diff --git a/.dev/.gitignore b/.dev/.gitignore new file mode 100644 index 0000000..d5845a3 --- /dev/null +++ b/.dev/.gitignore @@ -0,0 +1,3 @@ +data +config +logs \ No newline at end of file diff --git a/.dev/Caddyfile b/.dev/Caddyfile new file mode 100644 index 0000000..8505b3a --- /dev/null +++ b/.dev/Caddyfile @@ -0,0 +1,32 @@ +nattyarch.local { + log { + + } + + handle /.well-known/webfinger { + reverse_proxy 127.0.0.1:4939 + } + + handle /.well-known/nodeinfo { + reverse_proxy 127.0.0.1:4939 + } + + handle /nodeinfo/* { + reverse_proxy 127.0.0.1:4939 + } + + @render_html { + not path /api* /proxy* /files* /avatar* /identicon* + header Accept text/html* + } + + @static { + path /favicon.ico /favicon.png /favicon.svg /manifest.json /api-doc /sw.js /static-assets* /client-assets* /assets* /twemoji* /url + } + + reverse_proxy @render_html 127.0.0.1:4938 + reverse_proxy @static 127.0.0.1:4938 + + reverse_proxy 127.0.0.1:4937 +} + diff --git a/.dev/docker-compose.yaml b/.dev/docker-compose.yaml new file mode 100644 index 0000000..1548979 --- /dev/null +++ b/.dev/docker-compose.yaml @@ -0,0 +1,14 @@ +version: "3" + +services: + caddy: + image: docker.io/caddy:2.6.2-alpine + restart: unless-stopped + ports: + - "80:80" + network_mode: "host" + volumes: + - ./Caddyfile:/etc/caddy/Caddyfile + - ./data:/data + - ./config:/config + - ./logs:/logs diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..557b519 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,22 @@ +*.log +npm-debug.log* +.pnpm-debug.log* + +/fe_calckey/frontend/built + +node_modules/ + +.npm + +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +.temp +.cache + +.pnp.* + +/target \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 8af5824..e425fb4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -30,6 +30,24 @@ dependencies = [ "version_check", ] +[[package]] +name = "aho-corasick" +version = "0.7.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +dependencies = [ + "memchr", +] + +[[package]] +name = "aho-corasick" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +dependencies = [ + "memchr", +] + [[package]] name = "aliasable" version = "0.1.3" @@ -45,12 +63,6 @@ dependencies = [ "libc", ] -[[package]] -name = "anyhow" -version = "1.0.71" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" - [[package]] name = "arrayvec" version = "0.7.2" @@ -116,6 +128,7 @@ dependencies = [ "bitflags", "bytes", "futures-util", + "headers", "http", "http-body", "hyper", @@ -262,6 +275,16 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "bstr" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "bumpalo" version = "3.12.2" @@ -330,6 +353,28 @@ dependencies = [ "winapi", ] +[[package]] +name = "chrono-tz" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c39203181991a7dd4343b8005bd804e7a9a37afb8ac070e43771e8c820bbde" +dependencies = [ + "chrono", + "chrono-tz-build", + "phf", +] + +[[package]] +name = "chrono-tz-build" +version = "0.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f509c3a87b33437b05e2458750a0700e5bdd6956176773e6c7d6dd15a283a0c" +dependencies = [ + "parse-zoneinfo", + "phf", + "phf_codegen", +] + [[package]] name = "ck" version = "0.1.0" @@ -382,6 +427,12 @@ dependencies = [ "typenum", ] +[[package]] +name = "deunicode" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "850878694b7933ca4c9569d30a34b55031b9b139ee1fc7b94a527c4ef960d690" + [[package]] name = "digest" version = "0.10.6" @@ -549,6 +600,30 @@ dependencies = [ "wasi 0.11.0+wasi-snapshot-preview1", ] +[[package]] +name = "globset" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "029d74589adefde59de1a0c4f4732695c32805624aec7b68d91503d4dba79afc" +dependencies = [ + "aho-corasick 0.7.20", + "bstr", + "fnv", + "log", + "regex", +] + +[[package]] +name = "globwalk" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93e3af942408868f6934a7b85134a3230832b9977cf66125df2f9edcfce4ddcc" +dependencies = [ + "bitflags", + "ignore", + "walkdir", +] + [[package]] name = "h2" version = "0.3.20" @@ -595,6 +670,31 @@ dependencies = [ "hashbrown 0.13.2", ] +[[package]] +name = "headers" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3e372db8e5c0d213e0cd0b9be18be2aca3d44cf2fe30a9d46a65581cd454584" +dependencies = [ + "base64 0.13.1", + "bitflags", + "bytes", + "headers-core", + "http", + "httpdate", + "mime", + "sha1", +] + +[[package]] +name = "headers-core" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" +dependencies = [ + "http", +] + [[package]] name = "heck" version = "0.3.3" @@ -686,6 +786,12 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" +[[package]] +name = "humansize" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02296996cb8796d7c6e3bc2d9211b7802812d36999a51bb754123ead7d37d026" + [[package]] name = "hyper" version = "0.14.26" @@ -743,6 +849,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.3" @@ -819,19 +942,44 @@ dependencies = [ [[package]] name = "magnetar" -version = "0.1.1" +version = "0.2.0" dependencies = [ - "anyhow", "axum", "dotenvy", "hyper", "magnetar_calckey_model", + "magnetar_common", "magnetar_core", "magnetar_nodeinfo", "magnetar_webfinger", + "miette", "percent-encoding", "serde", "serde_json", + "thiserror", + "tokio", + "toml 0.7.4", + "tower", + "tower-http", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "magnetar_calckey_fe" +version = "0.2.0" +dependencies = [ + "axum", + "chrono", + "dotenvy", + "hyper", + "magnetar_common", + "miette", + "percent-encoding", + "serde", + "serde_json", + "tera", + "thiserror", "tokio", "toml 0.7.4", "tower", @@ -842,31 +990,41 @@ dependencies = [ [[package]] name = "magnetar_calckey_model" -version = "0.1.0" +version = "0.2.0" dependencies = [ - "anyhow", "chrono", "ck", "dotenvy", - "log", "sea-orm", "serde", "serde_json", + "thiserror", "tokio", + "tracing", +] + +[[package]] +name = "magnetar_common" +version = "0.2.0" +dependencies = [ + "magnetar_core", + "percent-encoding", + "serde", + "thiserror", + "toml 0.7.4", ] [[package]] name = "magnetar_core" -version = "0.1.0" +version = "0.2.0" dependencies = [ "serde", "serde_json", - "url", ] [[package]] name = "magnetar_nodeinfo" -version = "0.1.0" +version = "0.2.0" dependencies = [ "serde", "serde_json", @@ -874,7 +1032,7 @@ dependencies = [ [[package]] name = "magnetar_webfinger" -version = "0.1.0" +version = "0.2.0" dependencies = [ "magnetar_core", "serde", @@ -911,12 +1069,45 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +[[package]] +name = "miette" +version = "5.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a236ff270093b0b67451bc50a509bd1bad302cb1d3c7d37d5efe931238581fa9" +dependencies = [ + "miette-derive", + "once_cell", + "thiserror", + "unicode-width", +] + +[[package]] +name = "miette-derive" +version = "5.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4901771e1d44ddb37964565c654a3223ba41a594d02b8da471cc4464912b5cfa" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.16", +] + [[package]] name = "mime" version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "mime_guess" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" +dependencies = [ + "mime", + "unicase", +] + [[package]] name = "minimal-lexical" version = "0.2.1" @@ -1078,6 +1269,15 @@ dependencies = [ "windows-sys 0.45.0", ] +[[package]] +name = "parse-zoneinfo" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c705f256449c60da65e11ff6626e0c16a0a0b96aaa348de61376b249bc340f41" +dependencies = [ + "regex", +] + [[package]] name = "paste" version = "1.0.12" @@ -1090,6 +1290,89 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +[[package]] +name = "pest" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f73935e4d55e2abf7f130186537b19e7a4abc886a0252380b59248af473a3fc9" +dependencies = [ + "thiserror", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aef623c9bbfa0eedf5a0efba11a5ee83209c326653ca31ff019bec3a95bfff2b" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3e8cba4ec22bada7fc55ffe51e2deb6a0e0db2d0b7ab0b103acc80d2510c190" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn 2.0.16", +] + +[[package]] +name = "pest_meta" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a01f71cb40bd8bb94232df14b946909e14660e33fc05db3e50ae2a82d7ea0ca0" +dependencies = [ + "once_cell", + "pest", + "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", + "uncased", +] + [[package]] name = "pin-project" version = "1.1.0" @@ -1261,6 +1544,8 @@ version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" dependencies = [ + "aho-corasick 1.0.2", + "memchr", "regex-syntax 0.7.1", ] @@ -1388,6 +1673,15 @@ version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" +[[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 = "scopeguard" version = "1.1.0" @@ -1624,6 +1918,12 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" +[[package]] +name = "siphasher" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" + [[package]] name = "slab" version = "0.4.8" @@ -1633,6 +1933,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "slug" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3bc762e6a4b6c6fcaade73e77f9ebc6991b676f88bb2358bddb56560f073373" +dependencies = [ + "deunicode", +] + [[package]] name = "smallvec" version = "1.10.0" @@ -1814,6 +2123,28 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" +[[package]] +name = "tera" +version = "1.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3df578c295f9ec044ff1c829daf31bb7581d5b3c2a7a3d87419afe1f2531438c" +dependencies = [ + "chrono", + "chrono-tz", + "globwalk", + "humansize", + "lazy_static", + "percent-encoding", + "pest", + "pest_derive", + "rand", + "regex", + "serde", + "serde_json", + "slug", + "unic-segment", +] + [[package]] name = "thiserror" version = "1.0.40" @@ -2035,7 +2366,13 @@ dependencies = [ "http", "http-body", "http-range-header", + "httpdate", + "mime", + "mime_guess", + "percent-encoding", "pin-project-lite", + "tokio", + "tokio-util", "tower-layer", "tower-service", "tracing", @@ -2128,6 +2465,80 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +[[package]] +name = "ucd-trie" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" + +[[package]] +name = "uncased" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b9bc53168a4be7402ab86c3aad243a84dd7381d09be0eddc81280c1da95ca68" +dependencies = [ + "version_check", +] + +[[package]] +name = "unic-char-property" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" +dependencies = [ + "unic-char-range", +] + +[[package]] +name = "unic-char-range" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" + +[[package]] +name = "unic-common" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" + +[[package]] +name = "unic-segment" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4ed5d26be57f84f176157270c112ef57b86debac9cd21daaabbe56db0f88f23" +dependencies = [ + "unic-ucd-segment", +] + +[[package]] +name = "unic-ucd-segment" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2079c122a62205b421f499da10f3ee0f7697f012f55b675e002483c73ea34700" +dependencies = [ + "unic-char-property", + "unic-char-range", + "unic-ucd-version", +] + +[[package]] +name = "unic-ucd-version" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" +dependencies = [ + "unic-common", +] + +[[package]] +name = "unicase" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" +dependencies = [ + "version_check", +] + [[package]] name = "unicode-bidi" version = "0.3.13" @@ -2155,6 +2566,12 @@ version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" +[[package]] +name = "unicode-width" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" + [[package]] name = "unicode_categories" version = "0.1.1" @@ -2176,7 +2593,6 @@ dependencies = [ "form_urlencoded", "idna", "percent-encoding", - "serde", ] [[package]] @@ -2200,6 +2616,16 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "walkdir" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" +dependencies = [ + "same-file", + "winapi-util", +] + [[package]] name = "want" version = "0.3.0" @@ -2331,6 +2757,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" diff --git a/Cargo.toml b/Cargo.toml index 62d98d0..c52c94d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,9 +1,9 @@ [package] name = "magnetar" description = "An exploratory ActivityPub project" -version = "0.1.1" +version.workspace = true +edition.workspace = true license = "AGPL-3.0-only" -edition = "2021" [workspace] members = [ @@ -11,31 +11,60 @@ members = [ "ext_nodeinfo", "ext_webfinger", "ext_calckey_model", + "fe_calckey", + "magnetar_common", "core" ] -[dependencies] -magnetar_core = { path = "./core", version = "0.1" } -magnetar_webfinger = { path = "./ext_webfinger", version = "0.1"} -magnetar_nodeinfo = { path = "./ext_nodeinfo", version = "0.1"} -magnetar_calckey_model = { path = "./ext_calckey_model", version = "0.1" } - -anyhow = "1.0" - -dotenvy = "0.15" +[workspace.package] +version = "0.2.0" +edition = "2021" +[workspace.dependencies] axum = "0.6" -hyper = { version = "0.14", features = ["full"] } -tokio = { version = "1.24", features = ["full"] } -tower = "0.4" -tower-http = { version = "0.4", features = ["cors", "trace"] } - -tracing-subscriber = { version = "0.3", features = ["env-filter"] } -tracing = "0.1" - +chrono = "0.4" +dotenvy = "0.15" +hyper = "0.14" +log = "0.4" +miette = "5.9" percent-encoding = "2.2" - -serde = { version = "1.0", features = ["derive"] } +sea-orm = "0.11" +serde = "1" +serde_json = "1" +tera = { version = "1", default-features = false } +thiserror = "1" +tokio = "1.24" toml = "0.7" +tower = "0.4" +tower-http = "0.4" +tracing = "0.1" +tracing-subscriber = "0.3" +url = "2.3" -serde_json = "1.0" \ No newline at end of file +[dependencies] +magnetar_core = { path = "./core" } +magnetar_common = { path = "./magnetar_common" } +magnetar_webfinger = { path = "./ext_webfinger" } +magnetar_nodeinfo = { path = "./ext_nodeinfo" } +magnetar_calckey_model = { path = "./ext_calckey_model" } + +dotenvy = { workspace = true } + +axum = { workspace = true } +hyper = { workspace = true, features = ["full"] } +tokio = { workspace = true, features = ["full"] } +tower = { workspace = true } +tower-http = { workspace = true, features = ["cors", "trace", "fs"] } + +tracing-subscriber = { workspace = true, features = ["env-filter"] } +tracing = { workspace = true } + +thiserror = { workspace = true } +miette = { workspace = true } + +percent-encoding = { workspace = true } + +serde = { workspace = true, features = ["derive"] } +toml = { workspace = true } + +serde_json = { workspace = true } \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 21bf3a1..3c3b6b9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,3 +1,16 @@ +FROM docker.io/alpine:3.18 as build_fe + +RUN apk add --no-cache --no-progress git alpine-sdk nodejs-current npm + +WORKDIR /fe_calckey +COPY ./fe_calckey/frontend ./frontend +WORKDIR /fe_calckey/frontend + +RUN corepack enable && corepack prepare pnpm@latest --activate && pnpm i --frozen-lockfile + +RUN env NODE_ENV=production sh -c "pnpm run build && pnpm run gulp" + + FROM docker.io/rust:1.69-bullseye as build RUN update-ca-certificates @@ -17,7 +30,7 @@ WORKDIR /magnetar COPY ./ . -RUN cargo build --release --locked +RUN cargo build --release --locked --workspace --bins FROM docker.io/debian:bullseye-slim @@ -28,12 +41,22 @@ COPY --from=build /etc/group /etc/group WORKDIR /magnetar +WORKDIR /magnetar/fe_calckey/frontend +COPY --from=build_fe /fe_calckey/frontend/built ./built +COPY --from=build_fe /fe_calckey/frontend/assets ./assets +COPY --from=build_fe /fe_calckey/frontend/client/assets ./client/assets +COPY --from=build_fe /fe_calckey/frontend/assets-be ./assets-be + +WORKDIR /magnetar + RUN chown -R 10001:10001 . COPY --from=build /magnetar/target/release/magnetar ./ +COPY --from=build /magnetar/target/release/magnetar_calckey_fe ./ USER magnetar:magnetar +EXPOSE 4938/tcp EXPOSE 4939/tcp -CMD ["/magnetar/magnetar"] \ No newline at end of file +ENTRYPOINT ["/magnetar/magnetar"] \ No newline at end of file diff --git a/config/default.toml b/config/default.toml index 9ba4e70..662b777 100644 --- a/config/default.toml +++ b/config/default.toml @@ -47,6 +47,14 @@ # Environment variable: MAG_C_BIND_ADDR # networking.bind_addr = "::" +# -----------------------------[ CALCKEY FRONTEND ]---------------------------- + +# [Optional] +# The port of the frontend. +# Default: 4938 +# Environment variable: MAG_C_CK_FE_PORT +# calckey_frontend.port = 4938 + # ----------------------------------[ DATA ]----------------------------------- # [REQUIRED] diff --git a/core/Cargo.toml b/core/Cargo.toml index 48e2ec5..0afd5b2 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -1,14 +1,13 @@ [package] name = "magnetar_core" description = "A library to power an exploratory ActivityPub project" -version = "0.1.0" +version.workspace = true +edition.workspace = true license = "AGPL-3.0-only" -edition = "2021" [lib] crate-type = ["rlib"] [dependencies] -serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0" -url = { version = "2.3", features = ["serde"] } \ No newline at end of file +serde = { workspace = true, features = ["derive"] } +serde_json = { workspace = true } \ No newline at end of file diff --git a/ext_calckey_model/Cargo.toml b/ext_calckey_model/Cargo.toml index 745cc97..6d5a6e4 100644 --- a/ext_calckey_model/Cargo.toml +++ b/ext_calckey_model/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "magnetar_calckey_model" -version = "0.1.0" -edition = "2021" +version.workspace = true +edition.workspace = true [lib] crate-type = ["rlib"] @@ -9,11 +9,11 @@ crate-type = ["rlib"] [dependencies] ck = { path = "./entity_ck" } -anyhow = "1" -dotenvy = "0.15" -log = "0.4" -tokio = { version = "1.24", features = ["full"] } -sea-orm = { version = "0.11", features = ["sqlx-postgres", "runtime-tokio-rustls", "macros"] } -serde = { version = "1.0", features = ["derive"] } -serde_json = "1" -chrono = "0.4" \ No newline at end of file +dotenvy = { workspace = true} +tokio = { workspace = true, features = ["full"] } +sea-orm = { workspace = true, features = ["sqlx-postgres", "runtime-tokio-rustls", "macros"] } +serde = { workspace = true, features = ["derive"] } +serde_json = { workspace = true } +chrono = { workspace = true } +tracing = { workspace = true } +thiserror = { workspace = true } \ No newline at end of file diff --git a/ext_calckey_model/src/lib.rs b/ext_calckey_model/src/lib.rs index 9a0baf9..172e97c 100644 --- a/ext_calckey_model/src/lib.rs +++ b/ext_calckey_model/src/lib.rs @@ -1,6 +1,7 @@ use ck::user; -use log::LevelFilter; use sea_orm::{ColumnTrait, ConnectOptions, DatabaseConnection, EntityTrait, QueryFilter}; +use thiserror::Error; +use tracing::log::LevelFilter; #[derive(Debug)] pub struct ConnectorConfig { @@ -10,8 +11,14 @@ pub struct ConnectorConfig { #[derive(Clone, Debug)] pub struct CalckeyModel(DatabaseConnection); +#[derive(Debug, Error)] +pub enum CalckeyDbError { + #[error("Database error: {0}")] + DbError(#[from] sea_orm::DbErr), +} + impl CalckeyModel { - pub async fn new(config: ConnectorConfig) -> anyhow::Result { + pub async fn new(config: ConnectorConfig) -> Result { let opt = ConnectOptions::new(config.url) .max_connections(64) .min_connections(8) @@ -26,7 +33,7 @@ impl CalckeyModel { &self, name: &str, instance: Option<&str>, - ) -> anyhow::Result> { + ) -> Result, CalckeyDbError> { let name = name.to_lowercase(); let instance = instance.map(str::to_lowercase); @@ -47,7 +54,7 @@ impl CalckeyModel { Ok(user) } - pub async fn get_user_by_uri(&self, uri: &str) -> anyhow::Result> { + pub async fn get_user_by_uri(&self, uri: &str) -> Result, CalckeyDbError> { Ok(user::Entity::find() .filter(user::Column::Uri.eq(uri)) .one(&self.0) diff --git a/ext_nodeinfo/Cargo.toml b/ext_nodeinfo/Cargo.toml index 8a9d91a..6d98a9c 100644 --- a/ext_nodeinfo/Cargo.toml +++ b/ext_nodeinfo/Cargo.toml @@ -1,8 +1,11 @@ [package] name = "magnetar_nodeinfo" -version = "0.1.0" -edition = "2021" +version.workspace = true +edition.workspace = true + +[lib] +crate-type = ["rlib"] [dependencies] -serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0" +serde = { workspace = true, features = ["derive"] } +serde_json = { workspace = true } diff --git a/ext_webfinger/Cargo.toml b/ext_webfinger/Cargo.toml index c8c3448..fa81384 100644 --- a/ext_webfinger/Cargo.toml +++ b/ext_webfinger/Cargo.toml @@ -1,9 +1,12 @@ [package] name = "magnetar_webfinger" -version = "0.1.0" -edition = "2021" +version.workspace = true +edition.workspace = true + +[lib] +crate-type = ["rlib"] [dependencies] -magnetar_core = { path = "../core", version = "0.1" } -serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0" \ No newline at end of file +magnetar_core = { path = "../core" } +serde = { workspace = true, features = ["derive"] } +serde_json = { workspace = true} \ No newline at end of file diff --git a/fe_calckey/Cargo.toml b/fe_calckey/Cargo.toml new file mode 100644 index 0000000..f082f0e --- /dev/null +++ b/fe_calckey/Cargo.toml @@ -0,0 +1,30 @@ +[package] +name = "magnetar_calckey_fe" +version.workspace = true +edition.workspace = true + +[dependencies] +magnetar_common = { path = "../magnetar_common" } + +thiserror = { workspace = true } +miette = { workspace = true } + +dotenvy = { workspace = true } + +axum = { workspace = true, features = ["headers"] } +hyper = { workspace = true, features = ["full"] } +tokio = { workspace = true, features = ["full"] } +tower = { workspace = true } +tower-http = { workspace = true, features = ["cors", "trace", "fs"] } +tera = { workspace = true, default-features = false, features = ["builtins"] } + +tracing-subscriber = { workspace = true, features = ["env-filter"] } +tracing = { workspace = true } + +percent-encoding = { workspace = true } + +serde = { workspace = true, features = ["derive"] } +toml = { workspace = true } +serde_json = { workspace = true } + +chrono = { workspace = true } \ No newline at end of file diff --git a/fe_calckey/frontend/.gitignore b/fe_calckey/frontend/.gitignore new file mode 100644 index 0000000..3a66785 --- /dev/null +++ b/fe_calckey/frontend/.gitignore @@ -0,0 +1,68 @@ +# Visual Studio Code +/.vscode +!/.vscode/extensions.json + +# Intelij-IDEA +/.idea +packages/backend/.idea/backend.iml +packages/backend/.idea/modules.xml +packages/backend/.idea/vcs.xml + +# Node.js +node_modules +report.*.json + +# Cypress +cypress/screenshots +cypress/videos + +# Coverage +coverage + +# config +/.config/* +!/.config/example.yml +!/.config/devenv.yml +!/.config/docker_example.env +!/.config/helm_values_example.yml + +#docker dev config +/dev/docker-compose.yml + +# misskey +built +db +elasticsearch +redis +npm-debug.log +*.pem +run.bat +api-docs.json +*.log +*.code-workspace +.DS_Store +files +ormconfig.json +packages/backend/assets/instance.css +packages/backend/assets/sounds/None.mp3 + +!packages/backend/src/db + +# blender backups +*.blend1 +*.blend2 +*.blend3 +*.blend4 +*.blend5 + +# old yarn +.yarn +yarn* + +# Nix Development shell items +.devenv +.direnv + +# Cargo cache for Docker +/.cargo-cache +/.cargo-target diff --git a/fe_calckey/frontend/.node-version b/fe_calckey/frontend/.node-version new file mode 100644 index 0000000..8ddbc0c --- /dev/null +++ b/fe_calckey/frontend/.node-version @@ -0,0 +1 @@ +v18.16.0 diff --git a/fe_calckey/frontend/.npmrc b/fe_calckey/frontend/.npmrc new file mode 100644 index 0000000..abb787e --- /dev/null +++ b/fe_calckey/frontend/.npmrc @@ -0,0 +1 @@ +use-lockfile-v6=true diff --git a/fe_calckey/frontend/assets-be/.gitignore b/fe_calckey/frontend/assets-be/.gitignore new file mode 100644 index 0000000..1d39e4d --- /dev/null +++ b/fe_calckey/frontend/assets-be/.gitignore @@ -0,0 +1,3 @@ +twemoji +template/boot.js +template/style.css \ No newline at end of file diff --git a/fe_calckey/frontend/assets-be/boot.template.js b/fe_calckey/frontend/assets-be/boot.template.js new file mode 100644 index 0000000..d5d85b2 --- /dev/null +++ b/fe_calckey/frontend/assets-be/boot.template.js @@ -0,0 +1,307 @@ +/** + * BOOT LOADER + * サーバーからレスポンスされるHTMLに埋め込まれるスクリプトで、以下の役割を持ちます。 + * - 翻訳ファイルをフェッチする。 + * - バージョンに基づいて適切なメインスクリプトを読み込む。 + * - キャッシュされたコンパイル済みテーマを適用する。 + * - クライアントの設定値に基づいて対応するHTMLクラス等を設定する。 + * テーマをこの段階で設定するのは、メインスクリプトが読み込まれる間もテーマを適用したいためです。 + * 注: webpackは介さないため、このファイルではrequireやimportは使えません。 + */ + +"use strict"; + +// ブロックの中に入れないと、定義した変数がブラウザのグローバルスコープに登録されてしまい邪魔なので +(async () => { + window.onerror = (e) => { + console.error(e); + renderError("SOMETHING_HAPPENED", e); + }; + window.onunhandledrejection = (e) => { + console.error(e); + renderError("SOMETHING_HAPPENED_IN_PROMISE", e); + }; + + //#region Detect language & fetch translations + const v = localStorage.getItem("v") || VERSION; + + const supportedLangs = LANGS; + let lang = localStorage.getItem("lang"); + if (lang == null || !supportedLangs.includes(lang)) { + if (supportedLangs.includes(navigator.language)) { + lang = navigator.language; + } else { + lang = supportedLangs.find((x) => x.split("-")[0] === navigator.language); + + // Fallback + if (lang == null) lang = "en-US"; + } + } + + const res = await fetch(`/assets/locales/${lang}.${v}.json`); + if (res.status === 200) { + localStorage.setItem("lang", lang); + localStorage.setItem("locale", await res.text()); + localStorage.setItem("localeVersion", v); + } else { + await checkUpdate(); + renderError("LOCALE_FETCH"); + return; + } + //#endregion + + //#region Script + function importAppScript() { + import(`/assets/${CLIENT_ENTRY}`).catch(async (e) => { + await checkUpdate(); + console.error(e); + renderError("APP_IMPORT", e); + }); + } + + // タイミングによっては、この時点でDOMの構築が済んでいる場合とそうでない場合とがある + if (document.readyState !== "loading") { + importAppScript(); + } else { + window.addEventListener("DOMContentLoaded", () => { + importAppScript(); + }); + } + //#endregion + + //#region Theme + const theme = localStorage.getItem("theme"); + if (theme) { + for (const [k, v] of Object.entries(JSON.parse(theme))) { + document.documentElement.style.setProperty(`--${k}`, v.toString()); + + // HTMLの theme-color 適用 + if (k === "htmlThemeColor") { + for (const tag of document.head.children) { + if ( + tag.tagName === "META" && + tag.getAttribute("name") === "theme-color" + ) { + tag.setAttribute("content", v); + break; + } + } + } + } + } + const colorSchema = localStorage.getItem("colorSchema"); + if (colorSchema) { + document.documentElement.style.setProperty("color-schema", colorSchema); + } + //#endregion + + let fontSize = localStorage.getItem("fontSize"); + if (fontSize) { + if (fontSize < 10) { + // need to do this for now, as values before were 1, 2, 3 depending on the option + localStorage.setItem("fontSize", null); + fontSize = localStorage.getItem("fontSize"); + } + document.documentElement.style.fontSize = fontSize + "px"; + } + + const useSystemFont = localStorage.getItem("useSystemFont"); + if (useSystemFont) { + document.documentElement.classList.add("useSystemFont"); + } + + const wallpaper = localStorage.getItem("wallpaper"); + if (wallpaper) { + document.documentElement.style.backgroundImage = `url(${wallpaper})`; + } + + const customCss = localStorage.getItem("customCss"); + if (customCss && customCss.length > 0) { + const style = document.createElement("style"); + style.innerHTML = customCss; + document.head.appendChild(style); + } + + async function addStyle(styleText) { + let css = document.createElement("style"); + css.appendChild(document.createTextNode(styleText)); + document.head.appendChild(css); + } + + function renderError(code, details) { + let errorsElement = document.getElementById("errors"); + + if (!errorsElement) { + document.body.innerHTML = ` + + + + + +

An error has occurred!

+ +

Don't worry, it's (probably) not your fault.

+

Please make sure your browser is up-to-date and any AdBlockers are off.

+

If the problem persists after refreshing, please contact your instance's administrator

+
+
+ `; + errorsElement = document.getElementById("errors"); + } + const detailsElement = document.createElement("details"); + detailsElement.innerHTML = ` +
+ + ERROR CODE: ${code} + + ${JSON.stringify(details)}`; + errorsElement.appendChild(detailsElement); + addStyle(` + * { + font-family: BIZ UDGothic, Roboto, HelveticaNeue, Arial, sans-serif; + } + + #calckey_app, + #splash { + display: none !important; + } + + body, + html { + background-color: #191724; + color: #e0def4; + justify-content: center; + margin: auto; + padding: 10px; + text-align: center; + } + + button { + border-radius: 999px; + padding: 0px 12px 0px 12px; + border: none; + cursor: pointer; + margin-bottom: 12px; + } + + .button-big { + background: linear-gradient(90deg, rgb(196, 167, 231), rgb(235, 188, 186)); + line-height: 50px; + } + + .button-big:hover { + background: rgb(49, 116, 143); + } + + .button-small { + background: #444; + line-height: 40px; + } + + .button-small:hover { + background: #555; + } + + .button-label-big { + color: #191724; + font-weight: bold; + font-size: 20px; + padding: 12px; + } + + .button-label-small { + color: rgb(156, 207, 216); + font-size: 16px; + padding: 12px; + } + + a { + color: rgb(156, 207, 216); + text-decoration: none; + } + + p, + li { + font-size: 16px; + } + + .dont-worry, + #msg { + font-size: 18px; + } + + .icon-warning { + color: #f6c177; + height: 4rem; + padding-top: 2rem; + } + + h1 { + font-size: 32px; + } + + code { + font-family: Fira, FiraCode, monospace; + } + + details { + background: #1f1d2e; + margin-bottom: 2rem; + padding: 0.5rem 1rem; + width: 40rem; + border-radius: 10px; + justify-content: center; + margin: auto; + } + + summary { + cursor: pointer; + } + + summary > * { + display: inline; + } + + @media screen and (max-width: 500px) { + details { + width: 50%; + } + `); + } + + async function checkUpdate() { + try { + const res = await fetch( (_REMOTE_URL || "") + "/api/meta", { + method: "POST", + cache: "no-cache", + }); + + const meta = await res.json(); + + if (meta.version != v) { + localStorage.setItem("v", meta.version); + refresh(); + } + } catch (e) { + console.error(e); + renderError("UPDATE_CHECK", e); + throw e; + } + } + + function refresh() { + // Clear cache (service worker) + try { + navigator.serviceWorker.controller.postMessage("clear"); + navigator.serviceWorker.getRegistrations().then((registrations) => { + registrations.forEach((registration) => registration.unregister()); + }); + } catch (e) { + console.error(e); + } + + location.reload(); + } +})(); diff --git a/fe_calckey/frontend/assets-be/manifest.json b/fe_calckey/frontend/assets-be/manifest.json new file mode 100644 index 0000000..647a5d4 --- /dev/null +++ b/fe_calckey/frontend/assets-be/manifest.json @@ -0,0 +1,72 @@ +{ + "short_name": "Calckey", + "name": "Calckey", + "description": "An open source, decentralized social media platform that's free forever!", + "start_url": "/", + "display": "standalone", + "background_color": "#1f1d2e", + "theme_color": "#31748f", + "orientation": "portrait-primary", + "icons": [ + { + "src": "/static-assets/icons/192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "any" + }, + { + "src": "/static-assets/icons/512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "any" + }, + { + "src": "/static-assets/icons/maskable.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "/static-assets/icons/monochrome.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "monochrome" + } + ], + "share_target": { + "action": "/share/", + "params": { + "title": "title", + "text": "text", + "url": "url" + } + }, + "screenshots": [ + { + "src": "/static-assets/screenshots/1.webp", + "sizes": "1195x579", + "type": "image/webp", + "platform": "narrow", + "label": "Profile page" + }, + { + "src": "/static-assets/screenshots/2.webp", + "sizes": "1195x579", + "type": "image/webp", + "platform": "narrow", + "label": "Posts" + } + ], + "shortcuts": [ + { + "name": "Notifications", + "short_name": "Notifs", + "url": "/my/notifications" + }, + { + "name": "Chats", + "url": "/my/messaging" + } + ], + "categories": ["social"] +} diff --git a/fe_calckey/frontend/assets-be/style.template.css b/fe_calckey/frontend/assets-be/style.template.css new file mode 100644 index 0000000..9b2ee2d --- /dev/null +++ b/fe_calckey/frontend/assets-be/style.template.css @@ -0,0 +1,133 @@ +html { + background-color: var(--bg); + color: var(--fg); +} +@media (prefers-color-scheme: dark) { + html { + --bg: rgb(17, 17, 27); + --fg: rgb(224, 222, 244); + } +} + +#splash { + position: fixed; + z-index: 10000; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + cursor: wait; + background-color: var(--bg); + opacity: 1; + transition: opacity 0.2s ease; +} + +#splashIcon { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + margin: auto; + width: 64px; + height: 64px; + pointer-events: none; + animation-duration: 1s; + animation-iteration-count: infinite; + animation-name: tada; +} + +#splashSpinner { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + margin: auto; + display: inline-block; + width: 28px; + height: 28px; + transform: translateY(110px); + display: none; + color: var(--accent); +} +#splashSpinner > .spinner { + position: absolute; + top: 0; + left: 0; + width: 28px; + height: 28px; + fill-rule: evenodd; + clip-rule: evenodd; + stroke-linecap: round; + stroke-linejoin: round; + stroke-miterlimit: 1.5; +} +#splashSpinner > .spinner.bg { + opacity: 0.275; +} +#splashSpinner > .spinner.fg { + animation: splashSpinner 0.5s linear infinite; +} + +@keyframes splashSpinner { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} + +@keyframes tada { + 0% { + transform: scale3d(1, 1, 1); + } + + 10%, + 20% { + transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); + } + + 30%, + 50%, + 70%, + 90% { + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + } + + 40%, + 60%, + 80% { + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + } + + 100% { + transform: scale3d(1, 1, 1); + } +} + +@media(prefers-reduced-motion) { + #splashSpinner { + display: block; + } + + #splashIcon { + animation: none; + } +} + +#splashText { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + margin: auto; + display: inline-block; + width: 70%; + height: 0; + text-align: center; + padding-top: 100px; + font-family: sans-serif; +} diff --git a/fe_calckey/frontend/assets-be/template/base.html b/fe_calckey/frontend/assets-be/template/base.html new file mode 100644 index 0000000..5ec1a94 --- /dev/null +++ b/fe_calckey/frontend/assets-be/template/base.html @@ -0,0 +1,64 @@ + + + + + + + + + + + + {{ title | capitalize }} + + + + + + + + + + {% for css in client_entry.css %} + + {% endfor %} + + + + {% if not robots %} + + {% endif %} + + + + + + + + + + + + + + +
+ +
+ + \ No newline at end of file diff --git a/fe_calckey/frontend/assets/api-doc.png b/fe_calckey/frontend/assets/api-doc.png new file mode 100644 index 0000000..95fe697 Binary files /dev/null and b/fe_calckey/frontend/assets/api-doc.png differ diff --git a/fe_calckey/frontend/assets/apple-touch-icon.png b/fe_calckey/frontend/assets/apple-touch-icon.png new file mode 100644 index 0000000..35963d8 Binary files /dev/null and b/fe_calckey/frontend/assets/apple-touch-icon.png differ diff --git a/fe_calckey/frontend/assets/badges/CREDITS b/fe_calckey/frontend/assets/badges/CREDITS new file mode 100644 index 0000000..678ee54 --- /dev/null +++ b/fe_calckey/frontend/assets/badges/CREDITS @@ -0,0 +1,7 @@ +All images om this directory are illustrated by Henki (https://www.youtube.com/c/Henkiwashere) +Please show them some love, they're an awesome artist! + +Character design by ThatOneCalculator (https://t1c.dev) + +The images in this directory are complete redraws based off of the original Misskey error images. +The artist and license of said original images is sadly unknown. diff --git a/fe_calckey/frontend/assets/badges/LICENSE b/fe_calckey/frontend/assets/badges/LICENSE new file mode 100644 index 0000000..795087c --- /dev/null +++ b/fe_calckey/frontend/assets/badges/LICENSE @@ -0,0 +1,427 @@ +Attribution-ShareAlike 4.0 International + +======================================================================= + +Creative Commons Corporation ("Creative Commons") is not a law firm and +does not provide legal services or legal advice. Distribution of +Creative Commons public licenses does not create a lawyer-client or +other relationship. Creative Commons makes its licenses and related +information available on an "as-is" basis. Creative Commons gives no +warranties regarding its licenses, any material licensed under their +terms and conditions, or any related information. Creative Commons +disclaims all liability for damages resulting from their use to the +fullest extent possible. + +Using Creative Commons Public Licenses + +Creative Commons public licenses provide a standard set of terms and +conditions that creators and other rights holders may use to share +original works of authorship and other material subject to copyright +and certain other rights specified in the public license below. The +following considerations are for informational purposes only, are not +exhaustive, and do not form part of our licenses. + + Considerations for licensors: Our public licenses are + intended for use by those authorized to give the public + permission to use material in ways otherwise restricted by + copyright and certain other rights. Our licenses are + irrevocable. Licensors should read and understand the terms + and conditions of the license they choose before applying it. + Licensors should also secure all rights necessary before + applying our licenses so that the public can reuse the + material as expected. Licensors should clearly mark any + material not subject to the license. This includes other CC- + licensed material, or material used under an exception or + limitation to copyright. More considerations for licensors: + wiki.creativecommons.org/Considerations_for_licensors + + Considerations for the public: By using one of our public + licenses, a licensor grants the public permission to use the + licensed material under specified terms and conditions. If + the licensor's permission is not necessary for any reason--for + example, because of any applicable exception or limitation to + copyright--then that use is not regulated by the license. Our + licenses grant only permissions under copyright and certain + other rights that a licensor has authority to grant. Use of + the licensed material may still be restricted for other + reasons, including because others have copyright or other + rights in the material. A licensor may make special requests, + such as asking that all changes be marked or described. + Although not required by our licenses, you are encouraged to + respect those requests where reasonable. More considerations + for the public: + wiki.creativecommons.org/Considerations_for_licensees + +======================================================================= + +Creative Commons Attribution-ShareAlike 4.0 International Public +License + +By exercising the Licensed Rights (defined below), You accept and agree +to be bound by the terms and conditions of this Creative Commons +Attribution-ShareAlike 4.0 International Public License ("Public +License"). To the extent this Public License may be interpreted as a +contract, You are granted the Licensed Rights in consideration of Your +acceptance of these terms and conditions, and the Licensor grants You +such rights in consideration of benefits the Licensor receives from +making the Licensed Material available under these terms and +conditions. + + +Section 1 -- Definitions. + + a. Adapted Material means material subject to Copyright and Similar + Rights that is derived from or based upon the Licensed Material + and in which the Licensed Material is translated, altered, + arranged, transformed, or otherwise modified in a manner requiring + permission under the Copyright and Similar Rights held by the + Licensor. For purposes of this Public License, where the Licensed + Material is a musical work, performance, or sound recording, + Adapted Material is always produced where the Licensed Material is + synched in timed relation with a moving image. + + b. Adapter's License means the license You apply to Your Copyright + and Similar Rights in Your contributions to Adapted Material in + accordance with the terms and conditions of this Public License. + + c. BY-SA Compatible License means a license listed at + creativecommons.org/compatiblelicenses, approved by Creative + Commons as essentially the equivalent of this Public License. + + d. Copyright and Similar Rights means copyright and/or similar rights + closely related to copyright including, without limitation, + performance, broadcast, sound recording, and Sui Generis Database + Rights, without regard to how the rights are labeled or + categorized. For purposes of this Public License, the rights + specified in Section 2(b)(1)-(2) are not Copyright and Similar + Rights. + + e. Effective Technological Measures means those measures that, in the + absence of proper authority, may not be circumvented under laws + fulfilling obligations under Article 11 of the WIPO Copyright + Treaty adopted on December 20, 1996, and/or similar international + agreements. + + f. Exceptions and Limitations means fair use, fair dealing, and/or + any other exception or limitation to Copyright and Similar Rights + that applies to Your use of the Licensed Material. + + g. License Elements means the license attributes listed in the name + of a Creative Commons Public License. The License Elements of this + Public License are Attribution and ShareAlike. + + h. Licensed Material means the artistic or literary work, database, + or other material to which the Licensor applied this Public + License. + + i. Licensed Rights means the rights granted to You subject to the + terms and conditions of this Public License, which are limited to + all Copyright and Similar Rights that apply to Your use of the + Licensed Material and that the Licensor has authority to license. + + j. Licensor means the individual(s) or entity(ies) granting rights + under this Public License. + + k. Share means to provide material to the public by any means or + process that requires permission under the Licensed Rights, such + as reproduction, public display, public performance, distribution, + dissemination, communication, or importation, and to make material + available to the public including in ways that members of the + public may access the material from a place and at a time + individually chosen by them. + + l. Sui Generis Database Rights means rights other than copyright + resulting from Directive 96/9/EC of the European Parliament and of + the Council of 11 March 1996 on the legal protection of databases, + as amended and/or succeeded, as well as other essentially + equivalent rights anywhere in the world. + + m. You means the individual or entity exercising the Licensed Rights + under this Public License. Your has a corresponding meaning. + + +Section 2 -- Scope. + + a. License grant. + + 1. Subject to the terms and conditions of this Public License, + the Licensor hereby grants You a worldwide, royalty-free, + non-sublicensable, non-exclusive, irrevocable license to + exercise the Licensed Rights in the Licensed Material to: + + a. reproduce and Share the Licensed Material, in whole or + in part; and + + b. produce, reproduce, and Share Adapted Material. + + 2. Exceptions and Limitations. For the avoidance of doubt, where + Exceptions and Limitations apply to Your use, this Public + License does not apply, and You do not need to comply with + its terms and conditions. + + 3. Term. The term of this Public License is specified in Section + 6(a). + + 4. Media and formats; technical modifications allowed. The + Licensor authorizes You to exercise the Licensed Rights in + all media and formats whether now known or hereafter created, + and to make technical modifications necessary to do so. The + Licensor waives and/or agrees not to assert any right or + authority to forbid You from making technical modifications + necessary to exercise the Licensed Rights, including + technical modifications necessary to circumvent Effective + Technological Measures. For purposes of this Public License, + simply making modifications authorized by this Section 2(a) + (4) never produces Adapted Material. + + 5. Downstream recipients. + + a. Offer from the Licensor -- Licensed Material. Every + recipient of the Licensed Material automatically + receives an offer from the Licensor to exercise the + Licensed Rights under the terms and conditions of this + Public License. + + b. Additional offer from the Licensor -- Adapted Material. + Every recipient of Adapted Material from You + automatically receives an offer from the Licensor to + exercise the Licensed Rights in the Adapted Material + under the conditions of the Adapter's License You apply. + + c. No downstream restrictions. You may not offer or impose + any additional or different terms or conditions on, or + apply any Effective Technological Measures to, the + Licensed Material if doing so restricts exercise of the + Licensed Rights by any recipient of the Licensed + Material. + + 6. No endorsement. Nothing in this Public License constitutes or + may be construed as permission to assert or imply that You + are, or that Your use of the Licensed Material is, connected + with, or sponsored, endorsed, or granted official status by, + the Licensor or others designated to receive attribution as + provided in Section 3(a)(1)(A)(i). + + b. Other rights. + + 1. Moral rights, such as the right of integrity, are not + licensed under this Public License, nor are publicity, + privacy, and/or other similar personality rights; however, to + the extent possible, the Licensor waives and/or agrees not to + assert any such rights held by the Licensor to the limited + extent necessary to allow You to exercise the Licensed + Rights, but not otherwise. + + 2. Patent and trademark rights are not licensed under this + Public License. + + 3. To the extent possible, the Licensor waives any right to + collect royalties from You for the exercise of the Licensed + Rights, whether directly or through a collecting society + under any voluntary or waivable statutory or compulsory + licensing scheme. In all other cases the Licensor expressly + reserves any right to collect such royalties. + + +Section 3 -- License Conditions. + +Your exercise of the Licensed Rights is expressly made subject to the +following conditions. + + a. Attribution. + + 1. If You Share the Licensed Material (including in modified + form), You must: + + a. retain the following if it is supplied by the Licensor + with the Licensed Material: + + i. identification of the creator(s) of the Licensed + Material and any others designated to receive + attribution, in any reasonable manner requested by + the Licensor (including by pseudonym if + designated); + + ii. a copyright notice; + + iii. a notice that refers to this Public License; + + iv. a notice that refers to the disclaimer of + warranties; + + v. a URI or hyperlink to the Licensed Material to the + extent reasonably practicable; + + b. indicate if You modified the Licensed Material and + retain an indication of any previous modifications; and + + c. indicate the Licensed Material is licensed under this + Public License, and include the text of, or the URI or + hyperlink to, this Public License. + + 2. You may satisfy the conditions in Section 3(a)(1) in any + reasonable manner based on the medium, means, and context in + which You Share the Licensed Material. For example, it may be + reasonable to satisfy the conditions by providing a URI or + hyperlink to a resource that includes the required + information. + + 3. If requested by the Licensor, You must remove any of the + information required by Section 3(a)(1)(A) to the extent + reasonably practicable. + + b. ShareAlike. + + In addition to the conditions in Section 3(a), if You Share + Adapted Material You produce, the following conditions also apply. + + 1. The Adapter's License You apply must be a Creative Commons + license with the same License Elements, this version or + later, or a BY-SA Compatible License. + + 2. You must include the text of, or the URI or hyperlink to, the + Adapter's License You apply. You may satisfy this condition + in any reasonable manner based on the medium, means, and + context in which You Share Adapted Material. + + 3. You may not offer or impose any additional or different terms + or conditions on, or apply any Effective Technological + Measures to, Adapted Material that restrict exercise of the + rights granted under the Adapter's License You apply. + + +Section 4 -- Sui Generis Database Rights. + +Where the Licensed Rights include Sui Generis Database Rights that +apply to Your use of the Licensed Material: + + a. for the avoidance of doubt, Section 2(a)(1) grants You the right + to extract, reuse, reproduce, and Share all or a substantial + portion of the contents of the database; + + b. if You include all or a substantial portion of the database + contents in a database in which You have Sui Generis Database + Rights, then the database in which You have Sui Generis Database + Rights (but not its individual contents) is Adapted Material, + including for purposes of Section 3(b); and + + c. You must comply with the conditions in Section 3(a) if You Share + all or a substantial portion of the contents of the database. + +For the avoidance of doubt, this Section 4 supplements and does not +replace Your obligations under this Public License where the Licensed +Rights include other Copyright and Similar Rights. + + +Section 5 -- Disclaimer of Warranties and Limitation of Liability. + + a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE + EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS + AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF + ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, + IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, + WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, + ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT + KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT + ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. + + b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE + TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, + NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, + INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, + COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR + USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR + DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR + IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. + + c. The disclaimer of warranties and limitation of liability provided + above shall be interpreted in a manner that, to the extent + possible, most closely approximates an absolute disclaimer and + waiver of all liability. + + +Section 6 -- Term and Termination. + + a. This Public License applies for the term of the Copyright and + Similar Rights licensed here. However, if You fail to comply with + this Public License, then Your rights under this Public License + terminate automatically. + + b. Where Your right to use the Licensed Material has terminated under + Section 6(a), it reinstates: + + 1. automatically as of the date the violation is cured, provided + it is cured within 30 days of Your discovery of the + violation; or + + 2. upon express reinstatement by the Licensor. + + For the avoidance of doubt, this Section 6(b) does not affect any + right the Licensor may have to seek remedies for Your violations + of this Public License. + + c. For the avoidance of doubt, the Licensor may also offer the + Licensed Material under separate terms or conditions or stop + distributing the Licensed Material at any time; however, doing so + will not terminate this Public License. + + d. Sections 1, 5, 6, 7, and 8 survive termination of this Public + License. + + +Section 7 -- Other Terms and Conditions. + + a. The Licensor shall not be bound by any additional or different + terms or conditions communicated by You unless expressly agreed. + + b. Any arrangements, understandings, or agreements regarding the + Licensed Material not stated herein are separate from and + independent of the terms and conditions of this Public License. + + +Section 8 -- Interpretation. + + a. For the avoidance of doubt, this Public License does not, and + shall not be interpreted to, reduce, limit, restrict, or impose + conditions on any use of the Licensed Material that could lawfully + be made without permission under this Public License. + + b. To the extent possible, if any provision of this Public License is + deemed unenforceable, it shall be automatically reformed to the + minimum extent necessary to make it enforceable. If the provision + cannot be reformed, it shall be severed from this Public License + without affecting the enforceability of the remaining terms and + conditions. + + c. No term or condition of this Public License will be waived and no + failure to comply consented to unless expressly agreed to by the + Licensor. + + d. Nothing in this Public License constitutes or may be interpreted + as a limitation upon, or waiver of, any privileges and immunities + that apply to the Licensor or You, including from the legal + processes of any jurisdiction or authority. + + +======================================================================= + +Creative Commons is not a party to its public licenses. +Notwithstanding, Creative Commons may elect to apply one of its public +licenses to material it publishes and in those instances will be +considered the “Licensor.” The text of the Creative Commons public +licenses is dedicated to the public domain under the CC0 Public Domain +Dedication. Except for the limited purpose of indicating that material +is shared under a Creative Commons public license or as otherwise +permitted by the Creative Commons policies published at +creativecommons.org/policies, Creative Commons does not authorize the +use of the trademark "Creative Commons" or any other trademark or logo +of Creative Commons without its prior written consent including, +without limitation, in connection with any unauthorized modifications +to any of its public licenses or any other arrangements, +understandings, or agreements concerning use of licensed material. For +the avoidance of doubt, this paragraph does not form part of the public +licenses. + +Creative Commons may be contacted at creativecommons.org. diff --git a/fe_calckey/frontend/assets/badges/error.png b/fe_calckey/frontend/assets/badges/error.png new file mode 100644 index 0000000..e90912b Binary files /dev/null and b/fe_calckey/frontend/assets/badges/error.png differ diff --git a/fe_calckey/frontend/assets/badges/error_original.png b/fe_calckey/frontend/assets/badges/error_original.png new file mode 100644 index 0000000..3fef105 Binary files /dev/null and b/fe_calckey/frontend/assets/badges/error_original.png differ diff --git a/fe_calckey/frontend/assets/badges/info.png b/fe_calckey/frontend/assets/badges/info.png new file mode 100644 index 0000000..ac70544 Binary files /dev/null and b/fe_calckey/frontend/assets/badges/info.png differ diff --git a/fe_calckey/frontend/assets/badges/info_original.png b/fe_calckey/frontend/assets/badges/info_original.png new file mode 100644 index 0000000..4f148ba Binary files /dev/null and b/fe_calckey/frontend/assets/badges/info_original.png differ diff --git a/fe_calckey/frontend/assets/badges/not-found.png b/fe_calckey/frontend/assets/badges/not-found.png new file mode 100644 index 0000000..73d611e Binary files /dev/null and b/fe_calckey/frontend/assets/badges/not-found.png differ diff --git a/fe_calckey/frontend/assets/badges/not-found_original.png b/fe_calckey/frontend/assets/badges/not-found_original.png new file mode 100644 index 0000000..3022473 Binary files /dev/null and b/fe_calckey/frontend/assets/badges/not-found_original.png differ diff --git a/fe_calckey/frontend/assets/favicon.ico b/fe_calckey/frontend/assets/favicon.ico new file mode 100644 index 0000000..11a614a Binary files /dev/null and b/fe_calckey/frontend/assets/favicon.ico differ diff --git a/fe_calckey/frontend/assets/favicon.png b/fe_calckey/frontend/assets/favicon.png new file mode 100644 index 0000000..0f482d7 Binary files /dev/null and b/fe_calckey/frontend/assets/favicon.png differ diff --git a/fe_calckey/frontend/assets/favicon.svg b/fe_calckey/frontend/assets/favicon.svg new file mode 100644 index 0000000..675d09c --- /dev/null +++ b/fe_calckey/frontend/assets/favicon.svg @@ -0,0 +1 @@ + diff --git a/fe_calckey/frontend/assets/icons/192.png b/fe_calckey/frontend/assets/icons/192.png new file mode 100644 index 0000000..536e01c Binary files /dev/null and b/fe_calckey/frontend/assets/icons/192.png differ diff --git a/fe_calckey/frontend/assets/icons/512.png b/fe_calckey/frontend/assets/icons/512.png new file mode 100644 index 0000000..6455268 Binary files /dev/null and b/fe_calckey/frontend/assets/icons/512.png differ diff --git a/fe_calckey/frontend/assets/icons/maskable.png b/fe_calckey/frontend/assets/icons/maskable.png new file mode 100644 index 0000000..44b214c Binary files /dev/null and b/fe_calckey/frontend/assets/icons/maskable.png differ diff --git a/fe_calckey/frontend/assets/icons/monochrome.png b/fe_calckey/frontend/assets/icons/monochrome.png new file mode 100644 index 0000000..75894e7 Binary files /dev/null and b/fe_calckey/frontend/assets/icons/monochrome.png differ diff --git a/fe_calckey/frontend/assets/instance.css b/fe_calckey/frontend/assets/instance.css new file mode 100644 index 0000000..9a70e66 --- /dev/null +++ b/fe_calckey/frontend/assets/instance.css @@ -0,0 +1,7 @@ +/* +* !!! WARNING !!! +* Editing this file may cause your instance to break for EVERYONE. +* Please know what you're doing and test it out with regular user custom CSS. +* With that said, GLHF! +* This may eventuallly be replaced with a function in the admin panel. + */ diff --git a/fe_calckey/frontend/assets/inverse wordmark.png b/fe_calckey/frontend/assets/inverse wordmark.png new file mode 100644 index 0000000..6455268 Binary files /dev/null and b/fe_calckey/frontend/assets/inverse wordmark.png differ diff --git a/fe_calckey/frontend/assets/inverse wordmark.svg b/fe_calckey/frontend/assets/inverse wordmark.svg new file mode 100644 index 0000000..59125fe --- /dev/null +++ b/fe_calckey/frontend/assets/inverse wordmark.svg @@ -0,0 +1 @@ + diff --git a/fe_calckey/frontend/assets/mi-white.png b/fe_calckey/frontend/assets/mi-white.png new file mode 100644 index 0000000..2a186a9 Binary files /dev/null and b/fe_calckey/frontend/assets/mi-white.png differ diff --git a/fe_calckey/frontend/assets/notification-badges/LICENSE b/fe_calckey/frontend/assets/notification-badges/LICENSE new file mode 100644 index 0000000..841c4c6 --- /dev/null +++ b/fe_calckey/frontend/assets/notification-badges/LICENSE @@ -0,0 +1,5 @@ +Font Awesome Icons +------------------------- + +Ⓒ Font Awesome +CC BY 4.0 (https://creativecommons.org/licenses/by/4.0/) diff --git a/fe_calckey/frontend/assets/notification-badges/at.png b/fe_calckey/frontend/assets/notification-badges/at.png new file mode 100644 index 0000000..d149285 Binary files /dev/null and b/fe_calckey/frontend/assets/notification-badges/at.png differ diff --git a/fe_calckey/frontend/assets/notification-badges/check.png b/fe_calckey/frontend/assets/notification-badges/check.png new file mode 100644 index 0000000..baeb76b Binary files /dev/null and b/fe_calckey/frontend/assets/notification-badges/check.png differ diff --git a/fe_calckey/frontend/assets/notification-badges/clipboard-check-solid.png b/fe_calckey/frontend/assets/notification-badges/clipboard-check-solid.png new file mode 100644 index 0000000..d8cdfa9 Binary files /dev/null and b/fe_calckey/frontend/assets/notification-badges/clipboard-check-solid.png differ diff --git a/fe_calckey/frontend/assets/notification-badges/clock.png b/fe_calckey/frontend/assets/notification-badges/clock.png new file mode 100644 index 0000000..9323f8f Binary files /dev/null and b/fe_calckey/frontend/assets/notification-badges/clock.png differ diff --git a/fe_calckey/frontend/assets/notification-badges/comments.png b/fe_calckey/frontend/assets/notification-badges/comments.png new file mode 100644 index 0000000..bc8a1c3 Binary files /dev/null and b/fe_calckey/frontend/assets/notification-badges/comments.png differ diff --git a/fe_calckey/frontend/assets/notification-badges/id-card-alt.png b/fe_calckey/frontend/assets/notification-badges/id-card-alt.png new file mode 100644 index 0000000..67e1410 Binary files /dev/null and b/fe_calckey/frontend/assets/notification-badges/id-card-alt.png differ diff --git a/fe_calckey/frontend/assets/notification-badges/null.png b/fe_calckey/frontend/assets/notification-badges/null.png new file mode 100644 index 0000000..be1384d Binary files /dev/null and b/fe_calckey/frontend/assets/notification-badges/null.png differ diff --git a/fe_calckey/frontend/assets/notification-badges/plus.png b/fe_calckey/frontend/assets/notification-badges/plus.png new file mode 100644 index 0000000..05362c1 Binary files /dev/null and b/fe_calckey/frontend/assets/notification-badges/plus.png differ diff --git a/fe_calckey/frontend/assets/notification-badges/poll-h.png b/fe_calckey/frontend/assets/notification-badges/poll-h.png new file mode 100644 index 0000000..3b7ded6 Binary files /dev/null and b/fe_calckey/frontend/assets/notification-badges/poll-h.png differ diff --git a/fe_calckey/frontend/assets/notification-badges/quote-right.png b/fe_calckey/frontend/assets/notification-badges/quote-right.png new file mode 100644 index 0000000..0fa4837 Binary files /dev/null and b/fe_calckey/frontend/assets/notification-badges/quote-right.png differ diff --git a/fe_calckey/frontend/assets/notification-badges/reply.png b/fe_calckey/frontend/assets/notification-badges/reply.png new file mode 100644 index 0000000..77021f7 Binary files /dev/null and b/fe_calckey/frontend/assets/notification-badges/reply.png differ diff --git a/fe_calckey/frontend/assets/notification-badges/retweet.png b/fe_calckey/frontend/assets/notification-badges/retweet.png new file mode 100644 index 0000000..dc61060 Binary files /dev/null and b/fe_calckey/frontend/assets/notification-badges/retweet.png differ diff --git a/fe_calckey/frontend/assets/notification-badges/user-plus.png b/fe_calckey/frontend/assets/notification-badges/user-plus.png new file mode 100644 index 0000000..9d376d0 Binary files /dev/null and b/fe_calckey/frontend/assets/notification-badges/user-plus.png differ diff --git a/fe_calckey/frontend/assets/redoc.html b/fe_calckey/frontend/assets/redoc.html new file mode 100644 index 0000000..6f48c17 --- /dev/null +++ b/fe_calckey/frontend/assets/redoc.html @@ -0,0 +1,23 @@ + + + + Calckey API + + + + + + + + + + + + diff --git a/fe_calckey/frontend/assets/robots.txt b/fe_calckey/frontend/assets/robots.txt new file mode 100644 index 0000000..dc17e04 --- /dev/null +++ b/fe_calckey/frontend/assets/robots.txt @@ -0,0 +1,4 @@ +user-agent: * +allow: / + +# todo: sitemap diff --git a/fe_calckey/frontend/assets/screenshots/1.webp b/fe_calckey/frontend/assets/screenshots/1.webp new file mode 100644 index 0000000..50a69a1 Binary files /dev/null and b/fe_calckey/frontend/assets/screenshots/1.webp differ diff --git a/fe_calckey/frontend/assets/screenshots/2.webp b/fe_calckey/frontend/assets/screenshots/2.webp new file mode 100644 index 0000000..3686dc6 Binary files /dev/null and b/fe_calckey/frontend/assets/screenshots/2.webp differ diff --git a/fe_calckey/frontend/assets/sounds/aisha/1.mp3 b/fe_calckey/frontend/assets/sounds/aisha/1.mp3 new file mode 100644 index 0000000..d8e9a2f Binary files /dev/null and b/fe_calckey/frontend/assets/sounds/aisha/1.mp3 differ diff --git a/fe_calckey/frontend/assets/sounds/aisha/2.mp3 b/fe_calckey/frontend/assets/sounds/aisha/2.mp3 new file mode 100644 index 0000000..477c2eb Binary files /dev/null and b/fe_calckey/frontend/assets/sounds/aisha/2.mp3 differ diff --git a/fe_calckey/frontend/assets/sounds/aisha/3.mp3 b/fe_calckey/frontend/assets/sounds/aisha/3.mp3 new file mode 100644 index 0000000..fe0d806 Binary files /dev/null and b/fe_calckey/frontend/assets/sounds/aisha/3.mp3 differ diff --git a/fe_calckey/frontend/assets/sounds/noizenecio/kick_gaba.mp3 b/fe_calckey/frontend/assets/sounds/noizenecio/kick_gaba.mp3 new file mode 100644 index 0000000..616b506 Binary files /dev/null and b/fe_calckey/frontend/assets/sounds/noizenecio/kick_gaba.mp3 differ diff --git a/fe_calckey/frontend/assets/sounds/noizenecio/kick_gaba2.mp3 b/fe_calckey/frontend/assets/sounds/noizenecio/kick_gaba2.mp3 new file mode 100644 index 0000000..33c2837 Binary files /dev/null and b/fe_calckey/frontend/assets/sounds/noizenecio/kick_gaba2.mp3 differ diff --git a/fe_calckey/frontend/assets/sounds/syuilo/down.mp3 b/fe_calckey/frontend/assets/sounds/syuilo/down.mp3 new file mode 100644 index 0000000..4cd4211 Binary files /dev/null and b/fe_calckey/frontend/assets/sounds/syuilo/down.mp3 differ diff --git a/fe_calckey/frontend/assets/sounds/syuilo/kick.mp3 b/fe_calckey/frontend/assets/sounds/syuilo/kick.mp3 new file mode 100644 index 0000000..4e0e720 Binary files /dev/null and b/fe_calckey/frontend/assets/sounds/syuilo/kick.mp3 differ diff --git a/fe_calckey/frontend/assets/sounds/syuilo/pirori-square-wet.mp3 b/fe_calckey/frontend/assets/sounds/syuilo/pirori-square-wet.mp3 new file mode 100644 index 0000000..babf1fc Binary files /dev/null and b/fe_calckey/frontend/assets/sounds/syuilo/pirori-square-wet.mp3 differ diff --git a/fe_calckey/frontend/assets/sounds/syuilo/pirori-wet.mp3 b/fe_calckey/frontend/assets/sounds/syuilo/pirori-wet.mp3 new file mode 100644 index 0000000..25e2c46 Binary files /dev/null and b/fe_calckey/frontend/assets/sounds/syuilo/pirori-wet.mp3 differ diff --git a/fe_calckey/frontend/assets/sounds/syuilo/pirori.mp3 b/fe_calckey/frontend/assets/sounds/syuilo/pirori.mp3 new file mode 100644 index 0000000..a745415 Binary files /dev/null and b/fe_calckey/frontend/assets/sounds/syuilo/pirori.mp3 differ diff --git a/fe_calckey/frontend/assets/sounds/syuilo/poi1.mp3 b/fe_calckey/frontend/assets/sounds/syuilo/poi1.mp3 new file mode 100644 index 0000000..59dae90 Binary files /dev/null and b/fe_calckey/frontend/assets/sounds/syuilo/poi1.mp3 differ diff --git a/fe_calckey/frontend/assets/sounds/syuilo/poi2.mp3 b/fe_calckey/frontend/assets/sounds/syuilo/poi2.mp3 new file mode 100644 index 0000000..a65c653 Binary files /dev/null and b/fe_calckey/frontend/assets/sounds/syuilo/poi2.mp3 differ diff --git a/fe_calckey/frontend/assets/sounds/syuilo/pope1.mp3 b/fe_calckey/frontend/assets/sounds/syuilo/pope1.mp3 new file mode 100644 index 0000000..d6f53cf Binary files /dev/null and b/fe_calckey/frontend/assets/sounds/syuilo/pope1.mp3 differ diff --git a/fe_calckey/frontend/assets/sounds/syuilo/pope2.mp3 b/fe_calckey/frontend/assets/sounds/syuilo/pope2.mp3 new file mode 100644 index 0000000..fe5d95e Binary files /dev/null and b/fe_calckey/frontend/assets/sounds/syuilo/pope2.mp3 differ diff --git a/fe_calckey/frontend/assets/sounds/syuilo/popo.mp3 b/fe_calckey/frontend/assets/sounds/syuilo/popo.mp3 new file mode 100644 index 0000000..a2a1605 Binary files /dev/null and b/fe_calckey/frontend/assets/sounds/syuilo/popo.mp3 differ diff --git a/fe_calckey/frontend/assets/sounds/syuilo/queue-jammed.mp3 b/fe_calckey/frontend/assets/sounds/syuilo/queue-jammed.mp3 new file mode 100644 index 0000000..99e0c43 Binary files /dev/null and b/fe_calckey/frontend/assets/sounds/syuilo/queue-jammed.mp3 differ diff --git a/fe_calckey/frontend/assets/sounds/syuilo/reverved.mp3 b/fe_calckey/frontend/assets/sounds/syuilo/reverved.mp3 new file mode 100644 index 0000000..47588ef Binary files /dev/null and b/fe_calckey/frontend/assets/sounds/syuilo/reverved.mp3 differ diff --git a/fe_calckey/frontend/assets/sounds/syuilo/ryukyu.mp3 b/fe_calckey/frontend/assets/sounds/syuilo/ryukyu.mp3 new file mode 100644 index 0000000..9e935e3 Binary files /dev/null and b/fe_calckey/frontend/assets/sounds/syuilo/ryukyu.mp3 differ diff --git a/fe_calckey/frontend/assets/sounds/syuilo/snare.mp3 b/fe_calckey/frontend/assets/sounds/syuilo/snare.mp3 new file mode 100644 index 0000000..9244189 Binary files /dev/null and b/fe_calckey/frontend/assets/sounds/syuilo/snare.mp3 differ diff --git a/fe_calckey/frontend/assets/sounds/syuilo/square-pico.mp3 b/fe_calckey/frontend/assets/sounds/syuilo/square-pico.mp3 new file mode 100644 index 0000000..c4d8305 Binary files /dev/null and b/fe_calckey/frontend/assets/sounds/syuilo/square-pico.mp3 differ diff --git a/fe_calckey/frontend/assets/sounds/syuilo/triple.mp3 b/fe_calckey/frontend/assets/sounds/syuilo/triple.mp3 new file mode 100644 index 0000000..54ab974 Binary files /dev/null and b/fe_calckey/frontend/assets/sounds/syuilo/triple.mp3 differ diff --git a/fe_calckey/frontend/assets/sounds/syuilo/up.mp3 b/fe_calckey/frontend/assets/sounds/syuilo/up.mp3 new file mode 100644 index 0000000..3f30867 Binary files /dev/null and b/fe_calckey/frontend/assets/sounds/syuilo/up.mp3 differ diff --git a/fe_calckey/frontend/assets/sounds/syuilo/waon.mp3 b/fe_calckey/frontend/assets/sounds/syuilo/waon.mp3 new file mode 100644 index 0000000..a4af473 Binary files /dev/null and b/fe_calckey/frontend/assets/sounds/syuilo/waon.mp3 differ diff --git a/fe_calckey/frontend/assets/splash.png b/fe_calckey/frontend/assets/splash.png new file mode 100644 index 0000000..8c1da72 Binary files /dev/null and b/fe_calckey/frontend/assets/splash.png differ diff --git a/fe_calckey/frontend/assets/user-unknown.png b/fe_calckey/frontend/assets/user-unknown.png new file mode 100644 index 0000000..ab29bef Binary files /dev/null and b/fe_calckey/frontend/assets/user-unknown.png differ diff --git a/fe_calckey/frontend/assets/woozy.png b/fe_calckey/frontend/assets/woozy.png new file mode 100644 index 0000000..7e33530 Binary files /dev/null and b/fe_calckey/frontend/assets/woozy.png differ diff --git a/fe_calckey/frontend/calckey-js/.editorconfig b/fe_calckey/frontend/calckey-js/.editorconfig new file mode 100644 index 0000000..da178f0 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/.editorconfig @@ -0,0 +1,7 @@ +root = true + +[*] +indent_style = tab +indent_size = 2 +charset = utf-8 +insert_final_newline = true diff --git a/fe_calckey/frontend/calckey-js/.gitignore b/fe_calckey/frontend/calckey-js/.gitignore new file mode 100644 index 0000000..8a97abf --- /dev/null +++ b/fe_calckey/frontend/calckey-js/.gitignore @@ -0,0 +1,113 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# Next.js build output +.next + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and *not* Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# App +temp +# built + +# Yarn +.yarn/* +.pnp.cjs +.pnp.loader.mjs diff --git a/fe_calckey/frontend/calckey-js/.swcrc b/fe_calckey/frontend/calckey-js/.swcrc new file mode 100644 index 0000000..508e597 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/.swcrc @@ -0,0 +1,20 @@ +{ + "$schema": "https://json.schemastore.org/swcrc", + "jsc": { + "parser": { + "syntax": "typescript", + "dynamicImport": true, + "decorators": true + }, + "transform": { + "legacyDecorator": true, + "decoratorMetadata": true + }, + "target": "es2022" + }, + "minify": false, + "module": { + "type": "commonjs", + "strict": true + } +} diff --git a/fe_calckey/frontend/calckey-js/CHANGELOG.md b/fe_calckey/frontend/calckey-js/CHANGELOG.md new file mode 100644 index 0000000..88a5c24 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/CHANGELOG.md @@ -0,0 +1,29 @@ +# 0.0.14 +- remove needless Object.freeze() + +# 0.0.13 +- expose ChannelConnection and Channels types + +# 0.0.12 +- fix a bug that cannot connect to streaming + +# 0.0.11 +- update user type +- add missing main stream types + +# 0.0.10 +- add consts + +# 0.0.9 +- add list of api permission +- Update Note type + +# 0.0.8 +- add type definition for `messagingMessage` event to main stream channel +- Update Note type + +# 0.0.7 +- Notificationsの型を修正 +- MessagingMessageの型を修正 +- UserLiteの型を修正 +- apiでネイティブfetchを格納する際に無名関数でラップするように diff --git a/fe_calckey/frontend/calckey-js/LICENSE b/fe_calckey/frontend/calckey-js/LICENSE new file mode 100644 index 0000000..11c1f9c --- /dev/null +++ b/fe_calckey/frontend/calckey-js/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021-2022 syuilo and other contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/fe_calckey/frontend/calckey-js/README.md b/fe_calckey/frontend/calckey-js/README.md new file mode 100644 index 0000000..0aef8d6 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/README.md @@ -0,0 +1,9 @@ +# Calckey.js + +Fork of Misskey.js for Calckey + +https://www.npmjs.com/package/calckey-js + +To fully build, run `pnpm i && pnpm run render`. + +![Parody of the Javascript logo with "CK" instead of "JS"](https://codeberg.org/repo-avatars/80771-4d86135f67b9a460cdd1be9e91648e5f) diff --git a/fe_calckey/frontend/calckey-js/api-extractor.json b/fe_calckey/frontend/calckey-js/api-extractor.json new file mode 100644 index 0000000..a95281a --- /dev/null +++ b/fe_calckey/frontend/calckey-js/api-extractor.json @@ -0,0 +1,364 @@ +/** + * Config file for API Extractor. For more info, please visit: https://api-extractor.com + */ +{ + "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", + + /** + * Optionally specifies another JSON config file that this file extends from. This provides a way for + * standard settings to be shared across multiple projects. + * + * If the path starts with "./" or "../", the path is resolved relative to the folder of the file that contains + * the "extends" field. Otherwise, the first path segment is interpreted as an NPM package name, and will be + * resolved using NodeJS require(). + * + * SUPPORTED TOKENS: none + * DEFAULT VALUE: "" + */ + // "extends": "./shared/api-extractor-base.json" + // "extends": "my-package/include/api-extractor-base.json" + + /** + * Determines the "" token that can be used with other config file settings. The project folder + * typically contains the tsconfig.json and package.json config files, but the path is user-defined. + * + * The path is resolved relative to the folder of the config file that contains the setting. + * + * The default value for "projectFolder" is the token "", which means the folder is determined by traversing + * parent folders, starting from the folder containing api-extractor.json, and stopping at the first folder + * that contains a tsconfig.json file. If a tsconfig.json file cannot be found in this way, then an error + * will be reported. + * + * SUPPORTED TOKENS: + * DEFAULT VALUE: "" + */ + // "projectFolder": "..", + + /** + * (REQUIRED) Specifies the .d.ts file to be used as the starting point for analysis. API Extractor + * analyzes the symbols exported by this module. + * + * The file extension must be ".d.ts" and not ".ts". + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + */ + "mainEntryPointFilePath": "/built/index.d.ts", + + /** + * A list of NPM package names whose exports should be treated as part of this package. + * + * For example, suppose that Webpack is used to generate a distributed bundle for the project "library1", + * and another NPM package "library2" is embedded in this bundle. Some types from library2 may become part + * of the exported API for library1, but by default API Extractor would generate a .d.ts rollup that explicitly + * imports library2. To avoid this, we can specify: + * + * "bundledPackages": [ "library2" ], + * + * This would direct API Extractor to embed those types directly in the .d.ts rollup, as if they had been + * local files for library1. + */ + "bundledPackages": [], + + /** + * Determines how the TypeScript compiler engine will be invoked by API Extractor. + */ + "compiler": { + /** + * Specifies the path to the tsconfig.json file to be used by API Extractor when analyzing the project. + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * Note: This setting will be ignored if "overrideTsconfig" is used. + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "/tsconfig.json" + */ + // "tsconfigFilePath": "/tsconfig.json", + /** + * Provides a compiler configuration that will be used instead of reading the tsconfig.json file from disk. + * The object must conform to the TypeScript tsconfig schema: + * + * http://json.schemastore.org/tsconfig + * + * If omitted, then the tsconfig.json file will be read from the "projectFolder". + * + * DEFAULT VALUE: no overrideTsconfig section + */ + // "overrideTsconfig": { + // . . . + // } + /** + * This option causes the compiler to be invoked with the --skipLibCheck option. This option is not recommended + * and may cause API Extractor to produce incomplete or incorrect declarations, but it may be required when + * dependencies contain declarations that are incompatible with the TypeScript engine that API Extractor uses + * for its analysis. Where possible, the underlying issue should be fixed rather than relying on skipLibCheck. + * + * DEFAULT VALUE: false + */ + // "skipLibCheck": true, + }, + + /** + * Configures how the API report file (*.api.md) will be generated. + */ + "apiReport": { + /** + * (REQUIRED) Whether to generate an API report. + */ + "enabled": true + + /** + * The filename for the API report files. It will be combined with "reportFolder" or "reportTempFolder" to produce + * a full file path. + * + * The file extension should be ".api.md", and the string should not contain a path separator such as "\" or "/". + * + * SUPPORTED TOKENS: , + * DEFAULT VALUE: ".api.md" + */ + // "reportFileName": ".api.md", + + /** + * Specifies the folder where the API report file is written. The file name portion is determined by + * the "reportFileName" setting. + * + * The API report file is normally tracked by Git. Changes to it can be used to trigger a branch policy, + * e.g. for an API review. + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "/etc/" + */ + // "reportFolder": "/etc/", + + /** + * Specifies the folder where the temporary report file is written. The file name portion is determined by + * the "reportFileName" setting. + * + * After the temporary file is written to disk, it is compared with the file in the "reportFolder". + * If they are different, a production build will fail. + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "/temp/" + */ + // "reportTempFolder": "/temp/" + }, + + /** + * Configures how the doc model file (*.api.json) will be generated. + */ + "docModel": { + /** + * (REQUIRED) Whether to generate a doc model file. + */ + "enabled": true + + /** + * The output path for the doc model file. The file extension should be ".api.json". + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "/temp/.api.json" + */ + // "apiJsonFilePath": "/temp/.api.json" + }, + + /** + * Configures how the .d.ts rollup file will be generated. + */ + "dtsRollup": { + /** + * (REQUIRED) Whether to generate the .d.ts rollup file. + */ + "enabled": false + + /** + * Specifies the output path for a .d.ts rollup file to be generated without any trimming. + * This file will include all declarations that are exported by the main entry point. + * + * If the path is an empty string, then this file will not be written. + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "/dist/.d.ts" + */ + // "untrimmedFilePath": "/dist/.d.ts", + + /** + * Specifies the output path for a .d.ts rollup file to be generated with trimming for a "beta" release. + * This file will include only declarations that are marked as "@public" or "@beta". + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "" + */ + // "betaTrimmedFilePath": "/dist/-beta.d.ts", + + /** + * Specifies the output path for a .d.ts rollup file to be generated with trimming for a "public" release. + * This file will include only declarations that are marked as "@public". + * + * If the path is an empty string, then this file will not be written. + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "" + */ + // "publicTrimmedFilePath": "/dist/-public.d.ts", + + /** + * When a declaration is trimmed, by default it will be replaced by a code comment such as + * "Excluded from this release type: exampleMember". Set "omitTrimmingComments" to true to remove the + * declaration completely. + * + * DEFAULT VALUE: false + */ + // "omitTrimmingComments": true + }, + + /** + * Configures how the tsdoc-metadata.json file will be generated. + */ + "tsdocMetadata": { + /** + * Whether to generate the tsdoc-metadata.json file. + * + * DEFAULT VALUE: true + */ + // "enabled": true, + /** + * Specifies where the TSDoc metadata file should be written. + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * The default value is "", which causes the path to be automatically inferred from the "tsdocMetadata", + * "typings" or "main" fields of the project's package.json. If none of these fields are set, the lookup + * falls back to "tsdoc-metadata.json" in the package folder. + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "" + */ + // "tsdocMetadataFilePath": "/dist/tsdoc-metadata.json" + }, + + /** + * Specifies what type of newlines API Extractor should use when writing output files. By default, the output files + * will be written with Windows-style newlines. To use POSIX-style newlines, specify "lf" instead. + * To use the OS's default newline kind, specify "os". + * + * DEFAULT VALUE: "crlf" + */ + // "newlineKind": "crlf", + + /** + * Configures how API Extractor reports error and warning messages produced during analysis. + * + * There are three sources of messages: compiler messages, API Extractor messages, and TSDoc messages. + */ + "messages": { + /** + * Configures handling of diagnostic messages reported by the TypeScript compiler engine while analyzing + * the input .d.ts files. + * + * TypeScript message identifiers start with "TS" followed by an integer. For example: "TS2551" + * + * DEFAULT VALUE: A single "default" entry with logLevel=warning. + */ + "compilerMessageReporting": { + /** + * Configures the default routing for messages that don't match an explicit rule in this table. + */ + "default": { + /** + * Specifies whether the message should be written to the the tool's output log. Note that + * the "addToApiReportFile" property may supersede this option. + * + * Possible values: "error", "warning", "none" + * + * Errors cause the build to fail and return a nonzero exit code. Warnings cause a production build fail + * and return a nonzero exit code. For a non-production build (e.g. when "api-extractor run" includes + * the "--local" option), the warning is displayed but the build will not fail. + * + * DEFAULT VALUE: "warning" + */ + "logLevel": "warning" + + /** + * When addToApiReportFile is true: If API Extractor is configured to write an API report file (.api.md), + * then the message will be written inside that file; otherwise, the message is instead logged according to + * the "logLevel" option. + * + * DEFAULT VALUE: false + */ + // "addToApiReportFile": false + } + + // "TS2551": { + // "logLevel": "warning", + // "addToApiReportFile": true + // }, + // + // . . . + }, + + /** + * Configures handling of messages reported by API Extractor during its analysis. + * + * API Extractor message identifiers start with "ae-". For example: "ae-extra-release-tag" + * + * DEFAULT VALUE: See api-extractor-defaults.json for the complete table of extractorMessageReporting mappings + */ + "extractorMessageReporting": { + "default": { + "logLevel": "none" + // "addToApiReportFile": false + } + + // "ae-extra-release-tag": { + // "logLevel": "warning", + // "addToApiReportFile": true + // }, + // + // . . . + }, + + /** + * Configures handling of messages reported by the TSDoc parser when analyzing code comments. + * + * TSDoc message identifiers start with "tsdoc-". For example: "tsdoc-link-tag-unescaped-text" + * + * DEFAULT VALUE: A single "default" entry with logLevel=warning. + */ + "tsdocMessageReporting": { + "default": { + "logLevel": "warning" + // "addToApiReportFile": false + } + + // "tsdoc-link-tag-unescaped-text": { + // "logLevel": "warning", + // "addToApiReportFile": true + // }, + // + // . . . + } + } +} diff --git a/fe_calckey/frontend/calckey-js/codecov.yml b/fe_calckey/frontend/calckey-js/codecov.yml new file mode 100644 index 0000000..5242987 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/codecov.yml @@ -0,0 +1,2 @@ +codecov: + token: d55e1270-f20a-4727-aa05-2bd57793315a diff --git a/fe_calckey/frontend/calckey-js/etc/calckey-js.api.json b/fe_calckey/frontend/calckey-js/etc/calckey-js.api.json new file mode 100644 index 0000000..4f13a4d --- /dev/null +++ b/fe_calckey/frontend/calckey-js/etc/calckey-js.api.json @@ -0,0 +1,9814 @@ +{ + "metadata": { + "toolPackage": "@microsoft/api-extractor", + "toolVersion": "7.36.0", + "schemaVersion": 1011, + "oldestForwardsCompatibleVersion": 1001, + "tsdocConfig": { + "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json", + "noStandardTags": true, + "tagDefinitions": [ + { + "tagName": "@alpha", + "syntaxKind": "modifier" + }, + { + "tagName": "@beta", + "syntaxKind": "modifier" + }, + { + "tagName": "@defaultValue", + "syntaxKind": "block" + }, + { + "tagName": "@decorator", + "syntaxKind": "block", + "allowMultiple": true + }, + { + "tagName": "@deprecated", + "syntaxKind": "block" + }, + { + "tagName": "@eventProperty", + "syntaxKind": "modifier" + }, + { + "tagName": "@example", + "syntaxKind": "block", + "allowMultiple": true + }, + { + "tagName": "@experimental", + "syntaxKind": "modifier" + }, + { + "tagName": "@inheritDoc", + "syntaxKind": "inline" + }, + { + "tagName": "@internal", + "syntaxKind": "modifier" + }, + { + "tagName": "@label", + "syntaxKind": "inline" + }, + { + "tagName": "@link", + "syntaxKind": "inline", + "allowMultiple": true + }, + { + "tagName": "@override", + "syntaxKind": "modifier" + }, + { + "tagName": "@packageDocumentation", + "syntaxKind": "modifier" + }, + { + "tagName": "@param", + "syntaxKind": "block", + "allowMultiple": true + }, + { + "tagName": "@privateRemarks", + "syntaxKind": "block" + }, + { + "tagName": "@public", + "syntaxKind": "modifier" + }, + { + "tagName": "@readonly", + "syntaxKind": "modifier" + }, + { + "tagName": "@remarks", + "syntaxKind": "block" + }, + { + "tagName": "@returns", + "syntaxKind": "block" + }, + { + "tagName": "@sealed", + "syntaxKind": "modifier" + }, + { + "tagName": "@see", + "syntaxKind": "block" + }, + { + "tagName": "@throws", + "syntaxKind": "block", + "allowMultiple": true + }, + { + "tagName": "@typeParam", + "syntaxKind": "block", + "allowMultiple": true + }, + { + "tagName": "@virtual", + "syntaxKind": "modifier" + }, + { + "tagName": "@betaDocumentation", + "syntaxKind": "modifier" + }, + { + "tagName": "@internalRemarks", + "syntaxKind": "block" + }, + { + "tagName": "@preapproved", + "syntaxKind": "modifier" + } + ], + "supportForTags": { + "@alpha": true, + "@beta": true, + "@defaultValue": true, + "@decorator": true, + "@deprecated": true, + "@eventProperty": true, + "@example": true, + "@experimental": true, + "@inheritDoc": true, + "@internal": true, + "@label": true, + "@link": true, + "@override": true, + "@packageDocumentation": true, + "@param": true, + "@privateRemarks": true, + "@public": true, + "@readonly": true, + "@remarks": true, + "@returns": true, + "@sealed": true, + "@see": true, + "@throws": true, + "@typeParam": true, + "@virtual": true, + "@betaDocumentation": true, + "@internalRemarks": true, + "@preapproved": true + }, + "reportUnsupportedHtmlElements": false + } + }, + "kind": "Package", + "canonicalReference": "calckey-js!", + "docComment": "", + "name": "calckey-js", + "preserveMemberOrder": false, + "members": [ + { + "kind": "EntryPoint", + "canonicalReference": "calckey-js!", + "name": "", + "preserveMemberOrder": false, + "members": [ + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!Acct:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Acct = " + }, + { + "kind": "Content", + "text": "{\n\tusername: string;\n\thost: string | null;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/acct.ts", + "releaseTag": "Public", + "name": "Acct", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "Namespace", + "canonicalReference": "calckey-js!api:namespace", + "docComment": "", + "excerptTokens": [], + "fileUrlPath": "src/index.ts", + "releaseTag": "None", + "name": "api", + "preserveMemberOrder": false, + "members": [ + { + "kind": "Class", + "canonicalReference": "calckey-js!api.APIClient:class", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare class APIClient " + } + ], + "fileUrlPath": "src/api.ts", + "releaseTag": "Public", + "isAbstract": false, + "name": "APIClient", + "preserveMemberOrder": false, + "members": [ + { + "kind": "Constructor", + "canonicalReference": "calckey-js!api.APIClient:constructor(1)", + "docComment": "/**\n * Constructs a new instance of the `APIClient` class\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "constructor(opts: " + }, + { + "kind": "Content", + "text": "{\n\t\torigin: " + }, + { + "kind": "Reference", + "text": "APIClient", + "canonicalReference": "calckey-js!api.APIClient:class" + }, + { + "kind": "Content", + "text": "[\"origin\"];\n\t\tcredential?: " + }, + { + "kind": "Reference", + "text": "APIClient", + "canonicalReference": "calckey-js!api.APIClient:class" + }, + { + "kind": "Content", + "text": "[\"credential\"];\n\t\tfetch?: " + }, + { + "kind": "Reference", + "text": "APIClient", + "canonicalReference": "calckey-js!api.APIClient:class" + }, + { + "kind": "Content", + "text": "[\"fetch\"] | null | undefined;\n\t}" + }, + { + "kind": "Content", + "text": ");" + } + ], + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "opts", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 8 + }, + "isOptional": false + } + ] + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!api.APIClient#credential:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "credential: " + }, + { + "kind": "Content", + "text": "string | null | undefined" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "credential", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": false, + "isAbstract": false + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!api.APIClient#fetch:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "fetch: " + }, + { + "kind": "Reference", + "text": "FetchLike", + "canonicalReference": "calckey-js!api.FetchLike:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "fetch", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": false, + "isAbstract": false + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!api.APIClient#origin:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "origin: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "origin", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": false, + "isAbstract": false + }, + { + "kind": "Method", + "canonicalReference": "calckey-js!api.APIClient#request:member(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "request(\n\t\tendpoint: " + }, + { + "kind": "Content", + "text": "E" + }, + { + "kind": "Content", + "text": ",\n\t\tparams?: " + }, + { + "kind": "Content", + "text": "P" + }, + { + "kind": "Content", + "text": ",\n\t\tcredential?: " + }, + { + "kind": "Content", + "text": "string | null | undefined" + }, + { + "kind": "Content", + "text": ",\n\t): " + }, + { + "kind": "Reference", + "text": "Promise", + "canonicalReference": "!Promise:interface" + }, + { + "kind": "Content", + "text": "<\n\t\t" + }, + { + "kind": "Reference", + "text": "Endpoints", + "canonicalReference": "calckey-js!Endpoints:type" + }, + { + "kind": "Content", + "text": "[E][\"res\"] extends {\n\t\t\t$switch: {\n\t\t\t\t$cases: [any, any][];\n\t\t\t\t$default: any;\n\t\t\t};\n\t\t}\n\t\t\t? " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": " extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": " extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": " extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": " extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": " extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": " extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": " extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": " extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": " extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "IsCaseMatched", + "canonicalReference": "calckey-js!~IsCaseMatched:type" + }, + { + "kind": "Content", + "text": " extends true\n\t\t\t\t? " + }, + { + "kind": "Reference", + "text": "GetCaseResult", + "canonicalReference": "calckey-js!~GetCaseResult:type" + }, + { + "kind": "Content", + "text": "\n\t\t\t\t: " + }, + { + "kind": "Reference", + "text": "Endpoints", + "canonicalReference": "calckey-js!Endpoints:type" + }, + { + "kind": "Content", + "text": "[E][\"res\"][\"$switch\"][\"$default\"]\n\t\t\t: " + }, + { + "kind": "Reference", + "text": "Endpoints", + "canonicalReference": "calckey-js!Endpoints:type" + }, + { + "kind": "Content", + "text": "[E][\"res\"]\n\t>" + }, + { + "kind": "Content", + "text": ";" + } + ], + "typeParameters": [ + { + "typeParameterName": "E", + "constraintTokenRange": { + "startIndex": 1, + "endIndex": 3 + }, + "defaultTypeTokenRange": { + "startIndex": 0, + "endIndex": 0 + } + }, + { + "typeParameterName": "P", + "constraintTokenRange": { + "startIndex": 4, + "endIndex": 6 + }, + "defaultTypeTokenRange": { + "startIndex": 0, + "endIndex": 0 + } + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 13, + "endIndex": 61 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "endpoint", + "parameterTypeTokenRange": { + "startIndex": 7, + "endIndex": 8 + }, + "isOptional": false + }, + { + "parameterName": "params", + "parameterTypeTokenRange": { + "startIndex": 9, + "endIndex": 10 + }, + "isOptional": true + }, + { + "parameterName": "credential", + "parameterTypeTokenRange": { + "startIndex": 11, + "endIndex": 12 + }, + "isOptional": true + } + ], + "isOptional": false, + "isAbstract": false, + "name": "request" + } + ], + "implementsTokenRanges": [] + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!api.APIError:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type APIError = " + }, + { + "kind": "Content", + "text": "{\n\tid: string;\n\tcode: string;\n\tmessage: string;\n\tkind: \"client\" | \"server\";\n\tinfo: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": ";\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/api.ts", + "releaseTag": "Public", + "name": "APIError", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 4 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!api.FetchLike:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type FetchLike = " + }, + { + "kind": "Content", + "text": "(\n\tinput: string,\n\tinit?: {\n\t\tmethod?: string;\n\t\tbody?: string;\n\t\tcredentials?: " + }, + { + "kind": "Reference", + "text": "RequestCredentials", + "canonicalReference": "!RequestCredentials:type" + }, + { + "kind": "Content", + "text": ";\n\t\tcache?: " + }, + { + "kind": "Reference", + "text": "RequestCache", + "canonicalReference": "!RequestCache:type" + }, + { + "kind": "Content", + "text": ";\n\t},\n) => " + }, + { + "kind": "Reference", + "text": "Promise", + "canonicalReference": "!Promise:interface" + }, + { + "kind": "Content", + "text": "<{\n\tstatus: number;\n\tjson(): " + }, + { + "kind": "Reference", + "text": "Promise", + "canonicalReference": "!Promise:interface" + }, + { + "kind": "Content", + "text": ";\n}>" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/api.ts", + "releaseTag": "Public", + "name": "FetchLike", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 10 + } + }, + { + "kind": "Function", + "canonicalReference": "calckey-js!api.isAPIError:function(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare function isAPIError(reason: " + }, + { + "kind": "Content", + "text": "any" + }, + { + "kind": "Content", + "text": "): " + }, + { + "kind": "Reference", + "text": "reason", + "canonicalReference": "calckey-js!~reason" + }, + { + "kind": "Content", + "text": " is " + }, + { + "kind": "Reference", + "text": "APIError", + "canonicalReference": "calckey-js!api.APIError:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/api.ts", + "returnTypeTokenRange": { + "startIndex": 3, + "endIndex": 6 + }, + "releaseTag": "Public", + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "reason", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isOptional": false + } + ], + "name": "isAPIError" + } + ] + }, + { + "kind": "Class", + "canonicalReference": "calckey-js!ChannelConnection:class", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare abstract class Connection<\n\tChannel extends " + }, + { + "kind": "Reference", + "text": "AnyOf", + "canonicalReference": "calckey-js!~AnyOf:type" + }, + { + "kind": "Content", + "text": "<" + }, + { + "kind": "Reference", + "text": "Channels", + "canonicalReference": "calckey-js!Channels:type" + }, + { + "kind": "Content", + "text": ">" + }, + { + "kind": "Content", + "text": " = " + }, + { + "kind": "Content", + "text": "any" + }, + { + "kind": "Content", + "text": ",\n> extends " + }, + { + "kind": "Reference", + "text": "EventEmitter", + "canonicalReference": "eventemitter3!EventEmitter.EventEmitter" + }, + { + "kind": "Content", + "text": "" + }, + { + "kind": "Content", + "text": " " + } + ], + "fileUrlPath": "src/streaming.ts", + "releaseTag": "Public", + "typeParameters": [ + { + "typeParameterName": "Channel", + "constraintTokenRange": { + "startIndex": 1, + "endIndex": 5 + }, + "defaultTypeTokenRange": { + "startIndex": 6, + "endIndex": 7 + } + } + ], + "isAbstract": true, + "name": "ChannelConnection", + "preserveMemberOrder": false, + "members": [ + { + "kind": "Constructor", + "canonicalReference": "calckey-js!ChannelConnection:constructor(1)", + "docComment": "/**\n * Constructs a new instance of the `Connection` class\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "constructor(stream: " + }, + { + "kind": "Reference", + "text": "Stream", + "canonicalReference": "calckey-js!Stream:class" + }, + { + "kind": "Content", + "text": ", channel: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ", name?: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ");" + } + ], + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "stream", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isOptional": false + }, + { + "parameterName": "channel", + "parameterTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + }, + "isOptional": false + }, + { + "parameterName": "name", + "parameterTypeTokenRange": { + "startIndex": 5, + "endIndex": 6 + }, + "isOptional": true + } + ] + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!ChannelConnection#channel:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "channel: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "channel", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": false, + "isAbstract": false + }, + { + "kind": "Method", + "canonicalReference": "calckey-js!ChannelConnection#dispose:member(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "abstract dispose(): " + }, + { + "kind": "Content", + "text": "void" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [], + "isOptional": false, + "isAbstract": true, + "name": "dispose" + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!ChannelConnection#id:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "abstract id: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "id", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": false, + "isAbstract": true + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!ChannelConnection#inCount:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "inCount: " + }, + { + "kind": "Content", + "text": "number" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "inCount", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": false, + "isAbstract": false + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!ChannelConnection#name:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "name?: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": true, + "releaseTag": "Public", + "name": "name", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": false, + "isAbstract": false + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!ChannelConnection#outCount:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "outCount: " + }, + { + "kind": "Content", + "text": "number" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "outCount", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": false, + "isAbstract": false + }, + { + "kind": "Method", + "canonicalReference": "calckey-js!ChannelConnection#send:member(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "send(\n\t\ttype: " + }, + { + "kind": "Content", + "text": "T" + }, + { + "kind": "Content", + "text": ",\n\t\tbody: " + }, + { + "kind": "Content", + "text": "Channel[\"receives\"][T]" + }, + { + "kind": "Content", + "text": ",\n\t): " + }, + { + "kind": "Content", + "text": "void" + }, + { + "kind": "Content", + "text": ";" + } + ], + "typeParameters": [ + { + "typeParameterName": "T", + "constraintTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "defaultTypeTokenRange": { + "startIndex": 0, + "endIndex": 0 + } + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 7, + "endIndex": 8 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "type", + "parameterTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + }, + "isOptional": false + }, + { + "parameterName": "body", + "parameterTypeTokenRange": { + "startIndex": 5, + "endIndex": 6 + }, + "isOptional": false + } + ], + "isOptional": false, + "isAbstract": false, + "name": "send" + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!ChannelConnection#stream:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "protected stream: " + }, + { + "kind": "Reference", + "text": "Stream", + "canonicalReference": "calckey-js!Stream:class" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "stream", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": true, + "isAbstract": false + } + ], + "extendsTokenRange": { + "startIndex": 8, + "endIndex": 10 + }, + "implementsTokenRanges": [] + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!Channels:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Channels = " + }, + { + "kind": "Content", + "text": "{\n\tmain: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tnotification: (payload: " + }, + { + "kind": "Reference", + "text": "Notification", + "canonicalReference": "calckey-js!entities.Notification_2:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tmention: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\treply: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\trenote: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tfollow: (payload: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tfollowed: (payload: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tunfollow: (payload: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tmeUpdated: (payload: " + }, + { + "kind": "Reference", + "text": "MeDetailed", + "canonicalReference": "calckey-js!entities.MeDetailed:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tpageEvent: (payload: " + }, + { + "kind": "Reference", + "text": "PageEvent", + "canonicalReference": "calckey-js!entities.PageEvent:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\turlUploadFinished: (payload: {\n\t\t\t\tmarker: string;\n\t\t\t\tfile: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\t}) => void;\n\t\t\treadAllNotifications: () => void;\n\t\t\tunreadNotification: (payload: " + }, + { + "kind": "Reference", + "text": "Notification", + "canonicalReference": "calckey-js!entities.Notification_2:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tunreadMention: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"]) => void;\n\t\t\treadAllUnreadMentions: () => void;\n\t\t\tunreadSpecifiedNote: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"]) => void;\n\t\t\treadAllUnreadSpecifiedNotes: () => void;\n\t\t\treadAllMessagingMessages: () => void;\n\t\t\tmessagingMessage: (payload: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tunreadMessagingMessage: (payload: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\treadAllAntennas: () => void;\n\t\t\tunreadAntenna: (payload: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\treadAllAnnouncements: () => void;\n\t\t\treadAllChannels: () => void;\n\t\t\tunreadChannel: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"]) => void;\n\t\t\tmyTokenRegenerated: () => void;\n\t\t\treversiNoInvites: () => void;\n\t\t\treversiInvited: (payload: " + }, + { + "kind": "Reference", + "text": "FIXME", + "canonicalReference": "calckey-js!~FIXME:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tsignin: (payload: " + }, + { + "kind": "Reference", + "text": "FIXME", + "canonicalReference": "calckey-js!~FIXME:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tregistryUpdated: (payload: {\n\t\t\t\tscope?: string[];\n\t\t\t\tkey: string;\n\t\t\t\tvalue: any | null;\n\t\t\t}) => void;\n\t\t\tdriveFileCreated: (payload: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\treadAntenna: (payload: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\thomeTimeline: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tnote: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\tlocalTimeline: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tnote: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\thybridTimeline: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tnote: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\trecommendedTimeline: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tnote: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\tglobalTimeline: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tnote: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\tantenna: {\n\t\tparams: {\n\t\t\tantennaId: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tevents: {\n\t\t\tnote: (payload: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t};\n\t\treceives: null;\n\t};\n\tmessaging: {\n\t\tparams: {\n\t\t\totherparty?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t\tgroup?: " + }, + { + "kind": "Reference", + "text": "UserGroup", + "canonicalReference": "calckey-js!entities.UserGroup:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t};\n\t\tevents: {\n\t\t\tmessage: (payload: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t\tdeleted: (payload: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": "[\"id\"]) => void;\n\t\t\tread: (payload: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": "[\"id\"][]) => void;\n\t\t\ttypers: (payload: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[]) => void;\n\t\t};\n\t\treceives: {\n\t\t\tread: {\n\t\t\t\tid: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\t};\n\t\t};\n\t};\n\tserverStats: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tstats: (payload: " + }, + { + "kind": "Reference", + "text": "FIXME", + "canonicalReference": "calckey-js!~FIXME:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t};\n\t\treceives: {\n\t\t\trequestLog: {\n\t\t\t\tid: string | number;\n\t\t\t\tlength: number;\n\t\t\t};\n\t\t};\n\t};\n\tqueueStats: {\n\t\tparams: null;\n\t\tevents: {\n\t\t\tstats: (payload: " + }, + { + "kind": "Reference", + "text": "FIXME", + "canonicalReference": "calckey-js!~FIXME:type" + }, + { + "kind": "Content", + "text": ") => void;\n\t\t};\n\t\treceives: {\n\t\t\trequestLog: {\n\t\t\t\tid: string | number;\n\t\t\t\tlength: number;\n\t\t\t};\n\t\t};\n\t};\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/streaming.types.ts", + "releaseTag": "Public", + "name": "Channels", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 76 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!Endpoints:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Endpoints = " + }, + { + "kind": "Content", + "text": "{\n\t\"admin/abuse-user-reports\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/delete-all-files-of-a-user\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"admin/delete-logs\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: null;\n\t};\n\t\"admin/get-index-stats\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/get-table-stats\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/invite\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/logs\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/meta\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/reset-password\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/resolve-abuse-user-report\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/resync-chart\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/send-email\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/server-info\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/show-moderation-logs\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/show-user\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/show-users\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/silence-user\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/suspend-user\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/unsilence-user\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/unsuspend-user\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/update-meta\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/vacuum\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/accounts/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/ad/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/ad/delete\": {\n\t\treq: {\n\t\t\tid: " + }, + { + "kind": "Reference", + "text": "Ad", + "canonicalReference": "calckey-js!entities.Ad:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"admin/ad/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/ad/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/announcements/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/announcements/delete\": {\n\t\treq: {\n\t\t\tid: " + }, + { + "kind": "Reference", + "text": "Announcement", + "canonicalReference": "calckey-js!entities.Announcement:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"admin/announcements/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/announcements/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/drive/clean-remote-files\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/drive/cleanup\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/drive/files\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/drive/show-file\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/emoji/add\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/emoji/copy\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/emoji/list-remote\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/emoji/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/emoji/remove\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/emoji/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/federation/delete-all-files\": {\n\t\treq: {\n\t\t\thost: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"admin/federation/refresh-remote-instance-metadata\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/federation/remove-all-following\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/federation/update-instance\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/moderators/add\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/moderators/remove\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/promo/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/queue/clear\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/queue/deliver-delayed\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/queue/inbox-delayed\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/queue/jobs\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/queue/stats\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/relays/add\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/relays/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"admin/relays/remove\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\tannouncements: {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\twithUnreads?: boolean;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Announcement", + "canonicalReference": "calckey-js!entities.Announcement:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Announcement", + "canonicalReference": "calckey-js!entities.Announcement:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Announcement", + "canonicalReference": "calckey-js!entities.Announcement:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"antennas/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"antennas/delete\": {\n\t\treq: {\n\t\t\tantennaId: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"antennas/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"antennas/notes\": {\n\t\treq: {\n\t\t\tantennaId: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"antennas/show\": {\n\t\treq: {\n\t\t\tantennaId: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"antennas/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"antennas/mark-read\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Antenna", + "canonicalReference": "calckey-js!entities.Antenna:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"ap/get\": {\n\t\treq: {\n\t\t\turi: string;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"ap/show\": {\n\t\treq: {\n\t\t\turi: string;\n\t\t};\n\t\tres:\n\t\t\t| {\n\t\t\t\t\ttype: \"Note\";\n\t\t\t\t\tobject: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\t }\n\t\t\t| {\n\t\t\t\t\ttype: \"User\";\n\t\t\t\t\tobject: " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\t };\n\t};\n\t\"app/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "App", + "canonicalReference": "calckey-js!entities.App:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"app/show\": {\n\t\treq: {\n\t\t\tappId: " + }, + { + "kind": "Reference", + "text": "App", + "canonicalReference": "calckey-js!entities.App:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "App", + "canonicalReference": "calckey-js!entities.App:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"auth/accept\": {\n\t\treq: {\n\t\t\ttoken: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"auth/session/generate\": {\n\t\treq: {\n\t\t\tappSecret: string;\n\t\t};\n\t\tres: {\n\t\t\ttoken: string;\n\t\t\turl: string;\n\t\t};\n\t};\n\t\"auth/session/show\": {\n\t\treq: {\n\t\t\ttoken: string;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "AuthSession", + "canonicalReference": "calckey-js!entities.AuthSession:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"auth/session/userkey\": {\n\t\treq: {\n\t\t\tappSecret: string;\n\t\t\ttoken: string;\n\t\t};\n\t\tres: {\n\t\t\taccessToken: string;\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t};\n\t};\n\t\"blocking/create\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"blocking/delete\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"blocking/list\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Blocking", + "canonicalReference": "calckey-js!entities.Blocking:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Blocking", + "canonicalReference": "calckey-js!entities.Blocking:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Blocking", + "canonicalReference": "calckey-js!entities.Blocking:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"channels/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"channels/featured\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"channels/follow\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"channels/followed\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"channels/owned\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"channels/pin-note\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"channels/show\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"channels/timeline\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"channels/unfollow\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"channels/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"charts/active-users\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: {\n\t\t\tlocal: {\n\t\t\t\tusers: number[];\n\t\t\t};\n\t\t\tremote: {\n\t\t\t\tusers: number[];\n\t\t\t};\n\t\t};\n\t};\n\t\"charts/drive\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: {\n\t\t\tlocal: {\n\t\t\t\tdecCount: number[];\n\t\t\t\tdecSize: number[];\n\t\t\t\tincCount: number[];\n\t\t\t\tincSize: number[];\n\t\t\t\ttotalCount: number[];\n\t\t\t\ttotalSize: number[];\n\t\t\t};\n\t\t\tremote: {\n\t\t\t\tdecCount: number[];\n\t\t\t\tdecSize: number[];\n\t\t\t\tincCount: number[];\n\t\t\t\tincSize: number[];\n\t\t\t\ttotalCount: number[];\n\t\t\t\ttotalSize: number[];\n\t\t\t};\n\t\t};\n\t};\n\t\"charts/federation\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: {\n\t\t\tinstance: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t};\n\t\t};\n\t};\n\t\"charts/hashtag\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"charts/instance\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t\thost: string;\n\t\t};\n\t\tres: {\n\t\t\tdrive: {\n\t\t\t\tdecFiles: number[];\n\t\t\t\tdecUsage: number[];\n\t\t\t\tincFiles: number[];\n\t\t\t\tincUsage: number[];\n\t\t\t\ttotalFiles: number[];\n\t\t\t\ttotalUsage: number[];\n\t\t\t};\n\t\t\tfollowers: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t};\n\t\t\tfollowing: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t};\n\t\t\tnotes: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t\tdiffs: {\n\t\t\t\t\tnormal: number[];\n\t\t\t\t\trenote: number[];\n\t\t\t\t\treply: number[];\n\t\t\t\t};\n\t\t\t};\n\t\t\trequests: {\n\t\t\t\tfailed: number[];\n\t\t\t\treceived: number[];\n\t\t\t\tsucceeded: number[];\n\t\t\t};\n\t\t\tusers: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t};\n\t\t};\n\t};\n\t\"charts/network\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"charts/notes\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: {\n\t\t\tlocal: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t\tdiffs: {\n\t\t\t\t\tnormal: number[];\n\t\t\t\t\trenote: number[];\n\t\t\t\t\treply: number[];\n\t\t\t\t};\n\t\t\t};\n\t\t\tremote: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t\tdiffs: {\n\t\t\t\t\tnormal: number[];\n\t\t\t\t\trenote: number[];\n\t\t\t\t\treply: number[];\n\t\t\t\t};\n\t\t\t};\n\t\t};\n\t};\n\t\"charts/user/drive\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: {\n\t\t\tdecCount: number[];\n\t\t\tdecSize: number[];\n\t\t\tincCount: number[];\n\t\t\tincSize: number[];\n\t\t\ttotalCount: number[];\n\t\t\ttotalSize: number[];\n\t\t};\n\t};\n\t\"charts/user/following\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"charts/user/notes\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: {\n\t\t\tdec: number[];\n\t\t\tinc: number[];\n\t\t\ttotal: number[];\n\t\t\tdiffs: {\n\t\t\t\tnormal: number[];\n\t\t\t\trenote: number[];\n\t\t\t\treply: number[];\n\t\t\t};\n\t\t};\n\t};\n\t\"charts/user/reactions\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"charts/users\": {\n\t\treq: {\n\t\t\tspan: \"day\" | \"hour\";\n\t\t\tlimit?: number;\n\t\t\toffset?: number | null;\n\t\t};\n\t\tres: {\n\t\t\tlocal: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t};\n\t\t\tremote: {\n\t\t\t\tdec: number[];\n\t\t\t\tinc: number[];\n\t\t\t\ttotal: number[];\n\t\t\t};\n\t\t};\n\t};\n\t\"clips/add-note\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"clips/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"clips/delete\": {\n\t\treq: {\n\t\t\tclipId: " + }, + { + "kind": "Reference", + "text": "Clip", + "canonicalReference": "calckey-js!entities.Clip:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"clips/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"clips/notes\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"clips/show\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"clips/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\tdrive: {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: {\n\t\t\tcapacity: number;\n\t\t\tusage: number;\n\t\t};\n\t};\n\t\"drive/files\": {\n\t\treq: {\n\t\t\tfolderId?: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t\ttype?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"type\"] | null;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"drive/files/attached-notes\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"drive/files/check-existence\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"drive/files/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"drive/files/delete\": {\n\t\treq: {\n\t\t\tfileId: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"drive/files/find-by-hash\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"drive/files/find\": {\n\t\treq: {\n\t\t\tname: string;\n\t\t\tfolderId?: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"drive/files/show\": {\n\t\treq: {\n\t\t\tfileId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\turl?: string;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"drive/files/update\": {\n\t\treq: {\n\t\t\tfileId: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tfolderId?: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t\tname?: string;\n\t\t\tisSensitive?: boolean;\n\t\t\tcomment?: string | null;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"drive/files/upload-from-url\": {\n\t\treq: {\n\t\t\turl: string;\n\t\t\tfolderId?: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t\tisSensitive?: boolean;\n\t\t\tcomment?: string | null;\n\t\t\tmarker?: string | null;\n\t\t\tforce?: boolean;\n\t\t};\n\t\tres: null;\n\t};\n\t\"drive/folders\": {\n\t\treq: {\n\t\t\tfolderId?: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"drive/folders/create\": {\n\t\treq: {\n\t\t\tname?: string;\n\t\t\tparentId?: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"drive/folders/delete\": {\n\t\treq: {\n\t\t\tfolderId: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"drive/folders/find\": {\n\t\treq: {\n\t\t\tname: string;\n\t\t\tparentId?: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"drive/folders/show\": {\n\t\treq: {\n\t\t\tfolderId: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"drive/folders/update\": {\n\t\treq: {\n\t\t\tfolderId: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tname?: string;\n\t\t\tparentId?: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFolder", + "canonicalReference": "calckey-js!entities.DriveFolder:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"drive/stream\": {\n\t\treq: {\n\t\t\ttype?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"type\"] | null;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\tendpoint: {\n\t\treq: {\n\t\t\tendpoint: string;\n\t\t};\n\t\tres: {\n\t\t\tparams: {\n\t\t\t\tname: string;\n\t\t\t\ttype: string;\n\t\t\t}[];\n\t\t};\n\t};\n\tendpoints: {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: string[];\n\t};\n\t\"federation/dns\": {\n\t\treq: {\n\t\t\thost: string;\n\t\t};\n\t\tres: {\n\t\t\ta: string[];\n\t\t\taaaa: string[];\n\t\t\tcname: string[];\n\t\t\ttxt: string[];\n\t\t};\n\t};\n\t\"federation/followers\": {\n\t\treq: {\n\t\t\thost: string;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "FollowingFolloweePopulated", + "canonicalReference": "calckey-js!entities.FollowingFolloweePopulated:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"federation/following\": {\n\t\treq: {\n\t\t\thost: string;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "FollowingFolloweePopulated", + "canonicalReference": "calckey-js!entities.FollowingFolloweePopulated:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"federation/instances\": {\n\t\treq: {\n\t\t\thost?: string | null;\n\t\t\tblocked?: boolean | null;\n\t\t\tnotResponding?: boolean | null;\n\t\t\tsuspended?: boolean | null;\n\t\t\tfederating?: boolean | null;\n\t\t\tsubscribing?: boolean | null;\n\t\t\tpublishing?: boolean | null;\n\t\t\tlimit?: number;\n\t\t\toffset?: number;\n\t\t\tsort?:\n\t\t\t\t| \"+pubSub\"\n\t\t\t\t| \"-pubSub\"\n\t\t\t\t| \"+notes\"\n\t\t\t\t| \"-notes\"\n\t\t\t\t| \"+users\"\n\t\t\t\t| \"-users\"\n\t\t\t\t| \"+following\"\n\t\t\t\t| \"-following\"\n\t\t\t\t| \"+followers\"\n\t\t\t\t| \"-followers\"\n\t\t\t\t| \"+caughtAt\"\n\t\t\t\t| \"-caughtAt\"\n\t\t\t\t| \"+lastCommunicatedAt\"\n\t\t\t\t| \"-lastCommunicatedAt\"\n\t\t\t\t| \"+driveUsage\"\n\t\t\t\t| \"-driveUsage\"\n\t\t\t\t| \"+driveFiles\"\n\t\t\t\t| \"-driveFiles\";\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Instance", + "canonicalReference": "calckey-js!entities.Instance:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"federation/show-instance\": {\n\t\treq: {\n\t\t\thost: string;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Instance", + "canonicalReference": "calckey-js!entities.Instance:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"federation/update-remote-user\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"federation/users\": {\n\t\treq: {\n\t\t\thost: string;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"following/create\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"following/delete\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"following/requests/accept\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"following/requests/cancel\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"following/requests/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "FollowRequest", + "canonicalReference": "calckey-js!entities.FollowRequest:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"following/requests/reject\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"gallery/featured\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"gallery/popular\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"gallery/posts\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"gallery/posts/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"gallery/posts/delete\": {\n\t\treq: {\n\t\t\tpostId: " + }, + { + "kind": "Reference", + "text": "GalleryPost", + "canonicalReference": "calckey-js!entities.GalleryPost:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"gallery/posts/like\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"gallery/posts/show\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"gallery/posts/unlike\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"gallery/posts/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"games/reversi/games\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"games/reversi/games/show\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"games/reversi/games/surrender\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"games/reversi/invitations\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"games/reversi/match\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"games/reversi/match/cancel\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"get-online-users-count\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: {\n\t\t\tcount: number;\n\t\t};\n\t};\n\t\"hashtags/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"hashtags/search\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"hashtags/show\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"hashtags/trend\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"hashtags/users\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\ti: {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/apps\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/authorized-apps\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/change-password\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/delete-account\": {\n\t\treq: {\n\t\t\tpassword: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"i/export-blocking\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/export-following\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/export-mute\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/export-notes\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/export-user-lists\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/favorites\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "NoteFavorite", + "canonicalReference": "calckey-js!entities.NoteFavorite:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "NoteFavorite", + "canonicalReference": "calckey-js!entities.NoteFavorite:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "NoteFavorite", + "canonicalReference": "calckey-js!entities.NoteFavorite:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"i/gallery/likes\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/gallery/posts\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/get-word-muted-notes-count\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/import-following\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/import-user-lists\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/move\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/known-as\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/notifications\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Notification", + "canonicalReference": "calckey-js!entities.Notification_2:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Notification", + "canonicalReference": "calckey-js!entities.Notification_2:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tfollowing?: boolean;\n\t\t\tmarkAsRead?: boolean;\n\t\t\tincludeTypes?: " + }, + { + "kind": "Reference", + "text": "Notification", + "canonicalReference": "calckey-js!entities.Notification_2:type" + }, + { + "kind": "Content", + "text": "[\"type\"][];\n\t\t\texcludeTypes?: " + }, + { + "kind": "Reference", + "text": "Notification", + "canonicalReference": "calckey-js!entities.Notification_2:type" + }, + { + "kind": "Content", + "text": "[\"type\"][];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Notification", + "canonicalReference": "calckey-js!entities.Notification_2:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"i/page-likes\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/pages\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/pin\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "MeDetailed", + "canonicalReference": "calckey-js!entities.MeDetailed:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/read-all-messaging-messages\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/read-all-unread-notes\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/read-announcement\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/regenerate-token\": {\n\t\treq: {\n\t\t\tpassword: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"i/registry/get-all\": {\n\t\treq: {\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/registry/get-detail\": {\n\t\treq: {\n\t\t\tkey: string;\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: {\n\t\t\tupdatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tvalue: any;\n\t\t};\n\t};\n\t\"i/registry/get\": {\n\t\treq: {\n\t\t\tkey: string;\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: any;\n\t};\n\t\"i/registry/keys-with-type\": {\n\t\treq: {\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "<\n\t\t\tstring,\n\t\t\t\"null\" | \"array\" | \"number\" | \"string\" | \"boolean\" | \"object\"\n\t\t>;\n\t};\n\t\"i/registry/keys\": {\n\t\treq: {\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: string[];\n\t};\n\t\"i/registry/remove\": {\n\t\treq: {\n\t\t\tkey: string;\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: null;\n\t};\n\t\"i/registry/scopes\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: string[][];\n\t};\n\t\"i/registry/set\": {\n\t\treq: {\n\t\t\tkey: string;\n\t\t\tvalue: any;\n\t\t\tscope?: string[];\n\t\t};\n\t\tres: null;\n\t};\n\t\"i/revoke-token\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/signin-history\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Signin", + "canonicalReference": "calckey-js!entities.Signin:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Signin", + "canonicalReference": "calckey-js!entities.Signin:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Signin", + "canonicalReference": "calckey-js!entities.Signin:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"i/unpin\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "MeDetailed", + "canonicalReference": "calckey-js!entities.MeDetailed:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/update-email\": {\n\t\treq: {\n\t\t\tpassword: string;\n\t\t\temail?: string | null;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "MeDetailed", + "canonicalReference": "calckey-js!entities.MeDetailed:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/update\": {\n\t\treq: {\n\t\t\tname?: string | null;\n\t\t\tdescription?: string | null;\n\t\t\tlang?: string | null;\n\t\t\tlocation?: string | null;\n\t\t\tbirthday?: string | null;\n\t\t\tavatarId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t\tbannerId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\t\t\tfields?: {\n\t\t\t\tname: string;\n\t\t\t\tvalue: string;\n\t\t\t}[];\n\t\t\tisLocked?: boolean;\n\t\t\tisExplorable?: boolean;\n\t\t\thideOnlineStatus?: boolean;\n\t\t\tcarefulBot?: boolean;\n\t\t\tautoAcceptFollowed?: boolean;\n\t\t\tnoCrawle?: boolean;\n\t\t\tpreventAiLearning?: boolean;\n\t\t\tisBot?: boolean;\n\t\t\tisCat?: boolean;\n\t\t\tinjectFeaturedNote?: boolean;\n\t\t\treceiveAnnouncementEmail?: boolean;\n\t\t\talwaysMarkNsfw?: boolean;\n\t\t\tmutedWords?: string[][];\n\t\t\tmutingNotificationTypes?: " + }, + { + "kind": "Reference", + "text": "Notification", + "canonicalReference": "calckey-js!entities.Notification_2:type" + }, + { + "kind": "Content", + "text": "[\"type\"][];\n\t\t\temailNotificationTypes?: string[];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "MeDetailed", + "canonicalReference": "calckey-js!entities.MeDetailed:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/user-group-invites\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/2fa/done\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/2fa/key-done\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/2fa/password-less\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/2fa/register-key\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/2fa/register\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/2fa/update-key\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/2fa/remove-key\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"i/2fa/unregister\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"messaging/history\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tgroup?: boolean;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"messaging/messages\": {\n\t\treq: {\n\t\t\tuserId?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tgroupId?: " + }, + { + "kind": "Reference", + "text": "UserGroup", + "canonicalReference": "calckey-js!entities.UserGroup:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tmarkAsRead?: boolean;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"messaging/messages/create\": {\n\t\treq: {\n\t\t\tuserId?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tgroupId?: " + }, + { + "kind": "Reference", + "text": "UserGroup", + "canonicalReference": "calckey-js!entities.UserGroup:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\ttext?: string;\n\t\t\tfileId?: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"messaging/messages/delete\": {\n\t\treq: {\n\t\t\tmessageId: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"messaging/messages/read\": {\n\t\treq: {\n\t\t\tmessageId: " + }, + { + "kind": "Reference", + "text": "MessagingMessage", + "canonicalReference": "calckey-js!entities.MessagingMessage:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\tmeta: {\n\t\treq: {\n\t\t\tdetail?: boolean;\n\t\t};\n\t\tres: {\n\t\t\t$switch: {\n\t\t\t\t$cases: [\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdetail: true;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t" + }, + { + "kind": "Reference", + "text": "DetailedInstanceMetadata", + "canonicalReference": "calckey-js!entities.DetailedInstanceMetadata:type" + }, + { + "kind": "Content", + "text": ",\n\t\t\t\t\t],\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdetail: false;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t" + }, + { + "kind": "Reference", + "text": "LiteInstanceMetadata", + "canonicalReference": "calckey-js!entities.LiteInstanceMetadata:type" + }, + { + "kind": "Content", + "text": ",\n\t\t\t\t\t],\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tdetail: boolean;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t" + }, + { + "kind": "Reference", + "text": "LiteInstanceMetadata", + "canonicalReference": "calckey-js!entities.LiteInstanceMetadata:type" + }, + { + "kind": "Content", + "text": " | " + }, + { + "kind": "Reference", + "text": "DetailedInstanceMetadata", + "canonicalReference": "calckey-js!entities.DetailedInstanceMetadata:type" + }, + { + "kind": "Content", + "text": ",\n\t\t\t\t\t],\n\t\t\t\t];\n\t\t\t\t$default: " + }, + { + "kind": "Reference", + "text": "LiteInstanceMetadata", + "canonicalReference": "calckey-js!entities.LiteInstanceMetadata:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\t};\n\t\t};\n\t};\n\t\"miauth/gen-token\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"mute/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"mute/delete\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"mute/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"renote-mute/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"renote-mute/delete\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"renote-mute/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"my/apps\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\tnotes: {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/children\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/clips\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"notes/conversation\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"notes/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoteSubmitReq", + "canonicalReference": "calckey-js!~NoteSubmitReq:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: {\n\t\t\tcreatedNote: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t\t};\n\t};\n\t\"notes/delete\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/edit\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoteSubmitReq", + "canonicalReference": "calckey-js!~NoteSubmitReq:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: {\n\t\t\tcreatedNote: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t\t};\n\t};\n\t\"notes/favorites/create\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/favorites/delete\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/featured\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/global-timeline\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/recommended-timeline\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/hybrid-timeline\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/local-timeline\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/mentions\": {\n\t\treq: {\n\t\t\tfollowing?: boolean;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/polls/recommendation\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"notes/polls/vote\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tchoice: number;\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/reactions\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\ttype?: string | null;\n\t\t\tlimit?: number;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "NoteReaction", + "canonicalReference": "calckey-js!entities.NoteReaction:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/reactions/create\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\treaction: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/reactions/delete\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/renotes\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/replies\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/search-by-tag\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"notes/search\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"notes/show\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"notes/state\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"notes/timeline\": {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/unrenote\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"notes/user-list-timeline\": {\n\t\treq: {\n\t\t\tlistId: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"notes/watching/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"notes/watching/delete\": {\n\t\treq: {\n\t\t\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"notifications/create\": {\n\t\treq: {\n\t\t\tbody: string;\n\t\t\theader?: string | null;\n\t\t\ticon?: string | null;\n\t\t};\n\t\tres: null;\n\t};\n\t\"notifications/mark-all-as-read\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: null;\n\t};\n\t\"notifications/read\": {\n\t\treq: {\n\t\t\tnotificationId: " + }, + { + "kind": "Reference", + "text": "Notification", + "canonicalReference": "calckey-js!entities.Notification_2:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"page-push\": {\n\t\treq: {\n\t\t\tpageId: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tevent: string;\n\t\t\tvar?: any;\n\t\t};\n\t\tres: null;\n\t};\n\t\"pages/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"pages/delete\": {\n\t\treq: {\n\t\t\tpageId: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"pages/featured\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"pages/like\": {\n\t\treq: {\n\t\t\tpageId: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"pages/show\": {\n\t\treq: {\n\t\t\tpageId?: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tname?: string;\n\t\t\tusername?: string;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"pages/unlike\": {\n\t\treq: {\n\t\t\tpageId: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"pages/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: null;\n\t};\n\tping: {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: {\n\t\t\tpong: number;\n\t\t};\n\t};\n\t\"pinned-users\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"promo/read\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"request-reset-password\": {\n\t\treq: {\n\t\t\tusername: string;\n\t\t\temail: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"reset-password\": {\n\t\treq: {\n\t\t\ttoken: string;\n\t\t\tpassword: string;\n\t\t};\n\t\tres: null;\n\t};\n\t\"room/show\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"room/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\tstats: {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Stats", + "canonicalReference": "calckey-js!entities.Stats:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"server-info\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "ServerInfo", + "canonicalReference": "calckey-js!entities.ServerInfo:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"latest-version\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"sw/register\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"username/available\": {\n\t\treq: {\n\t\t\tusername: string;\n\t\t};\n\t\tres: {\n\t\t\tavailable: boolean;\n\t\t};\n\t};\n\tusers: {\n\t\treq: {\n\t\t\tlimit?: number;\n\t\t\toffset?: number;\n\t\t\tsort?: " + }, + { + "kind": "Reference", + "text": "UserSorting", + "canonicalReference": "calckey-js!entities.UserSorting:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\torigin?: " + }, + { + "kind": "Reference", + "text": "OriginType", + "canonicalReference": "calckey-js!entities.OriginType:type" + }, + { + "kind": "Content", + "text": ";\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"users/clips\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/followers\": {\n\t\treq: {\n\t\t\tuserId?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tusername?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"username\"];\n\t\t\thost?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"host\"] | null;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "FollowingFollowerPopulated", + "canonicalReference": "calckey-js!entities.FollowingFollowerPopulated:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"users/following\": {\n\t\treq: {\n\t\t\tuserId?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tusername?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"username\"];\n\t\t\thost?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"host\"] | null;\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "FollowingFolloweePopulated", + "canonicalReference": "calckey-js!entities.FollowingFolloweePopulated:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"users/gallery/posts\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/get-frequently-replied-users\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/create\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/delete\": {\n\t\treq: {\n\t\t\tgroupId: " + }, + { + "kind": "Reference", + "text": "UserGroup", + "canonicalReference": "calckey-js!entities.UserGroup:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"users/groups/invitations/accept\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/invitations/reject\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/invite\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/joined\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/owned\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/pull\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/show\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/transfer\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/groups/update\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/lists/create\": {\n\t\treq: {\n\t\t\tname: string;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/lists/delete\": {\n\t\treq: {\n\t\t\tlistId: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"users/lists/list\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "NoParams", + "canonicalReference": "calckey-js!~NoParams:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"users/lists/pull\": {\n\t\treq: {\n\t\t\tlistId: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"users/lists/push\": {\n\t\treq: {\n\t\t\tlistId: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: null;\n\t};\n\t\"users/lists/show\": {\n\t\treq: {\n\t\t\tlistId: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/lists/update\": {\n\t\treq: {\n\t\t\tlistId: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tname: string;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "UserList", + "canonicalReference": "calckey-js!entities.UserList:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/notes\": {\n\t\treq: {\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tlimit?: number;\n\t\t\tsinceId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tuntilId?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tsinceDate?: number;\n\t\t\tuntilDate?: number;\n\t\t};\n\t\tres: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\t};\n\t\"users/pages\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/recommendation\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/relation\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/report-abuse\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/search-by-username-and-host\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/search\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n\t\"users/show\": {\n\t\treq:\n\t\t\t| " + }, + { + "kind": "Reference", + "text": "ShowUserReq", + "canonicalReference": "calckey-js!~ShowUserReq:type" + }, + { + "kind": "Content", + "text": "\n\t\t\t| {\n\t\t\t\t\tuserIds: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"][];\n\t\t\t };\n\t\tres: {\n\t\t\t$switch: {\n\t\t\t\t$cases: [\n\t\t\t\t\t[\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tuserIds: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"][];\n\t\t\t\t\t\t},\n\t\t\t\t\t\t" + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": "[],\n\t\t\t\t\t],\n\t\t\t\t];\n\t\t\t\t$default: " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\t};\n\t\t};\n\t};\n\t\"users/stats\": {\n\t\treq: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t\tres: " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO:type" + }, + { + "kind": "Content", + "text": ";\n\t};\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/api.types.ts", + "releaseTag": "Public", + "name": "Endpoints", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 1158 + } + }, + { + "kind": "Namespace", + "canonicalReference": "calckey-js!entities:namespace", + "docComment": "", + "excerptTokens": [], + "fileUrlPath": "src/index.ts", + "releaseTag": "None", + "name": "entities", + "preserveMemberOrder": false, + "members": [ + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Ad:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Ad = " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO_2:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Ad", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Announcement:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Announcement = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tupdatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": " | null;\n\ttext: string;\n\ttitle: string;\n\timageUrl: string | null;\n\tisRead?: boolean;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Announcement", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 8 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Antenna:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Antenna = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tname: string;\n\tkeywords: string[][];\n\texcludeKeywords: string[][];\n\tsrc: \"home\" | \"all\" | \"users\" | \"list\" | \"group\" | \"instances\";\n\tuserListId: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": " | null;\n\tuserGroupId: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": " | null;\n\tusers: string[];\n\tinstances: string[];\n\tcaseSensitive: boolean;\n\tnotify: boolean;\n\twithReplies: boolean;\n\twithFile: boolean;\n\thasUnreadNote: boolean;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Antenna", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 10 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.App:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type App = " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO_2:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "App", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.AuthSession:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type AuthSession = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tapp: " + }, + { + "kind": "Reference", + "text": "App", + "canonicalReference": "calckey-js!entities.App:type" + }, + { + "kind": "Content", + "text": ";\n\ttoken: string;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "AuthSession", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 6 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Blocking:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Blocking = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tblockeeId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tblockee: " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": ";\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Blocking", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 10 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Channel:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Channel = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Channel", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 4 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Clip:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Clip = " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO_2:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Clip", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.CustomEmoji:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type CustomEmoji = " + }, + { + "kind": "Content", + "text": "{\n\tid: string;\n\tname: string;\n\turl: string;\n\tcategory: string;\n\taliases: string[];\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "CustomEmoji", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.DateString:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type DateString = " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "DateString", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.DetailedInstanceMetadata:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type DetailedInstanceMetadata = " + }, + { + "kind": "Reference", + "text": "LiteInstanceMetadata", + "canonicalReference": "calckey-js!entities.LiteInstanceMetadata:type" + }, + { + "kind": "Content", + "text": " & {\n\tfeatures: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": ";\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "DetailedInstanceMetadata", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 5 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.DriveFile:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type DriveFile = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tisSensitive: boolean;\n\tname: string;\n\tthumbnailUrl: string;\n\turl: string;\n\ttype: string;\n\tsize: number;\n\tmd5: string;\n\tblurhash: string;\n\tcomment: string | null;\n\tproperties: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": ";\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "DriveFile", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 8 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.DriveFolder:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type DriveFolder = " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO_2:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "DriveFolder", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Following:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Following = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tfollowerId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tfolloweeId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Following", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 10 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.FollowingFolloweePopulated:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type FollowingFolloweePopulated = " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": " & {\n\tfollowee: " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": ";\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "FollowingFolloweePopulated", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 5 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.FollowingFollowerPopulated:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type FollowingFollowerPopulated = " + }, + { + "kind": "Reference", + "text": "Following", + "canonicalReference": "calckey-js!entities.Following:type" + }, + { + "kind": "Content", + "text": " & {\n\tfollower: " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": ";\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "FollowingFollowerPopulated", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 5 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.FollowRequest:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type FollowRequest = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tfollower: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\tfollowee: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "FollowRequest", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 8 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.GalleryPost:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type GalleryPost = " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO_2:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "GalleryPost", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.ID:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type ID = " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "ID", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Instance:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Instance = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcaughtAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\thost: string;\n\tusersCount: number;\n\tnotesCount: number;\n\tfollowingCount: number;\n\tfollowersCount: number;\n\tdriveUsage: number;\n\tdriveFiles: number;\n\tlatestRequestSentAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": " | null;\n\tlatestStatus: number | null;\n\tlatestRequestReceivedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": " | null;\n\tlastCommunicatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tisNotResponding: boolean;\n\tisSuspended: boolean;\n\tsoftwareName: string | null;\n\tsoftwareVersion: string | null;\n\topenRegistrations: boolean | null;\n\tname: string | null;\n\tdescription: string | null;\n\tmaintainerName: string | null;\n\tmaintainerEmail: string | null;\n\ticonUrl: string | null;\n\tfaviconUrl: string | null;\n\tthemeColor: string | null;\n\tinfoUpdatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": " | null;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Instance", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 14 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.InstanceMetadata:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type InstanceMetadata =\n\t" + }, + { + "kind": "Content", + "text": "| " + }, + { + "kind": "Reference", + "text": "LiteInstanceMetadata", + "canonicalReference": "calckey-js!entities.LiteInstanceMetadata:type" + }, + { + "kind": "Content", + "text": "\n\t| " + }, + { + "kind": "Reference", + "text": "DetailedInstanceMetadata", + "canonicalReference": "calckey-js!entities.DetailedInstanceMetadata:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "InstanceMetadata", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 5 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.LiteInstanceMetadata:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type LiteInstanceMetadata = " + }, + { + "kind": "Content", + "text": "{\n\tmaintainerName: string | null;\n\tmaintainerEmail: string | null;\n\tversion: string;\n\tname: string | null;\n\turi: string;\n\tdescription: string | null;\n\ttosUrl: string | null;\n\tdisableRegistration: boolean;\n\tdisableLocalTimeline: boolean;\n\tdisableRecommendedTimeline: boolean;\n\tdisableGlobalTimeline: boolean;\n\tdriveCapacityPerLocalUserMb: number;\n\tdriveCapacityPerRemoteUserMb: number;\n\tenableHcaptcha: boolean;\n\thcaptchaSiteKey: string | null;\n\tenableRecaptcha: boolean;\n\trecaptchaSiteKey: string | null;\n\tswPublickey: string | null;\n\tmaxNoteTextLength: number;\n\tenableEmail: boolean;\n\tenableTwitterIntegration: boolean;\n\tenableGithubIntegration: boolean;\n\tenableDiscordIntegration: boolean;\n\tenableServiceWorker: boolean;\n\temojis: " + }, + { + "kind": "Reference", + "text": "CustomEmoji", + "canonicalReference": "calckey-js!entities.CustomEmoji:type" + }, + { + "kind": "Content", + "text": "[];\n\tads: {\n\t\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\t\tratio: number;\n\t\tplace: string;\n\t\turl: string;\n\t\timageUrl: string;\n\t}[];\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "LiteInstanceMetadata", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 6 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.MeDetailed:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type MeDetailed = " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": " & {\n\tavatarId: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tbannerId: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tautoAcceptFollowed: boolean;\n\talwaysMarkNsfw: boolean;\n\tcarefulBot: boolean;\n\temailNotificationTypes: string[];\n\thasPendingReceivedFollowRequest: boolean;\n\thasUnreadAnnouncement: boolean;\n\thasUnreadAntenna: boolean;\n\thasUnreadChannel: boolean;\n\thasUnreadMentions: boolean;\n\thasUnreadMessagingMessage: boolean;\n\thasUnreadNotification: boolean;\n\thasUnreadSpecifiedNotes: boolean;\n\thideOnlineStatus: boolean;\n\tinjectFeaturedNote: boolean;\n\tintegrations: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": ";\n\tisDeleted: boolean;\n\tisExplorable: boolean;\n\tmutedWords: string[][];\n\tmutingNotificationTypes: string[];\n\tnoCrawle: boolean;\n\tpreventAiLearning: boolean;\n\treceiveAnnouncementEmail: boolean;\n\tusePasswordLessLogin: boolean;\n\t[other: string]: any;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "MeDetailed", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 9 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.MessagingMessage:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type MessagingMessage = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tfile: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": " | null;\n\tfileId: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\tisRead: boolean;\n\treads: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"][];\n\ttext: string | null;\n\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\trecipient?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": " | null;\n\trecipientId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\tgroup?: " + }, + { + "kind": "Reference", + "text": "UserGroup", + "canonicalReference": "calckey-js!entities.UserGroup:type" + }, + { + "kind": "Content", + "text": " | null;\n\tgroupId: " + }, + { + "kind": "Reference", + "text": "UserGroup", + "canonicalReference": "calckey-js!entities.UserGroup:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "MessagingMessage", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 24 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Note:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Note = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\ttext: string | null;\n\tcw: string | null;\n\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\treply?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\treplyId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\trenote?: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\trenoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tfiles: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[];\n\tfileIds: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"][];\n\tvisibility: \"public\" | \"home\" | \"followers\" | \"specified\";\n\tvisibleUserIds?: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"][];\n\tlocalOnly?: boolean;\n\tchannel?: " + }, + { + "kind": "Reference", + "text": "Channel", + "canonicalReference": "calckey-js!entities.Channel:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tmyReaction?: string;\n\treactions: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": ";\n\trenoteCount: number;\n\trepliesCount: number;\n\tpoll?: {\n\t\texpiresAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": " | null;\n\t\tmultiple: boolean;\n\t\tchoices: {\n\t\t\tisVoted: boolean;\n\t\t\ttext: string;\n\t\t\tvotes: number;\n\t\t}[];\n\t};\n\temojis: {\n\t\tname: string;\n\t\turl: string;\n\t}[];\n\turi?: string;\n\turl?: string;\n\tupdatedAt?: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tisHidden?: boolean;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Note", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 32 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.NoteFavorite:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type NoteFavorite = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tnoteId: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tnote: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "NoteFavorite", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 10 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.NoteReaction:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type NoteReaction = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tuser: " + }, + { + "kind": "Reference", + "text": "UserLite", + "canonicalReference": "calckey-js!entities.UserLite:type" + }, + { + "kind": "Content", + "text": ";\n\ttype: string;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "NoteReaction", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 8 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Notification:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Notification = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tisRead: boolean;\n} & (\n\t| {\n\t\t\ttype: \"reaction\";\n\t\t\treaction: string;\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tnote: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t }\n\t| {\n\t\t\ttype: \"reply\";\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tnote: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t }\n\t| {\n\t\t\ttype: \"renote\";\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tnote: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t }\n\t| {\n\t\t\ttype: \"quote\";\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tnote: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t }\n\t| {\n\t\t\ttype: \"mention\";\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tnote: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t }\n\t| {\n\t\t\ttype: \"pollVote\";\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t\t\tnote: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": ";\n\t }\n\t| {\n\t\t\ttype: \"follow\";\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t }\n\t| {\n\t\t\ttype: \"followRequestAccepted\";\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t }\n\t| {\n\t\t\ttype: \"receiveFollowRequest\";\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t }\n\t| {\n\t\t\ttype: \"groupInvited\";\n\t\t\tinvitation: " + }, + { + "kind": "Reference", + "text": "UserGroup", + "canonicalReference": "calckey-js!entities.UserGroup:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\t\t\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\t }\n\t| {\n\t\t\ttype: \"app\";\n\t\t\theader?: string | null;\n\t\t\tbody: string;\n\t\t\ticon?: string | null;\n\t }\n)" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Notification", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 60 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.OriginType:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type OriginType = " + }, + { + "kind": "Content", + "text": "\"combined\" | \"local\" | \"remote\"" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "OriginType", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Page:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Page = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tupdatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n\tcontent: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "[];\n\tvariables: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": "[];\n\ttitle: string;\n\tname: string;\n\tsummary: string | null;\n\thideTitleWhenPinned: boolean;\n\talignCenter: boolean;\n\tfont: string;\n\tscript: string;\n\teyeCatchingImageId: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": "[\"id\"] | null;\n\teyeCatchingImage: " + }, + { + "kind": "Reference", + "text": "DriveFile", + "canonicalReference": "calckey-js!entities.DriveFile:type" + }, + { + "kind": "Content", + "text": " | null;\n\tattachedFiles: any;\n\tlikedCount: number;\n\tisLiked?: boolean;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Page", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 20 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.PageEvent:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type PageEvent = " + }, + { + "kind": "Content", + "text": "{\n\tpageId: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tevent: string;\n\tvar: any;\n\tuserId: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"];\n\tuser: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": ";\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "PageEvent", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 8 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.ServerInfo:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type ServerInfo = " + }, + { + "kind": "Content", + "text": "{\n\tmachine: string;\n\tcpu: {\n\t\tmodel: string;\n\t\tcores: number;\n\t};\n\tmem: {\n\t\ttotal: number;\n\t};\n\tfs: {\n\t\ttotal: number;\n\t\tused: number;\n\t};\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "ServerInfo", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Signin:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Signin = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tip: string;\n\theaders: " + }, + { + "kind": "Reference", + "text": "Record", + "canonicalReference": "!Record:type" + }, + { + "kind": "Content", + "text": ";\n\tsuccess: boolean;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Signin", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 8 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.Stats:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type Stats = " + }, + { + "kind": "Content", + "text": "{\n\tnotesCount: number;\n\toriginalNotesCount: number;\n\tusersCount: number;\n\toriginalUsersCount: number;\n\tinstances: number;\n\tdriveUsageLocal: number;\n\tdriveUsageRemote: number;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "Stats", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.User:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type User = " + }, + { + "kind": "Reference", + "text": "UserLite", + "canonicalReference": "calckey-js!entities.UserLite:type" + }, + { + "kind": "Content", + "text": " | " + }, + { + "kind": "Reference", + "text": "UserDetailed", + "canonicalReference": "calckey-js!entities.UserDetailed:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "User", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 4 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.UserDetailed:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type UserDetailed = " + }, + { + "kind": "Reference", + "text": "UserLite", + "canonicalReference": "calckey-js!entities.UserLite:type" + }, + { + "kind": "Content", + "text": " & {\n\tbannerBlurhash: string | null;\n\tbannerColor: string | null;\n\tbannerUrl: string | null;\n\tbirthday: string | null;\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tdescription: string | null;\n\tffVisibility: \"public\" | \"followers\" | \"private\";\n\tfields: {\n\t\tname: string;\n\t\tvalue: string;\n\t}[];\n\tfollowersCount: number;\n\tfollowingCount: number;\n\thasPendingFollowRequestFromYou: boolean;\n\thasPendingFollowRequestToYou: boolean;\n\tisAdmin: boolean;\n\tisBlocked: boolean;\n\tisBlocking: boolean;\n\tisBot: boolean;\n\tisCat: boolean;\n\tisFollowed: boolean;\n\tisFollowing: boolean;\n\tisLocked: boolean;\n\tisModerator: boolean;\n\tisMuted: boolean;\n\tisRenoteMuted: boolean;\n\tisSilenced: boolean;\n\tisSuspended: boolean;\n\tlang: string | null;\n\tlastFetchedAt?: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tlocation: string | null;\n\tnotesCount: number;\n\tpinnedNoteIds: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": "[];\n\tpinnedNotes: " + }, + { + "kind": "Reference", + "text": "Note", + "canonicalReference": "calckey-js!entities.Note:type" + }, + { + "kind": "Content", + "text": "[];\n\tpinnedPage: " + }, + { + "kind": "Reference", + "text": "Page", + "canonicalReference": "calckey-js!entities.Page:type" + }, + { + "kind": "Content", + "text": " | null;\n\tpinnedPageId: string | null;\n\tpublicReactions: boolean;\n\tsecurityKeys: boolean;\n\ttwoFactorEnabled: boolean;\n\tupdatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": " | null;\n\turi: string | null;\n\turl: string | null;\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "UserDetailed", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 15 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.UserGroup:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type UserGroup = " + }, + { + "kind": "Reference", + "text": "TODO", + "canonicalReference": "calckey-js!~TODO_2:type" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "UserGroup", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.UserList:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type UserList = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tcreatedAt: " + }, + { + "kind": "Reference", + "text": "DateString", + "canonicalReference": "calckey-js!entities.DateString:type" + }, + { + "kind": "Content", + "text": ";\n\tname: string;\n\tuserIds: " + }, + { + "kind": "Reference", + "text": "User", + "canonicalReference": "calckey-js!entities.User:type" + }, + { + "kind": "Content", + "text": "[\"id\"][];\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "UserList", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 8 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.UserLite:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type UserLite = " + }, + { + "kind": "Content", + "text": "{\n\tid: " + }, + { + "kind": "Reference", + "text": "ID", + "canonicalReference": "calckey-js!entities.ID:type" + }, + { + "kind": "Content", + "text": ";\n\tusername: string;\n\thost: string | null;\n\tname: string;\n\tonlineStatus: \"online\" | \"active\" | \"offline\" | \"unknown\";\n\tavatarUrl: string;\n\tavatarBlurhash: string;\n\talsoKnownAs: string[];\n\tmovedToUri: any;\n\temojis: {\n\t\tname: string;\n\t\turl: string;\n\t}[];\n\tinstance?: {\n\t\tname: " + }, + { + "kind": "Reference", + "text": "Instance", + "canonicalReference": "calckey-js!entities.Instance:type" + }, + { + "kind": "Content", + "text": "[\"name\"];\n\t\tsoftwareName: " + }, + { + "kind": "Reference", + "text": "Instance", + "canonicalReference": "calckey-js!entities.Instance:type" + }, + { + "kind": "Content", + "text": "[\"softwareName\"];\n\t\tsoftwareVersion: " + }, + { + "kind": "Reference", + "text": "Instance", + "canonicalReference": "calckey-js!entities.Instance:type" + }, + { + "kind": "Content", + "text": "[\"softwareVersion\"];\n\t\ticonUrl: " + }, + { + "kind": "Reference", + "text": "Instance", + "canonicalReference": "calckey-js!entities.Instance:type" + }, + { + "kind": "Content", + "text": "[\"iconUrl\"];\n\t\tfaviconUrl: " + }, + { + "kind": "Reference", + "text": "Instance", + "canonicalReference": "calckey-js!entities.Instance:type" + }, + { + "kind": "Content", + "text": "[\"faviconUrl\"];\n\t\tthemeColor: " + }, + { + "kind": "Reference", + "text": "Instance", + "canonicalReference": "calckey-js!entities.Instance:type" + }, + { + "kind": "Content", + "text": "[\"themeColor\"];\n\t};\n}" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "UserLite", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 16 + } + }, + { + "kind": "TypeAlias", + "canonicalReference": "calckey-js!entities.UserSorting:type", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export declare type UserSorting =\n\t" + }, + { + "kind": "Content", + "text": "| \"+follower\"\n\t| \"-follower\"\n\t| \"+createdAt\"\n\t| \"-createdAt\"\n\t| \"+updatedAt\"\n\t| \"-updatedAt\"" + }, + { + "kind": "Content", + "text": ";" + } + ], + "fileUrlPath": "src/entities.ts", + "releaseTag": "Public", + "name": "UserSorting", + "typeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + } + ] + }, + { + "kind": "Variable", + "canonicalReference": "calckey-js!ffVisibility:var", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "ffVisibility: " + }, + { + "kind": "Content", + "text": "readonly [\"public\", \"followers\", \"private\"]" + } + ], + "fileUrlPath": "src/index.ts", + "isReadonly": true, + "releaseTag": "Public", + "name": "ffVisibility", + "variableTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "Variable", + "canonicalReference": "calckey-js!mutedNoteReasons:var", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "mutedNoteReasons: " + }, + { + "kind": "Content", + "text": "readonly [\n\t\"word\",\n\t\"manual\",\n\t\"spam\",\n\t\"other\",\n]" + } + ], + "fileUrlPath": "src/index.ts", + "isReadonly": true, + "releaseTag": "Public", + "name": "mutedNoteReasons", + "variableTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "Variable", + "canonicalReference": "calckey-js!noteVisibilities:var", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "noteVisibilities: " + }, + { + "kind": "Content", + "text": "readonly [\n\t\"public\",\n\t\"home\",\n\t\"followers\",\n\t\"specified\",\n]" + } + ], + "fileUrlPath": "src/index.ts", + "isReadonly": true, + "releaseTag": "Public", + "name": "noteVisibilities", + "variableTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "Variable", + "canonicalReference": "calckey-js!notificationTypes:var", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "notificationTypes: " + }, + { + "kind": "Content", + "text": "readonly [\n\t\"follow\",\n\t\"mention\",\n\t\"reply\",\n\t\"renote\",\n\t\"quote\",\n\t\"reaction\",\n\t\"pollVote\",\n\t\"pollEnded\",\n\t\"receiveFollowRequest\",\n\t\"followRequestAccepted\",\n\t\"groupInvited\",\n\t\"app\",\n]" + } + ], + "fileUrlPath": "src/index.ts", + "isReadonly": true, + "releaseTag": "Public", + "name": "notificationTypes", + "variableTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "Variable", + "canonicalReference": "calckey-js!permissions:var", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "permissions: " + }, + { + "kind": "Content", + "text": "string[]" + } + ], + "fileUrlPath": "src/index.ts", + "isReadonly": true, + "releaseTag": "Public", + "name": "permissions", + "variableTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + } + }, + { + "kind": "Class", + "canonicalReference": "calckey-js!Stream:class", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "export default class Stream extends " + }, + { + "kind": "Reference", + "text": "EventEmitter", + "canonicalReference": "eventemitter3!EventEmitter.EventEmitter" + }, + { + "kind": "Content", + "text": "<" + }, + { + "kind": "Reference", + "text": "StreamEvents", + "canonicalReference": "calckey-js!~StreamEvents:type" + }, + { + "kind": "Content", + "text": ">" + }, + { + "kind": "Content", + "text": " " + } + ], + "fileUrlPath": "src/streaming.ts", + "releaseTag": "Public", + "isAbstract": false, + "name": "Stream", + "preserveMemberOrder": false, + "members": [ + { + "kind": "Constructor", + "canonicalReference": "calckey-js!Stream:constructor(1)", + "docComment": "/**\n * Constructs a new instance of the `Stream` class\n */\n", + "excerptTokens": [ + { + "kind": "Content", + "text": "constructor(\n\t\torigin: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ",\n\t\tuser: " + }, + { + "kind": "Content", + "text": "{\n\t\t\ttoken: string;\n\t\t} | null" + }, + { + "kind": "Content", + "text": ",\n\t\toptions?: " + }, + { + "kind": "Content", + "text": "{\n\t\t\tWebSocket?: any;\n\t\t}" + }, + { + "kind": "Content", + "text": ",\n\t);" + } + ], + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "origin", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isOptional": false + }, + { + "parameterName": "user", + "parameterTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + }, + "isOptional": false + }, + { + "parameterName": "options", + "parameterTypeTokenRange": { + "startIndex": 5, + "endIndex": 6 + }, + "isOptional": true + } + ] + }, + { + "kind": "Method", + "canonicalReference": "calckey-js!Stream#close:member(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "close(): " + }, + { + "kind": "Content", + "text": "void" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [], + "isOptional": false, + "isAbstract": false, + "name": "close" + }, + { + "kind": "Method", + "canonicalReference": "calckey-js!Stream#disconnectToChannel:member(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "disconnectToChannel(connection: " + }, + { + "kind": "Reference", + "text": "NonSharedConnection", + "canonicalReference": "calckey-js!~NonSharedConnection:class" + }, + { + "kind": "Content", + "text": "): " + }, + { + "kind": "Content", + "text": "void" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "connection", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isOptional": false + } + ], + "isOptional": false, + "isAbstract": false, + "name": "disconnectToChannel" + }, + { + "kind": "Method", + "canonicalReference": "calckey-js!Stream#removeSharedConnection:member(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "removeSharedConnection(connection: " + }, + { + "kind": "Reference", + "text": "SharedConnection", + "canonicalReference": "calckey-js!~SharedConnection:class" + }, + { + "kind": "Content", + "text": "): " + }, + { + "kind": "Content", + "text": "void" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "connection", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isOptional": false + } + ], + "isOptional": false, + "isAbstract": false, + "name": "removeSharedConnection" + }, + { + "kind": "Method", + "canonicalReference": "calckey-js!Stream#removeSharedConnectionPool:member(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "removeSharedConnectionPool(pool: " + }, + { + "kind": "Reference", + "text": "Pool", + "canonicalReference": "calckey-js!~Pool:class" + }, + { + "kind": "Content", + "text": "): " + }, + { + "kind": "Content", + "text": "void" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "pool", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isOptional": false + } + ], + "isOptional": false, + "isAbstract": false, + "name": "removeSharedConnectionPool" + }, + { + "kind": "Method", + "canonicalReference": "calckey-js!Stream#send:member(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "send(typeOrPayload: " + }, + { + "kind": "Content", + "text": "any" + }, + { + "kind": "Content", + "text": ", payload?: " + }, + { + "kind": "Content", + "text": "any" + }, + { + "kind": "Content", + "text": "): " + }, + { + "kind": "Content", + "text": "void" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 5, + "endIndex": 6 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "typeOrPayload", + "parameterTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isOptional": false + }, + { + "parameterName": "payload", + "parameterTypeTokenRange": { + "startIndex": 3, + "endIndex": 4 + }, + "isOptional": true + } + ], + "isOptional": false, + "isAbstract": false, + "name": "send" + }, + { + "kind": "Property", + "canonicalReference": "calckey-js!Stream#state:member", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "state: " + }, + { + "kind": "Content", + "text": "\"initializing\" | \"reconnecting\" | \"connected\"" + }, + { + "kind": "Content", + "text": ";" + } + ], + "isReadonly": false, + "isOptional": false, + "releaseTag": "Public", + "name": "state", + "propertyTypeTokenRange": { + "startIndex": 1, + "endIndex": 2 + }, + "isStatic": false, + "isProtected": false, + "isAbstract": false + }, + { + "kind": "Method", + "canonicalReference": "calckey-js!Stream#useChannel:member(1)", + "docComment": "", + "excerptTokens": [ + { + "kind": "Content", + "text": "useChannel(\n\t\tchannel: " + }, + { + "kind": "Content", + "text": "C" + }, + { + "kind": "Content", + "text": ",\n\t\tparams?: " + }, + { + "kind": "Reference", + "text": "Channels", + "canonicalReference": "calckey-js!Channels:type" + }, + { + "kind": "Content", + "text": "[C][\"params\"]" + }, + { + "kind": "Content", + "text": ",\n\t\tname?: " + }, + { + "kind": "Content", + "text": "string" + }, + { + "kind": "Content", + "text": ",\n\t): " + }, + { + "kind": "Reference", + "text": "Connection", + "canonicalReference": "calckey-js!ChannelConnection:class" + }, + { + "kind": "Content", + "text": "<" + }, + { + "kind": "Reference", + "text": "Channels", + "canonicalReference": "calckey-js!Channels:type" + }, + { + "kind": "Content", + "text": "[C]>" + }, + { + "kind": "Content", + "text": ";" + } + ], + "typeParameters": [ + { + "typeParameterName": "C", + "constraintTokenRange": { + "startIndex": 1, + "endIndex": 3 + }, + "defaultTypeTokenRange": { + "startIndex": 0, + "endIndex": 0 + } + } + ], + "isStatic": false, + "returnTypeTokenRange": { + "startIndex": 11, + "endIndex": 15 + }, + "releaseTag": "Public", + "isProtected": false, + "overloadIndex": 1, + "parameters": [ + { + "parameterName": "channel", + "parameterTypeTokenRange": { + "startIndex": 4, + "endIndex": 5 + }, + "isOptional": false + }, + { + "parameterName": "params", + "parameterTypeTokenRange": { + "startIndex": 6, + "endIndex": 8 + }, + "isOptional": true + }, + { + "parameterName": "name", + "parameterTypeTokenRange": { + "startIndex": 9, + "endIndex": 10 + }, + "isOptional": true + } + ], + "isOptional": false, + "isAbstract": false, + "name": "useChannel" + } + ], + "extendsTokenRange": { + "startIndex": 1, + "endIndex": 5 + }, + "implementsTokenRanges": [] + } + ] + } + ] +} diff --git a/fe_calckey/frontend/calckey-js/etc/calckey-js.api.md b/fe_calckey/frontend/calckey-js/etc/calckey-js.api.md new file mode 100644 index 0000000..c17648e --- /dev/null +++ b/fe_calckey/frontend/calckey-js/etc/calckey-js.api.md @@ -0,0 +1,2839 @@ +## API Report File for "calckey-js" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts + +import { EventEmitter } from 'eventemitter3'; + +// @public (undocumented) +export type Acct = { + username: string; + host: string | null; +}; + +// Warning: (ae-forgotten-export) The symbol "TODO_2" needs to be exported by the entry point index.d.ts +// +// @public (undocumented) +type Ad = TODO_2; + +// @public (undocumented) +type Announcement = { + id: ID; + createdAt: DateString; + updatedAt: DateString | null; + text: string; + title: string; + imageUrl: string | null; + isRead?: boolean; +}; + +// @public (undocumented) +type Antenna = { + id: ID; + createdAt: DateString; + name: string; + keywords: string[][]; + excludeKeywords: string[][]; + src: "home" | "all" | "users" | "list" | "group" | "instances"; + userListId: ID | null; + userGroupId: ID | null; + users: string[]; + instances: string[]; + caseSensitive: boolean; + notify: boolean; + withReplies: boolean; + withFile: boolean; + hasUnreadNote: boolean; +}; + +declare namespace api { + export { + isAPIError, + APIError, + FetchLike, + APIClient + } +} +export { api } + +// @public (undocumented) +class APIClient { + constructor(opts: { + origin: APIClient["origin"]; + credential?: APIClient["credential"]; + fetch?: APIClient["fetch"] | null | undefined; + }); + // (undocumented) + credential: string | null | undefined; + // (undocumented) + fetch: FetchLike; + // (undocumented) + origin: string; + // Warning: (ae-forgotten-export) The symbol "IsCaseMatched" needs to be exported by the entry point index.d.ts + // Warning: (ae-forgotten-export) The symbol "GetCaseResult" needs to be exported by the entry point index.d.ts + // + // (undocumented) + request( + endpoint: E, + params?: P, + credential?: string | null | undefined, + ): Promise< + Endpoints[E]["res"] extends { + $switch: { + $cases: [any, any][]; + $default: any; + }; + } + ? IsCaseMatched extends true + ? GetCaseResult + : IsCaseMatched extends true + ? GetCaseResult + : IsCaseMatched extends true + ? GetCaseResult + : IsCaseMatched extends true + ? GetCaseResult + : IsCaseMatched extends true + ? GetCaseResult + : IsCaseMatched extends true + ? GetCaseResult + : IsCaseMatched extends true + ? GetCaseResult + : IsCaseMatched extends true + ? GetCaseResult + : IsCaseMatched extends true + ? GetCaseResult + : IsCaseMatched extends true + ? GetCaseResult + : Endpoints[E]["res"]["$switch"]["$default"] + : Endpoints[E]["res"] + >; +} + +// @public (undocumented) +type APIError = { + id: string; + code: string; + message: string; + kind: "client" | "server"; + info: Record; +}; + +// @public (undocumented) +type App = TODO_2; + +// @public (undocumented) +type AuthSession = { + id: ID; + app: App; + token: string; +}; + +// @public (undocumented) +type Blocking = { + id: ID; + createdAt: DateString; + blockeeId: User["id"]; + blockee: UserDetailed; +}; + +// @public (undocumented) +type Channel = { + id: ID; +}; + +// Warning: (ae-forgotten-export) The symbol "AnyOf" needs to be exported by the entry point index.d.ts +// +// @public (undocumented) +export abstract class ChannelConnection< + Channel extends AnyOf = any, +> extends EventEmitter { + constructor(stream: Stream, channel: string, name?: string); + // (undocumented) + channel: string; + // (undocumented) + abstract dispose(): void; + // (undocumented) + abstract id: string; + // (undocumented) + inCount: number; + // (undocumented) + name?: string; + // (undocumented) + outCount: number; + // (undocumented) + send( + type: T, + body: Channel["receives"][T], + ): void; + // (undocumented) + protected stream: Stream; +} + +// @public (undocumented) +export type Channels = { + main: { + params: null; + events: { + notification: (payload: Notification_2) => void; + mention: (payload: Note) => void; + reply: (payload: Note) => void; + renote: (payload: Note) => void; + follow: (payload: User) => void; + followed: (payload: User) => void; + unfollow: (payload: User) => void; + meUpdated: (payload: MeDetailed) => void; + pageEvent: (payload: PageEvent) => void; + urlUploadFinished: (payload: { + marker: string; + file: DriveFile; + }) => void; + readAllNotifications: () => void; + unreadNotification: (payload: Notification_2) => void; + unreadMention: (payload: Note["id"]) => void; + readAllUnreadMentions: () => void; + unreadSpecifiedNote: (payload: Note["id"]) => void; + readAllUnreadSpecifiedNotes: () => void; + readAllMessagingMessages: () => void; + messagingMessage: (payload: MessagingMessage) => void; + unreadMessagingMessage: (payload: MessagingMessage) => void; + readAllAntennas: () => void; + unreadAntenna: (payload: Antenna) => void; + readAllAnnouncements: () => void; + readAllChannels: () => void; + unreadChannel: (payload: Note["id"]) => void; + myTokenRegenerated: () => void; + reversiNoInvites: () => void; + reversiInvited: (payload: FIXME) => void; + signin: (payload: FIXME) => void; + registryUpdated: (payload: { + scope?: string[]; + key: string; + value: any | null; + }) => void; + driveFileCreated: (payload: DriveFile) => void; + readAntenna: (payload: Antenna) => void; + }; + receives: null; + }; + homeTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + localTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + hybridTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + recommendedTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + globalTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + antenna: { + params: { + antennaId: Antenna["id"]; + }; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + messaging: { + params: { + otherparty?: User["id"] | null; + group?: UserGroup["id"] | null; + }; + events: { + message: (payload: MessagingMessage) => void; + deleted: (payload: MessagingMessage["id"]) => void; + read: (payload: MessagingMessage["id"][]) => void; + typers: (payload: User[]) => void; + }; + receives: { + read: { + id: MessagingMessage["id"]; + }; + }; + }; + serverStats: { + params: null; + events: { + stats: (payload: FIXME) => void; + }; + receives: { + requestLog: { + id: string | number; + length: number; + }; + }; + }; + queueStats: { + params: null; + events: { + stats: (payload: FIXME) => void; + }; + receives: { + requestLog: { + id: string | number; + length: number; + }; + }; + }; +}; + +// @public (undocumented) +type Clip = TODO_2; + +// @public (undocumented) +type CustomEmoji = { + id: string; + name: string; + url: string; + category: string; + aliases: string[]; +}; + +// @public (undocumented) +type DateString = string; + +// @public (undocumented) +type DetailedInstanceMetadata = LiteInstanceMetadata & { + features: Record; +}; + +// @public (undocumented) +type DriveFile = { + id: ID; + createdAt: DateString; + isSensitive: boolean; + name: string; + thumbnailUrl: string; + url: string; + type: string; + size: number; + md5: string; + blurhash: string; + comment: string | null; + properties: Record; +}; + +// @public (undocumented) +type DriveFolder = TODO_2; + +// @public (undocumented) +export type Endpoints = { + "admin/abuse-user-reports": { + req: TODO; + res: TODO; + }; + "admin/delete-all-files-of-a-user": { + req: { + userId: User["id"]; + }; + res: null; + }; + "admin/delete-logs": { + req: NoParams; + res: null; + }; + "admin/get-index-stats": { + req: TODO; + res: TODO; + }; + "admin/get-table-stats": { + req: TODO; + res: TODO; + }; + "admin/invite": { + req: TODO; + res: TODO; + }; + "admin/logs": { + req: TODO; + res: TODO; + }; + "admin/meta": { + req: TODO; + res: TODO; + }; + "admin/reset-password": { + req: TODO; + res: TODO; + }; + "admin/resolve-abuse-user-report": { + req: TODO; + res: TODO; + }; + "admin/resync-chart": { + req: TODO; + res: TODO; + }; + "admin/send-email": { + req: TODO; + res: TODO; + }; + "admin/server-info": { + req: TODO; + res: TODO; + }; + "admin/show-moderation-logs": { + req: TODO; + res: TODO; + }; + "admin/show-user": { + req: TODO; + res: TODO; + }; + "admin/show-users": { + req: TODO; + res: TODO; + }; + "admin/silence-user": { + req: TODO; + res: TODO; + }; + "admin/suspend-user": { + req: TODO; + res: TODO; + }; + "admin/unsilence-user": { + req: TODO; + res: TODO; + }; + "admin/unsuspend-user": { + req: TODO; + res: TODO; + }; + "admin/update-meta": { + req: TODO; + res: TODO; + }; + "admin/vacuum": { + req: TODO; + res: TODO; + }; + "admin/accounts/create": { + req: TODO; + res: TODO; + }; + "admin/ad/create": { + req: TODO; + res: TODO; + }; + "admin/ad/delete": { + req: { + id: Ad["id"]; + }; + res: null; + }; + "admin/ad/list": { + req: TODO; + res: TODO; + }; + "admin/ad/update": { + req: TODO; + res: TODO; + }; + "admin/announcements/create": { + req: TODO; + res: TODO; + }; + "admin/announcements/delete": { + req: { + id: Announcement["id"]; + }; + res: null; + }; + "admin/announcements/list": { + req: TODO; + res: TODO; + }; + "admin/announcements/update": { + req: TODO; + res: TODO; + }; + "admin/drive/clean-remote-files": { + req: TODO; + res: TODO; + }; + "admin/drive/cleanup": { + req: TODO; + res: TODO; + }; + "admin/drive/files": { + req: TODO; + res: TODO; + }; + "admin/drive/show-file": { + req: TODO; + res: TODO; + }; + "admin/emoji/add": { + req: TODO; + res: TODO; + }; + "admin/emoji/copy": { + req: TODO; + res: TODO; + }; + "admin/emoji/list-remote": { + req: TODO; + res: TODO; + }; + "admin/emoji/list": { + req: TODO; + res: TODO; + }; + "admin/emoji/remove": { + req: TODO; + res: TODO; + }; + "admin/emoji/update": { + req: TODO; + res: TODO; + }; + "admin/federation/delete-all-files": { + req: { + host: string; + }; + res: null; + }; + "admin/federation/refresh-remote-instance-metadata": { + req: TODO; + res: TODO; + }; + "admin/federation/remove-all-following": { + req: TODO; + res: TODO; + }; + "admin/federation/update-instance": { + req: TODO; + res: TODO; + }; + "admin/moderators/add": { + req: TODO; + res: TODO; + }; + "admin/moderators/remove": { + req: TODO; + res: TODO; + }; + "admin/promo/create": { + req: TODO; + res: TODO; + }; + "admin/queue/clear": { + req: TODO; + res: TODO; + }; + "admin/queue/deliver-delayed": { + req: TODO; + res: TODO; + }; + "admin/queue/inbox-delayed": { + req: TODO; + res: TODO; + }; + "admin/queue/jobs": { + req: TODO; + res: TODO; + }; + "admin/queue/stats": { + req: TODO; + res: TODO; + }; + "admin/relays/add": { + req: TODO; + res: TODO; + }; + "admin/relays/list": { + req: TODO; + res: TODO; + }; + "admin/relays/remove": { + req: TODO; + res: TODO; + }; + announcements: { + req: { + limit?: number; + withUnreads?: boolean; + sinceId?: Announcement["id"]; + untilId?: Announcement["id"]; + }; + res: Announcement[]; + }; + "antennas/create": { + req: TODO; + res: Antenna; + }; + "antennas/delete": { + req: { + antennaId: Antenna["id"]; + }; + res: null; + }; + "antennas/list": { + req: NoParams; + res: Antenna[]; + }; + "antennas/notes": { + req: { + antennaId: Antenna["id"]; + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + }; + res: Note[]; + }; + "antennas/show": { + req: { + antennaId: Antenna["id"]; + }; + res: Antenna; + }; + "antennas/update": { + req: TODO; + res: Antenna; + }; + "antennas/mark-read": { + req: TODO; + res: Antenna; + }; + "ap/get": { + req: { + uri: string; + }; + res: Record; + }; + "ap/show": { + req: { + uri: string; + }; + res: + | { + type: "Note"; + object: Note; + } + | { + type: "User"; + object: UserDetailed; + }; + }; + "app/create": { + req: TODO; + res: App; + }; + "app/show": { + req: { + appId: App["id"]; + }; + res: App; + }; + "auth/accept": { + req: { + token: string; + }; + res: null; + }; + "auth/session/generate": { + req: { + appSecret: string; + }; + res: { + token: string; + url: string; + }; + }; + "auth/session/show": { + req: { + token: string; + }; + res: AuthSession; + }; + "auth/session/userkey": { + req: { + appSecret: string; + token: string; + }; + res: { + accessToken: string; + user: User; + }; + }; + "blocking/create": { + req: { + userId: User["id"]; + }; + res: UserDetailed; + }; + "blocking/delete": { + req: { + userId: User["id"]; + }; + res: UserDetailed; + }; + "blocking/list": { + req: { + limit?: number; + sinceId?: Blocking["id"]; + untilId?: Blocking["id"]; + }; + res: Blocking[]; + }; + "channels/create": { + req: TODO; + res: TODO; + }; + "channels/featured": { + req: TODO; + res: TODO; + }; + "channels/follow": { + req: TODO; + res: TODO; + }; + "channels/followed": { + req: TODO; + res: TODO; + }; + "channels/owned": { + req: TODO; + res: TODO; + }; + "channels/pin-note": { + req: TODO; + res: TODO; + }; + "channels/show": { + req: TODO; + res: TODO; + }; + "channels/timeline": { + req: TODO; + res: TODO; + }; + "channels/unfollow": { + req: TODO; + res: TODO; + }; + "channels/update": { + req: TODO; + res: TODO; + }; + "charts/active-users": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: { + local: { + users: number[]; + }; + remote: { + users: number[]; + }; + }; + }; + "charts/drive": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: { + local: { + decCount: number[]; + decSize: number[]; + incCount: number[]; + incSize: number[]; + totalCount: number[]; + totalSize: number[]; + }; + remote: { + decCount: number[]; + decSize: number[]; + incCount: number[]; + incSize: number[]; + totalCount: number[]; + totalSize: number[]; + }; + }; + }; + "charts/federation": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: { + instance: { + dec: number[]; + inc: number[]; + total: number[]; + }; + }; + }; + "charts/hashtag": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: TODO; + }; + "charts/instance": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + host: string; + }; + res: { + drive: { + decFiles: number[]; + decUsage: number[]; + incFiles: number[]; + incUsage: number[]; + totalFiles: number[]; + totalUsage: number[]; + }; + followers: { + dec: number[]; + inc: number[]; + total: number[]; + }; + following: { + dec: number[]; + inc: number[]; + total: number[]; + }; + notes: { + dec: number[]; + inc: number[]; + total: number[]; + diffs: { + normal: number[]; + renote: number[]; + reply: number[]; + }; + }; + requests: { + failed: number[]; + received: number[]; + succeeded: number[]; + }; + users: { + dec: number[]; + inc: number[]; + total: number[]; + }; + }; + }; + "charts/network": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: TODO; + }; + "charts/notes": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: { + local: { + dec: number[]; + inc: number[]; + total: number[]; + diffs: { + normal: number[]; + renote: number[]; + reply: number[]; + }; + }; + remote: { + dec: number[]; + inc: number[]; + total: number[]; + diffs: { + normal: number[]; + renote: number[]; + reply: number[]; + }; + }; + }; + }; + "charts/user/drive": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + userId: User["id"]; + }; + res: { + decCount: number[]; + decSize: number[]; + incCount: number[]; + incSize: number[]; + totalCount: number[]; + totalSize: number[]; + }; + }; + "charts/user/following": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + userId: User["id"]; + }; + res: TODO; + }; + "charts/user/notes": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + userId: User["id"]; + }; + res: { + dec: number[]; + inc: number[]; + total: number[]; + diffs: { + normal: number[]; + renote: number[]; + reply: number[]; + }; + }; + }; + "charts/user/reactions": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + userId: User["id"]; + }; + res: TODO; + }; + "charts/users": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: { + local: { + dec: number[]; + inc: number[]; + total: number[]; + }; + remote: { + dec: number[]; + inc: number[]; + total: number[]; + }; + }; + }; + "clips/add-note": { + req: TODO; + res: TODO; + }; + "clips/create": { + req: TODO; + res: TODO; + }; + "clips/delete": { + req: { + clipId: Clip["id"]; + }; + res: null; + }; + "clips/list": { + req: TODO; + res: TODO; + }; + "clips/notes": { + req: TODO; + res: TODO; + }; + "clips/show": { + req: TODO; + res: TODO; + }; + "clips/update": { + req: TODO; + res: TODO; + }; + drive: { + req: NoParams; + res: { + capacity: number; + usage: number; + }; + }; + "drive/files": { + req: { + folderId?: DriveFolder["id"] | null; + type?: DriveFile["type"] | null; + limit?: number; + sinceId?: DriveFile["id"]; + untilId?: DriveFile["id"]; + }; + res: DriveFile[]; + }; + "drive/files/attached-notes": { + req: TODO; + res: TODO; + }; + "drive/files/check-existence": { + req: TODO; + res: TODO; + }; + "drive/files/create": { + req: TODO; + res: TODO; + }; + "drive/files/delete": { + req: { + fileId: DriveFile["id"]; + }; + res: null; + }; + "drive/files/find-by-hash": { + req: TODO; + res: TODO; + }; + "drive/files/find": { + req: { + name: string; + folderId?: DriveFolder["id"] | null; + }; + res: DriveFile[]; + }; + "drive/files/show": { + req: { + fileId?: DriveFile["id"]; + url?: string; + }; + res: DriveFile; + }; + "drive/files/update": { + req: { + fileId: DriveFile["id"]; + folderId?: DriveFolder["id"] | null; + name?: string; + isSensitive?: boolean; + comment?: string | null; + }; + res: DriveFile; + }; + "drive/files/upload-from-url": { + req: { + url: string; + folderId?: DriveFolder["id"] | null; + isSensitive?: boolean; + comment?: string | null; + marker?: string | null; + force?: boolean; + }; + res: null; + }; + "drive/folders": { + req: { + folderId?: DriveFolder["id"] | null; + limit?: number; + sinceId?: DriveFile["id"]; + untilId?: DriveFile["id"]; + }; + res: DriveFolder[]; + }; + "drive/folders/create": { + req: { + name?: string; + parentId?: DriveFolder["id"] | null; + }; + res: DriveFolder; + }; + "drive/folders/delete": { + req: { + folderId: DriveFolder["id"]; + }; + res: null; + }; + "drive/folders/find": { + req: { + name: string; + parentId?: DriveFolder["id"] | null; + }; + res: DriveFolder[]; + }; + "drive/folders/show": { + req: { + folderId: DriveFolder["id"]; + }; + res: DriveFolder; + }; + "drive/folders/update": { + req: { + folderId: DriveFolder["id"]; + name?: string; + parentId?: DriveFolder["id"] | null; + }; + res: DriveFolder; + }; + "drive/stream": { + req: { + type?: DriveFile["type"] | null; + limit?: number; + sinceId?: DriveFile["id"]; + untilId?: DriveFile["id"]; + }; + res: DriveFile[]; + }; + endpoint: { + req: { + endpoint: string; + }; + res: { + params: { + name: string; + type: string; + }[]; + }; + }; + endpoints: { + req: NoParams; + res: string[]; + }; + "federation/dns": { + req: { + host: string; + }; + res: { + a: string[]; + aaaa: string[]; + cname: string[]; + txt: string[]; + }; + }; + "federation/followers": { + req: { + host: string; + limit?: number; + sinceId?: Following["id"]; + untilId?: Following["id"]; + }; + res: FollowingFolloweePopulated[]; + }; + "federation/following": { + req: { + host: string; + limit?: number; + sinceId?: Following["id"]; + untilId?: Following["id"]; + }; + res: FollowingFolloweePopulated[]; + }; + "federation/instances": { + req: { + host?: string | null; + blocked?: boolean | null; + notResponding?: boolean | null; + suspended?: boolean | null; + federating?: boolean | null; + subscribing?: boolean | null; + publishing?: boolean | null; + limit?: number; + offset?: number; + sort?: + | "+pubSub" + | "-pubSub" + | "+notes" + | "-notes" + | "+users" + | "-users" + | "+following" + | "-following" + | "+followers" + | "-followers" + | "+caughtAt" + | "-caughtAt" + | "+lastCommunicatedAt" + | "-lastCommunicatedAt" + | "+driveUsage" + | "-driveUsage" + | "+driveFiles" + | "-driveFiles"; + }; + res: Instance[]; + }; + "federation/show-instance": { + req: { + host: string; + }; + res: Instance; + }; + "federation/update-remote-user": { + req: { + userId: User["id"]; + }; + res: null; + }; + "federation/users": { + req: { + host: string; + limit?: number; + sinceId?: User["id"]; + untilId?: User["id"]; + }; + res: UserDetailed[]; + }; + "following/create": { + req: { + userId: User["id"]; + }; + res: User; + }; + "following/delete": { + req: { + userId: User["id"]; + }; + res: User; + }; + "following/requests/accept": { + req: { + userId: User["id"]; + }; + res: null; + }; + "following/requests/cancel": { + req: { + userId: User["id"]; + }; + res: User; + }; + "following/requests/list": { + req: NoParams; + res: FollowRequest[]; + }; + "following/requests/reject": { + req: { + userId: User["id"]; + }; + res: null; + }; + "gallery/featured": { + req: TODO; + res: TODO; + }; + "gallery/popular": { + req: TODO; + res: TODO; + }; + "gallery/posts": { + req: TODO; + res: TODO; + }; + "gallery/posts/create": { + req: TODO; + res: TODO; + }; + "gallery/posts/delete": { + req: { + postId: GalleryPost["id"]; + }; + res: null; + }; + "gallery/posts/like": { + req: TODO; + res: TODO; + }; + "gallery/posts/show": { + req: TODO; + res: TODO; + }; + "gallery/posts/unlike": { + req: TODO; + res: TODO; + }; + "gallery/posts/update": { + req: TODO; + res: TODO; + }; + "games/reversi/games": { + req: TODO; + res: TODO; + }; + "games/reversi/games/show": { + req: TODO; + res: TODO; + }; + "games/reversi/games/surrender": { + req: TODO; + res: TODO; + }; + "games/reversi/invitations": { + req: TODO; + res: TODO; + }; + "games/reversi/match": { + req: TODO; + res: TODO; + }; + "games/reversi/match/cancel": { + req: TODO; + res: TODO; + }; + "get-online-users-count": { + req: NoParams; + res: { + count: number; + }; + }; + "hashtags/list": { + req: TODO; + res: TODO; + }; + "hashtags/search": { + req: TODO; + res: TODO; + }; + "hashtags/show": { + req: TODO; + res: TODO; + }; + "hashtags/trend": { + req: TODO; + res: TODO; + }; + "hashtags/users": { + req: TODO; + res: TODO; + }; + i: { + req: NoParams; + res: User; + }; + "i/apps": { + req: TODO; + res: TODO; + }; + "i/authorized-apps": { + req: TODO; + res: TODO; + }; + "i/change-password": { + req: TODO; + res: TODO; + }; + "i/delete-account": { + req: { + password: string; + }; + res: null; + }; + "i/export-blocking": { + req: TODO; + res: TODO; + }; + "i/export-following": { + req: TODO; + res: TODO; + }; + "i/export-mute": { + req: TODO; + res: TODO; + }; + "i/export-notes": { + req: TODO; + res: TODO; + }; + "i/export-user-lists": { + req: TODO; + res: TODO; + }; + "i/favorites": { + req: { + limit?: number; + sinceId?: NoteFavorite["id"]; + untilId?: NoteFavorite["id"]; + }; + res: NoteFavorite[]; + }; + "i/gallery/likes": { + req: TODO; + res: TODO; + }; + "i/gallery/posts": { + req: TODO; + res: TODO; + }; + "i/get-word-muted-notes-count": { + req: TODO; + res: TODO; + }; + "i/import-following": { + req: TODO; + res: TODO; + }; + "i/import-user-lists": { + req: TODO; + res: TODO; + }; + "i/move": { + req: TODO; + res: TODO; + }; + "i/known-as": { + req: TODO; + res: TODO; + }; + "i/notifications": { + req: { + limit?: number; + sinceId?: Notification_2["id"]; + untilId?: Notification_2["id"]; + following?: boolean; + markAsRead?: boolean; + includeTypes?: Notification_2["type"][]; + excludeTypes?: Notification_2["type"][]; + }; + res: Notification_2[]; + }; + "i/page-likes": { + req: TODO; + res: TODO; + }; + "i/pages": { + req: TODO; + res: TODO; + }; + "i/pin": { + req: { + noteId: Note["id"]; + }; + res: MeDetailed; + }; + "i/read-all-messaging-messages": { + req: TODO; + res: TODO; + }; + "i/read-all-unread-notes": { + req: TODO; + res: TODO; + }; + "i/read-announcement": { + req: TODO; + res: TODO; + }; + "i/regenerate-token": { + req: { + password: string; + }; + res: null; + }; + "i/registry/get-all": { + req: { + scope?: string[]; + }; + res: Record; + }; + "i/registry/get-detail": { + req: { + key: string; + scope?: string[]; + }; + res: { + updatedAt: DateString; + value: any; + }; + }; + "i/registry/get": { + req: { + key: string; + scope?: string[]; + }; + res: any; + }; + "i/registry/keys-with-type": { + req: { + scope?: string[]; + }; + res: Record< + string, + "null" | "array" | "number" | "string" | "boolean" | "object" + >; + }; + "i/registry/keys": { + req: { + scope?: string[]; + }; + res: string[]; + }; + "i/registry/remove": { + req: { + key: string; + scope?: string[]; + }; + res: null; + }; + "i/registry/scopes": { + req: NoParams; + res: string[][]; + }; + "i/registry/set": { + req: { + key: string; + value: any; + scope?: string[]; + }; + res: null; + }; + "i/revoke-token": { + req: TODO; + res: TODO; + }; + "i/signin-history": { + req: { + limit?: number; + sinceId?: Signin["id"]; + untilId?: Signin["id"]; + }; + res: Signin[]; + }; + "i/unpin": { + req: { + noteId: Note["id"]; + }; + res: MeDetailed; + }; + "i/update-email": { + req: { + password: string; + email?: string | null; + }; + res: MeDetailed; + }; + "i/update": { + req: { + name?: string | null; + description?: string | null; + lang?: string | null; + location?: string | null; + birthday?: string | null; + avatarId?: DriveFile["id"] | null; + bannerId?: DriveFile["id"] | null; + fields?: { + name: string; + value: string; + }[]; + isLocked?: boolean; + isExplorable?: boolean; + hideOnlineStatus?: boolean; + carefulBot?: boolean; + autoAcceptFollowed?: boolean; + noCrawle?: boolean; + preventAiLearning?: boolean; + isBot?: boolean; + isCat?: boolean; + injectFeaturedNote?: boolean; + receiveAnnouncementEmail?: boolean; + alwaysMarkNsfw?: boolean; + mutedWords?: string[][]; + mutingNotificationTypes?: Notification_2["type"][]; + emailNotificationTypes?: string[]; + }; + res: MeDetailed; + }; + "i/user-group-invites": { + req: TODO; + res: TODO; + }; + "i/2fa/done": { + req: TODO; + res: TODO; + }; + "i/2fa/key-done": { + req: TODO; + res: TODO; + }; + "i/2fa/password-less": { + req: TODO; + res: TODO; + }; + "i/2fa/register-key": { + req: TODO; + res: TODO; + }; + "i/2fa/register": { + req: TODO; + res: TODO; + }; + "i/2fa/update-key": { + req: TODO; + res: TODO; + }; + "i/2fa/remove-key": { + req: TODO; + res: TODO; + }; + "i/2fa/unregister": { + req: TODO; + res: TODO; + }; + "messaging/history": { + req: { + limit?: number; + group?: boolean; + }; + res: MessagingMessage[]; + }; + "messaging/messages": { + req: { + userId?: User["id"]; + groupId?: UserGroup["id"]; + limit?: number; + sinceId?: MessagingMessage["id"]; + untilId?: MessagingMessage["id"]; + markAsRead?: boolean; + }; + res: MessagingMessage[]; + }; + "messaging/messages/create": { + req: { + userId?: User["id"]; + groupId?: UserGroup["id"]; + text?: string; + fileId?: DriveFile["id"]; + }; + res: MessagingMessage; + }; + "messaging/messages/delete": { + req: { + messageId: MessagingMessage["id"]; + }; + res: null; + }; + "messaging/messages/read": { + req: { + messageId: MessagingMessage["id"]; + }; + res: null; + }; + meta: { + req: { + detail?: boolean; + }; + res: { + $switch: { + $cases: [ + [ + { + detail: true; + }, + DetailedInstanceMetadata, + ], + [ + { + detail: false; + }, + LiteInstanceMetadata, + ], + [ + { + detail: boolean; + }, + LiteInstanceMetadata | DetailedInstanceMetadata, + ], + ]; + $default: LiteInstanceMetadata; + }; + }; + }; + "miauth/gen-token": { + req: TODO; + res: TODO; + }; + "mute/create": { + req: TODO; + res: TODO; + }; + "mute/delete": { + req: { + userId: User["id"]; + }; + res: null; + }; + "mute/list": { + req: TODO; + res: TODO; + }; + "renote-mute/create": { + req: TODO; + res: TODO; + }; + "renote-mute/delete": { + req: { + userId: User["id"]; + }; + res: null; + }; + "renote-mute/list": { + req: TODO; + res: TODO; + }; + "my/apps": { + req: TODO; + res: TODO; + }; + notes: { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + }; + res: Note[]; + }; + "notes/children": { + req: { + noteId: Note["id"]; + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + }; + res: Note[]; + }; + "notes/clips": { + req: TODO; + res: TODO; + }; + "notes/conversation": { + req: TODO; + res: TODO; + }; + "notes/create": { + req: NoteSubmitReq; + res: { + createdNote: Note; + }; + }; + "notes/delete": { + req: { + noteId: Note["id"]; + }; + res: null; + }; + "notes/edit": { + req: NoteSubmitReq; + res: { + createdNote: Note; + }; + }; + "notes/favorites/create": { + req: { + noteId: Note["id"]; + }; + res: null; + }; + "notes/favorites/delete": { + req: { + noteId: Note["id"]; + }; + res: null; + }; + "notes/featured": { + req: TODO; + res: Note[]; + }; + "notes/global-timeline": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/recommended-timeline": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/hybrid-timeline": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/local-timeline": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/mentions": { + req: { + following?: boolean; + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + }; + res: Note[]; + }; + "notes/polls/recommendation": { + req: TODO; + res: TODO; + }; + "notes/polls/vote": { + req: { + noteId: Note["id"]; + choice: number; + }; + res: null; + }; + "notes/reactions": { + req: { + noteId: Note["id"]; + type?: string | null; + limit?: number; + }; + res: NoteReaction[]; + }; + "notes/reactions/create": { + req: { + noteId: Note["id"]; + reaction: string; + }; + res: null; + }; + "notes/reactions/delete": { + req: { + noteId: Note["id"]; + }; + res: null; + }; + "notes/renotes": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + noteId: Note["id"]; + }; + res: Note[]; + }; + "notes/replies": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + noteId: Note["id"]; + }; + res: Note[]; + }; + "notes/search-by-tag": { + req: TODO; + res: TODO; + }; + "notes/search": { + req: TODO; + res: TODO; + }; + "notes/show": { + req: { + noteId: Note["id"]; + }; + res: Note; + }; + "notes/state": { + req: TODO; + res: TODO; + }; + "notes/timeline": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/unrenote": { + req: { + noteId: Note["id"]; + }; + res: null; + }; + "notes/user-list-timeline": { + req: { + listId: UserList["id"]; + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/watching/create": { + req: TODO; + res: TODO; + }; + "notes/watching/delete": { + req: { + noteId: Note["id"]; + }; + res: null; + }; + "notifications/create": { + req: { + body: string; + header?: string | null; + icon?: string | null; + }; + res: null; + }; + "notifications/mark-all-as-read": { + req: NoParams; + res: null; + }; + "notifications/read": { + req: { + notificationId: Notification_2["id"]; + }; + res: null; + }; + "page-push": { + req: { + pageId: Page["id"]; + event: string; + var?: any; + }; + res: null; + }; + "pages/create": { + req: TODO; + res: Page; + }; + "pages/delete": { + req: { + pageId: Page["id"]; + }; + res: null; + }; + "pages/featured": { + req: NoParams; + res: Page[]; + }; + "pages/like": { + req: { + pageId: Page["id"]; + }; + res: null; + }; + "pages/show": { + req: { + pageId?: Page["id"]; + name?: string; + username?: string; + }; + res: Page; + }; + "pages/unlike": { + req: { + pageId: Page["id"]; + }; + res: null; + }; + "pages/update": { + req: TODO; + res: null; + }; + ping: { + req: NoParams; + res: { + pong: number; + }; + }; + "pinned-users": { + req: TODO; + res: TODO; + }; + "promo/read": { + req: TODO; + res: TODO; + }; + "request-reset-password": { + req: { + username: string; + email: string; + }; + res: null; + }; + "reset-password": { + req: { + token: string; + password: string; + }; + res: null; + }; + "room/show": { + req: TODO; + res: TODO; + }; + "room/update": { + req: TODO; + res: TODO; + }; + stats: { + req: NoParams; + res: Stats; + }; + "server-info": { + req: NoParams; + res: ServerInfo; + }; + "latest-version": { + req: NoParams; + res: TODO; + }; + "sw/register": { + req: TODO; + res: TODO; + }; + "username/available": { + req: { + username: string; + }; + res: { + available: boolean; + }; + }; + users: { + req: { + limit?: number; + offset?: number; + sort?: UserSorting; + origin?: OriginType; + }; + res: User[]; + }; + "users/clips": { + req: TODO; + res: TODO; + }; + "users/followers": { + req: { + userId?: User["id"]; + username?: User["username"]; + host?: User["host"] | null; + limit?: number; + sinceId?: Following["id"]; + untilId?: Following["id"]; + }; + res: FollowingFollowerPopulated[]; + }; + "users/following": { + req: { + userId?: User["id"]; + username?: User["username"]; + host?: User["host"] | null; + limit?: number; + sinceId?: Following["id"]; + untilId?: Following["id"]; + }; + res: FollowingFolloweePopulated[]; + }; + "users/gallery/posts": { + req: TODO; + res: TODO; + }; + "users/get-frequently-replied-users": { + req: TODO; + res: TODO; + }; + "users/groups/create": { + req: TODO; + res: TODO; + }; + "users/groups/delete": { + req: { + groupId: UserGroup["id"]; + }; + res: null; + }; + "users/groups/invitations/accept": { + req: TODO; + res: TODO; + }; + "users/groups/invitations/reject": { + req: TODO; + res: TODO; + }; + "users/groups/invite": { + req: TODO; + res: TODO; + }; + "users/groups/joined": { + req: TODO; + res: TODO; + }; + "users/groups/owned": { + req: TODO; + res: TODO; + }; + "users/groups/pull": { + req: TODO; + res: TODO; + }; + "users/groups/show": { + req: TODO; + res: TODO; + }; + "users/groups/transfer": { + req: TODO; + res: TODO; + }; + "users/groups/update": { + req: TODO; + res: TODO; + }; + "users/lists/create": { + req: { + name: string; + }; + res: UserList; + }; + "users/lists/delete": { + req: { + listId: UserList["id"]; + }; + res: null; + }; + "users/lists/list": { + req: NoParams; + res: UserList[]; + }; + "users/lists/pull": { + req: { + listId: UserList["id"]; + userId: User["id"]; + }; + res: null; + }; + "users/lists/push": { + req: { + listId: UserList["id"]; + userId: User["id"]; + }; + res: null; + }; + "users/lists/show": { + req: { + listId: UserList["id"]; + }; + res: UserList; + }; + "users/lists/update": { + req: { + listId: UserList["id"]; + name: string; + }; + res: UserList; + }; + "users/notes": { + req: { + userId: User["id"]; + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "users/pages": { + req: TODO; + res: TODO; + }; + "users/recommendation": { + req: TODO; + res: TODO; + }; + "users/relation": { + req: TODO; + res: TODO; + }; + "users/report-abuse": { + req: TODO; + res: TODO; + }; + "users/search-by-username-and-host": { + req: TODO; + res: TODO; + }; + "users/search": { + req: TODO; + res: TODO; + }; + "users/show": { + req: + | ShowUserReq + | { + userIds: User["id"][]; + }; + res: { + $switch: { + $cases: [ + [ + { + userIds: User["id"][]; + }, + UserDetailed[], + ], + ]; + $default: UserDetailed; + }; + }; + }; + "users/stats": { + req: TODO; + res: TODO; + }; +}; + +declare namespace entities { + export { + ID, + DateString, + User, + UserLite, + UserDetailed, + UserGroup, + UserList, + MeDetailed, + DriveFile, + DriveFolder, + GalleryPost, + Note, + NoteReaction, + Notification_2 as Notification, + MessagingMessage, + CustomEmoji, + LiteInstanceMetadata, + DetailedInstanceMetadata, + InstanceMetadata, + ServerInfo, + Stats, + Page, + PageEvent, + Announcement, + Antenna, + App, + AuthSession, + Ad, + Clip, + NoteFavorite, + FollowRequest, + Channel, + Following, + FollowingFolloweePopulated, + FollowingFollowerPopulated, + Blocking, + Instance, + Signin, + UserSorting, + OriginType + } +} +export { entities } + +// @public (undocumented) +type FetchLike = ( + input: string, + init?: { + method?: string; + body?: string; + credentials?: RequestCredentials; + cache?: RequestCache; + }, +) => Promise<{ + status: number; + json(): Promise; +}>; + +// @public (undocumented) +export const ffVisibility: readonly ["public", "followers", "private"]; + +// @public (undocumented) +type Following = { + id: ID; + createdAt: DateString; + followerId: User["id"]; + followeeId: User["id"]; +}; + +// @public (undocumented) +type FollowingFolloweePopulated = Following & { + followee: UserDetailed; +}; + +// @public (undocumented) +type FollowingFollowerPopulated = Following & { + follower: UserDetailed; +}; + +// @public (undocumented) +type FollowRequest = { + id: ID; + follower: User; + followee: User; +}; + +// @public (undocumented) +type GalleryPost = TODO_2; + +// @public (undocumented) +type ID = string; + +// @public (undocumented) +type Instance = { + id: ID; + caughtAt: DateString; + host: string; + usersCount: number; + notesCount: number; + followingCount: number; + followersCount: number; + driveUsage: number; + driveFiles: number; + latestRequestSentAt: DateString | null; + latestStatus: number | null; + latestRequestReceivedAt: DateString | null; + lastCommunicatedAt: DateString; + isNotResponding: boolean; + isSuspended: boolean; + softwareName: string | null; + softwareVersion: string | null; + openRegistrations: boolean | null; + name: string | null; + description: string | null; + maintainerName: string | null; + maintainerEmail: string | null; + iconUrl: string | null; + faviconUrl: string | null; + themeColor: string | null; + infoUpdatedAt: DateString | null; +}; + +// @public (undocumented) +type InstanceMetadata = + | LiteInstanceMetadata + | DetailedInstanceMetadata; + +// @public (undocumented) +function isAPIError(reason: any): reason is APIError; + +// @public (undocumented) +type LiteInstanceMetadata = { + maintainerName: string | null; + maintainerEmail: string | null; + version: string; + name: string | null; + uri: string; + description: string | null; + tosUrl: string | null; + disableRegistration: boolean; + disableLocalTimeline: boolean; + disableRecommendedTimeline: boolean; + disableGlobalTimeline: boolean; + driveCapacityPerLocalUserMb: number; + driveCapacityPerRemoteUserMb: number; + enableHcaptcha: boolean; + hcaptchaSiteKey: string | null; + enableRecaptcha: boolean; + recaptchaSiteKey: string | null; + swPublickey: string | null; + maxNoteTextLength: number; + enableEmail: boolean; + enableTwitterIntegration: boolean; + enableGithubIntegration: boolean; + enableDiscordIntegration: boolean; + enableServiceWorker: boolean; + emojis: CustomEmoji[]; + ads: { + id: ID; + ratio: number; + place: string; + url: string; + imageUrl: string; + }[]; +}; + +// @public (undocumented) +type MeDetailed = UserDetailed & { + avatarId: DriveFile["id"]; + bannerId: DriveFile["id"]; + autoAcceptFollowed: boolean; + alwaysMarkNsfw: boolean; + carefulBot: boolean; + emailNotificationTypes: string[]; + hasPendingReceivedFollowRequest: boolean; + hasUnreadAnnouncement: boolean; + hasUnreadAntenna: boolean; + hasUnreadChannel: boolean; + hasUnreadMentions: boolean; + hasUnreadMessagingMessage: boolean; + hasUnreadNotification: boolean; + hasUnreadSpecifiedNotes: boolean; + hideOnlineStatus: boolean; + injectFeaturedNote: boolean; + integrations: Record; + isDeleted: boolean; + isExplorable: boolean; + mutedWords: string[][]; + mutingNotificationTypes: string[]; + noCrawle: boolean; + preventAiLearning: boolean; + receiveAnnouncementEmail: boolean; + usePasswordLessLogin: boolean; + [other: string]: any; +}; + +// @public (undocumented) +type MessagingMessage = { + id: ID; + createdAt: DateString; + file: DriveFile | null; + fileId: DriveFile["id"] | null; + isRead: boolean; + reads: User["id"][]; + text: string | null; + user: User; + userId: User["id"]; + recipient?: User | null; + recipientId: User["id"] | null; + group?: UserGroup | null; + groupId: UserGroup["id"] | null; +}; + +// @public (undocumented) +export const mutedNoteReasons: readonly [ + "word", + "manual", + "spam", + "other", +]; + +// @public (undocumented) +type Note = { + id: ID; + createdAt: DateString; + text: string | null; + cw: string | null; + user: User; + userId: User["id"]; + reply?: Note; + replyId: Note["id"]; + renote?: Note; + renoteId: Note["id"]; + files: DriveFile[]; + fileIds: DriveFile["id"][]; + visibility: "public" | "home" | "followers" | "specified"; + visibleUserIds?: User["id"][]; + localOnly?: boolean; + channel?: Channel["id"]; + myReaction?: string; + reactions: Record; + renoteCount: number; + repliesCount: number; + poll?: { + expiresAt: DateString | null; + multiple: boolean; + choices: { + isVoted: boolean; + text: string; + votes: number; + }[]; + }; + emojis: { + name: string; + url: string; + }[]; + uri?: string; + url?: string; + updatedAt?: DateString; + isHidden?: boolean; +}; + +// @public (undocumented) +type NoteFavorite = { + id: ID; + createdAt: DateString; + noteId: Note["id"]; + note: Note; +}; + +// @public (undocumented) +type NoteReaction = { + id: ID; + createdAt: DateString; + user: UserLite; + type: string; +}; + +// @public (undocumented) +export const noteVisibilities: readonly [ + "public", + "home", + "followers", + "specified", +]; + +// @public (undocumented) +type Notification_2 = { + id: ID; + createdAt: DateString; + isRead: boolean; +} & ( + | { + type: "reaction"; + reaction: string; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "reply"; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "renote"; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "quote"; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "mention"; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "pollVote"; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "follow"; + user: User; + userId: User["id"]; + } + | { + type: "followRequestAccepted"; + user: User; + userId: User["id"]; + } + | { + type: "receiveFollowRequest"; + user: User; + userId: User["id"]; + } + | { + type: "groupInvited"; + invitation: UserGroup; + user: User; + userId: User["id"]; + } + | { + type: "app"; + header?: string | null; + body: string; + icon?: string | null; + } +); + +// @public (undocumented) +export const notificationTypes: readonly [ + "follow", + "mention", + "reply", + "renote", + "quote", + "reaction", + "pollVote", + "pollEnded", + "receiveFollowRequest", + "followRequestAccepted", + "groupInvited", + "app", +]; + +// @public (undocumented) +type OriginType = "combined" | "local" | "remote"; + +// @public (undocumented) +type Page = { + id: ID; + createdAt: DateString; + updatedAt: DateString; + userId: User["id"]; + user: User; + content: Record[]; + variables: Record[]; + title: string; + name: string; + summary: string | null; + hideTitleWhenPinned: boolean; + alignCenter: boolean; + font: string; + script: string; + eyeCatchingImageId: DriveFile["id"] | null; + eyeCatchingImage: DriveFile | null; + attachedFiles: any; + likedCount: number; + isLiked?: boolean; +}; + +// @public (undocumented) +type PageEvent = { + pageId: Page["id"]; + event: string; + var: any; + userId: User["id"]; + user: User; +}; + +// @public (undocumented) +export const permissions: string[]; + +// @public (undocumented) +type ServerInfo = { + machine: string; + cpu: { + model: string; + cores: number; + }; + mem: { + total: number; + }; + fs: { + total: number; + used: number; + }; +}; + +// @public (undocumented) +type Signin = { + id: ID; + createdAt: DateString; + ip: string; + headers: Record; + success: boolean; +}; + +// @public (undocumented) +type Stats = { + notesCount: number; + originalNotesCount: number; + usersCount: number; + originalUsersCount: number; + instances: number; + driveUsageLocal: number; + driveUsageRemote: number; +}; + +// Warning: (ae-forgotten-export) The symbol "StreamEvents" needs to be exported by the entry point index.d.ts +// +// @public (undocumented) +export class Stream extends EventEmitter { + constructor( + origin: string, + user: { + token: string; + } | null, + options?: { + WebSocket?: any; + }, + ); + // (undocumented) + close(): void; + // Warning: (ae-forgotten-export) The symbol "NonSharedConnection" needs to be exported by the entry point index.d.ts + // + // (undocumented) + disconnectToChannel(connection: NonSharedConnection): void; + // Warning: (ae-forgotten-export) The symbol "SharedConnection" needs to be exported by the entry point index.d.ts + // + // (undocumented) + removeSharedConnection(connection: SharedConnection): void; + // Warning: (ae-forgotten-export) The symbol "Pool" needs to be exported by the entry point index.d.ts + // + // (undocumented) + removeSharedConnectionPool(pool: Pool): void; + // (undocumented) + send(typeOrPayload: any, payload?: any): void; + // (undocumented) + state: "initializing" | "reconnecting" | "connected"; + // (undocumented) + useChannel( + channel: C, + params?: Channels[C]["params"], + name?: string, + ): ChannelConnection; + } + +// @public (undocumented) +type User = UserLite | UserDetailed; + +// @public (undocumented) +type UserDetailed = UserLite & { + bannerBlurhash: string | null; + bannerColor: string | null; + bannerUrl: string | null; + birthday: string | null; + createdAt: DateString; + description: string | null; + ffVisibility: "public" | "followers" | "private"; + fields: { + name: string; + value: string; + }[]; + followersCount: number; + followingCount: number; + hasPendingFollowRequestFromYou: boolean; + hasPendingFollowRequestToYou: boolean; + isAdmin: boolean; + isBlocked: boolean; + isBlocking: boolean; + isBot: boolean; + isCat: boolean; + isFollowed: boolean; + isFollowing: boolean; + isLocked: boolean; + isModerator: boolean; + isMuted: boolean; + isRenoteMuted: boolean; + isSilenced: boolean; + isSuspended: boolean; + lang: string | null; + lastFetchedAt?: DateString; + location: string | null; + notesCount: number; + pinnedNoteIds: ID[]; + pinnedNotes: Note[]; + pinnedPage: Page | null; + pinnedPageId: string | null; + publicReactions: boolean; + securityKeys: boolean; + twoFactorEnabled: boolean; + updatedAt: DateString | null; + uri: string | null; + url: string | null; +}; + +// @public (undocumented) +type UserGroup = TODO_2; + +// @public (undocumented) +type UserList = { + id: ID; + createdAt: DateString; + name: string; + userIds: User["id"][]; +}; + +// @public (undocumented) +type UserLite = { + id: ID; + username: string; + host: string | null; + name: string; + onlineStatus: "online" | "active" | "offline" | "unknown"; + avatarUrl: string; + avatarBlurhash: string; + alsoKnownAs: string[]; + movedToUri: any; + emojis: { + name: string; + url: string; + }[]; + instance?: { + name: Instance["name"]; + softwareName: Instance["softwareName"]; + softwareVersion: Instance["softwareVersion"]; + iconUrl: Instance["iconUrl"]; + faviconUrl: Instance["faviconUrl"]; + themeColor: Instance["themeColor"]; + }; +}; + +// @public (undocumented) +type UserSorting = + | "+follower" + | "-follower" + | "+createdAt" + | "-createdAt" + | "+updatedAt" + | "-updatedAt"; + +// Warnings were encountered during analysis: +// +// src/api.types.ts:80:37 - (ae-forgotten-export) The symbol "TODO" needs to be exported by the entry point index.d.ts +// src/api.types.ts:83:28 - (ae-forgotten-export) The symbol "NoParams" needs to be exported by the entry point index.d.ts +// src/api.types.ts:853:5 - (ae-forgotten-export) The symbol "NoteSubmitReq" needs to be exported by the entry point index.d.ts +// src/api.types.ts:1094:3 - (ae-forgotten-export) The symbol "ShowUserReq" needs to be exported by the entry point index.d.ts +// src/streaming.types.ts:56:18 - (ae-forgotten-export) The symbol "FIXME" needs to be exported by the entry point index.d.ts + +// (No @packageDocumentation comment for this package) + +``` diff --git a/fe_calckey/frontend/calckey-js/etc/misskey-js.api.md b/fe_calckey/frontend/calckey-js/etc/misskey-js.api.md new file mode 100644 index 0000000..269d5cf --- /dev/null +++ b/fe_calckey/frontend/calckey-js/etc/misskey-js.api.md @@ -0,0 +1,2681 @@ +## API Report File for "misskey-js" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts + +import { EventEmitter } from 'eventemitter3'; + +// @public (undocumented) +export type Acct = { + username: string; + host: string | null; +}; + +// Warning: (ae-forgotten-export) The symbol "TODO" needs to be exported by the entry point index.d.ts +// +// @public (undocumented) +type Ad = TODO_2; + +// @public (undocumented) +type Announcement = { + id: ID; + createdAt: DateString; + updatedAt: DateString | null; + text: string; + title: string; + imageUrl: string | null; + isRead?: boolean; +}; + +// @public (undocumented) +type Antenna = { + id: ID; + createdAt: DateString; + name: string; + keywords: string[][]; + excludeKeywords: string[][]; + src: 'home' | 'all' | 'users' | 'list' | 'group'; + userListId: ID | null; + userGroupId: ID | null; + users: string[]; + caseSensitive: boolean; + notify: boolean; + withReplies: boolean; + withFile: boolean; + hasUnreadNote: boolean; +}; + +declare namespace api { + export { + isAPIError, + APIError, + FetchLike, + APIClient + } +} +export { api } + +// @public (undocumented) +class APIClient { + constructor(opts: { + origin: APIClient['origin']; + credential?: APIClient['credential']; + fetch?: APIClient['fetch'] | null | undefined; + }); + // (undocumented) + credential: string | null | undefined; + // (undocumented) + fetch: FetchLike; + // (undocumented) + origin: string; + // Warning: (ae-forgotten-export) The symbol "IsCaseMatched" needs to be exported by the entry point index.d.ts + // Warning: (ae-forgotten-export) The symbol "GetCaseResult" needs to be exported by the entry point index.d.ts + // + // (undocumented) + request(endpoint: E, params?: P, credential?: string | null | undefined): Promise extends true ? GetCaseResult : IsCaseMatched extends true ? GetCaseResult : IsCaseMatched extends true ? GetCaseResult : IsCaseMatched extends true ? GetCaseResult : IsCaseMatched extends true ? GetCaseResult : IsCaseMatched extends true ? GetCaseResult : IsCaseMatched extends true ? GetCaseResult : IsCaseMatched extends true ? GetCaseResult : IsCaseMatched extends true ? GetCaseResult : IsCaseMatched extends true ? GetCaseResult : Endpoints[E]['res']['$switch']['$default'] : Endpoints[E]['res']>; +} + +// @public (undocumented) +type APIError = { + id: string; + code: string; + message: string; + kind: 'client' | 'server'; + info: Record; +}; + +// @public (undocumented) +type App = TODO_2; + +// @public (undocumented) +type AuthSession = { + id: ID; + app: App; + token: string; +}; + +// @public (undocumented) +type Blocking = { + id: ID; + createdAt: DateString; + blockeeId: User['id']; + blockee: UserDetailed; +}; + +// @public (undocumented) +type Channel = { + id: ID; +}; + +// Warning: (ae-forgotten-export) The symbol "AnyOf" needs to be exported by the entry point index.d.ts +// +// @public (undocumented) +export abstract class ChannelConnection = any> extends EventEmitter { + constructor(stream: Stream, channel: string, name?: string); + // (undocumented) + channel: string; + // (undocumented) + abstract dispose(): void; + // (undocumented) + abstract id: string; + // (undocumented) + inCount: number; + // (undocumented) + name?: string; + // (undocumented) + outCount: number; + // (undocumented) + send(type: T, body: Channel['receives'][T]): void; + // (undocumented) + protected stream: Stream; +} + +// @public (undocumented) +export type Channels = { + main: { + params: null; + events: { + notification: (payload: Notification_2) => void; + mention: (payload: Note) => void; + reply: (payload: Note) => void; + renote: (payload: Note) => void; + follow: (payload: User) => void; + followed: (payload: User) => void; + unfollow: (payload: User) => void; + meUpdated: (payload: MeDetailed) => void; + pageEvent: (payload: PageEvent) => void; + urlUploadFinished: (payload: { + marker: string; + file: DriveFile; + }) => void; + readAllNotifications: () => void; + unreadNotification: (payload: Notification_2) => void; + unreadMention: (payload: Note['id']) => void; + readAllUnreadMentions: () => void; + unreadSpecifiedNote: (payload: Note['id']) => void; + readAllUnreadSpecifiedNotes: () => void; + readAllMessagingMessages: () => void; + messagingMessage: (payload: MessagingMessage) => void; + unreadMessagingMessage: (payload: MessagingMessage) => void; + readAllAntennas: () => void; + unreadAntenna: (payload: Antenna) => void; + readAllAnnouncements: () => void; + readAllChannels: () => void; + unreadChannel: (payload: Note['id']) => void; + myTokenRegenerated: () => void; + reversiNoInvites: () => void; + reversiInvited: (payload: FIXME) => void; + signin: (payload: FIXME) => void; + registryUpdated: (payload: { + scope?: string[]; + key: string; + value: any | null; + }) => void; + driveFileCreated: (payload: DriveFile) => void; + readAntenna: (payload: Antenna) => void; + }; + receives: null; + }; + homeTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + localTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + hybridTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + recommendedTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + globalTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + messaging: { + params: { + otherparty?: User['id'] | null; + group?: UserGroup['id'] | null; + }; + events: { + message: (payload: MessagingMessage) => void; + deleted: (payload: MessagingMessage['id']) => void; + read: (payload: MessagingMessage['id'][]) => void; + typers: (payload: User[]) => void; + }; + receives: { + read: { + id: MessagingMessage['id']; + }; + }; + }; + serverStats: { + params: null; + events: { + stats: (payload: FIXME) => void; + }; + receives: { + requestLog: { + id: string | number; + length: number; + }; + }; + }; + queueStats: { + params: null; + events: { + stats: (payload: FIXME) => void; + }; + receives: { + requestLog: { + id: string | number; + length: number; + }; + }; + }; +}; + +// @public (undocumented) +type Clip = TODO_2; + +// @public (undocumented) +type CustomEmoji = { + id: string; + name: string; + url: string; + category: string; + aliases: string[]; +}; + +// @public (undocumented) +type DateString = string; + +// @public (undocumented) +type DetailedInstanceMetadata = LiteInstanceMetadata & { + features: Record; +}; + +// @public (undocumented) +type DriveFile = { + id: ID; + createdAt: DateString; + isSensitive: boolean; + name: string; + thumbnailUrl: string; + url: string; + type: string; + size: number; + md5: string; + blurhash: string; + properties: Record; +}; + +// @public (undocumented) +type DriveFolder = TODO_2; + +// @public (undocumented) +export type Endpoints = { + 'admin/abuse-user-reports': { + req: TODO; + res: TODO; + }; + 'admin/delete-all-files-of-a-user': { + req: { + userId: User['id']; + }; + res: null; + }; + 'admin/delete-logs': { + req: NoParams; + res: null; + }; + 'admin/get-index-stats': { + req: TODO; + res: TODO; + }; + 'admin/get-table-stats': { + req: TODO; + res: TODO; + }; + 'admin/invite': { + req: TODO; + res: TODO; + }; + 'admin/logs': { + req: TODO; + res: TODO; + }; + 'admin/reset-password': { + req: TODO; + res: TODO; + }; + 'admin/resolve-abuse-user-report': { + req: TODO; + res: TODO; + }; + 'admin/resync-chart': { + req: TODO; + res: TODO; + }; + 'admin/send-email': { + req: TODO; + res: TODO; + }; + 'admin/server-info': { + req: TODO; + res: TODO; + }; + 'admin/show-moderation-logs': { + req: TODO; + res: TODO; + }; + 'admin/show-user': { + req: TODO; + res: TODO; + }; + 'admin/show-users': { + req: TODO; + res: TODO; + }; + 'admin/silence-user': { + req: TODO; + res: TODO; + }; + 'admin/suspend-user': { + req: TODO; + res: TODO; + }; + 'admin/unsilence-user': { + req: TODO; + res: TODO; + }; + 'admin/unsuspend-user': { + req: TODO; + res: TODO; + }; + 'admin/update-meta': { + req: TODO; + res: TODO; + }; + 'admin/vacuum': { + req: TODO; + res: TODO; + }; + 'admin/accounts/create': { + req: TODO; + res: TODO; + }; + 'admin/ad/create': { + req: TODO; + res: TODO; + }; + 'admin/ad/delete': { + req: { + id: Ad['id']; + }; + res: null; + }; + 'admin/ad/list': { + req: TODO; + res: TODO; + }; + 'admin/ad/update': { + req: TODO; + res: TODO; + }; + 'admin/announcements/create': { + req: TODO; + res: TODO; + }; + 'admin/announcements/delete': { + req: { + id: Announcement['id']; + }; + res: null; + }; + 'admin/announcements/list': { + req: TODO; + res: TODO; + }; + 'admin/announcements/update': { + req: TODO; + res: TODO; + }; + 'admin/drive/clean-remote-files': { + req: TODO; + res: TODO; + }; + 'admin/drive/cleanup': { + req: TODO; + res: TODO; + }; + 'admin/drive/files': { + req: TODO; + res: TODO; + }; + 'admin/drive/show-file': { + req: TODO; + res: TODO; + }; + 'admin/emoji/add': { + req: TODO; + res: TODO; + }; + 'admin/emoji/copy': { + req: TODO; + res: TODO; + }; + 'admin/emoji/list-remote': { + req: TODO; + res: TODO; + }; + 'admin/emoji/list': { + req: TODO; + res: TODO; + }; + 'admin/emoji/remove': { + req: TODO; + res: TODO; + }; + 'admin/emoji/update': { + req: TODO; + res: TODO; + }; + 'admin/federation/delete-all-files': { + req: { + host: string; + }; + res: null; + }; + 'admin/federation/refresh-remote-instance-metadata': { + req: TODO; + res: TODO; + }; + 'admin/federation/remove-all-following': { + req: TODO; + res: TODO; + }; + 'admin/federation/update-instance': { + req: TODO; + res: TODO; + }; + 'admin/moderators/add': { + req: TODO; + res: TODO; + }; + 'admin/moderators/remove': { + req: TODO; + res: TODO; + }; + 'admin/promo/create': { + req: TODO; + res: TODO; + }; + 'admin/queue/clear': { + req: TODO; + res: TODO; + }; + 'admin/queue/deliver-delayed': { + req: TODO; + res: TODO; + }; + 'admin/queue/inbox-delayed': { + req: TODO; + res: TODO; + }; + 'admin/queue/jobs': { + req: TODO; + res: TODO; + }; + 'admin/queue/stats': { + req: TODO; + res: TODO; + }; + 'admin/relays/add': { + req: TODO; + res: TODO; + }; + 'admin/relays/list': { + req: TODO; + res: TODO; + }; + 'admin/relays/remove': { + req: TODO; + res: TODO; + }; + 'announcements': { + req: { + limit?: number; + withUnreads?: boolean; + sinceId?: Announcement['id']; + untilId?: Announcement['id']; + }; + res: Announcement[]; + }; + 'antennas/create': { + req: TODO; + res: Antenna; + }; + 'antennas/delete': { + req: { + antennaId: Antenna['id']; + }; + res: null; + }; + 'antennas/list': { + req: NoParams; + res: Antenna[]; + }; + 'antennas/notes': { + req: { + antennaId: Antenna['id']; + limit?: number; + sinceId?: Note['id']; + untilId?: Note['id']; + }; + res: Note[]; + }; + 'antennas/show': { + req: { + antennaId: Antenna['id']; + }; + res: Antenna; + }; + 'antennas/update': { + req: TODO; + res: Antenna; + }; + 'ap/get': { + req: { + uri: string; + }; + res: Record; + }; + 'ap/show': { + req: { + uri: string; + }; + res: { + type: 'Note'; + object: Note; + } | { + type: 'User'; + object: UserDetailed; + }; + }; + 'app/create': { + req: TODO; + res: App; + }; + 'app/show': { + req: { + appId: App['id']; + }; + res: App; + }; + 'auth/accept': { + req: { + token: string; + }; + res: null; + }; + 'auth/session/generate': { + req: { + appSecret: string; + }; + res: { + token: string; + url: string; + }; + }; + 'auth/session/show': { + req: { + token: string; + }; + res: AuthSession; + }; + 'auth/session/userkey': { + req: { + appSecret: string; + token: string; + }; + res: { + accessToken: string; + user: User; + }; + }; + 'blocking/create': { + req: { + userId: User['id']; + }; + res: UserDetailed; + }; + 'blocking/delete': { + req: { + userId: User['id']; + }; + res: UserDetailed; + }; + 'blocking/list': { + req: { + limit?: number; + sinceId?: Blocking['id']; + untilId?: Blocking['id']; + }; + res: Blocking[]; + }; + 'channels/create': { + req: TODO; + res: TODO; + }; + 'channels/featured': { + req: TODO; + res: TODO; + }; + 'channels/follow': { + req: TODO; + res: TODO; + }; + 'channels/followed': { + req: TODO; + res: TODO; + }; + 'channels/owned': { + req: TODO; + res: TODO; + }; + 'channels/pin-note': { + req: TODO; + res: TODO; + }; + 'channels/show': { + req: TODO; + res: TODO; + }; + 'channels/timeline': { + req: TODO; + res: TODO; + }; + 'channels/unfollow': { + req: TODO; + res: TODO; + }; + 'channels/update': { + req: TODO; + res: TODO; + }; + 'charts/active-users': { + req: { + span: 'day' | 'hour'; + limit?: number; + offset?: number | null; + }; + res: { + local: { + users: number[]; + }; + remote: { + users: number[]; + }; + }; + }; + 'charts/drive': { + req: { + span: 'day' | 'hour'; + limit?: number; + offset?: number | null; + }; + res: { + local: { + decCount: number[]; + decSize: number[]; + incCount: number[]; + incSize: number[]; + totalCount: number[]; + totalSize: number[]; + }; + remote: { + decCount: number[]; + decSize: number[]; + incCount: number[]; + incSize: number[]; + totalCount: number[]; + totalSize: number[]; + }; + }; + }; + 'charts/federation': { + req: { + span: 'day' | 'hour'; + limit?: number; + offset?: number | null; + }; + res: { + instance: { + dec: number[]; + inc: number[]; + total: number[]; + }; + }; + }; + 'charts/hashtag': { + req: { + span: 'day' | 'hour'; + limit?: number; + offset?: number | null; + }; + res: TODO; + }; + 'charts/instance': { + req: { + span: 'day' | 'hour'; + limit?: number; + offset?: number | null; + host: string; + }; + res: { + drive: { + decFiles: number[]; + decUsage: number[]; + incFiles: number[]; + incUsage: number[]; + totalFiles: number[]; + totalUsage: number[]; + }; + followers: { + dec: number[]; + inc: number[]; + total: number[]; + }; + following: { + dec: number[]; + inc: number[]; + total: number[]; + }; + notes: { + dec: number[]; + inc: number[]; + total: number[]; + diffs: { + normal: number[]; + renote: number[]; + reply: number[]; + }; + }; + requests: { + failed: number[]; + received: number[]; + succeeded: number[]; + }; + users: { + dec: number[]; + inc: number[]; + total: number[]; + }; + }; + }; + 'charts/network': { + req: { + span: 'day' | 'hour'; + limit?: number; + offset?: number | null; + }; + res: TODO; + }; + 'charts/notes': { + req: { + span: 'day' | 'hour'; + limit?: number; + offset?: number | null; + }; + res: { + local: { + dec: number[]; + inc: number[]; + total: number[]; + diffs: { + normal: number[]; + renote: number[]; + reply: number[]; + }; + }; + remote: { + dec: number[]; + inc: number[]; + total: number[]; + diffs: { + normal: number[]; + renote: number[]; + reply: number[]; + }; + }; + }; + }; + 'charts/user/drive': { + req: { + span: 'day' | 'hour'; + limit?: number; + offset?: number | null; + userId: User['id']; + }; + res: { + decCount: number[]; + decSize: number[]; + incCount: number[]; + incSize: number[]; + totalCount: number[]; + totalSize: number[]; + }; + }; + 'charts/user/following': { + req: { + span: 'day' | 'hour'; + limit?: number; + offset?: number | null; + userId: User['id']; + }; + res: TODO; + }; + 'charts/user/notes': { + req: { + span: 'day' | 'hour'; + limit?: number; + offset?: number | null; + userId: User['id']; + }; + res: { + dec: number[]; + inc: number[]; + total: number[]; + diffs: { + normal: number[]; + renote: number[]; + reply: number[]; + }; + }; + }; + 'charts/user/reactions': { + req: { + span: 'day' | 'hour'; + limit?: number; + offset?: number | null; + userId: User['id']; + }; + res: TODO; + }; + 'charts/users': { + req: { + span: 'day' | 'hour'; + limit?: number; + offset?: number | null; + }; + res: { + local: { + dec: number[]; + inc: number[]; + total: number[]; + }; + remote: { + dec: number[]; + inc: number[]; + total: number[]; + }; + }; + }; + 'clips/add-note': { + req: TODO; + res: TODO; + }; + 'clips/create': { + req: TODO; + res: TODO; + }; + 'clips/delete': { + req: { + clipId: Clip['id']; + }; + res: null; + }; + 'clips/list': { + req: TODO; + res: TODO; + }; + 'clips/notes': { + req: TODO; + res: TODO; + }; + 'clips/show': { + req: TODO; + res: TODO; + }; + 'clips/update': { + req: TODO; + res: TODO; + }; + 'drive': { + req: NoParams; + res: { + capacity: number; + usage: number; + }; + }; + 'drive/files': { + req: { + folderId?: DriveFolder['id'] | null; + type?: DriveFile['type'] | null; + limit?: number; + sinceId?: DriveFile['id']; + untilId?: DriveFile['id']; + }; + res: DriveFile[]; + }; + 'drive/files/attached-notes': { + req: TODO; + res: TODO; + }; + 'drive/files/check-existence': { + req: TODO; + res: TODO; + }; + 'drive/files/create': { + req: TODO; + res: TODO; + }; + 'drive/files/delete': { + req: { + fileId: DriveFile['id']; + }; + res: null; + }; + 'drive/files/find-by-hash': { + req: TODO; + res: TODO; + }; + 'drive/files/find': { + req: { + name: string; + folderId?: DriveFolder['id'] | null; + }; + res: DriveFile[]; + }; + 'drive/files/show': { + req: { + fileId?: DriveFile['id']; + url?: string; + }; + res: DriveFile; + }; + 'drive/files/update': { + req: { + fileId: DriveFile['id']; + folderId?: DriveFolder['id'] | null; + name?: string; + isSensitive?: boolean; + comment?: string | null; + }; + res: DriveFile; + }; + 'drive/files/upload-from-url': { + req: { + url: string; + folderId?: DriveFolder['id'] | null; + isSensitive?: boolean; + comment?: string | null; + marker?: string | null; + force?: boolean; + }; + res: null; + }; + 'drive/folders': { + req: { + folderId?: DriveFolder['id'] | null; + limit?: number; + sinceId?: DriveFile['id']; + untilId?: DriveFile['id']; + }; + res: DriveFolder[]; + }; + 'drive/folders/create': { + req: { + name?: string; + parentId?: DriveFolder['id'] | null; + }; + res: DriveFolder; + }; + 'drive/folders/delete': { + req: { + folderId: DriveFolder['id']; + }; + res: null; + }; + 'drive/folders/find': { + req: { + name: string; + parentId?: DriveFolder['id'] | null; + }; + res: DriveFolder[]; + }; + 'drive/folders/show': { + req: { + folderId: DriveFolder['id']; + }; + res: DriveFolder; + }; + 'drive/folders/update': { + req: { + folderId: DriveFolder['id']; + name?: string; + parentId?: DriveFolder['id'] | null; + }; + res: DriveFolder; + }; + 'drive/stream': { + req: { + type?: DriveFile['type'] | null; + limit?: number; + sinceId?: DriveFile['id']; + untilId?: DriveFile['id']; + }; + res: DriveFile[]; + }; + 'endpoint': { + req: { + endpoint: string; + }; + res: { + params: { + name: string; + type: string; + }[]; + }; + }; + 'endpoints': { + req: NoParams; + res: string[]; + }; + 'federation/dns': { + req: { + host: string; + }; + res: { + a: string[]; + aaaa: string[]; + cname: string[]; + txt: string[]; + }; + }; + 'federation/followers': { + req: { + host: string; + limit?: number; + sinceId?: Following['id']; + untilId?: Following['id']; + }; + res: FollowingFolloweePopulated[]; + }; + 'federation/following': { + req: { + host: string; + limit?: number; + sinceId?: Following['id']; + untilId?: Following['id']; + }; + res: FollowingFolloweePopulated[]; + }; + 'federation/instances': { + req: { + host?: string | null; + blocked?: boolean | null; + notResponding?: boolean | null; + suspended?: boolean | null; + federating?: boolean | null; + subscribing?: boolean | null; + publishing?: boolean | null; + limit?: number; + offset?: number; + sort?: '+pubSub' | '-pubSub' | '+notes' | '-notes' | '+users' | '-users' | '+following' | '-following' | '+followers' | '-followers' | '+caughtAt' | '-caughtAt' | '+lastCommunicatedAt' | '-lastCommunicatedAt' | '+driveUsage' | '-driveUsage' | '+driveFiles' | '-driveFiles'; + }; + res: Instance[]; + }; + 'federation/show-instance': { + req: { + host: string; + }; + res: Instance; + }; + 'federation/update-remote-user': { + req: { + userId: User['id']; + }; + res: null; + }; + 'federation/users': { + req: { + host: string; + limit?: number; + sinceId?: User['id']; + untilId?: User['id']; + }; + res: UserDetailed[]; + }; + 'following/create': { + req: { + userId: User['id']; + }; + res: User; + }; + 'following/delete': { + req: { + userId: User['id']; + }; + res: User; + }; + 'following/requests/accept': { + req: { + userId: User['id']; + }; + res: null; + }; + 'following/requests/cancel': { + req: { + userId: User['id']; + }; + res: User; + }; + 'following/requests/list': { + req: NoParams; + res: FollowRequest[]; + }; + 'following/requests/reject': { + req: { + userId: User['id']; + }; + res: null; + }; + 'gallery/featured': { + req: TODO; + res: TODO; + }; + 'gallery/popular': { + req: TODO; + res: TODO; + }; + 'gallery/posts': { + req: TODO; + res: TODO; + }; + 'gallery/posts/create': { + req: TODO; + res: TODO; + }; + 'gallery/posts/delete': { + req: { + postId: GalleryPost['id']; + }; + res: null; + }; + 'gallery/posts/like': { + req: TODO; + res: TODO; + }; + 'gallery/posts/show': { + req: TODO; + res: TODO; + }; + 'gallery/posts/unlike': { + req: TODO; + res: TODO; + }; + 'gallery/posts/update': { + req: TODO; + res: TODO; + }; + 'games/reversi/games': { + req: TODO; + res: TODO; + }; + 'games/reversi/games/show': { + req: TODO; + res: TODO; + }; + 'games/reversi/games/surrender': { + req: TODO; + res: TODO; + }; + 'games/reversi/invitations': { + req: TODO; + res: TODO; + }; + 'games/reversi/match': { + req: TODO; + res: TODO; + }; + 'games/reversi/match/cancel': { + req: TODO; + res: TODO; + }; + 'get-online-users-count': { + req: NoParams; + res: { + count: number; + }; + }; + 'hashtags/list': { + req: TODO; + res: TODO; + }; + 'hashtags/search': { + req: TODO; + res: TODO; + }; + 'hashtags/show': { + req: TODO; + res: TODO; + }; + 'hashtags/trend': { + req: TODO; + res: TODO; + }; + 'hashtags/users': { + req: TODO; + res: TODO; + }; + 'i': { + req: NoParams; + res: User; + }; + 'i/apps': { + req: TODO; + res: TODO; + }; + 'i/authorized-apps': { + req: TODO; + res: TODO; + }; + 'i/change-password': { + req: TODO; + res: TODO; + }; + 'i/delete-account': { + req: { + password: string; + }; + res: null; + }; + 'i/export-blocking': { + req: TODO; + res: TODO; + }; + 'i/export-following': { + req: TODO; + res: TODO; + }; + 'i/export-mute': { + req: TODO; + res: TODO; + }; + 'i/export-notes': { + req: TODO; + res: TODO; + }; + 'i/export-user-lists': { + req: TODO; + res: TODO; + }; + 'i/favorites': { + req: { + limit?: number; + sinceId?: NoteFavorite['id']; + untilId?: NoteFavorite['id']; + }; + res: NoteFavorite[]; + }; + 'i/gallery/likes': { + req: TODO; + res: TODO; + }; + 'i/gallery/posts': { + req: TODO; + res: TODO; + }; + 'i/get-word-muted-notes-count': { + req: TODO; + res: TODO; + }; + 'i/import-following': { + req: TODO; + res: TODO; + }; + 'i/import-user-lists': { + req: TODO; + res: TODO; + }; + 'i/notifications': { + req: { + limit?: number; + sinceId?: Notification_2['id']; + untilId?: Notification_2['id']; + following?: boolean; + markAsRead?: boolean; + includeTypes?: Notification_2['type'][]; + excludeTypes?: Notification_2['type'][]; + }; + res: Notification_2[]; + }; + 'i/page-likes': { + req: TODO; + res: TODO; + }; + 'i/pages': { + req: TODO; + res: TODO; + }; + 'i/pin': { + req: { + noteId: Note['id']; + }; + res: MeDetailed; + }; + 'i/read-all-messaging-messages': { + req: TODO; + res: TODO; + }; + 'i/read-all-unread-notes': { + req: TODO; + res: TODO; + }; + 'i/read-announcement': { + req: TODO; + res: TODO; + }; + 'i/regenerate-token': { + req: { + password: string; + }; + res: null; + }; + 'i/registry/get-all': { + req: { + scope?: string[]; + }; + res: Record; + }; + 'i/registry/get-detail': { + req: { + key: string; + scope?: string[]; + }; + res: { + updatedAt: DateString; + value: any; + }; + }; + 'i/registry/get': { + req: { + key: string; + scope?: string[]; + }; + res: any; + }; + 'i/registry/keys-with-type': { + req: { + scope?: string[]; + }; + res: Record; + }; + 'i/registry/keys': { + req: { + scope?: string[]; + }; + res: string[]; + }; + 'i/registry/remove': { + req: { + key: string; + scope?: string[]; + }; + res: null; + }; + 'i/registry/scopes': { + req: NoParams; + res: string[][]; + }; + 'i/registry/set': { + req: { + key: string; + value: any; + scope?: string[]; + }; + res: null; + }; + 'i/revoke-token': { + req: TODO; + res: TODO; + }; + 'i/signin-history': { + req: { + limit?: number; + sinceId?: Signin['id']; + untilId?: Signin['id']; + }; + res: Signin[]; + }; + 'i/unpin': { + req: { + noteId: Note['id']; + }; + res: MeDetailed; + }; + 'i/update-email': { + req: { + password: string; + email?: string | null; + }; + res: MeDetailed; + }; + 'i/update': { + req: { + name?: string | null; + description?: string | null; + lang?: string | null; + location?: string | null; + birthday?: string | null; + avatarId?: DriveFile['id'] | null; + bannerId?: DriveFile['id'] | null; + fields?: { + name: string; + value: string; + }[]; + isLocked?: boolean; + isExplorable?: boolean; + hideOnlineStatus?: boolean; + carefulBot?: boolean; + autoAcceptFollowed?: boolean; + noCrawle?: boolean; + isBot?: boolean; + isCat?: boolean; + injectFeaturedNote?: boolean; + receiveAnnouncementEmail?: boolean; + alwaysMarkNsfw?: boolean; + mutedWords?: string[][]; + mutingNotificationTypes?: Notification_2['type'][]; + emailNotificationTypes?: string[]; + }; + res: MeDetailed; + }; + 'i/user-group-invites': { + req: TODO; + res: TODO; + }; + 'i/2fa/done': { + req: TODO; + res: TODO; + }; + 'i/2fa/key-done': { + req: TODO; + res: TODO; + }; + 'i/2fa/password-less': { + req: TODO; + res: TODO; + }; + 'i/2fa/register-key': { + req: TODO; + res: TODO; + }; + 'i/2fa/register': { + req: TODO; + res: TODO; + }; + 'i/2fa/remove-key': { + req: TODO; + res: TODO; + }; + 'i/2fa/unregister': { + req: TODO; + res: TODO; + }; + 'messaging/history': { + req: { + limit?: number; + group?: boolean; + }; + res: MessagingMessage[]; + }; + 'messaging/messages': { + req: { + userId?: User['id']; + groupId?: UserGroup['id']; + limit?: number; + sinceId?: MessagingMessage['id']; + untilId?: MessagingMessage['id']; + markAsRead?: boolean; + }; + res: MessagingMessage[]; + }; + 'messaging/messages/create': { + req: { + userId?: User['id']; + groupId?: UserGroup['id']; + text?: string; + fileId?: DriveFile['id']; + }; + res: MessagingMessage; + }; + 'messaging/messages/delete': { + req: { + messageId: MessagingMessage['id']; + }; + res: null; + }; + 'messaging/messages/read': { + req: { + messageId: MessagingMessage['id']; + }; + res: null; + }; + 'meta': { + req: { + detail?: boolean; + }; + res: { + $switch: { + $cases: [ + [ + { + detail: true; + }, + DetailedInstanceMetadata + ], + [ + { + detail: false; + }, + LiteInstanceMetadata + ], + [ + { + detail: boolean; + }, + LiteInstanceMetadata | DetailedInstanceMetadata + ] + ]; + $default: LiteInstanceMetadata; + }; + }; + }; + 'miauth/gen-token': { + req: TODO; + res: TODO; + }; + 'mute/create': { + req: TODO; + res: TODO; + }; + 'mute/delete': { + req: { + userId: User['id']; + }; + res: null; + }; + 'mute/list': { + req: TODO; + res: TODO; + }; + 'my/apps': { + req: TODO; + res: TODO; + }; + 'notes': { + req: { + limit?: number; + sinceId?: Note['id']; + untilId?: Note['id']; + }; + res: Note[]; + }; + 'notes/children': { + req: { + noteId: Note['id']; + limit?: number; + sinceId?: Note['id']; + untilId?: Note['id']; + }; + res: Note[]; + }; + 'notes/clips': { + req: TODO; + res: TODO; + }; + 'notes/conversation': { + req: TODO; + res: TODO; + }; + 'notes/create': { + req: { + visibility?: 'public' | 'home' | 'followers' | 'specified'; + visibleUserIds?: User['id'][]; + text?: null | string; + cw?: null | string; + viaMobile?: boolean; + localOnly?: boolean; + fileIds?: DriveFile['id'][]; + replyId?: null | Note['id']; + renoteId?: null | Note['id']; + channelId?: null | Channel['id']; + poll?: null | { + choices: string[]; + multiple?: boolean; + expiresAt?: null | number; + expiredAfter?: null | number; + }; + }; + res: { + createdNote: Note; + }; + }; + 'notes/delete': { + req: { + noteId: Note['id']; + }; + res: null; + }; + 'notes/favorites/create': { + req: { + noteId: Note['id']; + }; + res: null; + }; + 'notes/favorites/delete': { + req: { + noteId: Note['id']; + }; + res: null; + }; + 'notes/featured': { + req: TODO; + res: Note[]; + }; + 'notes/global-timeline': { + req: { + limit?: number; + sinceId?: Note['id']; + untilId?: Note['id']; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + 'notes/recommended-timeline': { + req: { + limit?: number; + sinceId?: Note['id']; + untilId?: Note['id']; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + 'notes/hybrid-timeline': { + req: { + limit?: number; + sinceId?: Note['id']; + untilId?: Note['id']; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + 'notes/local-timeline': { + req: { + limit?: number; + sinceId?: Note['id']; + untilId?: Note['id']; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + 'notes/mentions': { + req: { + following?: boolean; + limit?: number; + sinceId?: Note['id']; + untilId?: Note['id']; + }; + res: Note[]; + }; + 'notes/polls/recommendation': { + req: TODO; + res: TODO; + }; + 'notes/polls/vote': { + req: { + noteId: Note['id']; + choice: number; + }; + res: null; + }; + 'notes/reactions': { + req: { + noteId: Note['id']; + type?: string | null; + limit?: number; + }; + res: NoteReaction[]; + }; + 'notes/reactions/create': { + req: { + noteId: Note['id']; + reaction: string; + }; + res: null; + }; + 'notes/reactions/delete': { + req: { + noteId: Note['id']; + }; + res: null; + }; + 'notes/renotes': { + req: { + limit?: number; + sinceId?: Note['id']; + untilId?: Note['id']; + noteId: Note['id']; + }; + res: Note[]; + }; + 'notes/replies': { + req: { + limit?: number; + sinceId?: Note['id']; + untilId?: Note['id']; + noteId: Note['id']; + }; + res: Note[]; + }; + 'notes/search-by-tag': { + req: TODO; + res: TODO; + }; + 'notes/search': { + req: TODO; + res: TODO; + }; + 'notes/show': { + req: { + noteId: Note['id']; + }; + res: Note; + }; + 'notes/state': { + req: TODO; + res: TODO; + }; + 'notes/timeline': { + req: { + limit?: number; + sinceId?: Note['id']; + untilId?: Note['id']; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + 'notes/unrenote': { + req: { + noteId: Note['id']; + }; + res: null; + }; + 'notes/user-list-timeline': { + req: { + listId: UserList['id']; + limit?: number; + sinceId?: Note['id']; + untilId?: Note['id']; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + 'notes/watching/create': { + req: TODO; + res: TODO; + }; + 'notes/watching/delete': { + req: { + noteId: Note['id']; + }; + res: null; + }; + 'notifications/create': { + req: { + body: string; + header?: string | null; + icon?: string | null; + }; + res: null; + }; + 'notifications/mark-all-as-read': { + req: NoParams; + res: null; + }; + 'notifications/read': { + req: { + notificationId: Notification_2['id']; + }; + res: null; + }; + 'page-push': { + req: { + pageId: Page['id']; + event: string; + var?: any; + }; + res: null; + }; + 'pages/create': { + req: TODO; + res: Page; + }; + 'pages/delete': { + req: { + pageId: Page['id']; + }; + res: null; + }; + 'pages/featured': { + req: NoParams; + res: Page[]; + }; + 'pages/like': { + req: { + pageId: Page['id']; + }; + res: null; + }; + 'pages/show': { + req: { + pageId?: Page['id']; + name?: string; + username?: string; + }; + res: Page; + }; + 'pages/unlike': { + req: { + pageId: Page['id']; + }; + res: null; + }; + 'pages/update': { + req: TODO; + res: null; + }; + 'ping': { + req: NoParams; + res: { + pong: number; + }; + }; + 'pinned-users': { + req: TODO; + res: TODO; + }; + 'promo/read': { + req: TODO; + res: TODO; + }; + 'request-reset-password': { + req: { + username: string; + email: string; + }; + res: null; + }; + 'reset-password': { + req: { + token: string; + password: string; + }; + res: null; + }; + 'room/show': { + req: TODO; + res: TODO; + }; + 'room/update': { + req: TODO; + res: TODO; + }; + 'stats': { + req: NoParams; + res: Stats; + }; + 'server-info': { + req: NoParams; + res: ServerInfo; + }; + 'sw/register': { + req: TODO; + res: TODO; + }; + 'username/available': { + req: { + username: string; + }; + res: { + available: boolean; + }; + }; + 'users': { + req: { + limit?: number; + offset?: number; + sort?: UserSorting; + origin?: OriginType; + }; + res: User[]; + }; + 'users/clips': { + req: TODO; + res: TODO; + }; + 'users/followers': { + req: { + userId?: User['id']; + username?: User['username']; + host?: User['host'] | null; + limit?: number; + sinceId?: Following['id']; + untilId?: Following['id']; + }; + res: FollowingFollowerPopulated[]; + }; + 'users/following': { + req: { + userId?: User['id']; + username?: User['username']; + host?: User['host'] | null; + limit?: number; + sinceId?: Following['id']; + untilId?: Following['id']; + }; + res: FollowingFolloweePopulated[]; + }; + 'users/gallery/posts': { + req: TODO; + res: TODO; + }; + 'users/get-frequently-replied-users': { + req: TODO; + res: TODO; + }; + 'users/groups/create': { + req: TODO; + res: TODO; + }; + 'users/groups/delete': { + req: { + groupId: UserGroup['id']; + }; + res: null; + }; + 'users/groups/invitations/accept': { + req: TODO; + res: TODO; + }; + 'users/groups/invitations/reject': { + req: TODO; + res: TODO; + }; + 'users/groups/invite': { + req: TODO; + res: TODO; + }; + 'users/groups/joined': { + req: TODO; + res: TODO; + }; + 'users/groups/owned': { + req: TODO; + res: TODO; + }; + 'users/groups/pull': { + req: TODO; + res: TODO; + }; + 'users/groups/show': { + req: TODO; + res: TODO; + }; + 'users/groups/transfer': { + req: TODO; + res: TODO; + }; + 'users/groups/update': { + req: TODO; + res: TODO; + }; + 'users/lists/create': { + req: { + name: string; + }; + res: UserList; + }; + 'users/lists/delete': { + req: { + listId: UserList['id']; + }; + res: null; + }; + 'users/lists/list': { + req: NoParams; + res: UserList[]; + }; + 'users/lists/pull': { + req: { + listId: UserList['id']; + userId: User['id']; + }; + res: null; + }; + 'users/lists/push': { + req: { + listId: UserList['id']; + userId: User['id']; + }; + res: null; + }; + 'users/lists/show': { + req: { + listId: UserList['id']; + }; + res: UserList; + }; + 'users/lists/update': { + req: { + listId: UserList['id']; + name: string; + }; + res: UserList; + }; + 'users/notes': { + req: { + userId: User['id']; + limit?: number; + sinceId?: Note['id']; + untilId?: Note['id']; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + 'users/pages': { + req: TODO; + res: TODO; + }; + 'users/recommendation': { + req: TODO; + res: TODO; + }; + 'users/relation': { + req: TODO; + res: TODO; + }; + 'users/report-abuse': { + req: TODO; + res: TODO; + }; + 'users/search-by-username-and-host': { + req: TODO; + res: TODO; + }; + 'users/search': { + req: TODO; + res: TODO; + }; + 'users/show': { + req: ShowUserReq | { + userIds: User['id'][]; + }; + res: { + $switch: { + $cases: [ + [ + { + userIds: User['id'][]; + }, + UserDetailed[] + ] + ]; + $default: UserDetailed; + }; + }; + }; + 'users/stats': { + req: TODO; + res: TODO; + }; +}; + +declare namespace entities { + export { + ID, + DateString, + User, + UserLite, + UserDetailed, + UserGroup, + UserList, + MeDetailed, + DriveFile, + DriveFolder, + GalleryPost, + Note, + NoteReaction, + Notification_2 as Notification, + MessagingMessage, + CustomEmoji, + LiteInstanceMetadata, + DetailedInstanceMetadata, + InstanceMetadata, + ServerInfo, + Stats, + Page, + PageEvent, + Announcement, + Antenna, + App, + AuthSession, + Ad, + Clip, + NoteFavorite, + FollowRequest, + Channel, + Following, + FollowingFolloweePopulated, + FollowingFollowerPopulated, + Blocking, + Instance, + Signin, + UserSorting, + OriginType + } +} +export { entities } + +// @public (undocumented) +type FetchLike = (input: string, init?: { + method?: string; + body?: string; + credentials?: RequestCredentials; + cache?: RequestCache; +}) => Promise<{ + status: number; + json(): Promise; +}>; + +// @public (undocumented) +export const ffVisibility: readonly ["public", "followers", "private"]; + +// @public (undocumented) +type Following = { + id: ID; + createdAt: DateString; + followerId: User['id']; + followeeId: User['id']; +}; + +// @public (undocumented) +type FollowingFolloweePopulated = Following & { + followee: UserDetailed; +}; + +// @public (undocumented) +type FollowingFollowerPopulated = Following & { + follower: UserDetailed; +}; + +// @public (undocumented) +type FollowRequest = { + id: ID; + follower: User; + followee: User; +}; + +// @public (undocumented) +type GalleryPost = TODO_2; + +// @public (undocumented) +type ID = string; + +// @public (undocumented) +type Instance = { + id: ID; + caughtAt: DateString; + host: string; + usersCount: number; + notesCount: number; + followingCount: number; + followersCount: number; + driveUsage: number; + driveFiles: number; + latestRequestSentAt: DateString | null; + latestStatus: number | null; + latestRequestReceivedAt: DateString | null; + lastCommunicatedAt: DateString; + isNotResponding: boolean; + isSuspended: boolean; + softwareName: string | null; + softwareVersion: string | null; + openRegistrations: boolean | null; + name: string | null; + description: string | null; + maintainerName: string | null; + maintainerEmail: string | null; + iconUrl: string | null; + faviconUrl: string | null; + themeColor: string | null; + infoUpdatedAt: DateString | null; +}; + +// @public (undocumented) +type InstanceMetadata = LiteInstanceMetadata | DetailedInstanceMetadata; + +// @public (undocumented) +function isAPIError(reason: any): reason is APIError; + +// @public (undocumented) +type LiteInstanceMetadata = { + maintainerName: string | null; + maintainerEmail: string | null; + version: string; + name: string | null; + uri: string; + description: string | null; + tosUrl: string | null; + disableRegistration: boolean; + disableLocalTimeline: boolean; + disableRecommendedTimeline: boolean; + disableGlobalTimeline: boolean; + driveCapacityPerLocalUserMb: number; + driveCapacityPerRemoteUserMb: number; + enableHcaptcha: boolean; + hcaptchaSiteKey: string | null; + enableRecaptcha: boolean; + recaptchaSiteKey: string | null; + swPublickey: string | null; + maxNoteTextLength: number; + enableEmail: boolean; + enableTwitterIntegration: boolean; + enableGithubIntegration: boolean; + enableDiscordIntegration: boolean; + enableServiceWorker: boolean; + emojis: CustomEmoji[]; + ads: { + id: ID; + ratio: number; + place: string; + url: string; + imageUrl: string; + }[]; +}; + +// @public (undocumented) +type MeDetailed = UserDetailed & { + avatarId: DriveFile['id']; + bannerId: DriveFile['id']; + autoAcceptFollowed: boolean; + alwaysMarkNsfw: boolean; + carefulBot: boolean; + emailNotificationTypes: string[]; + hasPendingReceivedFollowRequest: boolean; + hasUnreadAnnouncement: boolean; + hasUnreadAntenna: boolean; + hasUnreadChannel: boolean; + hasUnreadMentions: boolean; + hasUnreadMessagingMessage: boolean; + hasUnreadNotification: boolean; + hasUnreadSpecifiedNotes: boolean; + hideOnlineStatus: boolean; + injectFeaturedNote: boolean; + integrations: Record; + isDeleted: boolean; + isExplorable: boolean; + mutedWords: string[][]; + mutingNotificationTypes: string[]; + noCrawle: boolean; + receiveAnnouncementEmail: boolean; + usePasswordLessLogin: boolean; + [other: string]: any; +}; + +// @public (undocumented) +type MessagingMessage = { + id: ID; + createdAt: DateString; + file: DriveFile | null; + fileId: DriveFile['id'] | null; + isRead: boolean; + reads: User['id'][]; + text: string | null; + user: User; + userId: User['id']; + recipient?: User | null; + recipientId: User['id'] | null; + group?: UserGroup | null; + groupId: UserGroup['id'] | null; +}; + +// @public (undocumented) +export const mutedNoteReasons: readonly ["word", "manual", "spam", "other"]; + +// @public (undocumented) +type Note = { + id: ID; + createdAt: DateString; + text: string | null; + cw: string | null; + user: User; + userId: User['id']; + reply?: Note; + replyId: Note['id']; + renote?: Note; + renoteId: Note['id']; + files: DriveFile[]; + fileIds: DriveFile['id'][]; + visibility: 'public' | 'home' | 'followers' | 'specified'; + visibleUserIds?: User['id'][]; + localOnly?: boolean; + myReaction?: string; + reactions: Record; + renoteCount: number; + repliesCount: number; + poll?: { + expiresAt: DateString | null; + multiple: boolean; + choices: { + isVoted: boolean; + text: string; + votes: number; + }[]; + }; + emojis: { + name: string; + url: string; + }[]; + uri?: string; + url?: string; + isHidden?: boolean; +}; + +// @public (undocumented) +type NoteFavorite = { + id: ID; + createdAt: DateString; + noteId: Note['id']; + note: Note; +}; + +// @public (undocumented) +type NoteReaction = { + id: ID; + createdAt: DateString; + user: UserLite; + type: string; +}; + +// @public (undocumented) +export const noteVisibilities: readonly ["public", "home", "followers", "specified"]; + +// @public (undocumented) +type Notification_2 = { + id: ID; + createdAt: DateString; + isRead: boolean; +} & ({ + type: 'reaction'; + reaction: string; + user: User; + userId: User['id']; + note: Note; +} | { + type: 'reply'; + user: User; + userId: User['id']; + note: Note; +} | { + type: 'renote'; + user: User; + userId: User['id']; + note: Note; +} | { + type: 'quote'; + user: User; + userId: User['id']; + note: Note; +} | { + type: 'mention'; + user: User; + userId: User['id']; + note: Note; +} | { + type: 'pollVote'; + user: User; + userId: User['id']; + note: Note; +} | { + type: 'follow'; + user: User; + userId: User['id']; +} | { + type: 'followRequestAccepted'; + user: User; + userId: User['id']; +} | { + type: 'receiveFollowRequest'; + user: User; + userId: User['id']; +} | { + type: 'groupInvited'; + invitation: UserGroup; + user: User; + userId: User['id']; +} | { + type: 'app'; + header?: string | null; + body: string; + icon?: string | null; +}); + +// @public (undocumented) +export const notificationTypes: readonly ["follow", "mention", "reply", "renote", "quote", "reaction", "pollVote", "receiveFollowRequest", "followRequestAccepted", "groupInvited", "app"]; + +// @public (undocumented) +type OriginType = 'combined' | 'local' | 'remote'; + +// @public (undocumented) +type Page = { + id: ID; + createdAt: DateString; + updatedAt: DateString; + userId: User['id']; + user: User; + content: Record[]; + variables: Record[]; + title: string; + name: string; + summary: string | null; + hideTitleWhenPinned: boolean; + alignCenter: boolean; + font: string; + script: string; + eyeCatchingImageId: DriveFile['id'] | null; + eyeCatchingImage: DriveFile | null; + attachedFiles: any; + likedCount: number; + isLiked?: boolean; +}; + +// @public (undocumented) +type PageEvent = { + pageId: Page['id']; + event: string; + var: any; + userId: User['id']; + user: User; +}; + +// @public (undocumented) +export const permissions: string[]; + +// @public (undocumented) +type ServerInfo = { + machine: string; + cpu: { + model: string; + cores: number; + }; + mem: { + total: number; + }; + fs: { + total: number; + used: number; + }; +}; + +// @public (undocumented) +type Signin = { + id: ID; + createdAt: DateString; + ip: string; + headers: Record; + success: boolean; +}; + +// @public (undocumented) +type Stats = { + notesCount: number; + originalNotesCount: number; + usersCount: number; + originalUsersCount: number; + instances: number; + driveUsageLocal: number; + driveUsageRemote: number; +}; + +// Warning: (ae-forgotten-export) The symbol "StreamEvents" needs to be exported by the entry point index.d.ts +// +// @public (undocumented) +export class Stream extends EventEmitter { + constructor(origin: string, user: { + token: string; + } | null, options?: { + WebSocket?: any; + }); + // (undocumented) + close(): void; + // Warning: (ae-forgotten-export) The symbol "NonSharedConnection" needs to be exported by the entry point index.d.ts + // + // (undocumented) + disconnectToChannel(connection: NonSharedConnection): void; + // Warning: (ae-forgotten-export) The symbol "SharedConnection" needs to be exported by the entry point index.d.ts + // + // (undocumented) + removeSharedConnection(connection: SharedConnection): void; + // Warning: (ae-forgotten-export) The symbol "Pool" needs to be exported by the entry point index.d.ts + // + // (undocumented) + removeSharedConnectionPool(pool: Pool): void; + // (undocumented) + send(typeOrPayload: any, payload?: any): void; + // (undocumented) + state: 'initializing' | 'reconnecting' | 'connected'; + // (undocumented) + useChannel(channel: C, params?: Channels[C]['params'], name?: string): ChannelConnection; +} + +// @public (undocumented) +type User = UserLite | UserDetailed; + +// @public (undocumented) +type UserDetailed = UserLite & { + bannerBlurhash: string | null; + bannerColor: string | null; + bannerUrl: string | null; + birthday: string | null; + createdAt: DateString; + description: string | null; + ffVisibility: 'public' | 'followers' | 'private'; + fields: { + name: string; + value: string; + }[]; + followersCount: number; + followingCount: number; + hasPendingFollowRequestFromYou: boolean; + hasPendingFollowRequestToYou: boolean; + isAdmin: boolean; + isBlocked: boolean; + isBlocking: boolean; + isBot: boolean; + isCat: boolean; + isFollowed: boolean; + isFollowing: boolean; + isLocked: boolean; + isModerator: boolean; + isMuted: boolean; + isSilenced: boolean; + isSuspended: boolean; + lang: string | null; + lastFetchedAt?: DateString; + location: string | null; + notesCount: number; + pinnedNoteIds: ID[]; + pinnedNotes: Note[]; + pinnedPage: Page | null; + pinnedPageId: string | null; + publicReactions: boolean; + securityKeys: boolean; + twoFactorEnabled: boolean; + updatedAt: DateString | null; + uri: string | null; + url: string | null; +}; + +// @public (undocumented) +type UserGroup = TODO_2; + +// @public (undocumented) +type UserList = { + id: ID; + createdAt: DateString; + name: string; + userIds: User['id'][]; +}; + +// @public (undocumented) +type UserLite = { + id: ID; + username: string; + host: string | null; + name: string; + onlineStatus: 'online' | 'active' | 'offline' | 'unknown'; + avatarUrl: string; + avatarBlurhash: string; + emojis: { + name: string; + url: string; + }[]; + instance?: { + name: Instance['name']; + softwareName: Instance['softwareName']; + softwareVersion: Instance['softwareVersion']; + iconUrl: Instance['iconUrl']; + faviconUrl: Instance['faviconUrl']; + themeColor: Instance['themeColor']; + }; +}; + +// @public (undocumented) +type UserSorting = '+follower' | '-follower' | '+createdAt' | '-createdAt' | '+updatedAt' | '-updatedAt'; + +// Warnings were encountered during analysis: +// +// src/api.types.ts:16:32 - (ae-forgotten-export) The symbol "TODO" needs to be exported by the entry point index.d.ts +// src/api.types.ts:18:25 - (ae-forgotten-export) The symbol "NoParams" needs to be exported by the entry point index.d.ts +// src/api.types.ts:595:18 - (ae-forgotten-export) The symbol "ShowUserReq" needs to be exported by the entry point index.d.ts +// src/streaming.types.ts:35:4 - (ae-forgotten-export) The symbol "FIXME" needs to be exported by the entry point index.d.ts + +// (No @packageDocumentation comment for this package) + +``` diff --git a/fe_calckey/frontend/calckey-js/jest.config.ts b/fe_calckey/frontend/calckey-js/jest.config.ts new file mode 100644 index 0000000..f26a77c --- /dev/null +++ b/fe_calckey/frontend/calckey-js/jest.config.ts @@ -0,0 +1,195 @@ +/* + * For a detailed explanation regarding each configuration property and type check, visit: + * https://jestjs.io/docs/en/configuration.html + */ + +export default { + // All imported modules in your tests should be mocked automatically + // automock: false, + + // Stop running tests after `n` failures + // bail: 0, + + // The directory where Jest should store its cached dependency information + // cacheDirectory: "C:\\Users\\ai\\AppData\\Local\\Temp\\jest", + + // Automatically clear mock calls and instances between every test + // clearMocks: false, + + // Indicates whether the coverage information should be collected while executing the test + // collectCoverage: false, + + // An array of glob patterns indicating a set of files for which coverage information should be collected + // collectCoverageFrom: undefined, + + // The directory where Jest should output its coverage files + coverageDirectory: "coverage", + + // An array of regexp pattern strings used to skip coverage collection + // coveragePathIgnorePatterns: [ + // "\\\\node_modules\\\\" + // ], + + // Indicates which provider should be used to instrument code for coverage + coverageProvider: "v8", + + // A list of reporter names that Jest uses when writing coverage reports + // coverageReporters: [ + // "json", + // "text", + // "lcov", + // "clover" + // ], + + // An object that configures minimum threshold enforcement for coverage results + // coverageThreshold: undefined, + + // A path to a custom dependency extractor + // dependencyExtractor: undefined, + + // Make calling deprecated APIs throw helpful error messages + // errorOnDeprecated: false, + + // Force coverage collection from ignored files using an array of glob patterns + // forceCoverageMatch: [], + + // A path to a module which exports an async function that is triggered once before all test suites + // globalSetup: undefined, + + // A path to a module which exports an async function that is triggered once after all test suites + // globalTeardown: undefined, + + // A set of global variables that need to be available in all test environments + // globals: {}, + + // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. + // maxWorkers: "50%", + + // An array of directory names to be searched recursively up from the requiring module's location + // moduleDirectories: [ + // "node_modules" + // ], + + // An array of file extensions your modules use + // moduleFileExtensions: [ + // "js", + // "json", + // "jsx", + // "ts", + // "tsx", + // "node" + // ], + + // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module + // moduleNameMapper: {}, + + // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader + // modulePathIgnorePatterns: [], + + // Activates notifications for test results + // notify: false, + + // An enum that specifies notification mode. Requires { notify: true } + // notifyMode: "failure-change", + + // A preset that is used as a base for Jest's configuration + // preset: undefined, + + // Run tests from one or more projects + // projects: undefined, + + // Use this configuration option to add custom reporters to Jest + // reporters: undefined, + + // Automatically reset mock state between every test + // resetMocks: false, + + // Reset the module registry before running each individual test + // resetModules: false, + + // A path to a custom resolver + // resolver: undefined, + + // Automatically restore mock state between every test + // restoreMocks: false, + + // The root directory that Jest should scan for tests and modules within + // rootDir: undefined, + + // A list of paths to directories that Jest should use to search for files in + roots: [""], + + // Allows you to use a custom runner instead of Jest's default test runner + // runner: "jest-runner", + + // The paths to modules that run some code to configure or set up the testing environment before each test + // setupFiles: [], + + // A list of paths to modules that run some code to configure or set up the testing framework before each test + // setupFilesAfterEnv: [], + + // The number of seconds after which a test is considered as slow and reported as such in the results. + // slowTestThreshold: 5, + + // A list of paths to snapshot serializer modules Jest should use for snapshot testing + // snapshotSerializers: [], + + // The test environment that will be used for testing + testEnvironment: "node", + + // Options that will be passed to the testEnvironment + // testEnvironmentOptions: {}, + + // Adds a location field to test results + // testLocationInResults: false, + + // The glob patterns Jest uses to detect test files + testMatch: [ + "**/__tests__/**/*.[jt]s?(x)", + "**/?(*.)+(spec|test).[tj]s?(x)", + "/test/**/*", + ], + + // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped + // testPathIgnorePatterns: [ + // "\\\\node_modules\\\\" + // ], + + // The regexp pattern or array of patterns that Jest uses to detect test files + // testRegex: [], + + // This option allows the use of a custom results processor + // testResultsProcessor: undefined, + + // This option allows use of a custom test runner + // testRunner: "jasmine2", + + // This option sets the URL for the jsdom environment. It is reflected in properties such as location.href + // testURL: "http://localhost", + + // Setting this value to "fake" allows the use of fake timers for functions such as "setTimeout" + // timers: "real", + + // A map from regular expressions to paths to transformers + transform: { + "^.+\\.(ts|tsx)$": "ts-jest", + }, + + // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation + // transformIgnorePatterns: [ + // "\\\\node_modules\\\\", + // "\\.pnp\\.[^\\\\]+$" + // ], + + // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them + // unmockedModulePathPatterns: undefined, + + // Indicates whether each individual test should be reported during the run + // verbose: undefined, + + // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode + // watchPathIgnorePatterns: [], + + // Whether to use watchman for file crawling + // watchman: true, +}; diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.acct.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.acct.md new file mode 100644 index 0000000..b984c95 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.acct.md @@ -0,0 +1,14 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [Acct](./calckey-js.acct.md) + +## Acct type + +**Signature:** + +```typescript +export declare type Acct = { + username: string; + host: string | null; +}; +``` diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.api.apiclient._constructor_.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.api.apiclient._constructor_.md new file mode 100644 index 0000000..5255777 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.api.apiclient._constructor_.md @@ -0,0 +1,24 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [api](./calckey-js.api.md) > [APIClient](./calckey-js.api.apiclient.md) > [(constructor)](./calckey-js.api.apiclient._constructor_.md) + +## api.APIClient.(constructor) + +Constructs a new instance of the `APIClient` class + +**Signature:** + +```typescript +constructor(opts: { + origin: APIClient["origin"]; + credential?: APIClient["credential"]; + fetch?: APIClient["fetch"] | null | undefined; + }); +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| opts | { origin: [APIClient](./calckey-js.api.apiclient.md)\["origin"\]; credential?: [APIClient](./calckey-js.api.apiclient.md)\["credential"\]; fetch?: [APIClient](./calckey-js.api.apiclient.md)\["fetch"\] \| null \| undefined; } | | + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.api.apiclient.credential.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.api.apiclient.credential.md new file mode 100644 index 0000000..4ecdf94 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.api.apiclient.credential.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [api](./calckey-js.api.md) > [APIClient](./calckey-js.api.apiclient.md) > [credential](./calckey-js.api.apiclient.credential.md) + +## api.APIClient.credential property + +**Signature:** + +```typescript +credential: string | null | undefined; +``` diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.api.apiclient.fetch.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.api.apiclient.fetch.md new file mode 100644 index 0000000..7f03062 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.api.apiclient.fetch.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [api](./calckey-js.api.md) > [APIClient](./calckey-js.api.apiclient.md) > [fetch](./calckey-js.api.apiclient.fetch.md) + +## api.APIClient.fetch property + +**Signature:** + +```typescript +fetch: FetchLike; +``` diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.api.apiclient.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.api.apiclient.md new file mode 100644 index 0000000..902db5c --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.api.apiclient.md @@ -0,0 +1,32 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [api](./calckey-js.api.md) > [APIClient](./calckey-js.api.apiclient.md) + +## api.APIClient class + +**Signature:** + +```typescript +export declare class APIClient +``` + +## Constructors + +| Constructor | Modifiers | Description | +| --- | --- | --- | +| [(constructor)(opts)](./calckey-js.api.apiclient._constructor_.md) | | Constructs a new instance of the APIClient class | + +## Properties + +| Property | Modifiers | Type | Description | +| --- | --- | --- | --- | +| [credential](./calckey-js.api.apiclient.credential.md) | | string \| null \| undefined | | +| [fetch](./calckey-js.api.apiclient.fetch.md) | | [FetchLike](./calckey-js.api.fetchlike.md) | | +| [origin](./calckey-js.api.apiclient.origin.md) | | string | | + +## Methods + +| Method | Modifiers | Description | +| --- | --- | --- | +| [request(endpoint, params, credential)](./calckey-js.api.apiclient.request.md) | | | + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.api.apiclient.origin.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.api.apiclient.origin.md new file mode 100644 index 0000000..bd7ed15 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.api.apiclient.origin.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [api](./calckey-js.api.md) > [APIClient](./calckey-js.api.apiclient.md) > [origin](./calckey-js.api.apiclient.origin.md) + +## api.APIClient.origin property + +**Signature:** + +```typescript +origin: string; +``` diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.api.apiclient.request.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.api.apiclient.request.md new file mode 100644 index 0000000..d2696cf --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.api.apiclient.request.md @@ -0,0 +1,57 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [api](./calckey-js.api.md) > [APIClient](./calckey-js.api.apiclient.md) > [request](./calckey-js.api.apiclient.request.md) + +## api.APIClient.request() method + +**Signature:** + +```typescript +request( + endpoint: E, + params?: P, + credential?: string | null | undefined, + ): Promise< + Endpoints[E]["res"] extends { + $switch: { + $cases: [any, any][]; + $default: any; + }; + } + ? IsCaseMatched extends true + ? GetCaseResult + : IsCaseMatched extends true + ? GetCaseResult + : IsCaseMatched extends true + ? GetCaseResult + : IsCaseMatched extends true + ? GetCaseResult + : IsCaseMatched extends true + ? GetCaseResult + : IsCaseMatched extends true + ? GetCaseResult + : IsCaseMatched extends true + ? GetCaseResult + : IsCaseMatched extends true + ? GetCaseResult + : IsCaseMatched extends true + ? GetCaseResult + : IsCaseMatched extends true + ? GetCaseResult + : Endpoints[E]["res"]["$switch"]["$default"] + : Endpoints[E]["res"] + >; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| endpoint | E | | +| params | P | _(Optional)_ | +| credential | string \| null \| undefined | _(Optional)_ | + +**Returns:** + +Promise< [Endpoints](./calckey-js.endpoints.md)\[E\]\["res"\] extends { $switch: { $cases: \[any, any\]\[\]; $default: any; }; } ? IsCaseMatched<E, P, 0> extends true ? GetCaseResult<E, P, 0> : IsCaseMatched<E, P, 1> extends true ? GetCaseResult<E, P, 1> : IsCaseMatched<E, P, 2> extends true ? GetCaseResult<E, P, 2> : IsCaseMatched<E, P, 3> extends true ? GetCaseResult<E, P, 3> : IsCaseMatched<E, P, 4> extends true ? GetCaseResult<E, P, 4> : IsCaseMatched<E, P, 5> extends true ? GetCaseResult<E, P, 5> : IsCaseMatched<E, P, 6> extends true ? GetCaseResult<E, P, 6> : IsCaseMatched<E, P, 7> extends true ? GetCaseResult<E, P, 7> : IsCaseMatched<E, P, 8> extends true ? GetCaseResult<E, P, 8> : IsCaseMatched<E, P, 9> extends true ? GetCaseResult<E, P, 9> : [Endpoints](./calckey-js.endpoints.md)\[E\]\["res"\]\["$switch"\]\["$default"\] : [Endpoints](./calckey-js.endpoints.md)\[E\]\["res"\] > + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.api.apierror.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.api.apierror.md new file mode 100644 index 0000000..9cb31a1 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.api.apierror.md @@ -0,0 +1,17 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [api](./calckey-js.api.md) > [APIError](./calckey-js.api.apierror.md) + +## api.APIError type + +**Signature:** + +```typescript +export declare type APIError = { + id: string; + code: string; + message: string; + kind: "client" | "server"; + info: Record; +}; +``` diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.api.fetchlike.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.api.fetchlike.md new file mode 100644 index 0000000..3838393 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.api.fetchlike.md @@ -0,0 +1,22 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [api](./calckey-js.api.md) > [FetchLike](./calckey-js.api.fetchlike.md) + +## api.FetchLike type + +**Signature:** + +```typescript +export declare type FetchLike = ( + input: string, + init?: { + method?: string; + body?: string; + credentials?: RequestCredentials; + cache?: RequestCache; + }, +) => Promise<{ + status: number; + json(): Promise; +}>; +``` diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.api.isapierror.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.api.isapierror.md new file mode 100644 index 0000000..3e331b5 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.api.isapierror.md @@ -0,0 +1,22 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [api](./calckey-js.api.md) > [isAPIError](./calckey-js.api.isapierror.md) + +## api.isAPIError() function + +**Signature:** + +```typescript +export declare function isAPIError(reason: any): reason is APIError; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| reason | any | | + +**Returns:** + +reason is [APIError](./calckey-js.api.apierror.md) + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.api.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.api.md new file mode 100644 index 0000000..a9be8b2 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.api.md @@ -0,0 +1,25 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [api](./calckey-js.api.md) + +## api namespace + +## Classes + +| Class | Description | +| --- | --- | +| [APIClient](./calckey-js.api.apiclient.md) | | + +## Functions + +| Function | Description | +| --- | --- | +| [isAPIError(reason)](./calckey-js.api.isapierror.md) | | + +## Type Aliases + +| Type Alias | Description | +| --- | --- | +| [APIError](./calckey-js.api.apierror.md) | | +| [FetchLike](./calckey-js.api.fetchlike.md) | | + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.channelconnection._constructor_.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.channelconnection._constructor_.md new file mode 100644 index 0000000..54ab315 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.channelconnection._constructor_.md @@ -0,0 +1,22 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [ChannelConnection](./calckey-js.channelconnection.md) > [(constructor)](./calckey-js.channelconnection._constructor_.md) + +## ChannelConnection.(constructor) + +Constructs a new instance of the `Connection` class + +**Signature:** + +```typescript +constructor(stream: Stream, channel: string, name?: string); +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| stream | [Stream](./calckey-js.stream.md) | | +| channel | string | | +| name | string | _(Optional)_ | + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.channelconnection.channel.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.channelconnection.channel.md new file mode 100644 index 0000000..8ef958e --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.channelconnection.channel.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [ChannelConnection](./calckey-js.channelconnection.md) > [channel](./calckey-js.channelconnection.channel.md) + +## ChannelConnection.channel property + +**Signature:** + +```typescript +channel: string; +``` diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.channelconnection.dispose.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.channelconnection.dispose.md new file mode 100644 index 0000000..3086a8a --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.channelconnection.dispose.md @@ -0,0 +1,15 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [ChannelConnection](./calckey-js.channelconnection.md) > [dispose](./calckey-js.channelconnection.dispose.md) + +## ChannelConnection.dispose() method + +**Signature:** + +```typescript +abstract dispose(): void; +``` +**Returns:** + +void + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.channelconnection.id.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.channelconnection.id.md new file mode 100644 index 0000000..f1a7893 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.channelconnection.id.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [ChannelConnection](./calckey-js.channelconnection.md) > [id](./calckey-js.channelconnection.id.md) + +## ChannelConnection.id property + +**Signature:** + +```typescript +abstract id: string; +``` diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.channelconnection.incount.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.channelconnection.incount.md new file mode 100644 index 0000000..960c055 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.channelconnection.incount.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [ChannelConnection](./calckey-js.channelconnection.md) > [inCount](./calckey-js.channelconnection.incount.md) + +## ChannelConnection.inCount property + +**Signature:** + +```typescript +inCount: number; +``` diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.channelconnection.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.channelconnection.md new file mode 100644 index 0000000..7a93e20 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.channelconnection.md @@ -0,0 +1,39 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [ChannelConnection](./calckey-js.channelconnection.md) + +## ChannelConnection class + +**Signature:** + +```typescript +export declare abstract class Connection< + Channel extends AnyOf = any, +> extends EventEmitter +``` +**Extends:** EventEmitter<Channel\["events"\]> + +## Constructors + +| Constructor | Modifiers | Description | +| --- | --- | --- | +| [(constructor)(stream, channel, name)](./calckey-js.channelconnection._constructor_.md) | | Constructs a new instance of the Connection class | + +## Properties + +| Property | Modifiers | Type | Description | +| --- | --- | --- | --- | +| [channel](./calckey-js.channelconnection.channel.md) | | string | | +| [id](./calckey-js.channelconnection.id.md) | abstract | string | | +| [inCount](./calckey-js.channelconnection.incount.md) | | number | | +| [name?](./calckey-js.channelconnection.name.md) | | string | _(Optional)_ | +| [outCount](./calckey-js.channelconnection.outcount.md) | | number | | +| [stream](./calckey-js.channelconnection.stream.md) | protected | [Stream](./calckey-js.stream.md) | | + +## Methods + +| Method | Modifiers | Description | +| --- | --- | --- | +| [dispose()](./calckey-js.channelconnection.dispose.md) | abstract | | +| [send(type, body)](./calckey-js.channelconnection.send.md) | | | + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.channelconnection.name.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.channelconnection.name.md new file mode 100644 index 0000000..088d96e --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.channelconnection.name.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [ChannelConnection](./calckey-js.channelconnection.md) > [name](./calckey-js.channelconnection.name.md) + +## ChannelConnection.name property + +**Signature:** + +```typescript +name?: string; +``` diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.channelconnection.outcount.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.channelconnection.outcount.md new file mode 100644 index 0000000..b85435c --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.channelconnection.outcount.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [ChannelConnection](./calckey-js.channelconnection.md) > [outCount](./calckey-js.channelconnection.outcount.md) + +## ChannelConnection.outCount property + +**Signature:** + +```typescript +outCount: number; +``` diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.channelconnection.send.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.channelconnection.send.md new file mode 100644 index 0000000..4f80473 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.channelconnection.send.md @@ -0,0 +1,26 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [ChannelConnection](./calckey-js.channelconnection.md) > [send](./calckey-js.channelconnection.send.md) + +## ChannelConnection.send() method + +**Signature:** + +```typescript +send( + type: T, + body: Channel["receives"][T], + ): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| type | T | | +| body | Channel\["receives"\]\[T\] | | + +**Returns:** + +void + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.channelconnection.stream.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.channelconnection.stream.md new file mode 100644 index 0000000..d363c76 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.channelconnection.stream.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [ChannelConnection](./calckey-js.channelconnection.md) > [stream](./calckey-js.channelconnection.stream.md) + +## ChannelConnection.stream property + +**Signature:** + +```typescript +protected stream: Stream; +``` diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.channels.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.channels.md new file mode 100644 index 0000000..963c431 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.channels.md @@ -0,0 +1,143 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [Channels](./calckey-js.channels.md) + +## Channels type + +**Signature:** + +```typescript +export declare type Channels = { + main: { + params: null; + events: { + notification: (payload: Notification) => void; + mention: (payload: Note) => void; + reply: (payload: Note) => void; + renote: (payload: Note) => void; + follow: (payload: User) => void; + followed: (payload: User) => void; + unfollow: (payload: User) => void; + meUpdated: (payload: MeDetailed) => void; + pageEvent: (payload: PageEvent) => void; + urlUploadFinished: (payload: { + marker: string; + file: DriveFile; + }) => void; + readAllNotifications: () => void; + unreadNotification: (payload: Notification) => void; + unreadMention: (payload: Note["id"]) => void; + readAllUnreadMentions: () => void; + unreadSpecifiedNote: (payload: Note["id"]) => void; + readAllUnreadSpecifiedNotes: () => void; + readAllMessagingMessages: () => void; + messagingMessage: (payload: MessagingMessage) => void; + unreadMessagingMessage: (payload: MessagingMessage) => void; + readAllAntennas: () => void; + unreadAntenna: (payload: Antenna) => void; + readAllAnnouncements: () => void; + readAllChannels: () => void; + unreadChannel: (payload: Note["id"]) => void; + myTokenRegenerated: () => void; + reversiNoInvites: () => void; + reversiInvited: (payload: FIXME) => void; + signin: (payload: FIXME) => void; + registryUpdated: (payload: { + scope?: string[]; + key: string; + value: any | null; + }) => void; + driveFileCreated: (payload: DriveFile) => void; + readAntenna: (payload: Antenna) => void; + }; + receives: null; + }; + homeTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + localTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + hybridTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + recommendedTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + globalTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + antenna: { + params: { + antennaId: Antenna["id"]; + }; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + messaging: { + params: { + otherparty?: User["id"] | null; + group?: UserGroup["id"] | null; + }; + events: { + message: (payload: MessagingMessage) => void; + deleted: (payload: MessagingMessage["id"]) => void; + read: (payload: MessagingMessage["id"][]) => void; + typers: (payload: User[]) => void; + }; + receives: { + read: { + id: MessagingMessage["id"]; + }; + }; + }; + serverStats: { + params: null; + events: { + stats: (payload: FIXME) => void; + }; + receives: { + requestLog: { + id: string | number; + length: number; + }; + }; + }; + queueStats: { + params: null; + events: { + stats: (payload: FIXME) => void; + }; + receives: { + requestLog: { + id: string | number; + length: number; + }; + }; + }; +}; +``` +**References:** [Note](./calckey-js.entities.note.md), [User](./calckey-js.entities.user.md), [MeDetailed](./calckey-js.entities.medetailed.md), [PageEvent](./calckey-js.entities.pageevent.md), [DriveFile](./calckey-js.entities.drivefile.md), [MessagingMessage](./calckey-js.entities.messagingmessage.md), [Antenna](./calckey-js.entities.antenna.md), [UserGroup](./calckey-js.entities.usergroup.md) + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.endpoints.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.endpoints.md new file mode 100644 index 0000000..c6649c2 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.endpoints.md @@ -0,0 +1,1911 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [Endpoints](./calckey-js.endpoints.md) + +## Endpoints type + +**Signature:** + +```typescript +export declare type Endpoints = { + "admin/abuse-user-reports": { + req: TODO; + res: TODO; + }; + "admin/delete-all-files-of-a-user": { + req: { + userId: User["id"]; + }; + res: null; + }; + "admin/delete-logs": { + req: NoParams; + res: null; + }; + "admin/get-index-stats": { + req: TODO; + res: TODO; + }; + "admin/get-table-stats": { + req: TODO; + res: TODO; + }; + "admin/invite": { + req: TODO; + res: TODO; + }; + "admin/logs": { + req: TODO; + res: TODO; + }; + "admin/meta": { + req: TODO; + res: TODO; + }; + "admin/reset-password": { + req: TODO; + res: TODO; + }; + "admin/resolve-abuse-user-report": { + req: TODO; + res: TODO; + }; + "admin/resync-chart": { + req: TODO; + res: TODO; + }; + "admin/send-email": { + req: TODO; + res: TODO; + }; + "admin/server-info": { + req: TODO; + res: TODO; + }; + "admin/show-moderation-logs": { + req: TODO; + res: TODO; + }; + "admin/show-user": { + req: TODO; + res: TODO; + }; + "admin/show-users": { + req: TODO; + res: TODO; + }; + "admin/silence-user": { + req: TODO; + res: TODO; + }; + "admin/suspend-user": { + req: TODO; + res: TODO; + }; + "admin/unsilence-user": { + req: TODO; + res: TODO; + }; + "admin/unsuspend-user": { + req: TODO; + res: TODO; + }; + "admin/update-meta": { + req: TODO; + res: TODO; + }; + "admin/vacuum": { + req: TODO; + res: TODO; + }; + "admin/accounts/create": { + req: TODO; + res: TODO; + }; + "admin/ad/create": { + req: TODO; + res: TODO; + }; + "admin/ad/delete": { + req: { + id: Ad["id"]; + }; + res: null; + }; + "admin/ad/list": { + req: TODO; + res: TODO; + }; + "admin/ad/update": { + req: TODO; + res: TODO; + }; + "admin/announcements/create": { + req: TODO; + res: TODO; + }; + "admin/announcements/delete": { + req: { + id: Announcement["id"]; + }; + res: null; + }; + "admin/announcements/list": { + req: TODO; + res: TODO; + }; + "admin/announcements/update": { + req: TODO; + res: TODO; + }; + "admin/drive/clean-remote-files": { + req: TODO; + res: TODO; + }; + "admin/drive/cleanup": { + req: TODO; + res: TODO; + }; + "admin/drive/files": { + req: TODO; + res: TODO; + }; + "admin/drive/show-file": { + req: TODO; + res: TODO; + }; + "admin/emoji/add": { + req: TODO; + res: TODO; + }; + "admin/emoji/copy": { + req: TODO; + res: TODO; + }; + "admin/emoji/list-remote": { + req: TODO; + res: TODO; + }; + "admin/emoji/list": { + req: TODO; + res: TODO; + }; + "admin/emoji/remove": { + req: TODO; + res: TODO; + }; + "admin/emoji/update": { + req: TODO; + res: TODO; + }; + "admin/federation/delete-all-files": { + req: { + host: string; + }; + res: null; + }; + "admin/federation/refresh-remote-instance-metadata": { + req: TODO; + res: TODO; + }; + "admin/federation/remove-all-following": { + req: TODO; + res: TODO; + }; + "admin/federation/update-instance": { + req: TODO; + res: TODO; + }; + "admin/moderators/add": { + req: TODO; + res: TODO; + }; + "admin/moderators/remove": { + req: TODO; + res: TODO; + }; + "admin/promo/create": { + req: TODO; + res: TODO; + }; + "admin/queue/clear": { + req: TODO; + res: TODO; + }; + "admin/queue/deliver-delayed": { + req: TODO; + res: TODO; + }; + "admin/queue/inbox-delayed": { + req: TODO; + res: TODO; + }; + "admin/queue/jobs": { + req: TODO; + res: TODO; + }; + "admin/queue/stats": { + req: TODO; + res: TODO; + }; + "admin/relays/add": { + req: TODO; + res: TODO; + }; + "admin/relays/list": { + req: TODO; + res: TODO; + }; + "admin/relays/remove": { + req: TODO; + res: TODO; + }; + announcements: { + req: { + limit?: number; + withUnreads?: boolean; + sinceId?: Announcement["id"]; + untilId?: Announcement["id"]; + }; + res: Announcement[]; + }; + "antennas/create": { + req: TODO; + res: Antenna; + }; + "antennas/delete": { + req: { + antennaId: Antenna["id"]; + }; + res: null; + }; + "antennas/list": { + req: NoParams; + res: Antenna[]; + }; + "antennas/notes": { + req: { + antennaId: Antenna["id"]; + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + }; + res: Note[]; + }; + "antennas/show": { + req: { + antennaId: Antenna["id"]; + }; + res: Antenna; + }; + "antennas/update": { + req: TODO; + res: Antenna; + }; + "antennas/mark-read": { + req: TODO; + res: Antenna; + }; + "ap/get": { + req: { + uri: string; + }; + res: Record; + }; + "ap/show": { + req: { + uri: string; + }; + res: + | { + type: "Note"; + object: Note; + } + | { + type: "User"; + object: UserDetailed; + }; + }; + "app/create": { + req: TODO; + res: App; + }; + "app/show": { + req: { + appId: App["id"]; + }; + res: App; + }; + "auth/accept": { + req: { + token: string; + }; + res: null; + }; + "auth/session/generate": { + req: { + appSecret: string; + }; + res: { + token: string; + url: string; + }; + }; + "auth/session/show": { + req: { + token: string; + }; + res: AuthSession; + }; + "auth/session/userkey": { + req: { + appSecret: string; + token: string; + }; + res: { + accessToken: string; + user: User; + }; + }; + "blocking/create": { + req: { + userId: User["id"]; + }; + res: UserDetailed; + }; + "blocking/delete": { + req: { + userId: User["id"]; + }; + res: UserDetailed; + }; + "blocking/list": { + req: { + limit?: number; + sinceId?: Blocking["id"]; + untilId?: Blocking["id"]; + }; + res: Blocking[]; + }; + "channels/create": { + req: TODO; + res: TODO; + }; + "channels/featured": { + req: TODO; + res: TODO; + }; + "channels/follow": { + req: TODO; + res: TODO; + }; + "channels/followed": { + req: TODO; + res: TODO; + }; + "channels/owned": { + req: TODO; + res: TODO; + }; + "channels/pin-note": { + req: TODO; + res: TODO; + }; + "channels/show": { + req: TODO; + res: TODO; + }; + "channels/timeline": { + req: TODO; + res: TODO; + }; + "channels/unfollow": { + req: TODO; + res: TODO; + }; + "channels/update": { + req: TODO; + res: TODO; + }; + "charts/active-users": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: { + local: { + users: number[]; + }; + remote: { + users: number[]; + }; + }; + }; + "charts/drive": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: { + local: { + decCount: number[]; + decSize: number[]; + incCount: number[]; + incSize: number[]; + totalCount: number[]; + totalSize: number[]; + }; + remote: { + decCount: number[]; + decSize: number[]; + incCount: number[]; + incSize: number[]; + totalCount: number[]; + totalSize: number[]; + }; + }; + }; + "charts/federation": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: { + instance: { + dec: number[]; + inc: number[]; + total: number[]; + }; + }; + }; + "charts/hashtag": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: TODO; + }; + "charts/instance": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + host: string; + }; + res: { + drive: { + decFiles: number[]; + decUsage: number[]; + incFiles: number[]; + incUsage: number[]; + totalFiles: number[]; + totalUsage: number[]; + }; + followers: { + dec: number[]; + inc: number[]; + total: number[]; + }; + following: { + dec: number[]; + inc: number[]; + total: number[]; + }; + notes: { + dec: number[]; + inc: number[]; + total: number[]; + diffs: { + normal: number[]; + renote: number[]; + reply: number[]; + }; + }; + requests: { + failed: number[]; + received: number[]; + succeeded: number[]; + }; + users: { + dec: number[]; + inc: number[]; + total: number[]; + }; + }; + }; + "charts/network": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: TODO; + }; + "charts/notes": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: { + local: { + dec: number[]; + inc: number[]; + total: number[]; + diffs: { + normal: number[]; + renote: number[]; + reply: number[]; + }; + }; + remote: { + dec: number[]; + inc: number[]; + total: number[]; + diffs: { + normal: number[]; + renote: number[]; + reply: number[]; + }; + }; + }; + }; + "charts/user/drive": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + userId: User["id"]; + }; + res: { + decCount: number[]; + decSize: number[]; + incCount: number[]; + incSize: number[]; + totalCount: number[]; + totalSize: number[]; + }; + }; + "charts/user/following": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + userId: User["id"]; + }; + res: TODO; + }; + "charts/user/notes": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + userId: User["id"]; + }; + res: { + dec: number[]; + inc: number[]; + total: number[]; + diffs: { + normal: number[]; + renote: number[]; + reply: number[]; + }; + }; + }; + "charts/user/reactions": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + userId: User["id"]; + }; + res: TODO; + }; + "charts/users": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + }; + res: { + local: { + dec: number[]; + inc: number[]; + total: number[]; + }; + remote: { + dec: number[]; + inc: number[]; + total: number[]; + }; + }; + }; + "clips/add-note": { + req: TODO; + res: TODO; + }; + "clips/create": { + req: TODO; + res: TODO; + }; + "clips/delete": { + req: { + clipId: Clip["id"]; + }; + res: null; + }; + "clips/list": { + req: TODO; + res: TODO; + }; + "clips/notes": { + req: TODO; + res: TODO; + }; + "clips/show": { + req: TODO; + res: TODO; + }; + "clips/update": { + req: TODO; + res: TODO; + }; + drive: { + req: NoParams; + res: { + capacity: number; + usage: number; + }; + }; + "drive/files": { + req: { + folderId?: DriveFolder["id"] | null; + type?: DriveFile["type"] | null; + limit?: number; + sinceId?: DriveFile["id"]; + untilId?: DriveFile["id"]; + }; + res: DriveFile[]; + }; + "drive/files/attached-notes": { + req: TODO; + res: TODO; + }; + "drive/files/check-existence": { + req: TODO; + res: TODO; + }; + "drive/files/create": { + req: TODO; + res: TODO; + }; + "drive/files/delete": { + req: { + fileId: DriveFile["id"]; + }; + res: null; + }; + "drive/files/find-by-hash": { + req: TODO; + res: TODO; + }; + "drive/files/find": { + req: { + name: string; + folderId?: DriveFolder["id"] | null; + }; + res: DriveFile[]; + }; + "drive/files/show": { + req: { + fileId?: DriveFile["id"]; + url?: string; + }; + res: DriveFile; + }; + "drive/files/update": { + req: { + fileId: DriveFile["id"]; + folderId?: DriveFolder["id"] | null; + name?: string; + isSensitive?: boolean; + comment?: string | null; + }; + res: DriveFile; + }; + "drive/files/upload-from-url": { + req: { + url: string; + folderId?: DriveFolder["id"] | null; + isSensitive?: boolean; + comment?: string | null; + marker?: string | null; + force?: boolean; + }; + res: null; + }; + "drive/folders": { + req: { + folderId?: DriveFolder["id"] | null; + limit?: number; + sinceId?: DriveFile["id"]; + untilId?: DriveFile["id"]; + }; + res: DriveFolder[]; + }; + "drive/folders/create": { + req: { + name?: string; + parentId?: DriveFolder["id"] | null; + }; + res: DriveFolder; + }; + "drive/folders/delete": { + req: { + folderId: DriveFolder["id"]; + }; + res: null; + }; + "drive/folders/find": { + req: { + name: string; + parentId?: DriveFolder["id"] | null; + }; + res: DriveFolder[]; + }; + "drive/folders/show": { + req: { + folderId: DriveFolder["id"]; + }; + res: DriveFolder; + }; + "drive/folders/update": { + req: { + folderId: DriveFolder["id"]; + name?: string; + parentId?: DriveFolder["id"] | null; + }; + res: DriveFolder; + }; + "drive/stream": { + req: { + type?: DriveFile["type"] | null; + limit?: number; + sinceId?: DriveFile["id"]; + untilId?: DriveFile["id"]; + }; + res: DriveFile[]; + }; + endpoint: { + req: { + endpoint: string; + }; + res: { + params: { + name: string; + type: string; + }[]; + }; + }; + endpoints: { + req: NoParams; + res: string[]; + }; + "federation/dns": { + req: { + host: string; + }; + res: { + a: string[]; + aaaa: string[]; + cname: string[]; + txt: string[]; + }; + }; + "federation/followers": { + req: { + host: string; + limit?: number; + sinceId?: Following["id"]; + untilId?: Following["id"]; + }; + res: FollowingFolloweePopulated[]; + }; + "federation/following": { + req: { + host: string; + limit?: number; + sinceId?: Following["id"]; + untilId?: Following["id"]; + }; + res: FollowingFolloweePopulated[]; + }; + "federation/instances": { + req: { + host?: string | null; + blocked?: boolean | null; + notResponding?: boolean | null; + suspended?: boolean | null; + federating?: boolean | null; + subscribing?: boolean | null; + publishing?: boolean | null; + limit?: number; + offset?: number; + sort?: + | "+pubSub" + | "-pubSub" + | "+notes" + | "-notes" + | "+users" + | "-users" + | "+following" + | "-following" + | "+followers" + | "-followers" + | "+caughtAt" + | "-caughtAt" + | "+lastCommunicatedAt" + | "-lastCommunicatedAt" + | "+driveUsage" + | "-driveUsage" + | "+driveFiles" + | "-driveFiles"; + }; + res: Instance[]; + }; + "federation/show-instance": { + req: { + host: string; + }; + res: Instance; + }; + "federation/update-remote-user": { + req: { + userId: User["id"]; + }; + res: null; + }; + "federation/users": { + req: { + host: string; + limit?: number; + sinceId?: User["id"]; + untilId?: User["id"]; + }; + res: UserDetailed[]; + }; + "following/create": { + req: { + userId: User["id"]; + }; + res: User; + }; + "following/delete": { + req: { + userId: User["id"]; + }; + res: User; + }; + "following/requests/accept": { + req: { + userId: User["id"]; + }; + res: null; + }; + "following/requests/cancel": { + req: { + userId: User["id"]; + }; + res: User; + }; + "following/requests/list": { + req: NoParams; + res: FollowRequest[]; + }; + "following/requests/reject": { + req: { + userId: User["id"]; + }; + res: null; + }; + "gallery/featured": { + req: TODO; + res: TODO; + }; + "gallery/popular": { + req: TODO; + res: TODO; + }; + "gallery/posts": { + req: TODO; + res: TODO; + }; + "gallery/posts/create": { + req: TODO; + res: TODO; + }; + "gallery/posts/delete": { + req: { + postId: GalleryPost["id"]; + }; + res: null; + }; + "gallery/posts/like": { + req: TODO; + res: TODO; + }; + "gallery/posts/show": { + req: TODO; + res: TODO; + }; + "gallery/posts/unlike": { + req: TODO; + res: TODO; + }; + "gallery/posts/update": { + req: TODO; + res: TODO; + }; + "games/reversi/games": { + req: TODO; + res: TODO; + }; + "games/reversi/games/show": { + req: TODO; + res: TODO; + }; + "games/reversi/games/surrender": { + req: TODO; + res: TODO; + }; + "games/reversi/invitations": { + req: TODO; + res: TODO; + }; + "games/reversi/match": { + req: TODO; + res: TODO; + }; + "games/reversi/match/cancel": { + req: TODO; + res: TODO; + }; + "get-online-users-count": { + req: NoParams; + res: { + count: number; + }; + }; + "hashtags/list": { + req: TODO; + res: TODO; + }; + "hashtags/search": { + req: TODO; + res: TODO; + }; + "hashtags/show": { + req: TODO; + res: TODO; + }; + "hashtags/trend": { + req: TODO; + res: TODO; + }; + "hashtags/users": { + req: TODO; + res: TODO; + }; + i: { + req: NoParams; + res: User; + }; + "i/apps": { + req: TODO; + res: TODO; + }; + "i/authorized-apps": { + req: TODO; + res: TODO; + }; + "i/change-password": { + req: TODO; + res: TODO; + }; + "i/delete-account": { + req: { + password: string; + }; + res: null; + }; + "i/export-blocking": { + req: TODO; + res: TODO; + }; + "i/export-following": { + req: TODO; + res: TODO; + }; + "i/export-mute": { + req: TODO; + res: TODO; + }; + "i/export-notes": { + req: TODO; + res: TODO; + }; + "i/export-user-lists": { + req: TODO; + res: TODO; + }; + "i/favorites": { + req: { + limit?: number; + sinceId?: NoteFavorite["id"]; + untilId?: NoteFavorite["id"]; + }; + res: NoteFavorite[]; + }; + "i/gallery/likes": { + req: TODO; + res: TODO; + }; + "i/gallery/posts": { + req: TODO; + res: TODO; + }; + "i/get-word-muted-notes-count": { + req: TODO; + res: TODO; + }; + "i/import-following": { + req: TODO; + res: TODO; + }; + "i/import-user-lists": { + req: TODO; + res: TODO; + }; + "i/move": { + req: TODO; + res: TODO; + }; + "i/known-as": { + req: TODO; + res: TODO; + }; + "i/notifications": { + req: { + limit?: number; + sinceId?: Notification["id"]; + untilId?: Notification["id"]; + following?: boolean; + markAsRead?: boolean; + includeTypes?: Notification["type"][]; + excludeTypes?: Notification["type"][]; + }; + res: Notification[]; + }; + "i/page-likes": { + req: TODO; + res: TODO; + }; + "i/pages": { + req: TODO; + res: TODO; + }; + "i/pin": { + req: { + noteId: Note["id"]; + }; + res: MeDetailed; + }; + "i/read-all-messaging-messages": { + req: TODO; + res: TODO; + }; + "i/read-all-unread-notes": { + req: TODO; + res: TODO; + }; + "i/read-announcement": { + req: TODO; + res: TODO; + }; + "i/regenerate-token": { + req: { + password: string; + }; + res: null; + }; + "i/registry/get-all": { + req: { + scope?: string[]; + }; + res: Record; + }; + "i/registry/get-detail": { + req: { + key: string; + scope?: string[]; + }; + res: { + updatedAt: DateString; + value: any; + }; + }; + "i/registry/get": { + req: { + key: string; + scope?: string[]; + }; + res: any; + }; + "i/registry/keys-with-type": { + req: { + scope?: string[]; + }; + res: Record< + string, + "null" | "array" | "number" | "string" | "boolean" | "object" + >; + }; + "i/registry/keys": { + req: { + scope?: string[]; + }; + res: string[]; + }; + "i/registry/remove": { + req: { + key: string; + scope?: string[]; + }; + res: null; + }; + "i/registry/scopes": { + req: NoParams; + res: string[][]; + }; + "i/registry/set": { + req: { + key: string; + value: any; + scope?: string[]; + }; + res: null; + }; + "i/revoke-token": { + req: TODO; + res: TODO; + }; + "i/signin-history": { + req: { + limit?: number; + sinceId?: Signin["id"]; + untilId?: Signin["id"]; + }; + res: Signin[]; + }; + "i/unpin": { + req: { + noteId: Note["id"]; + }; + res: MeDetailed; + }; + "i/update-email": { + req: { + password: string; + email?: string | null; + }; + res: MeDetailed; + }; + "i/update": { + req: { + name?: string | null; + description?: string | null; + lang?: string | null; + location?: string | null; + birthday?: string | null; + avatarId?: DriveFile["id"] | null; + bannerId?: DriveFile["id"] | null; + fields?: { + name: string; + value: string; + }[]; + isLocked?: boolean; + isExplorable?: boolean; + hideOnlineStatus?: boolean; + carefulBot?: boolean; + autoAcceptFollowed?: boolean; + noCrawle?: boolean; + preventAiLearning?: boolean; + isBot?: boolean; + isCat?: boolean; + injectFeaturedNote?: boolean; + receiveAnnouncementEmail?: boolean; + alwaysMarkNsfw?: boolean; + mutedWords?: string[][]; + mutingNotificationTypes?: Notification["type"][]; + emailNotificationTypes?: string[]; + }; + res: MeDetailed; + }; + "i/user-group-invites": { + req: TODO; + res: TODO; + }; + "i/2fa/done": { + req: TODO; + res: TODO; + }; + "i/2fa/key-done": { + req: TODO; + res: TODO; + }; + "i/2fa/password-less": { + req: TODO; + res: TODO; + }; + "i/2fa/register-key": { + req: TODO; + res: TODO; + }; + "i/2fa/register": { + req: TODO; + res: TODO; + }; + "i/2fa/update-key": { + req: TODO; + res: TODO; + }; + "i/2fa/remove-key": { + req: TODO; + res: TODO; + }; + "i/2fa/unregister": { + req: TODO; + res: TODO; + }; + "messaging/history": { + req: { + limit?: number; + group?: boolean; + }; + res: MessagingMessage[]; + }; + "messaging/messages": { + req: { + userId?: User["id"]; + groupId?: UserGroup["id"]; + limit?: number; + sinceId?: MessagingMessage["id"]; + untilId?: MessagingMessage["id"]; + markAsRead?: boolean; + }; + res: MessagingMessage[]; + }; + "messaging/messages/create": { + req: { + userId?: User["id"]; + groupId?: UserGroup["id"]; + text?: string; + fileId?: DriveFile["id"]; + }; + res: MessagingMessage; + }; + "messaging/messages/delete": { + req: { + messageId: MessagingMessage["id"]; + }; + res: null; + }; + "messaging/messages/read": { + req: { + messageId: MessagingMessage["id"]; + }; + res: null; + }; + meta: { + req: { + detail?: boolean; + }; + res: { + $switch: { + $cases: [ + [ + { + detail: true; + }, + DetailedInstanceMetadata, + ], + [ + { + detail: false; + }, + LiteInstanceMetadata, + ], + [ + { + detail: boolean; + }, + LiteInstanceMetadata | DetailedInstanceMetadata, + ], + ]; + $default: LiteInstanceMetadata; + }; + }; + }; + "miauth/gen-token": { + req: TODO; + res: TODO; + }; + "mute/create": { + req: TODO; + res: TODO; + }; + "mute/delete": { + req: { + userId: User["id"]; + }; + res: null; + }; + "mute/list": { + req: TODO; + res: TODO; + }; + "renote-mute/create": { + req: TODO; + res: TODO; + }; + "renote-mute/delete": { + req: { + userId: User["id"]; + }; + res: null; + }; + "renote-mute/list": { + req: TODO; + res: TODO; + }; + "my/apps": { + req: TODO; + res: TODO; + }; + notes: { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + }; + res: Note[]; + }; + "notes/children": { + req: { + noteId: Note["id"]; + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + }; + res: Note[]; + }; + "notes/clips": { + req: TODO; + res: TODO; + }; + "notes/conversation": { + req: TODO; + res: TODO; + }; + "notes/create": { + req: NoteSubmitReq; + res: { + createdNote: Note; + }; + }; + "notes/delete": { + req: { + noteId: Note["id"]; + }; + res: null; + }; + "notes/edit": { + req: NoteSubmitReq; + res: { + createdNote: Note; + }; + }; + "notes/favorites/create": { + req: { + noteId: Note["id"]; + }; + res: null; + }; + "notes/favorites/delete": { + req: { + noteId: Note["id"]; + }; + res: null; + }; + "notes/featured": { + req: TODO; + res: Note[]; + }; + "notes/global-timeline": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/recommended-timeline": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/hybrid-timeline": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/local-timeline": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/mentions": { + req: { + following?: boolean; + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + }; + res: Note[]; + }; + "notes/polls/recommendation": { + req: TODO; + res: TODO; + }; + "notes/polls/vote": { + req: { + noteId: Note["id"]; + choice: number; + }; + res: null; + }; + "notes/reactions": { + req: { + noteId: Note["id"]; + type?: string | null; + limit?: number; + }; + res: NoteReaction[]; + }; + "notes/reactions/create": { + req: { + noteId: Note["id"]; + reaction: string; + }; + res: null; + }; + "notes/reactions/delete": { + req: { + noteId: Note["id"]; + }; + res: null; + }; + "notes/renotes": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + noteId: Note["id"]; + }; + res: Note[]; + }; + "notes/replies": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + noteId: Note["id"]; + }; + res: Note[]; + }; + "notes/search-by-tag": { + req: TODO; + res: TODO; + }; + "notes/search": { + req: TODO; + res: TODO; + }; + "notes/show": { + req: { + noteId: Note["id"]; + }; + res: Note; + }; + "notes/state": { + req: TODO; + res: TODO; + }; + "notes/timeline": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/unrenote": { + req: { + noteId: Note["id"]; + }; + res: null; + }; + "notes/user-list-timeline": { + req: { + listId: UserList["id"]; + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/watching/create": { + req: TODO; + res: TODO; + }; + "notes/watching/delete": { + req: { + noteId: Note["id"]; + }; + res: null; + }; + "notifications/create": { + req: { + body: string; + header?: string | null; + icon?: string | null; + }; + res: null; + }; + "notifications/mark-all-as-read": { + req: NoParams; + res: null; + }; + "notifications/read": { + req: { + notificationId: Notification["id"]; + }; + res: null; + }; + "page-push": { + req: { + pageId: Page["id"]; + event: string; + var?: any; + }; + res: null; + }; + "pages/create": { + req: TODO; + res: Page; + }; + "pages/delete": { + req: { + pageId: Page["id"]; + }; + res: null; + }; + "pages/featured": { + req: NoParams; + res: Page[]; + }; + "pages/like": { + req: { + pageId: Page["id"]; + }; + res: null; + }; + "pages/show": { + req: { + pageId?: Page["id"]; + name?: string; + username?: string; + }; + res: Page; + }; + "pages/unlike": { + req: { + pageId: Page["id"]; + }; + res: null; + }; + "pages/update": { + req: TODO; + res: null; + }; + ping: { + req: NoParams; + res: { + pong: number; + }; + }; + "pinned-users": { + req: TODO; + res: TODO; + }; + "promo/read": { + req: TODO; + res: TODO; + }; + "request-reset-password": { + req: { + username: string; + email: string; + }; + res: null; + }; + "reset-password": { + req: { + token: string; + password: string; + }; + res: null; + }; + "room/show": { + req: TODO; + res: TODO; + }; + "room/update": { + req: TODO; + res: TODO; + }; + stats: { + req: NoParams; + res: Stats; + }; + "server-info": { + req: NoParams; + res: ServerInfo; + }; + "latest-version": { + req: NoParams; + res: TODO; + }; + "sw/register": { + req: TODO; + res: TODO; + }; + "username/available": { + req: { + username: string; + }; + res: { + available: boolean; + }; + }; + users: { + req: { + limit?: number; + offset?: number; + sort?: UserSorting; + origin?: OriginType; + }; + res: User[]; + }; + "users/clips": { + req: TODO; + res: TODO; + }; + "users/followers": { + req: { + userId?: User["id"]; + username?: User["username"]; + host?: User["host"] | null; + limit?: number; + sinceId?: Following["id"]; + untilId?: Following["id"]; + }; + res: FollowingFollowerPopulated[]; + }; + "users/following": { + req: { + userId?: User["id"]; + username?: User["username"]; + host?: User["host"] | null; + limit?: number; + sinceId?: Following["id"]; + untilId?: Following["id"]; + }; + res: FollowingFolloweePopulated[]; + }; + "users/gallery/posts": { + req: TODO; + res: TODO; + }; + "users/get-frequently-replied-users": { + req: TODO; + res: TODO; + }; + "users/groups/create": { + req: TODO; + res: TODO; + }; + "users/groups/delete": { + req: { + groupId: UserGroup["id"]; + }; + res: null; + }; + "users/groups/invitations/accept": { + req: TODO; + res: TODO; + }; + "users/groups/invitations/reject": { + req: TODO; + res: TODO; + }; + "users/groups/invite": { + req: TODO; + res: TODO; + }; + "users/groups/joined": { + req: TODO; + res: TODO; + }; + "users/groups/owned": { + req: TODO; + res: TODO; + }; + "users/groups/pull": { + req: TODO; + res: TODO; + }; + "users/groups/show": { + req: TODO; + res: TODO; + }; + "users/groups/transfer": { + req: TODO; + res: TODO; + }; + "users/groups/update": { + req: TODO; + res: TODO; + }; + "users/lists/create": { + req: { + name: string; + }; + res: UserList; + }; + "users/lists/delete": { + req: { + listId: UserList["id"]; + }; + res: null; + }; + "users/lists/list": { + req: NoParams; + res: UserList[]; + }; + "users/lists/pull": { + req: { + listId: UserList["id"]; + userId: User["id"]; + }; + res: null; + }; + "users/lists/push": { + req: { + listId: UserList["id"]; + userId: User["id"]; + }; + res: null; + }; + "users/lists/show": { + req: { + listId: UserList["id"]; + }; + res: UserList; + }; + "users/lists/update": { + req: { + listId: UserList["id"]; + name: string; + }; + res: UserList; + }; + "users/notes": { + req: { + userId: User["id"]; + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "users/pages": { + req: TODO; + res: TODO; + }; + "users/recommendation": { + req: TODO; + res: TODO; + }; + "users/relation": { + req: TODO; + res: TODO; + }; + "users/report-abuse": { + req: TODO; + res: TODO; + }; + "users/search-by-username-and-host": { + req: TODO; + res: TODO; + }; + "users/search": { + req: TODO; + res: TODO; + }; + "users/show": { + req: + | ShowUserReq + | { + userIds: User["id"][]; + }; + res: { + $switch: { + $cases: [ + [ + { + userIds: User["id"][]; + }, + UserDetailed[], + ], + ]; + $default: UserDetailed; + }; + }; + }; + "users/stats": { + req: TODO; + res: TODO; + }; +}; +``` +**References:** [User](./calckey-js.entities.user.md), [Ad](./calckey-js.entities.ad.md), [Announcement](./calckey-js.entities.announcement.md), [Antenna](./calckey-js.entities.antenna.md), [Note](./calckey-js.entities.note.md), [UserDetailed](./calckey-js.entities.userdetailed.md), [App](./calckey-js.entities.app.md), [AuthSession](./calckey-js.entities.authsession.md), [Blocking](./calckey-js.entities.blocking.md), [Clip](./calckey-js.entities.clip.md), [DriveFolder](./calckey-js.entities.drivefolder.md), [DriveFile](./calckey-js.entities.drivefile.md), [Following](./calckey-js.entities.following.md), [FollowingFolloweePopulated](./calckey-js.entities.followingfolloweepopulated.md), [Instance](./calckey-js.entities.instance.md), [FollowRequest](./calckey-js.entities.followrequest.md), [GalleryPost](./calckey-js.entities.gallerypost.md), [NoteFavorite](./calckey-js.entities.notefavorite.md), [MeDetailed](./calckey-js.entities.medetailed.md), [DateString](./calckey-js.entities.datestring.md), [Signin](./calckey-js.entities.signin.md), [MessagingMessage](./calckey-js.entities.messagingmessage.md), [UserGroup](./calckey-js.entities.usergroup.md), [DetailedInstanceMetadata](./calckey-js.entities.detailedinstancemetadata.md), [LiteInstanceMetadata](./calckey-js.entities.liteinstancemetadata.md), [NoteReaction](./calckey-js.entities.notereaction.md), [UserList](./calckey-js.entities.userlist.md), [Page](./calckey-js.entities.page.md), [Stats](./calckey-js.entities.stats.md), [ServerInfo](./calckey-js.entities.serverinfo.md), [UserSorting](./calckey-js.entities.usersorting.md), [OriginType](./calckey-js.entities.origintype.md), [FollowingFollowerPopulated](./calckey-js.entities.followingfollowerpopulated.md) + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.ad.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.ad.md new file mode 100644 index 0000000..f68e17d --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.ad.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [Ad](./calckey-js.entities.ad.md) + +## entities.Ad type + +**Signature:** + +```typescript +export declare type Ad = TODO; +``` diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.announcement.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.announcement.md new file mode 100644 index 0000000..a7385aa --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.announcement.md @@ -0,0 +1,21 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [Announcement](./calckey-js.entities.announcement.md) + +## entities.Announcement type + +**Signature:** + +```typescript +export declare type Announcement = { + id: ID; + createdAt: DateString; + updatedAt: DateString | null; + text: string; + title: string; + imageUrl: string | null; + isRead?: boolean; +}; +``` +**References:** [ID](./calckey-js.entities.id.md), [DateString](./calckey-js.entities.datestring.md) + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.antenna.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.antenna.md new file mode 100644 index 0000000..a4fa297 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.antenna.md @@ -0,0 +1,29 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [Antenna](./calckey-js.entities.antenna.md) + +## entities.Antenna type + +**Signature:** + +```typescript +export declare type Antenna = { + id: ID; + createdAt: DateString; + name: string; + keywords: string[][]; + excludeKeywords: string[][]; + src: "home" | "all" | "users" | "list" | "group" | "instances"; + userListId: ID | null; + userGroupId: ID | null; + users: string[]; + instances: string[]; + caseSensitive: boolean; + notify: boolean; + withReplies: boolean; + withFile: boolean; + hasUnreadNote: boolean; +}; +``` +**References:** [ID](./calckey-js.entities.id.md), [DateString](./calckey-js.entities.datestring.md) + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.app.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.app.md new file mode 100644 index 0000000..32416ce --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.app.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [App](./calckey-js.entities.app.md) + +## entities.App type + +**Signature:** + +```typescript +export declare type App = TODO; +``` diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.authsession.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.authsession.md new file mode 100644 index 0000000..c14955d --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.authsession.md @@ -0,0 +1,17 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [AuthSession](./calckey-js.entities.authsession.md) + +## entities.AuthSession type + +**Signature:** + +```typescript +export declare type AuthSession = { + id: ID; + app: App; + token: string; +}; +``` +**References:** [ID](./calckey-js.entities.id.md), [App](./calckey-js.entities.app.md) + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.blocking.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.blocking.md new file mode 100644 index 0000000..d8c3add --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.blocking.md @@ -0,0 +1,18 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [Blocking](./calckey-js.entities.blocking.md) + +## entities.Blocking type + +**Signature:** + +```typescript +export declare type Blocking = { + id: ID; + createdAt: DateString; + blockeeId: User["id"]; + blockee: UserDetailed; +}; +``` +**References:** [ID](./calckey-js.entities.id.md), [DateString](./calckey-js.entities.datestring.md), [User](./calckey-js.entities.user.md), [UserDetailed](./calckey-js.entities.userdetailed.md) + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.channel.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.channel.md new file mode 100644 index 0000000..d69ce6e --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.channel.md @@ -0,0 +1,15 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [Channel](./calckey-js.entities.channel.md) + +## entities.Channel type + +**Signature:** + +```typescript +export declare type Channel = { + id: ID; +}; +``` +**References:** [ID](./calckey-js.entities.id.md) + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.clip.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.clip.md new file mode 100644 index 0000000..facd676 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.clip.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [Clip](./calckey-js.entities.clip.md) + +## entities.Clip type + +**Signature:** + +```typescript +export declare type Clip = TODO; +``` diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.customemoji.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.customemoji.md new file mode 100644 index 0000000..07ee6c5 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.customemoji.md @@ -0,0 +1,17 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [CustomEmoji](./calckey-js.entities.customemoji.md) + +## entities.CustomEmoji type + +**Signature:** + +```typescript +export declare type CustomEmoji = { + id: string; + name: string; + url: string; + category: string; + aliases: string[]; +}; +``` diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.datestring.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.datestring.md new file mode 100644 index 0000000..8ea7776 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.datestring.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [DateString](./calckey-js.entities.datestring.md) + +## entities.DateString type + +**Signature:** + +```typescript +export declare type DateString = string; +``` diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.detailedinstancemetadata.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.detailedinstancemetadata.md new file mode 100644 index 0000000..c37cab0 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.detailedinstancemetadata.md @@ -0,0 +1,15 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [DetailedInstanceMetadata](./calckey-js.entities.detailedinstancemetadata.md) + +## entities.DetailedInstanceMetadata type + +**Signature:** + +```typescript +export declare type DetailedInstanceMetadata = LiteInstanceMetadata & { + features: Record; +}; +``` +**References:** [LiteInstanceMetadata](./calckey-js.entities.liteinstancemetadata.md) + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.drivefile.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.drivefile.md new file mode 100644 index 0000000..bb89fd6 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.drivefile.md @@ -0,0 +1,26 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [DriveFile](./calckey-js.entities.drivefile.md) + +## entities.DriveFile type + +**Signature:** + +```typescript +export declare type DriveFile = { + id: ID; + createdAt: DateString; + isSensitive: boolean; + name: string; + thumbnailUrl: string; + url: string; + type: string; + size: number; + md5: string; + blurhash: string; + comment: string | null; + properties: Record; +}; +``` +**References:** [ID](./calckey-js.entities.id.md), [DateString](./calckey-js.entities.datestring.md) + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.drivefolder.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.drivefolder.md new file mode 100644 index 0000000..c0102e5 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.drivefolder.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [DriveFolder](./calckey-js.entities.drivefolder.md) + +## entities.DriveFolder type + +**Signature:** + +```typescript +export declare type DriveFolder = TODO; +``` diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.following.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.following.md new file mode 100644 index 0000000..cd8bbc7 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.following.md @@ -0,0 +1,18 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [Following](./calckey-js.entities.following.md) + +## entities.Following type + +**Signature:** + +```typescript +export declare type Following = { + id: ID; + createdAt: DateString; + followerId: User["id"]; + followeeId: User["id"]; +}; +``` +**References:** [ID](./calckey-js.entities.id.md), [DateString](./calckey-js.entities.datestring.md), [User](./calckey-js.entities.user.md) + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.followingfolloweepopulated.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.followingfolloweepopulated.md new file mode 100644 index 0000000..c75ffec --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.followingfolloweepopulated.md @@ -0,0 +1,15 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [FollowingFolloweePopulated](./calckey-js.entities.followingfolloweepopulated.md) + +## entities.FollowingFolloweePopulated type + +**Signature:** + +```typescript +export declare type FollowingFolloweePopulated = Following & { + followee: UserDetailed; +}; +``` +**References:** [Following](./calckey-js.entities.following.md), [UserDetailed](./calckey-js.entities.userdetailed.md) + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.followingfollowerpopulated.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.followingfollowerpopulated.md new file mode 100644 index 0000000..a847ed2 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.followingfollowerpopulated.md @@ -0,0 +1,15 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [FollowingFollowerPopulated](./calckey-js.entities.followingfollowerpopulated.md) + +## entities.FollowingFollowerPopulated type + +**Signature:** + +```typescript +export declare type FollowingFollowerPopulated = Following & { + follower: UserDetailed; +}; +``` +**References:** [Following](./calckey-js.entities.following.md), [UserDetailed](./calckey-js.entities.userdetailed.md) + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.followrequest.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.followrequest.md new file mode 100644 index 0000000..7fce741 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.followrequest.md @@ -0,0 +1,17 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [FollowRequest](./calckey-js.entities.followrequest.md) + +## entities.FollowRequest type + +**Signature:** + +```typescript +export declare type FollowRequest = { + id: ID; + follower: User; + followee: User; +}; +``` +**References:** [ID](./calckey-js.entities.id.md), [User](./calckey-js.entities.user.md) + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.gallerypost.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.gallerypost.md new file mode 100644 index 0000000..0440a39 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.gallerypost.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [GalleryPost](./calckey-js.entities.gallerypost.md) + +## entities.GalleryPost type + +**Signature:** + +```typescript +export declare type GalleryPost = TODO; +``` diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.id.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.id.md new file mode 100644 index 0000000..ae0dd28 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.id.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [ID](./calckey-js.entities.id.md) + +## entities.ID type + +**Signature:** + +```typescript +export declare type ID = string; +``` diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.instance.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.instance.md new file mode 100644 index 0000000..0638c35 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.instance.md @@ -0,0 +1,40 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [Instance](./calckey-js.entities.instance.md) + +## entities.Instance type + +**Signature:** + +```typescript +export declare type Instance = { + id: ID; + caughtAt: DateString; + host: string; + usersCount: number; + notesCount: number; + followingCount: number; + followersCount: number; + driveUsage: number; + driveFiles: number; + latestRequestSentAt: DateString | null; + latestStatus: number | null; + latestRequestReceivedAt: DateString | null; + lastCommunicatedAt: DateString; + isNotResponding: boolean; + isSuspended: boolean; + softwareName: string | null; + softwareVersion: string | null; + openRegistrations: boolean | null; + name: string | null; + description: string | null; + maintainerName: string | null; + maintainerEmail: string | null; + iconUrl: string | null; + faviconUrl: string | null; + themeColor: string | null; + infoUpdatedAt: DateString | null; +}; +``` +**References:** [ID](./calckey-js.entities.id.md), [DateString](./calckey-js.entities.datestring.md) + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.instancemetadata.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.instancemetadata.md new file mode 100644 index 0000000..92a3a04 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.instancemetadata.md @@ -0,0 +1,15 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [InstanceMetadata](./calckey-js.entities.instancemetadata.md) + +## entities.InstanceMetadata type + +**Signature:** + +```typescript +export declare type InstanceMetadata = + | LiteInstanceMetadata + | DetailedInstanceMetadata; +``` +**References:** [LiteInstanceMetadata](./calckey-js.entities.liteinstancemetadata.md), [DetailedInstanceMetadata](./calckey-js.entities.detailedinstancemetadata.md) + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.liteinstancemetadata.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.liteinstancemetadata.md new file mode 100644 index 0000000..7cbebc0 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.liteinstancemetadata.md @@ -0,0 +1,46 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [LiteInstanceMetadata](./calckey-js.entities.liteinstancemetadata.md) + +## entities.LiteInstanceMetadata type + +**Signature:** + +```typescript +export declare type LiteInstanceMetadata = { + maintainerName: string | null; + maintainerEmail: string | null; + version: string; + name: string | null; + uri: string; + description: string | null; + tosUrl: string | null; + disableRegistration: boolean; + disableLocalTimeline: boolean; + disableRecommendedTimeline: boolean; + disableGlobalTimeline: boolean; + driveCapacityPerLocalUserMb: number; + driveCapacityPerRemoteUserMb: number; + enableHcaptcha: boolean; + hcaptchaSiteKey: string | null; + enableRecaptcha: boolean; + recaptchaSiteKey: string | null; + swPublickey: string | null; + maxNoteTextLength: number; + enableEmail: boolean; + enableTwitterIntegration: boolean; + enableGithubIntegration: boolean; + enableDiscordIntegration: boolean; + enableServiceWorker: boolean; + emojis: CustomEmoji[]; + ads: { + id: ID; + ratio: number; + place: string; + url: string; + imageUrl: string; + }[]; +}; +``` +**References:** [CustomEmoji](./calckey-js.entities.customemoji.md), [ID](./calckey-js.entities.id.md) + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.md new file mode 100644 index 0000000..250a95a --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.md @@ -0,0 +1,51 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) + +## entities namespace + +## Type Aliases + +| Type Alias | Description | +| --- | --- | +| [Ad](./calckey-js.entities.ad.md) | | +| [Announcement](./calckey-js.entities.announcement.md) | | +| [Antenna](./calckey-js.entities.antenna.md) | | +| [App](./calckey-js.entities.app.md) | | +| [AuthSession](./calckey-js.entities.authsession.md) | | +| [Blocking](./calckey-js.entities.blocking.md) | | +| [Channel](./calckey-js.entities.channel.md) | | +| [Clip](./calckey-js.entities.clip.md) | | +| [CustomEmoji](./calckey-js.entities.customemoji.md) | | +| [DateString](./calckey-js.entities.datestring.md) | | +| [DetailedInstanceMetadata](./calckey-js.entities.detailedinstancemetadata.md) | | +| [DriveFile](./calckey-js.entities.drivefile.md) | | +| [DriveFolder](./calckey-js.entities.drivefolder.md) | | +| [Following](./calckey-js.entities.following.md) | | +| [FollowingFolloweePopulated](./calckey-js.entities.followingfolloweepopulated.md) | | +| [FollowingFollowerPopulated](./calckey-js.entities.followingfollowerpopulated.md) | | +| [FollowRequest](./calckey-js.entities.followrequest.md) | | +| [GalleryPost](./calckey-js.entities.gallerypost.md) | | +| [ID](./calckey-js.entities.id.md) | | +| [Instance](./calckey-js.entities.instance.md) | | +| [InstanceMetadata](./calckey-js.entities.instancemetadata.md) | | +| [LiteInstanceMetadata](./calckey-js.entities.liteinstancemetadata.md) | | +| [MeDetailed](./calckey-js.entities.medetailed.md) | | +| [MessagingMessage](./calckey-js.entities.messagingmessage.md) | | +| [Note](./calckey-js.entities.note.md) | | +| [NoteFavorite](./calckey-js.entities.notefavorite.md) | | +| [NoteReaction](./calckey-js.entities.notereaction.md) | | +| [Notification](./calckey-js.entities.notification.md) | | +| [OriginType](./calckey-js.entities.origintype.md) | | +| [Page](./calckey-js.entities.page.md) | | +| [PageEvent](./calckey-js.entities.pageevent.md) | | +| [ServerInfo](./calckey-js.entities.serverinfo.md) | | +| [Signin](./calckey-js.entities.signin.md) | | +| [Stats](./calckey-js.entities.stats.md) | | +| [User](./calckey-js.entities.user.md) | | +| [UserDetailed](./calckey-js.entities.userdetailed.md) | | +| [UserGroup](./calckey-js.entities.usergroup.md) | | +| [UserList](./calckey-js.entities.userlist.md) | | +| [UserLite](./calckey-js.entities.userlite.md) | | +| [UserSorting](./calckey-js.entities.usersorting.md) | | + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.medetailed.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.medetailed.md new file mode 100644 index 0000000..0d6b0c4 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.medetailed.md @@ -0,0 +1,40 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [MeDetailed](./calckey-js.entities.medetailed.md) + +## entities.MeDetailed type + +**Signature:** + +```typescript +export declare type MeDetailed = UserDetailed & { + avatarId: DriveFile["id"]; + bannerId: DriveFile["id"]; + autoAcceptFollowed: boolean; + alwaysMarkNsfw: boolean; + carefulBot: boolean; + emailNotificationTypes: string[]; + hasPendingReceivedFollowRequest: boolean; + hasUnreadAnnouncement: boolean; + hasUnreadAntenna: boolean; + hasUnreadChannel: boolean; + hasUnreadMentions: boolean; + hasUnreadMessagingMessage: boolean; + hasUnreadNotification: boolean; + hasUnreadSpecifiedNotes: boolean; + hideOnlineStatus: boolean; + injectFeaturedNote: boolean; + integrations: Record; + isDeleted: boolean; + isExplorable: boolean; + mutedWords: string[][]; + mutingNotificationTypes: string[]; + noCrawle: boolean; + preventAiLearning: boolean; + receiveAnnouncementEmail: boolean; + usePasswordLessLogin: boolean; + [other: string]: any; +}; +``` +**References:** [UserDetailed](./calckey-js.entities.userdetailed.md), [DriveFile](./calckey-js.entities.drivefile.md) + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.messagingmessage.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.messagingmessage.md new file mode 100644 index 0000000..100f0e3 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.messagingmessage.md @@ -0,0 +1,27 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [MessagingMessage](./calckey-js.entities.messagingmessage.md) + +## entities.MessagingMessage type + +**Signature:** + +```typescript +export declare type MessagingMessage = { + id: ID; + createdAt: DateString; + file: DriveFile | null; + fileId: DriveFile["id"] | null; + isRead: boolean; + reads: User["id"][]; + text: string | null; + user: User; + userId: User["id"]; + recipient?: User | null; + recipientId: User["id"] | null; + group?: UserGroup | null; + groupId: UserGroup["id"] | null; +}; +``` +**References:** [ID](./calckey-js.entities.id.md), [DateString](./calckey-js.entities.datestring.md), [DriveFile](./calckey-js.entities.drivefile.md), [User](./calckey-js.entities.user.md), [UserGroup](./calckey-js.entities.usergroup.md) + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.note.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.note.md new file mode 100644 index 0000000..7faf70e --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.note.md @@ -0,0 +1,51 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [Note](./calckey-js.entities.note.md) + +## entities.Note type + +**Signature:** + +```typescript +export declare type Note = { + id: ID; + createdAt: DateString; + text: string | null; + cw: string | null; + user: User; + userId: User["id"]; + reply?: Note; + replyId: Note["id"]; + renote?: Note; + renoteId: Note["id"]; + files: DriveFile[]; + fileIds: DriveFile["id"][]; + visibility: "public" | "home" | "followers" | "specified"; + visibleUserIds?: User["id"][]; + localOnly?: boolean; + channel?: Channel["id"]; + myReaction?: string; + reactions: Record; + renoteCount: number; + repliesCount: number; + poll?: { + expiresAt: DateString | null; + multiple: boolean; + choices: { + isVoted: boolean; + text: string; + votes: number; + }[]; + }; + emojis: { + name: string; + url: string; + }[]; + uri?: string; + url?: string; + updatedAt?: DateString; + isHidden?: boolean; +}; +``` +**References:** [ID](./calckey-js.entities.id.md), [DateString](./calckey-js.entities.datestring.md), [User](./calckey-js.entities.user.md), [Note](./calckey-js.entities.note.md), [DriveFile](./calckey-js.entities.drivefile.md), [Channel](./calckey-js.entities.channel.md) + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.notefavorite.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.notefavorite.md new file mode 100644 index 0000000..8773389 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.notefavorite.md @@ -0,0 +1,18 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [NoteFavorite](./calckey-js.entities.notefavorite.md) + +## entities.NoteFavorite type + +**Signature:** + +```typescript +export declare type NoteFavorite = { + id: ID; + createdAt: DateString; + noteId: Note["id"]; + note: Note; +}; +``` +**References:** [ID](./calckey-js.entities.id.md), [DateString](./calckey-js.entities.datestring.md), [Note](./calckey-js.entities.note.md) + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.notereaction.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.notereaction.md new file mode 100644 index 0000000..3c89089 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.notereaction.md @@ -0,0 +1,18 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [NoteReaction](./calckey-js.entities.notereaction.md) + +## entities.NoteReaction type + +**Signature:** + +```typescript +export declare type NoteReaction = { + id: ID; + createdAt: DateString; + user: UserLite; + type: string; +}; +``` +**References:** [ID](./calckey-js.entities.id.md), [DateString](./calckey-js.entities.datestring.md), [UserLite](./calckey-js.entities.userlite.md) + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.notification.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.notification.md new file mode 100644 index 0000000..cf9896a --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.notification.md @@ -0,0 +1,82 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [Notification](./calckey-js.entities.notification.md) + +## entities.Notification type + +**Signature:** + +```typescript +export declare type Notification = { + id: ID; + createdAt: DateString; + isRead: boolean; +} & ( + | { + type: "reaction"; + reaction: string; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "reply"; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "renote"; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "quote"; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "mention"; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "pollVote"; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "follow"; + user: User; + userId: User["id"]; + } + | { + type: "followRequestAccepted"; + user: User; + userId: User["id"]; + } + | { + type: "receiveFollowRequest"; + user: User; + userId: User["id"]; + } + | { + type: "groupInvited"; + invitation: UserGroup; + user: User; + userId: User["id"]; + } + | { + type: "app"; + header?: string | null; + body: string; + icon?: string | null; + } +); +``` +**References:** [ID](./calckey-js.entities.id.md), [DateString](./calckey-js.entities.datestring.md), [User](./calckey-js.entities.user.md), [Note](./calckey-js.entities.note.md), [UserGroup](./calckey-js.entities.usergroup.md) + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.origintype.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.origintype.md new file mode 100644 index 0000000..ce3d68e --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.origintype.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [OriginType](./calckey-js.entities.origintype.md) + +## entities.OriginType type + +**Signature:** + +```typescript +export declare type OriginType = "combined" | "local" | "remote"; +``` diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.page.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.page.md new file mode 100644 index 0000000..3d6c48e --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.page.md @@ -0,0 +1,33 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [Page](./calckey-js.entities.page.md) + +## entities.Page type + +**Signature:** + +```typescript +export declare type Page = { + id: ID; + createdAt: DateString; + updatedAt: DateString; + userId: User["id"]; + user: User; + content: Record[]; + variables: Record[]; + title: string; + name: string; + summary: string | null; + hideTitleWhenPinned: boolean; + alignCenter: boolean; + font: string; + script: string; + eyeCatchingImageId: DriveFile["id"] | null; + eyeCatchingImage: DriveFile | null; + attachedFiles: any; + likedCount: number; + isLiked?: boolean; +}; +``` +**References:** [ID](./calckey-js.entities.id.md), [DateString](./calckey-js.entities.datestring.md), [User](./calckey-js.entities.user.md), [DriveFile](./calckey-js.entities.drivefile.md) + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.pageevent.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.pageevent.md new file mode 100644 index 0000000..c01947c --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.pageevent.md @@ -0,0 +1,19 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [PageEvent](./calckey-js.entities.pageevent.md) + +## entities.PageEvent type + +**Signature:** + +```typescript +export declare type PageEvent = { + pageId: Page["id"]; + event: string; + var: any; + userId: User["id"]; + user: User; +}; +``` +**References:** [Page](./calckey-js.entities.page.md), [User](./calckey-js.entities.user.md) + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.serverinfo.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.serverinfo.md new file mode 100644 index 0000000..0fbed1a --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.serverinfo.md @@ -0,0 +1,24 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [ServerInfo](./calckey-js.entities.serverinfo.md) + +## entities.ServerInfo type + +**Signature:** + +```typescript +export declare type ServerInfo = { + machine: string; + cpu: { + model: string; + cores: number; + }; + mem: { + total: number; + }; + fs: { + total: number; + used: number; + }; +}; +``` diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.signin.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.signin.md new file mode 100644 index 0000000..d1f0118 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.signin.md @@ -0,0 +1,19 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [Signin](./calckey-js.entities.signin.md) + +## entities.Signin type + +**Signature:** + +```typescript +export declare type Signin = { + id: ID; + createdAt: DateString; + ip: string; + headers: Record; + success: boolean; +}; +``` +**References:** [ID](./calckey-js.entities.id.md), [DateString](./calckey-js.entities.datestring.md) + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.stats.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.stats.md new file mode 100644 index 0000000..aa4057b --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.stats.md @@ -0,0 +1,19 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [Stats](./calckey-js.entities.stats.md) + +## entities.Stats type + +**Signature:** + +```typescript +export declare type Stats = { + notesCount: number; + originalNotesCount: number; + usersCount: number; + originalUsersCount: number; + instances: number; + driveUsageLocal: number; + driveUsageRemote: number; +}; +``` diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.user.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.user.md new file mode 100644 index 0000000..0b1446b --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.user.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [User](./calckey-js.entities.user.md) + +## entities.User type + +**Signature:** + +```typescript +export declare type User = UserLite | UserDetailed; +``` +**References:** [UserLite](./calckey-js.entities.userlite.md), [UserDetailed](./calckey-js.entities.userdetailed.md) + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.userdetailed.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.userdetailed.md new file mode 100644 index 0000000..a4a957a --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.userdetailed.md @@ -0,0 +1,56 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [UserDetailed](./calckey-js.entities.userdetailed.md) + +## entities.UserDetailed type + +**Signature:** + +```typescript +export declare type UserDetailed = UserLite & { + bannerBlurhash: string | null; + bannerColor: string | null; + bannerUrl: string | null; + birthday: string | null; + createdAt: DateString; + description: string | null; + ffVisibility: "public" | "followers" | "private"; + fields: { + name: string; + value: string; + }[]; + followersCount: number; + followingCount: number; + hasPendingFollowRequestFromYou: boolean; + hasPendingFollowRequestToYou: boolean; + isAdmin: boolean; + isBlocked: boolean; + isBlocking: boolean; + isBot: boolean; + isCat: boolean; + isFollowed: boolean; + isFollowing: boolean; + isLocked: boolean; + isModerator: boolean; + isMuted: boolean; + isRenoteMuted: boolean; + isSilenced: boolean; + isSuspended: boolean; + lang: string | null; + lastFetchedAt?: DateString; + location: string | null; + notesCount: number; + pinnedNoteIds: ID[]; + pinnedNotes: Note[]; + pinnedPage: Page | null; + pinnedPageId: string | null; + publicReactions: boolean; + securityKeys: boolean; + twoFactorEnabled: boolean; + updatedAt: DateString | null; + uri: string | null; + url: string | null; +}; +``` +**References:** [UserLite](./calckey-js.entities.userlite.md), [DateString](./calckey-js.entities.datestring.md), [ID](./calckey-js.entities.id.md), [Note](./calckey-js.entities.note.md), [Page](./calckey-js.entities.page.md) + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.usergroup.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.usergroup.md new file mode 100644 index 0000000..2408278 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.usergroup.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [UserGroup](./calckey-js.entities.usergroup.md) + +## entities.UserGroup type + +**Signature:** + +```typescript +export declare type UserGroup = TODO; +``` diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.userlist.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.userlist.md new file mode 100644 index 0000000..6b1960b --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.userlist.md @@ -0,0 +1,18 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [UserList](./calckey-js.entities.userlist.md) + +## entities.UserList type + +**Signature:** + +```typescript +export declare type UserList = { + id: ID; + createdAt: DateString; + name: string; + userIds: User["id"][]; +}; +``` +**References:** [ID](./calckey-js.entities.id.md), [DateString](./calckey-js.entities.datestring.md), [User](./calckey-js.entities.user.md) + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.userlite.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.userlite.md new file mode 100644 index 0000000..5d0e28f --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.userlite.md @@ -0,0 +1,35 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [UserLite](./calckey-js.entities.userlite.md) + +## entities.UserLite type + +**Signature:** + +```typescript +export declare type UserLite = { + id: ID; + username: string; + host: string | null; + name: string; + onlineStatus: "online" | "active" | "offline" | "unknown"; + avatarUrl: string; + avatarBlurhash: string; + alsoKnownAs: string[]; + movedToUri: any; + emojis: { + name: string; + url: string; + }[]; + instance?: { + name: Instance["name"]; + softwareName: Instance["softwareName"]; + softwareVersion: Instance["softwareVersion"]; + iconUrl: Instance["iconUrl"]; + faviconUrl: Instance["faviconUrl"]; + themeColor: Instance["themeColor"]; + }; +}; +``` +**References:** [ID](./calckey-js.entities.id.md), [Instance](./calckey-js.entities.instance.md) + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.usersorting.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.usersorting.md new file mode 100644 index 0000000..3ca7ad4 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.entities.usersorting.md @@ -0,0 +1,17 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [entities](./calckey-js.entities.md) > [UserSorting](./calckey-js.entities.usersorting.md) + +## entities.UserSorting type + +**Signature:** + +```typescript +export declare type UserSorting = + | "+follower" + | "-follower" + | "+createdAt" + | "-createdAt" + | "+updatedAt" + | "-updatedAt"; +``` diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.ffvisibility.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.ffvisibility.md new file mode 100644 index 0000000..03da275 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.ffvisibility.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [ffVisibility](./calckey-js.ffvisibility.md) + +## ffVisibility variable + +**Signature:** + +```typescript +ffVisibility: readonly ["public", "followers", "private"] +``` diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.md new file mode 100644 index 0000000..ac4b113 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.md @@ -0,0 +1,43 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) + +## calckey-js package + +## Classes + +| Class | Description | +| --- | --- | +| [Stream](./calckey-js.stream.md) | | + +## Abstract Classes + +| Abstract Class | Description | +| --- | --- | +| [ChannelConnection](./calckey-js.channelconnection.md) | | + +## Namespaces + +| Namespace | Description | +| --- | --- | +| [api](./calckey-js.api.md) | | +| [entities](./calckey-js.entities.md) | | + +## Variables + +| Variable | Description | +| --- | --- | +| [ffVisibility](./calckey-js.ffvisibility.md) | | +| [mutedNoteReasons](./calckey-js.mutednotereasons.md) | | +| [noteVisibilities](./calckey-js.notevisibilities.md) | | +| [notificationTypes](./calckey-js.notificationtypes.md) | | +| [permissions](./calckey-js.permissions.md) | | + +## Type Aliases + +| Type Alias | Description | +| --- | --- | +| [Acct](./calckey-js.acct.md) | | +| [Channels](./calckey-js.channels.md) | | +| [Endpoints](./calckey-js.endpoints.md) | | + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.mutednotereasons.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.mutednotereasons.md new file mode 100644 index 0000000..b0fb617 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.mutednotereasons.md @@ -0,0 +1,16 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [mutedNoteReasons](./calckey-js.mutednotereasons.md) + +## mutedNoteReasons variable + +**Signature:** + +```typescript +mutedNoteReasons: readonly [ + "word", + "manual", + "spam", + "other", +] +``` diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.notevisibilities.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.notevisibilities.md new file mode 100644 index 0000000..9fff881 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.notevisibilities.md @@ -0,0 +1,16 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [noteVisibilities](./calckey-js.notevisibilities.md) + +## noteVisibilities variable + +**Signature:** + +```typescript +noteVisibilities: readonly [ + "public", + "home", + "followers", + "specified", +] +``` diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.notificationtypes.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.notificationtypes.md new file mode 100644 index 0000000..57d8c73 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.notificationtypes.md @@ -0,0 +1,24 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [notificationTypes](./calckey-js.notificationtypes.md) + +## notificationTypes variable + +**Signature:** + +```typescript +notificationTypes: readonly [ + "follow", + "mention", + "reply", + "renote", + "quote", + "reaction", + "pollVote", + "pollEnded", + "receiveFollowRequest", + "followRequestAccepted", + "groupInvited", + "app", +] +``` diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.permissions.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.permissions.md new file mode 100644 index 0000000..611bfde --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.permissions.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [permissions](./calckey-js.permissions.md) + +## permissions variable + +**Signature:** + +```typescript +permissions: string[] +``` diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.stream._constructor_.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.stream._constructor_.md new file mode 100644 index 0000000..8cc0298 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.stream._constructor_.md @@ -0,0 +1,30 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [Stream](./calckey-js.stream.md) > [(constructor)](./calckey-js.stream._constructor_.md) + +## Stream.(constructor) + +Constructs a new instance of the `Stream` class + +**Signature:** + +```typescript +constructor( + origin: string, + user: { + token: string; + } | null, + options?: { + WebSocket?: any; + }, + ); +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| origin | string | | +| user | { token: string; } \| null | | +| options | { WebSocket?: any; } | _(Optional)_ | + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.stream.close.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.stream.close.md new file mode 100644 index 0000000..0160503 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.stream.close.md @@ -0,0 +1,15 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [Stream](./calckey-js.stream.md) > [close](./calckey-js.stream.close.md) + +## Stream.close() method + +**Signature:** + +```typescript +close(): void; +``` +**Returns:** + +void + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.stream.disconnecttochannel.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.stream.disconnecttochannel.md new file mode 100644 index 0000000..0d1e5bd --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.stream.disconnecttochannel.md @@ -0,0 +1,22 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [Stream](./calckey-js.stream.md) > [disconnectToChannel](./calckey-js.stream.disconnecttochannel.md) + +## Stream.disconnectToChannel() method + +**Signature:** + +```typescript +disconnectToChannel(connection: NonSharedConnection): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| connection | NonSharedConnection | | + +**Returns:** + +void + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.stream.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.stream.md new file mode 100644 index 0000000..c6f1492 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.stream.md @@ -0,0 +1,36 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [Stream](./calckey-js.stream.md) + +## Stream class + +**Signature:** + +```typescript +export default class Stream extends EventEmitter +``` +**Extends:** EventEmitter<StreamEvents> + +## Constructors + +| Constructor | Modifiers | Description | +| --- | --- | --- | +| [(constructor)(origin, user, options)](./calckey-js.stream._constructor_.md) | | Constructs a new instance of the Stream class | + +## Properties + +| Property | Modifiers | Type | Description | +| --- | --- | --- | --- | +| [state](./calckey-js.stream.state.md) | | "initializing" \| "reconnecting" \| "connected" | | + +## Methods + +| Method | Modifiers | Description | +| --- | --- | --- | +| [close()](./calckey-js.stream.close.md) | | | +| [disconnectToChannel(connection)](./calckey-js.stream.disconnecttochannel.md) | | | +| [removeSharedConnection(connection)](./calckey-js.stream.removesharedconnection.md) | | | +| [removeSharedConnectionPool(pool)](./calckey-js.stream.removesharedconnectionpool.md) | | | +| [send(typeOrPayload, payload)](./calckey-js.stream.send.md) | | | +| [useChannel(channel, params, name)](./calckey-js.stream.usechannel.md) | | | + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.stream.removesharedconnection.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.stream.removesharedconnection.md new file mode 100644 index 0000000..46fed5a --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.stream.removesharedconnection.md @@ -0,0 +1,22 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [Stream](./calckey-js.stream.md) > [removeSharedConnection](./calckey-js.stream.removesharedconnection.md) + +## Stream.removeSharedConnection() method + +**Signature:** + +```typescript +removeSharedConnection(connection: SharedConnection): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| connection | SharedConnection | | + +**Returns:** + +void + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.stream.removesharedconnectionpool.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.stream.removesharedconnectionpool.md new file mode 100644 index 0000000..4af9713 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.stream.removesharedconnectionpool.md @@ -0,0 +1,22 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [Stream](./calckey-js.stream.md) > [removeSharedConnectionPool](./calckey-js.stream.removesharedconnectionpool.md) + +## Stream.removeSharedConnectionPool() method + +**Signature:** + +```typescript +removeSharedConnectionPool(pool: Pool): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| pool | Pool | | + +**Returns:** + +void + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.stream.send.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.stream.send.md new file mode 100644 index 0000000..a822538 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.stream.send.md @@ -0,0 +1,23 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [Stream](./calckey-js.stream.md) > [send](./calckey-js.stream.send.md) + +## Stream.send() method + +**Signature:** + +```typescript +send(typeOrPayload: any, payload?: any): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| typeOrPayload | any | | +| payload | any | _(Optional)_ | + +**Returns:** + +void + diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.stream.state.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.stream.state.md new file mode 100644 index 0000000..b14d2f2 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.stream.state.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [Stream](./calckey-js.stream.md) > [state](./calckey-js.stream.state.md) + +## Stream.state property + +**Signature:** + +```typescript +state: "initializing" | "reconnecting" | "connected"; +``` diff --git a/fe_calckey/frontend/calckey-js/markdown/calckey-js.stream.usechannel.md b/fe_calckey/frontend/calckey-js/markdown/calckey-js.stream.usechannel.md new file mode 100644 index 0000000..331b60b --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/calckey-js.stream.usechannel.md @@ -0,0 +1,28 @@ + + +[Home](./index.md) > [calckey-js](./calckey-js.md) > [Stream](./calckey-js.stream.md) > [useChannel](./calckey-js.stream.usechannel.md) + +## Stream.useChannel() method + +**Signature:** + +```typescript +useChannel( + channel: C, + params?: Channels[C]["params"], + name?: string, + ): Connection; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| channel | C | | +| params | [Channels](./calckey-js.channels.md)\[C\]\["params"\] | _(Optional)_ | +| name | string | _(Optional)_ | + +**Returns:** + +[Connection](./calckey-js.channelconnection.md)<[Channels](./calckey-js.channels.md)\[C\]> + diff --git a/fe_calckey/frontend/calckey-js/markdown/index.md b/fe_calckey/frontend/calckey-js/markdown/index.md new file mode 100644 index 0000000..20c7819 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/markdown/index.md @@ -0,0 +1,12 @@ + + +[Home](./index.md) + +## API Reference + +## Packages + +| Package | Description | +| --- | --- | +| [calckey-js](./calckey-js.md) | | + diff --git a/fe_calckey/frontend/calckey-js/package.json b/fe_calckey/frontend/calckey-js/package.json new file mode 100644 index 0000000..fdb253f --- /dev/null +++ b/fe_calckey/frontend/calckey-js/package.json @@ -0,0 +1,50 @@ +{ + "name": "calckey-js", + "version": "0.0.24", + "description": "Calckey SDK for JavaScript", + "main": "./built/index.js", + "types": "./built/index.d.ts", + "scripts": { + "build": "pnpm swc src -d built -D", + "render": "pnpm run build && pnpm run api && pnpm run api-prod && cp temp/calckey-js.api.json etc/ && pnpm run api-doc", + "tsd": "tsc && tsd", + "api": "pnpm api-extractor run --local --verbose", + "api-prod": "pnpm api-extractor run --verbose", + "api-doc": "pnpm api-documenter markdown -i ./etc/", + "lint": "pnpm rome check --apply *.ts", + "format": "pnpm rome format --write *.ts", + "jest": "jest --coverage --detectOpenHandles", + "test": "pnpm jest && pnpm tsd" + }, + "repository": { + "type": "git", + "url": "https://codeberg.org/calckey/calckey.git" + }, + "devDependencies": { + "@microsoft/api-extractor": "^7.36.0", + "@microsoft/api-documenter": "^7.22.21", + "@swc/cli": "^0.1.62", + "@swc/core": "^1.3.62", + "@types/jest": "^27.4.0", + "@types/node": "20.3.1", + "jest": "^27.4.5", + "jest-fetch-mock": "^3.0.3", + "jest-websocket-mock": "^2.2.1", + "mock-socket": "^9.0.8", + "ts-jest": "^27.1.2", + "ts-node": "10.4.0", + "tsd": "^0.28.1", + "typescript": "5.1.3" + }, + "files": [ + "built" + ], + "dependencies": { + "eventemitter3": "^4.0.7", + "reconnecting-websocket": "^4.4.0", + "semver": "^7.3.8" + }, + "optionalDependencies": { + "@swc/core-android-arm64": "1.3.11" + } +} diff --git a/fe_calckey/frontend/calckey-js/src/acct.ts b/fe_calckey/frontend/calckey-js/src/acct.ts new file mode 100644 index 0000000..5b7767a --- /dev/null +++ b/fe_calckey/frontend/calckey-js/src/acct.ts @@ -0,0 +1,14 @@ +export type Acct = { + username: string; + host: string | null; +}; + +export function parse(acct: string): Acct { + if (acct.startsWith("@")) acct = acct.substr(1); + const split = acct.split("@", 2); + return { username: split[0], host: split[1] || null }; +} + +export function toString(acct: Acct): string { + return acct.host == null ? acct.username : `${acct.username}@${acct.host}`; +} diff --git a/fe_calckey/frontend/calckey-js/src/api.ts b/fe_calckey/frontend/calckey-js/src/api.ts new file mode 100644 index 0000000..141aa4b --- /dev/null +++ b/fe_calckey/frontend/calckey-js/src/api.ts @@ -0,0 +1,127 @@ +import { Endpoints } from "./api.types"; + +const MK_API_ERROR = Symbol(); + +export type APIError = { + id: string; + code: string; + message: string; + kind: "client" | "server"; + info: Record; +}; + +export function isAPIError(reason: any): reason is APIError { + return reason[MK_API_ERROR] === true; +} + +export type FetchLike = ( + input: string, + init?: { + method?: string; + body?: string; + credentials?: RequestCredentials; + cache?: RequestCache; + }, +) => Promise<{ + status: number; + json(): Promise; +}>; + +type IsNeverType = [T] extends [never] ? true : false; + +type StrictExtract = Cond extends Union ? Union : never; + +type IsCaseMatched< + E extends keyof Endpoints, + P extends Endpoints[E]["req"], + C extends number, +> = IsNeverType< + StrictExtract +> extends false + ? true + : false; + +type GetCaseResult< + E extends keyof Endpoints, + P extends Endpoints[E]["req"], + C extends number, +> = StrictExtract[1]; + +export class APIClient { + public origin: string; + public credential: string | null | undefined; + public fetch: FetchLike; + + constructor(opts: { + origin: APIClient["origin"]; + credential?: APIClient["credential"]; + fetch?: APIClient["fetch"] | null | undefined; + }) { + this.origin = opts.origin; + this.credential = opts.credential; + // ネイティブ関数をそのまま変数に代入して使おうとするとChromiumではIllegal invocationエラーが発生するため、 + // 環境で実装されているfetchを使う場合は無名関数でラップして使用する + this.fetch = opts.fetch || ((...args) => fetch(...args)); + } + + public request( + endpoint: E, + params: P = {} as P, + credential?: string | null | undefined, + ): Promise< + Endpoints[E]["res"] extends { + $switch: { $cases: [any, any][]; $default: any }; + } + ? IsCaseMatched extends true + ? GetCaseResult + : IsCaseMatched extends true + ? GetCaseResult + : IsCaseMatched extends true + ? GetCaseResult + : IsCaseMatched extends true + ? GetCaseResult + : IsCaseMatched extends true + ? GetCaseResult + : IsCaseMatched extends true + ? GetCaseResult + : IsCaseMatched extends true + ? GetCaseResult + : IsCaseMatched extends true + ? GetCaseResult + : IsCaseMatched extends true + ? GetCaseResult + : IsCaseMatched extends true + ? GetCaseResult + : Endpoints[E]["res"]["$switch"]["$default"] + : Endpoints[E]["res"] + > { + const promise = new Promise((resolve, reject) => { + this.fetch(`${this.origin}/api/${endpoint}`, { + method: "POST", + body: JSON.stringify({ + ...params, + i: credential !== undefined ? credential : this.credential, + }), + credentials: "omit", + cache: "no-cache", + }) + .then(async (res) => { + const body = res.status === 204 ? null : await res.json(); + + if (res.status === 200) { + resolve(body); + } else if (res.status === 204) { + resolve(null); + } else { + reject({ + [MK_API_ERROR]: true, + ...body.error, + }); + } + }) + .catch(reject); + }); + + return promise as any; + } +} diff --git a/fe_calckey/frontend/calckey-js/src/api.types.ts b/fe_calckey/frontend/calckey-js/src/api.types.ts new file mode 100644 index 0000000..626bdaa --- /dev/null +++ b/fe_calckey/frontend/calckey-js/src/api.types.ts @@ -0,0 +1,1094 @@ +import { + Ad, + Announcement, + Antenna, + App, + AuthSession, + Blocking, + Channel, + Clip, + DateString, + DetailedInstanceMetadata, + DriveFile, + DriveFolder, + Following, + FollowingFolloweePopulated, + FollowingFollowerPopulated, + FollowRequest, + GalleryPost, + Instance, + InstanceMetadata, + LiteInstanceMetadata, + MeDetailed, + Note, + NoteFavorite, + OriginType, + Page, + ServerInfo, + Stats, + User, + UserDetailed, + UserGroup, + UserList, + UserSorting, + Notification, + NoteReaction, + Signin, + MessagingMessage, +} from "./entities"; + +type TODO = Record | null; + +type NoParams = Record; + +type ShowUserReq = { username: string; host?: string } | { userId: User["id"] }; + +type NoteSubmitReq = { + editId?: null | Note["id"]; + visibility?: "public" | "home" | "followers" | "specified"; + visibleUserIds?: User["id"][]; + text?: null | string; + cw?: null | string; + viaMobile?: boolean; + localOnly?: boolean; + fileIds?: DriveFile["id"][]; + replyId?: null | Note["id"]; + renoteId?: null | Note["id"]; + channelId?: null | Channel["id"]; + poll?: null | { + choices: string[]; + multiple?: boolean; + expiresAt?: null | number; + expiredAfter?: null | number; + }; +}; + +export type Endpoints = { + // admin + "admin/abuse-user-reports": { req: TODO; res: TODO }; + "admin/delete-all-files-of-a-user": { + req: { userId: User["id"] }; + res: null; + }; + "admin/delete-logs": { req: NoParams; res: null }; + "admin/get-index-stats": { req: TODO; res: TODO }; + "admin/get-table-stats": { req: TODO; res: TODO }; + "admin/invite": { req: TODO; res: TODO }; + "admin/logs": { req: TODO; res: TODO }; + "admin/meta": { req: TODO; res: TODO }; + "admin/reset-password": { req: TODO; res: TODO }; + "admin/resolve-abuse-user-report": { req: TODO; res: TODO }; + "admin/resync-chart": { req: TODO; res: TODO }; + "admin/send-email": { req: TODO; res: TODO }; + "admin/server-info": { req: TODO; res: TODO }; + "admin/show-moderation-logs": { req: TODO; res: TODO }; + "admin/show-user": { req: TODO; res: TODO }; + "admin/show-users": { req: TODO; res: TODO }; + "admin/silence-user": { req: TODO; res: TODO }; + "admin/suspend-user": { req: TODO; res: TODO }; + "admin/unsilence-user": { req: TODO; res: TODO }; + "admin/unsuspend-user": { req: TODO; res: TODO }; + "admin/update-meta": { req: TODO; res: TODO }; + "admin/vacuum": { req: TODO; res: TODO }; + "admin/accounts/create": { req: TODO; res: TODO }; + "admin/ad/create": { req: TODO; res: TODO }; + "admin/ad/delete": { req: { id: Ad["id"] }; res: null }; + "admin/ad/list": { req: TODO; res: TODO }; + "admin/ad/update": { req: TODO; res: TODO }; + "admin/announcements/create": { req: TODO; res: TODO }; + "admin/announcements/delete": { req: { id: Announcement["id"] }; res: null }; + "admin/announcements/list": { req: TODO; res: TODO }; + "admin/announcements/update": { req: TODO; res: TODO }; + "admin/drive/clean-remote-files": { req: TODO; res: TODO }; + "admin/drive/cleanup": { req: TODO; res: TODO }; + "admin/drive/files": { req: TODO; res: TODO }; + "admin/drive/show-file": { req: TODO; res: TODO }; + "admin/emoji/add": { req: TODO; res: TODO }; + "admin/emoji/copy": { req: TODO; res: TODO }; + "admin/emoji/list-remote": { req: TODO; res: TODO }; + "admin/emoji/list": { req: TODO; res: TODO }; + "admin/emoji/remove": { req: TODO; res: TODO }; + "admin/emoji/update": { req: TODO; res: TODO }; + "admin/federation/delete-all-files": { req: { host: string }; res: null }; + "admin/federation/refresh-remote-instance-metadata": { req: TODO; res: TODO }; + "admin/federation/remove-all-following": { req: TODO; res: TODO }; + "admin/federation/update-instance": { req: TODO; res: TODO }; + "admin/moderators/add": { req: TODO; res: TODO }; + "admin/moderators/remove": { req: TODO; res: TODO }; + "admin/promo/create": { req: TODO; res: TODO }; + "admin/queue/clear": { req: TODO; res: TODO }; + "admin/queue/deliver-delayed": { req: TODO; res: TODO }; + "admin/queue/inbox-delayed": { req: TODO; res: TODO }; + "admin/queue/jobs": { req: TODO; res: TODO }; + "admin/queue/stats": { req: TODO; res: TODO }; + "admin/relays/add": { req: TODO; res: TODO }; + "admin/relays/list": { req: TODO; res: TODO }; + "admin/relays/remove": { req: TODO; res: TODO }; + + // announcements + announcements: { + req: { + limit?: number; + withUnreads?: boolean; + sinceId?: Announcement["id"]; + untilId?: Announcement["id"]; + }; + res: Announcement[]; + }; + + // antennas + "antennas/create": { req: TODO; res: Antenna }; + "antennas/delete": { req: { antennaId: Antenna["id"] }; res: null }; + "antennas/list": { req: NoParams; res: Antenna[] }; + "antennas/notes": { + req: { + antennaId: Antenna["id"]; + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + }; + res: Note[]; + }; + "antennas/show": { req: { antennaId: Antenna["id"] }; res: Antenna }; + "antennas/update": { req: TODO; res: Antenna }; + "antennas/mark-read": { req: TODO; res: Antenna }; + + // ap + "ap/get": { req: { uri: string }; res: Record }; + "ap/show": { + req: { uri: string }; + res: + | { + type: "Note"; + object: Note; + } + | { + type: "User"; + object: UserDetailed; + }; + }; + + // app + "app/create": { req: TODO; res: App }; + "app/show": { req: { appId: App["id"] }; res: App }; + + // auth + "auth/accept": { req: { token: string }; res: null }; + "auth/session/generate": { + req: { appSecret: string }; + res: { token: string; url: string }; + }; + "auth/session/show": { req: { token: string }; res: AuthSession }; + "auth/session/userkey": { + req: { appSecret: string; token: string }; + res: { accessToken: string; user: User }; + }; + + // blocking + "blocking/create": { req: { userId: User["id"] }; res: UserDetailed }; + "blocking/delete": { req: { userId: User["id"] }; res: UserDetailed }; + "blocking/list": { + req: { limit?: number; sinceId?: Blocking["id"]; untilId?: Blocking["id"] }; + res: Blocking[]; + }; + + // channels + "channels/create": { req: TODO; res: TODO }; + "channels/featured": { req: TODO; res: TODO }; + "channels/follow": { req: TODO; res: TODO }; + "channels/followed": { req: TODO; res: TODO }; + "channels/owned": { req: TODO; res: TODO }; + "channels/pin-note": { req: TODO; res: TODO }; + "channels/show": { req: TODO; res: TODO }; + "channels/timeline": { req: TODO; res: TODO }; + "channels/unfollow": { req: TODO; res: TODO }; + "channels/update": { req: TODO; res: TODO }; + + // charts + "charts/active-users": { + req: { span: "day" | "hour"; limit?: number; offset?: number | null }; + res: { + local: { + users: number[]; + }; + remote: { + users: number[]; + }; + }; + }; + "charts/drive": { + req: { span: "day" | "hour"; limit?: number; offset?: number | null }; + res: { + local: { + decCount: number[]; + decSize: number[]; + incCount: number[]; + incSize: number[]; + totalCount: number[]; + totalSize: number[]; + }; + remote: { + decCount: number[]; + decSize: number[]; + incCount: number[]; + incSize: number[]; + totalCount: number[]; + totalSize: number[]; + }; + }; + }; + "charts/federation": { + req: { span: "day" | "hour"; limit?: number; offset?: number | null }; + res: { + instance: { + dec: number[]; + inc: number[]; + total: number[]; + }; + }; + }; + "charts/hashtag": { + req: { span: "day" | "hour"; limit?: number; offset?: number | null }; + res: TODO; + }; + "charts/instance": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + host: string; + }; + res: { + drive: { + decFiles: number[]; + decUsage: number[]; + incFiles: number[]; + incUsage: number[]; + totalFiles: number[]; + totalUsage: number[]; + }; + followers: { + dec: number[]; + inc: number[]; + total: number[]; + }; + following: { + dec: number[]; + inc: number[]; + total: number[]; + }; + notes: { + dec: number[]; + inc: number[]; + total: number[]; + diffs: { + normal: number[]; + renote: number[]; + reply: number[]; + }; + }; + requests: { + failed: number[]; + received: number[]; + succeeded: number[]; + }; + users: { + dec: number[]; + inc: number[]; + total: number[]; + }; + }; + }; + "charts/network": { + req: { span: "day" | "hour"; limit?: number; offset?: number | null }; + res: TODO; + }; + "charts/notes": { + req: { span: "day" | "hour"; limit?: number; offset?: number | null }; + res: { + local: { + dec: number[]; + inc: number[]; + total: number[]; + diffs: { + normal: number[]; + renote: number[]; + reply: number[]; + }; + }; + remote: { + dec: number[]; + inc: number[]; + total: number[]; + diffs: { + normal: number[]; + renote: number[]; + reply: number[]; + }; + }; + }; + }; + "charts/user/drive": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + userId: User["id"]; + }; + res: { + decCount: number[]; + decSize: number[]; + incCount: number[]; + incSize: number[]; + totalCount: number[]; + totalSize: number[]; + }; + }; + "charts/user/following": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + userId: User["id"]; + }; + res: TODO; + }; + "charts/user/notes": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + userId: User["id"]; + }; + res: { + dec: number[]; + inc: number[]; + total: number[]; + diffs: { + normal: number[]; + renote: number[]; + reply: number[]; + }; + }; + }; + "charts/user/reactions": { + req: { + span: "day" | "hour"; + limit?: number; + offset?: number | null; + userId: User["id"]; + }; + res: TODO; + }; + "charts/users": { + req: { span: "day" | "hour"; limit?: number; offset?: number | null }; + res: { + local: { + dec: number[]; + inc: number[]; + total: number[]; + }; + remote: { + dec: number[]; + inc: number[]; + total: number[]; + }; + }; + }; + + // clips + "clips/add-note": { req: TODO; res: TODO }; + "clips/create": { req: TODO; res: TODO }; + "clips/delete": { req: { clipId: Clip["id"] }; res: null }; + "clips/list": { req: TODO; res: TODO }; + "clips/notes": { req: TODO; res: TODO }; + "clips/show": { req: TODO; res: TODO }; + "clips/update": { req: TODO; res: TODO }; + + // drive + drive: { req: NoParams; res: { capacity: number; usage: number } }; + "drive/files": { + req: { + folderId?: DriveFolder["id"] | null; + type?: DriveFile["type"] | null; + limit?: number; + sinceId?: DriveFile["id"]; + untilId?: DriveFile["id"]; + }; + res: DriveFile[]; + }; + "drive/files/attached-notes": { req: TODO; res: TODO }; + "drive/files/check-existence": { req: TODO; res: TODO }; + "drive/files/create": { req: TODO; res: TODO }; + "drive/files/delete": { req: { fileId: DriveFile["id"] }; res: null }; + "drive/files/find-by-hash": { req: TODO; res: TODO }; + "drive/files/find": { + req: { name: string; folderId?: DriveFolder["id"] | null }; + res: DriveFile[]; + }; + "drive/files/show": { + req: { fileId?: DriveFile["id"]; url?: string }; + res: DriveFile; + }; + "drive/files/update": { + req: { + fileId: DriveFile["id"]; + folderId?: DriveFolder["id"] | null; + name?: string; + isSensitive?: boolean; + comment?: string | null; + }; + res: DriveFile; + }; + "drive/files/upload-from-url": { + req: { + url: string; + folderId?: DriveFolder["id"] | null; + isSensitive?: boolean; + comment?: string | null; + marker?: string | null; + force?: boolean; + }; + res: null; + }; + "drive/folders": { + req: { + folderId?: DriveFolder["id"] | null; + limit?: number; + sinceId?: DriveFile["id"]; + untilId?: DriveFile["id"]; + }; + res: DriveFolder[]; + }; + "drive/folders/create": { + req: { name?: string; parentId?: DriveFolder["id"] | null }; + res: DriveFolder; + }; + "drive/folders/delete": { req: { folderId: DriveFolder["id"] }; res: null }; + "drive/folders/find": { + req: { name: string; parentId?: DriveFolder["id"] | null }; + res: DriveFolder[]; + }; + "drive/folders/show": { + req: { folderId: DriveFolder["id"] }; + res: DriveFolder; + }; + "drive/folders/update": { + req: { + folderId: DriveFolder["id"]; + name?: string; + parentId?: DriveFolder["id"] | null; + }; + res: DriveFolder; + }; + "drive/stream": { + req: { + type?: DriveFile["type"] | null; + limit?: number; + sinceId?: DriveFile["id"]; + untilId?: DriveFile["id"]; + }; + res: DriveFile[]; + }; + + // endpoint + endpoint: { + req: { endpoint: string }; + res: { params: { name: string; type: string }[] }; + }; + + // endpoints + endpoints: { req: NoParams; res: string[] }; + + // federation + "federation/dns": { + req: { host: string }; + res: { + a: string[]; + aaaa: string[]; + cname: string[]; + txt: string[]; + }; + }; + "federation/followers": { + req: { + host: string; + limit?: number; + sinceId?: Following["id"]; + untilId?: Following["id"]; + }; + res: FollowingFolloweePopulated[]; + }; + "federation/following": { + req: { + host: string; + limit?: number; + sinceId?: Following["id"]; + untilId?: Following["id"]; + }; + res: FollowingFolloweePopulated[]; + }; + "federation/instances": { + req: { + host?: string | null; + blocked?: boolean | null; + notResponding?: boolean | null; + suspended?: boolean | null; + federating?: boolean | null; + subscribing?: boolean | null; + publishing?: boolean | null; + limit?: number; + offset?: number; + sort?: + | "+pubSub" + | "-pubSub" + | "+notes" + | "-notes" + | "+users" + | "-users" + | "+following" + | "-following" + | "+followers" + | "-followers" + | "+caughtAt" + | "-caughtAt" + | "+lastCommunicatedAt" + | "-lastCommunicatedAt" + | "+driveUsage" + | "-driveUsage" + | "+driveFiles" + | "-driveFiles"; + }; + res: Instance[]; + }; + "federation/show-instance": { req: { host: string }; res: Instance }; + "federation/update-remote-user": { req: { userId: User["id"] }; res: null }; + "federation/users": { + req: { + host: string; + limit?: number; + sinceId?: User["id"]; + untilId?: User["id"]; + }; + res: UserDetailed[]; + }; + + // following + "following/create": { req: { userId: User["id"] }; res: User }; + "following/delete": { req: { userId: User["id"] }; res: User }; + "following/requests/accept": { req: { userId: User["id"] }; res: null }; + "following/requests/cancel": { req: { userId: User["id"] }; res: User }; + "following/requests/list": { req: NoParams; res: FollowRequest[] }; + "following/requests/reject": { req: { userId: User["id"] }; res: null }; + + // gallery + "gallery/featured": { req: TODO; res: TODO }; + "gallery/popular": { req: TODO; res: TODO }; + "gallery/posts": { req: TODO; res: TODO }; + "gallery/posts/create": { req: TODO; res: TODO }; + "gallery/posts/delete": { req: { postId: GalleryPost["id"] }; res: null }; + "gallery/posts/like": { req: TODO; res: TODO }; + "gallery/posts/show": { req: TODO; res: TODO }; + "gallery/posts/unlike": { req: TODO; res: TODO }; + "gallery/posts/update": { req: TODO; res: TODO }; + + // games + "games/reversi/games": { req: TODO; res: TODO }; + "games/reversi/games/show": { req: TODO; res: TODO }; + "games/reversi/games/surrender": { req: TODO; res: TODO }; + "games/reversi/invitations": { req: TODO; res: TODO }; + "games/reversi/match": { req: TODO; res: TODO }; + "games/reversi/match/cancel": { req: TODO; res: TODO }; + + // get-online-users-count + "get-online-users-count": { req: NoParams; res: { count: number } }; + + // hashtags + "hashtags/list": { req: TODO; res: TODO }; + "hashtags/search": { req: TODO; res: TODO }; + "hashtags/show": { req: TODO; res: TODO }; + "hashtags/trend": { req: TODO; res: TODO }; + "hashtags/users": { req: TODO; res: TODO }; + + // i + i: { req: NoParams; res: User }; + "i/apps": { req: TODO; res: TODO }; + "i/authorized-apps": { req: TODO; res: TODO }; + "i/change-password": { req: TODO; res: TODO }; + "i/delete-account": { req: { password: string }; res: null }; + "i/export-blocking": { req: TODO; res: TODO }; + "i/export-following": { req: TODO; res: TODO }; + "i/export-mute": { req: TODO; res: TODO }; + "i/export-notes": { req: TODO; res: TODO }; + "i/export-user-lists": { req: TODO; res: TODO }; + "i/favorites": { + req: { + limit?: number; + sinceId?: NoteFavorite["id"]; + untilId?: NoteFavorite["id"]; + }; + res: NoteFavorite[]; + }; + "i/gallery/likes": { req: TODO; res: TODO }; + "i/gallery/posts": { req: TODO; res: TODO }; + "i/get-word-muted-notes-count": { req: TODO; res: TODO }; + "i/import-following": { req: TODO; res: TODO }; + "i/import-user-lists": { req: TODO; res: TODO }; + "i/move": { req: TODO; res: TODO }; + "i/known-as": { req: TODO; res: TODO }; + "i/notifications": { + req: { + limit?: number; + sinceId?: Notification["id"]; + untilId?: Notification["id"]; + following?: boolean; + markAsRead?: boolean; + includeTypes?: Notification["type"][]; + excludeTypes?: Notification["type"][]; + }; + res: Notification[]; + }; + "i/page-likes": { req: TODO; res: TODO }; + "i/pages": { req: TODO; res: TODO }; + "i/pin": { req: { noteId: Note["id"] }; res: MeDetailed }; + "i/read-all-messaging-messages": { req: TODO; res: TODO }; + "i/read-all-unread-notes": { req: TODO; res: TODO }; + "i/read-announcement": { req: TODO; res: TODO }; + "i/regenerate-token": { req: { password: string }; res: null }; + "i/registry/get-all": { req: { scope?: string[] }; res: Record }; + "i/registry/get-detail": { + req: { key: string; scope?: string[] }; + res: { updatedAt: DateString; value: any }; + }; + "i/registry/get": { req: { key: string; scope?: string[] }; res: any }; + "i/registry/keys-with-type": { + req: { scope?: string[] }; + res: Record< + string, + "null" | "array" | "number" | "string" | "boolean" | "object" + >; + }; + "i/registry/keys": { req: { scope?: string[] }; res: string[] }; + "i/registry/remove": { req: { key: string; scope?: string[] }; res: null }; + "i/registry/scopes": { req: NoParams; res: string[][] }; + "i/registry/set": { + req: { key: string; value: any; scope?: string[] }; + res: null; + }; + "i/revoke-token": { req: TODO; res: TODO }; + "i/signin-history": { + req: { limit?: number; sinceId?: Signin["id"]; untilId?: Signin["id"] }; + res: Signin[]; + }; + "i/unpin": { req: { noteId: Note["id"] }; res: MeDetailed }; + "i/update-email": { + req: { + password: string; + email?: string | null; + }; + res: MeDetailed; + }; + "i/update": { + req: { + name?: string | null; + description?: string | null; + lang?: string | null; + location?: string | null; + birthday?: string | null; + avatarId?: DriveFile["id"] | null; + bannerId?: DriveFile["id"] | null; + fields?: { + name: string; + value: string; + }[]; + isLocked?: boolean; + isExplorable?: boolean; + hideOnlineStatus?: boolean; + carefulBot?: boolean; + autoAcceptFollowed?: boolean; + noCrawle?: boolean; + preventAiLearning?: boolean; + isBot?: boolean; + isCat?: boolean; + injectFeaturedNote?: boolean; + receiveAnnouncementEmail?: boolean; + alwaysMarkNsfw?: boolean; + mutedWords?: string[][]; + mutingNotificationTypes?: Notification["type"][]; + emailNotificationTypes?: string[]; + }; + res: MeDetailed; + }; + "i/user-group-invites": { req: TODO; res: TODO }; + "i/2fa/done": { req: TODO; res: TODO }; + "i/2fa/key-done": { req: TODO; res: TODO }; + "i/2fa/password-less": { req: TODO; res: TODO }; + "i/2fa/register-key": { req: TODO; res: TODO }; + "i/2fa/register": { req: TODO; res: TODO }; + "i/2fa/update-key": { req: TODO; res: TODO }; + "i/2fa/remove-key": { req: TODO; res: TODO }; + "i/2fa/unregister": { req: TODO; res: TODO }; + + // messaging + "messaging/history": { + req: { limit?: number; group?: boolean }; + res: MessagingMessage[]; + }; + "messaging/messages": { + req: { + userId?: User["id"]; + groupId?: UserGroup["id"]; + limit?: number; + sinceId?: MessagingMessage["id"]; + untilId?: MessagingMessage["id"]; + markAsRead?: boolean; + }; + res: MessagingMessage[]; + }; + "messaging/messages/create": { + req: { + userId?: User["id"]; + groupId?: UserGroup["id"]; + text?: string; + fileId?: DriveFile["id"]; + }; + res: MessagingMessage; + }; + "messaging/messages/delete": { + req: { messageId: MessagingMessage["id"] }; + res: null; + }; + "messaging/messages/read": { + req: { messageId: MessagingMessage["id"] }; + res: null; + }; + + // meta + meta: { + req: { detail?: boolean }; + res: { + $switch: { + $cases: [ + [{ detail: true }, DetailedInstanceMetadata], + [{ detail: false }, LiteInstanceMetadata], + [ + { detail: boolean }, + LiteInstanceMetadata | DetailedInstanceMetadata, + ], + ]; + $default: LiteInstanceMetadata; + }; + }; + }; + + // miauth + "miauth/gen-token": { req: TODO; res: TODO }; + + // mute + "mute/create": { req: TODO; res: TODO }; + "mute/delete": { req: { userId: User["id"] }; res: null }; + "mute/list": { req: TODO; res: TODO }; + "renote-mute/create": { req: TODO; res: TODO }; + "renote-mute/delete": { req: { userId: User["id"] }; res: null }; + "renote-mute/list": { req: TODO; res: TODO }; + + // my + "my/apps": { req: TODO; res: TODO }; + + // notes + notes: { + req: { limit?: number; sinceId?: Note["id"]; untilId?: Note["id"] }; + res: Note[]; + }; + "notes/children": { + req: { + noteId: Note["id"]; + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + }; + res: Note[]; + }; + "notes/clips": { req: TODO; res: TODO }; + "notes/conversation": { req: TODO; res: TODO }; + "notes/create": { + req: NoteSubmitReq; + res: { createdNote: Note }; + }; + "notes/delete": { req: { noteId: Note["id"] }; res: null }; + "notes/edit": { + req: NoteSubmitReq; + res: { createdNote: Note }; + }; + "notes/favorites/create": { req: { noteId: Note["id"] }; res: null }; + "notes/favorites/delete": { req: { noteId: Note["id"] }; res: null }; + "notes/featured": { req: TODO; res: Note[] }; + "notes/global-timeline": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/recommended-timeline": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/hybrid-timeline": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/local-timeline": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/mentions": { + req: { + following?: boolean; + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + }; + res: Note[]; + }; + "notes/polls/recommendation": { req: TODO; res: TODO }; + "notes/polls/vote": { + req: { noteId: Note["id"]; choice: number }; + res: null; + }; + "notes/reactions": { + req: { noteId: Note["id"]; type?: string | null; limit?: number }; + res: NoteReaction[]; + }; + "notes/reactions/create": { + req: { noteId: Note["id"]; reaction: string }; + res: null; + }; + "notes/reactions/delete": { req: { noteId: Note["id"] }; res: null }; + "notes/renotes": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + noteId: Note["id"]; + }; + res: Note[]; + }; + "notes/replies": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + noteId: Note["id"]; + }; + res: Note[]; + }; + "notes/search-by-tag": { req: TODO; res: TODO }; + "notes/search": { req: TODO; res: TODO }; + "notes/show": { req: { noteId: Note["id"] }; res: Note }; + "notes/state": { req: TODO; res: TODO }; + "notes/timeline": { + req: { + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/unrenote": { req: { noteId: Note["id"] }; res: null }; + "notes/user-list-timeline": { + req: { + listId: UserList["id"]; + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "notes/watching/create": { req: TODO; res: TODO }; + "notes/watching/delete": { req: { noteId: Note["id"] }; res: null }; + + // notifications + "notifications/create": { + req: { body: string; header?: string | null; icon?: string | null }; + res: null; + }; + "notifications/mark-all-as-read": { req: NoParams; res: null }; + "notifications/read": { + req: { notificationId: Notification["id"] }; + res: null; + }; + + // page-push + "page-push": { + req: { pageId: Page["id"]; event: string; var?: any }; + res: null; + }; + + // pages + "pages/create": { req: TODO; res: Page }; + "pages/delete": { req: { pageId: Page["id"] }; res: null }; + "pages/featured": { req: NoParams; res: Page[] }; + "pages/like": { req: { pageId: Page["id"] }; res: null }; + "pages/show": { + req: { pageId?: Page["id"]; name?: string; username?: string }; + res: Page; + }; + "pages/unlike": { req: { pageId: Page["id"] }; res: null }; + "pages/update": { req: TODO; res: null }; + + // ping + ping: { req: NoParams; res: { pong: number } }; + + // pinned-users + "pinned-users": { req: TODO; res: TODO }; + + // promo + "promo/read": { req: TODO; res: TODO }; + + // request-reset-password + "request-reset-password": { + req: { username: string; email: string }; + res: null; + }; + + // reset-password + "reset-password": { req: { token: string; password: string }; res: null }; + + // room + "room/show": { req: TODO; res: TODO }; + "room/update": { req: TODO; res: TODO }; + + // stats + stats: { req: NoParams; res: Stats }; + + // server-info + "server-info": { req: NoParams; res: ServerInfo }; + + // ck specific + "latest-version": { req: NoParams; res: TODO }; + + // sw + "sw/register": { req: TODO; res: TODO }; + + // username + "username/available": { + req: { username: string }; + res: { available: boolean }; + }; + + // users + users: { + req: { + limit?: number; + offset?: number; + sort?: UserSorting; + origin?: OriginType; + }; + res: User[]; + }; + "users/clips": { req: TODO; res: TODO }; + "users/followers": { + req: { + userId?: User["id"]; + username?: User["username"]; + host?: User["host"] | null; + limit?: number; + sinceId?: Following["id"]; + untilId?: Following["id"]; + }; + res: FollowingFollowerPopulated[]; + }; + "users/following": { + req: { + userId?: User["id"]; + username?: User["username"]; + host?: User["host"] | null; + limit?: number; + sinceId?: Following["id"]; + untilId?: Following["id"]; + }; + res: FollowingFolloweePopulated[]; + }; + "users/gallery/posts": { req: TODO; res: TODO }; + "users/get-frequently-replied-users": { req: TODO; res: TODO }; + "users/groups/create": { req: TODO; res: TODO }; + "users/groups/delete": { req: { groupId: UserGroup["id"] }; res: null }; + "users/groups/invitations/accept": { req: TODO; res: TODO }; + "users/groups/invitations/reject": { req: TODO; res: TODO }; + "users/groups/invite": { req: TODO; res: TODO }; + "users/groups/joined": { req: TODO; res: TODO }; + "users/groups/owned": { req: TODO; res: TODO }; + "users/groups/pull": { req: TODO; res: TODO }; + "users/groups/show": { req: TODO; res: TODO }; + "users/groups/transfer": { req: TODO; res: TODO }; + "users/groups/update": { req: TODO; res: TODO }; + "users/lists/create": { req: { name: string }; res: UserList }; + "users/lists/delete": { req: { listId: UserList["id"] }; res: null }; + "users/lists/list": { req: NoParams; res: UserList[] }; + "users/lists/pull": { + req: { listId: UserList["id"]; userId: User["id"] }; + res: null; + }; + "users/lists/push": { + req: { listId: UserList["id"]; userId: User["id"] }; + res: null; + }; + "users/lists/show": { req: { listId: UserList["id"] }; res: UserList }; + "users/lists/update": { + req: { listId: UserList["id"]; name: string }; + res: UserList; + }; + "users/notes": { + req: { + userId: User["id"]; + limit?: number; + sinceId?: Note["id"]; + untilId?: Note["id"]; + sinceDate?: number; + untilDate?: number; + }; + res: Note[]; + }; + "users/pages": { req: TODO; res: TODO }; + "users/recommendation": { req: TODO; res: TODO }; + "users/relation": { req: TODO; res: TODO }; + "users/report-abuse": { req: TODO; res: TODO }; + "users/search-by-username-and-host": { req: TODO; res: TODO }; + "users/search": { req: TODO; res: TODO }; + "users/show": { + req: ShowUserReq | { userIds: User["id"][] }; + res: { + $switch: { + $cases: [[{ userIds: User["id"][] }, UserDetailed[]]]; + $default: UserDetailed; + }; + }; + }; + "users/stats": { req: TODO; res: TODO }; +}; diff --git a/fe_calckey/frontend/calckey-js/src/consts.ts b/fe_calckey/frontend/calckey-js/src/consts.ts new file mode 100644 index 0000000..be33c0d --- /dev/null +++ b/fe_calckey/frontend/calckey-js/src/consts.ts @@ -0,0 +1,60 @@ +export const notificationTypes = [ + "follow", + "mention", + "reply", + "renote", + "quote", + "reaction", + "pollVote", + "pollEnded", + "receiveFollowRequest", + "followRequestAccepted", + "groupInvited", + "app", +] as const; + +export const noteVisibilities = [ + "public", + "home", + "followers", + "specified", +] as const; + +export const mutedNoteReasons = ["word", "manual", "spam", "other"] as const; + +export const ffVisibility = ["public", "followers", "private"] as const; + +export const permissions = [ + "read:account", + "write:account", + "read:blocks", + "write:blocks", + "read:drive", + "write:drive", + "read:favorites", + "write:favorites", + "read:following", + "write:following", + "read:messaging", + "write:messaging", + "read:mutes", + "write:mutes", + "write:notes", + "read:notifications", + "write:notifications", + "read:reactions", + "write:reactions", + "write:votes", + "read:pages", + "write:pages", + "write:page-likes", + "read:page-likes", + "read:user-groups", + "write:user-groups", + "read:channels", + "write:channels", + "read:gallery", + "write:gallery", + "read:gallery-likes", + "write:gallery-likes", +]; diff --git a/fe_calckey/frontend/calckey-js/src/entities.ts b/fe_calckey/frontend/calckey-js/src/entities.ts new file mode 100644 index 0000000..5a581a5 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/src/entities.ts @@ -0,0 +1,494 @@ +export type ID = string; +export type DateString = string; + +type TODO = Record; + +// NOTE: 極力この型を使うのは避け、UserLite か UserDetailed か明示するように +export type User = UserLite | UserDetailed; + +export type UserLite = { + id: ID; + username: string; + host: string | null; + name: string; + onlineStatus: "online" | "active" | "offline" | "unknown"; + avatarUrl: string; + avatarBlurhash: string; + alsoKnownAs: string[]; + movedToUri: any; + emojis: { + name: string; + url: string; + }[]; + instance?: { + name: Instance["name"]; + softwareName: Instance["softwareName"]; + softwareVersion: Instance["softwareVersion"]; + iconUrl: Instance["iconUrl"]; + faviconUrl: Instance["faviconUrl"]; + themeColor: Instance["themeColor"]; + }; +}; + +export type UserDetailed = UserLite & { + bannerBlurhash: string | null; + bannerColor: string | null; + bannerUrl: string | null; + birthday: string | null; + createdAt: DateString; + description: string | null; + ffVisibility: "public" | "followers" | "private"; + fields: { name: string; value: string }[]; + followersCount: number; + followingCount: number; + hasPendingFollowRequestFromYou: boolean; + hasPendingFollowRequestToYou: boolean; + isAdmin: boolean; + isBlocked: boolean; + isBlocking: boolean; + isBot: boolean; + isCat: boolean; + isFollowed: boolean; + isFollowing: boolean; + isLocked: boolean; + isModerator: boolean; + isMuted: boolean; + isRenoteMuted: boolean; + isSilenced: boolean; + isSuspended: boolean; + lang: string | null; + lastFetchedAt?: DateString; + location: string | null; + notesCount: number; + pinnedNoteIds: ID[]; + pinnedNotes: Note[]; + pinnedPage: Page | null; + pinnedPageId: string | null; + publicReactions: boolean; + securityKeys: boolean; + twoFactorEnabled: boolean; + updatedAt: DateString | null; + uri: string | null; + url: string | null; +}; + +export type UserGroup = TODO; + +export type UserList = { + id: ID; + createdAt: DateString; + name: string; + userIds: User["id"][]; +}; + +export type MeDetailed = UserDetailed & { + avatarId: DriveFile["id"]; + bannerId: DriveFile["id"]; + autoAcceptFollowed: boolean; + alwaysMarkNsfw: boolean; + carefulBot: boolean; + emailNotificationTypes: string[]; + hasPendingReceivedFollowRequest: boolean; + hasUnreadAnnouncement: boolean; + hasUnreadAntenna: boolean; + hasUnreadChannel: boolean; + hasUnreadMentions: boolean; + hasUnreadMessagingMessage: boolean; + hasUnreadNotification: boolean; + hasUnreadSpecifiedNotes: boolean; + hideOnlineStatus: boolean; + injectFeaturedNote: boolean; + integrations: Record; + isDeleted: boolean; + isExplorable: boolean; + mutedWords: string[][]; + mutingNotificationTypes: string[]; + noCrawle: boolean; + preventAiLearning: boolean; + receiveAnnouncementEmail: boolean; + usePasswordLessLogin: boolean; + [other: string]: any; +}; + +export type DriveFile = { + id: ID; + createdAt: DateString; + isSensitive: boolean; + name: string; + thumbnailUrl: string; + url: string; + type: string; + size: number; + md5: string; + blurhash: string; + comment: string | null; + properties: Record; +}; + +export type DriveFolder = TODO; + +export type GalleryPost = TODO; + +export type Note = { + id: ID; + createdAt: DateString; + text: string | null; + cw: string | null; + user: User; + userId: User["id"]; + reply?: Note; + replyId: Note["id"]; + renote?: Note; + renoteId: Note["id"]; + files: DriveFile[]; + fileIds: DriveFile["id"][]; + visibility: "public" | "home" | "followers" | "specified"; + visibleUserIds?: User["id"][]; + localOnly?: boolean; + channel?: Channel["id"]; + myReaction?: string; + reactions: Record; + renoteCount: number; + repliesCount: number; + poll?: { + expiresAt: DateString | null; + multiple: boolean; + choices: { + isVoted: boolean; + text: string; + votes: number; + }[]; + }; + emojis: { + name: string; + url: string; + }[]; + uri?: string; + url?: string; + updatedAt?: DateString; + isHidden?: boolean; +}; + +export type NoteReaction = { + id: ID; + createdAt: DateString; + user: UserLite; + type: string; +}; + +export type Notification = { + id: ID; + createdAt: DateString; + isRead: boolean; +} & ( + | { + type: "reaction"; + reaction: string; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "reply"; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "renote"; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "quote"; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "mention"; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "pollVote"; + user: User; + userId: User["id"]; + note: Note; + } + | { + type: "follow"; + user: User; + userId: User["id"]; + } + | { + type: "followRequestAccepted"; + user: User; + userId: User["id"]; + } + | { + type: "receiveFollowRequest"; + user: User; + userId: User["id"]; + } + | { + type: "groupInvited"; + invitation: UserGroup; + user: User; + userId: User["id"]; + } + | { + type: "app"; + header?: string | null; + body: string; + icon?: string | null; + } +); + +export type MessagingMessage = { + id: ID; + createdAt: DateString; + file: DriveFile | null; + fileId: DriveFile["id"] | null; + isRead: boolean; + reads: User["id"][]; + text: string | null; + user: User; + userId: User["id"]; + recipient?: User | null; + recipientId: User["id"] | null; + group?: UserGroup | null; + groupId: UserGroup["id"] | null; +}; + +export type CustomEmoji = { + id: string; + name: string; + url: string; + category: string; + aliases: string[]; +}; + +export type LiteInstanceMetadata = { + maintainerName: string | null; + maintainerEmail: string | null; + version: string; + name: string | null; + uri: string; + description: string | null; + tosUrl: string | null; + disableRegistration: boolean; + disableLocalTimeline: boolean; + disableRecommendedTimeline: boolean; + disableGlobalTimeline: boolean; + driveCapacityPerLocalUserMb: number; + driveCapacityPerRemoteUserMb: number; + enableHcaptcha: boolean; + hcaptchaSiteKey: string | null; + enableRecaptcha: boolean; + recaptchaSiteKey: string | null; + swPublickey: string | null; + maxNoteTextLength: number; + enableEmail: boolean; + enableTwitterIntegration: boolean; + enableGithubIntegration: boolean; + enableDiscordIntegration: boolean; + enableServiceWorker: boolean; + emojis: CustomEmoji[]; + ads: { + id: ID; + ratio: number; + place: string; + url: string; + imageUrl: string; + }[]; +}; + +export type DetailedInstanceMetadata = LiteInstanceMetadata & { + features: Record; +}; + +export type InstanceMetadata = LiteInstanceMetadata | DetailedInstanceMetadata; + +export type ServerInfo = { + machine: string; + cpu: { + model: string; + cores: number; + }; + mem: { + total: number; + }; + fs: { + total: number; + used: number; + }; +}; + +export type Stats = { + notesCount: number; + originalNotesCount: number; + usersCount: number; + originalUsersCount: number; + instances: number; + driveUsageLocal: number; + driveUsageRemote: number; +}; + +export type Page = { + id: ID; + createdAt: DateString; + updatedAt: DateString; + userId: User["id"]; + user: User; + content: Record[]; + variables: Record[]; + title: string; + name: string; + summary: string | null; + hideTitleWhenPinned: boolean; + alignCenter: boolean; + font: string; + script: string; + eyeCatchingImageId: DriveFile["id"] | null; + eyeCatchingImage: DriveFile | null; + attachedFiles: any; + likedCount: number; + isLiked?: boolean; +}; + +export type PageEvent = { + pageId: Page["id"]; + event: string; + var: any; + userId: User["id"]; + user: User; +}; + +export type Announcement = { + id: ID; + createdAt: DateString; + updatedAt: DateString | null; + text: string; + title: string; + imageUrl: string | null; + isRead?: boolean; +}; + +export type Antenna = { + id: ID; + createdAt: DateString; + name: string; + keywords: string[][]; // TODO + excludeKeywords: string[][]; // TODO + src: "home" | "all" | "users" | "list" | "group" | "instances"; + userListId: ID | null; // TODO + userGroupId: ID | null; // TODO + users: string[]; // TODO + instances: string[]; + caseSensitive: boolean; + notify: boolean; + withReplies: boolean; + withFile: boolean; + hasUnreadNote: boolean; +}; + +export type App = TODO; + +export type AuthSession = { + id: ID; + app: App; + token: string; +}; + +export type Ad = TODO; + +export type Clip = TODO; + +export type NoteFavorite = { + id: ID; + createdAt: DateString; + noteId: Note["id"]; + note: Note; +}; + +export type FollowRequest = { + id: ID; + follower: User; + followee: User; +}; + +export type Channel = { + id: ID; + // TODO +}; + +export type Following = { + id: ID; + createdAt: DateString; + followerId: User["id"]; + followeeId: User["id"]; +}; + +export type FollowingFolloweePopulated = Following & { + followee: UserDetailed; +}; + +export type FollowingFollowerPopulated = Following & { + follower: UserDetailed; +}; + +export type Blocking = { + id: ID; + createdAt: DateString; + blockeeId: User["id"]; + blockee: UserDetailed; +}; + +export type Instance = { + id: ID; + caughtAt: DateString; + host: string; + usersCount: number; + notesCount: number; + followingCount: number; + followersCount: number; + driveUsage: number; + driveFiles: number; + latestRequestSentAt: DateString | null; + latestStatus: number | null; + latestRequestReceivedAt: DateString | null; + lastCommunicatedAt: DateString; + isNotResponding: boolean; + isSuspended: boolean; + softwareName: string | null; + softwareVersion: string | null; + openRegistrations: boolean | null; + name: string | null; + description: string | null; + maintainerName: string | null; + maintainerEmail: string | null; + iconUrl: string | null; + faviconUrl: string | null; + themeColor: string | null; + infoUpdatedAt: DateString | null; +}; + +export type Signin = { + id: ID; + createdAt: DateString; + ip: string; + headers: Record; + success: boolean; +}; + +export type UserSorting = + | "+follower" + | "-follower" + | "+createdAt" + | "-createdAt" + | "+updatedAt" + | "-updatedAt"; +export type OriginType = "combined" | "local" | "remote"; diff --git a/fe_calckey/frontend/calckey-js/src/index.ts b/fe_calckey/frontend/calckey-js/src/index.ts new file mode 100644 index 0000000..128ed8c --- /dev/null +++ b/fe_calckey/frontend/calckey-js/src/index.ts @@ -0,0 +1,20 @@ +import { Endpoints } from "./api.types"; +import Stream, { Connection } from "./streaming"; +import { Channels } from "./streaming.types"; +import { Acct } from "./acct"; +import * as consts from "./consts"; + +export { Endpoints, Stream, Connection as ChannelConnection, Channels, Acct }; + +export const permissions = consts.permissions; +export const notificationTypes = consts.notificationTypes; +export const noteVisibilities = consts.noteVisibilities; +export const mutedNoteReasons = consts.mutedNoteReasons; +export const ffVisibility = consts.ffVisibility; + +// api extractor not supported yet +//export * as api from './api'; +//export * as entities from './entities'; +import * as api from "./api"; +import * as entities from "./entities"; +export { api, entities }; diff --git a/fe_calckey/frontend/calckey-js/src/streaming.ts b/fe_calckey/frontend/calckey-js/src/streaming.ts new file mode 100644 index 0000000..924e33a --- /dev/null +++ b/fe_calckey/frontend/calckey-js/src/streaming.ts @@ -0,0 +1,391 @@ +import { EventEmitter } from "eventemitter3"; +import ReconnectingWebsocket from "reconnecting-websocket"; +import { BroadcastEvents, Channels } from "./streaming.types"; + +function autobind(instance: any): void { + const prototype = Object.getPrototypeOf(instance); + + const propertyNames = Object.getOwnPropertyNames(prototype); + + for (const key of propertyNames) { + const descriptor = Object.getOwnPropertyDescriptor(prototype, key); + + if (typeof descriptor?.value === "function" && key !== "constructor") { + Object.defineProperty(instance, key, { + value: instance[key].bind(instance), + enumerable: descriptor.enumerable, + configurable: descriptor.configurable, + writable: descriptor.writable, + }); + } + } +} + +export function urlQuery( + obj: Record, +): string { + const params = Object.entries(obj) + .filter(([, v]) => (Array.isArray(v) ? v.length : v !== undefined)) + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + .reduce( + (a, [k, v]) => ((a[k] = v!), a), + {} as Record, + ); + + return Object.entries(params) + .map((e) => `${e[0]}=${encodeURIComponent(e[1])}`) + .join("&"); +} + +type AnyOf> = T[keyof T]; + +type StreamEvents = { + _connected_: void; + _disconnected_: void; +} & BroadcastEvents; + +/** + * Misskey stream connection + */ +export default class Stream extends EventEmitter { + private stream: ReconnectingWebsocket; + public state: "initializing" | "reconnecting" | "connected" = "initializing"; + private sharedConnectionPools: Pool[] = []; + private sharedConnections: SharedConnection[] = []; + private nonSharedConnections: NonSharedConnection[] = []; + private idCounter = 0; + + constructor( + origin: string, + user: { token: string } | null, + options?: { + WebSocket?: any; + }, + ) { + super(); + autobind(this); + options = options || {}; + + const query = urlQuery({ + i: user?.token, + + // To prevent cache of an HTML such as error screen + _t: Date.now(), + }); + + const wsOrigin = origin + .replace("http://", "ws://") + .replace("https://", "wss://"); + + this.stream = new ReconnectingWebsocket( + `${wsOrigin}/streaming?${query}`, + "", + { + minReconnectionDelay: 1, // https://github.com/pladaria/reconnecting-websocket/issues/91 + WebSocket: options.WebSocket, + }, + ); + this.stream.addEventListener("open", this.onOpen); + this.stream.addEventListener("close", this.onClose); + this.stream.addEventListener("message", this.onMessage); + } + + private genId(): string { + return (++this.idCounter).toString(); + } + + public useChannel( + channel: C, + params?: Channels[C]["params"], + name?: string, + ): Connection { + if (params) { + return this.connectToChannel(channel, params); + } else { + return this.useSharedConnection(channel, name); + } + } + + private useSharedConnection( + channel: C, + name?: string, + ): SharedConnection { + let pool = this.sharedConnectionPools.find((p) => p.channel === channel); + + if (pool == null) { + pool = new Pool(this, channel, this.genId()); + this.sharedConnectionPools.push(pool); + } + + const connection = new SharedConnection(this, channel, pool, name); + this.sharedConnections.push(connection); + return connection; + } + + public removeSharedConnection(connection: SharedConnection): void { + this.sharedConnections = this.sharedConnections.filter( + (c) => c !== connection, + ); + } + + public removeSharedConnectionPool(pool: Pool): void { + this.sharedConnectionPools = this.sharedConnectionPools.filter( + (p) => p !== pool, + ); + } + + private connectToChannel( + channel: C, + params: Channels[C]["params"], + ): NonSharedConnection { + const connection = new NonSharedConnection( + this, + channel, + this.genId(), + params, + ); + this.nonSharedConnections.push(connection); + return connection; + } + + public disconnectToChannel(connection: NonSharedConnection): void { + this.nonSharedConnections = this.nonSharedConnections.filter( + (c) => c !== connection, + ); + } + + /** + * Callback of when open connection + */ + private onOpen(): void { + const isReconnect = this.state === "reconnecting"; + + this.state = "connected"; + this.emit("_connected_"); + + // チャンネル再接続 + if (isReconnect) { + for (const p of this.sharedConnectionPools) p.connect(); + for (const c of this.nonSharedConnections) c.connect(); + } + } + + /** + * Callback of when close connection + */ + private onClose(): void { + if (this.state === "connected") { + this.state = "reconnecting"; + this.emit("_disconnected_"); + } + } + + /** + * Callback of when received a message from connection + */ + private onMessage(message: { data: string }): void { + const { type, body } = JSON.parse(message.data); + + if (type === "channel") { + const id = body.id; + + let connections: Connection[]; + + connections = this.sharedConnections.filter((c) => c.id === id); + + if (connections.length === 0) { + const found = this.nonSharedConnections.find((c) => c.id === id); + if (found) { + connections = [found]; + } + } + + for (const c of connections) { + c.emit(body.type, body.body); + c.inCount++; + } + } else { + this.emit(type, body); + } + } + + /** + * Send a message to connection + */ + public send(typeOrPayload: any, payload?: any): void { + const data = + payload === undefined + ? typeOrPayload + : { + type: typeOrPayload, + body: payload, + }; + + this.stream.send(JSON.stringify(data)); + } + + /** + * Close this connection + */ + public close(): void { + this.stream.close(); + } +} + +// TODO: これらのクラスを Stream クラスの内部クラスにすれば余計なメンバをpublicにしないで済むかも? +// もしくは @internal を使う? https://www.typescriptlang.org/tsconfig#stripInternal +class Pool { + public channel: string; + public id: string; + protected stream: Stream; + public users = 0; + private disposeTimerId: any; + private isConnected = false; + + constructor(stream: Stream, channel: string, id: string) { + this.channel = channel; + this.stream = stream; + this.id = id; + + this.stream.on("_disconnected_", this.onStreamDisconnected); + } + + private onStreamDisconnected(): void { + this.isConnected = false; + } + + public inc(): void { + if (this.users === 0 && !this.isConnected) { + this.connect(); + } + + this.users++; + + // タイマー解除 + if (this.disposeTimerId) { + clearTimeout(this.disposeTimerId); + this.disposeTimerId = null; + } + } + + public dec(): void { + this.users--; + + // そのコネクションの利用者が誰もいなくなったら + if (this.users === 0) { + // また直ぐに再利用される可能性があるので、一定時間待ち、 + // 新たな利用者が現れなければコネクションを切断する + this.disposeTimerId = setTimeout(() => { + this.disconnect(); + }, 3000); + } + } + + public connect(): void { + if (this.isConnected) return; + this.isConnected = true; + this.stream.send("connect", { + channel: this.channel, + id: this.id, + }); + } + + private disconnect(): void { + this.stream.off("_disconnected_", this.onStreamDisconnected); + this.stream.send("disconnect", { id: this.id }); + this.stream.removeSharedConnectionPool(this); + } +} + +export abstract class Connection< + Channel extends AnyOf = any, +> extends EventEmitter { + public channel: string; + protected stream: Stream; + public abstract id: string; + + public name?: string; // for debug + public inCount = 0; // for debug + public outCount = 0; // for debug + + constructor(stream: Stream, channel: string, name?: string) { + super(); + + this.stream = stream; + this.channel = channel; + this.name = name; + } + + public send( + type: T, + body: Channel["receives"][T], + ): void { + this.stream.send("ch", { + id: this.id, + type: type, + body: body, + }); + + this.outCount++; + } + + public abstract dispose(): void; +} + +class SharedConnection< + Channel extends AnyOf = any, +> extends Connection { + private pool: Pool; + + public get id(): string { + return this.pool.id; + } + + constructor(stream: Stream, channel: string, pool: Pool, name?: string) { + super(stream, channel, name); + + this.pool = pool; + this.pool.inc(); + } + + public dispose(): void { + this.pool.dec(); + this.removeAllListeners(); + this.stream.removeSharedConnection(this); + } +} + +class NonSharedConnection< + Channel extends AnyOf = any, +> extends Connection { + public id: string; + protected params: Channel["params"]; + + constructor( + stream: Stream, + channel: string, + id: string, + params: Channel["params"], + ) { + super(stream, channel); + + this.params = params; + this.id = id; + + this.connect(); + } + + public connect(): void { + this.stream.send("connect", { + channel: this.channel, + id: this.id, + params: this.params, + }); + } + + public dispose(): void { + this.removeAllListeners(); + this.stream.send("disconnect", { id: this.id }); + this.stream.disconnectToChannel(this); + } +} diff --git a/fe_calckey/frontend/calckey-js/src/streaming.types.ts b/fe_calckey/frontend/calckey-js/src/streaming.types.ts new file mode 100644 index 0000000..c0b0b03 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/src/streaming.types.ts @@ -0,0 +1,197 @@ +import type { + Antenna, + CustomEmoji, + DriveFile, + MeDetailed, + MessagingMessage, + Note, + Notification, + PageEvent, + User, + UserGroup, +} from "./entities"; + +type FIXME = any; + +export type Channels = { + main: { + params: null; + events: { + notification: (payload: Notification) => void; + mention: (payload: Note) => void; + reply: (payload: Note) => void; + renote: (payload: Note) => void; + follow: (payload: User) => void; // 自分が他人をフォローしたとき + followed: (payload: User) => void; // 他人が自分をフォローしたとき + unfollow: (payload: User) => void; // 自分が他人をフォロー解除したとき + meUpdated: (payload: MeDetailed) => void; + pageEvent: (payload: PageEvent) => void; + urlUploadFinished: (payload: { marker: string; file: DriveFile }) => void; + readAllNotifications: () => void; + unreadNotification: (payload: Notification) => void; + unreadMention: (payload: Note["id"]) => void; + readAllUnreadMentions: () => void; + unreadSpecifiedNote: (payload: Note["id"]) => void; + readAllUnreadSpecifiedNotes: () => void; + readAllMessagingMessages: () => void; + messagingMessage: (payload: MessagingMessage) => void; + unreadMessagingMessage: (payload: MessagingMessage) => void; + readAllAntennas: () => void; + unreadAntenna: (payload: Antenna) => void; + readAllAnnouncements: () => void; + readAllChannels: () => void; + unreadChannel: (payload: Note["id"]) => void; + myTokenRegenerated: () => void; + reversiNoInvites: () => void; + reversiInvited: (payload: FIXME) => void; + signin: (payload: FIXME) => void; + registryUpdated: (payload: { + scope?: string[]; + key: string; + value: any | null; + }) => void; + driveFileCreated: (payload: DriveFile) => void; + readAntenna: (payload: Antenna) => void; + }; + receives: null; + }; + homeTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + localTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + hybridTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + recommendedTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + globalTimeline: { + params: null; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + antenna: { + params: { + antennaId: Antenna["id"]; + }; + events: { + note: (payload: Note) => void; + }; + receives: null; + }; + messaging: { + params: { + otherparty?: User["id"] | null; + group?: UserGroup["id"] | null; + }; + events: { + message: (payload: MessagingMessage) => void; + deleted: (payload: MessagingMessage["id"]) => void; + read: (payload: MessagingMessage["id"][]) => void; + typers: (payload: User[]) => void; + }; + receives: { + read: { + id: MessagingMessage["id"]; + }; + }; + }; + serverStats: { + params: null; + events: { + stats: (payload: FIXME) => void; + }; + receives: { + requestLog: { + id: string | number; + length: number; + }; + }; + }; + queueStats: { + params: null; + events: { + stats: (payload: FIXME) => void; + }; + receives: { + requestLog: { + id: string | number; + length: number; + }; + }; + }; +}; + +export type NoteUpdatedEvent = + | { + id: Note["id"]; + type: "reacted"; + body: { + reaction: string; + userId: User["id"]; + }; + } + | { + id: Note["id"]; + type: "unreacted"; + body: { + reaction: string; + userId: User["id"]; + }; + } + | { + id: Note["id"]; + type: "deleted"; + body: { + deletedAt: string; + }; + } + | { + id: Note["id"]; + type: "pollVoted"; + body: { + choice: number; + userId: User["id"]; + }; + } + | { + id: Note["id"]; + type: "replied"; + body: { + id: Note["id"]; + }; + } + | { + id: Note["id"]; + type: "updated"; + body: { + updatedAt: string; + }; + }; + +export type BroadcastEvents = { + noteUpdated: (payload: NoteUpdatedEvent) => void; + emojiAdded: (payload: { + emoji: CustomEmoji; + }) => void; +}; diff --git a/fe_calckey/frontend/calckey-js/test/api.ts b/fe_calckey/frontend/calckey-js/test/api.ts new file mode 100644 index 0000000..5de41e1 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/test/api.ts @@ -0,0 +1,222 @@ +import { APIClient, isAPIError } from "../src/api"; +import { enableFetchMocks } from "jest-fetch-mock"; + +enableFetchMocks(); + +function getFetchCall(call: any[]) { + const { body, method } = call[1]; + if (body != null && typeof body !== "string") { + throw new Error("invalid body"); + } + return { + url: call[0], + method: method, + body: JSON.parse(body as any), + }; +} + +describe("API", () => { + test("success", async () => { + fetchMock.resetMocks(); + fetchMock.mockResponse(async (req) => { + const body = await req.json(); + if (req.method === "POST" && req.url === "https://calckey.test/api/i") { + if (body.i === "TOKEN") { + return JSON.stringify({ id: "foo" }); + } else { + return { status: 400 }; + } + } else { + return { status: 404 }; + } + }); + + const cli = new APIClient({ + origin: "https://calckey.test", + credential: "TOKEN", + }); + + const res = await cli.request("i"); + + expect(res).toEqual({ + id: "foo", + }); + + expect(getFetchCall(fetchMock.mock.calls[0])).toEqual({ + url: "https://calckey.test/api/i", + method: "POST", + body: { i: "TOKEN" }, + }); + }); + + test("with params", async () => { + fetchMock.resetMocks(); + fetchMock.mockResponse(async (req) => { + const body = await req.json(); + if ( + req.method === "POST" && + req.url === "https://calckey.test/api/notes/show" + ) { + if (body.i === "TOKEN" && body.noteId === "aaaaa") { + return JSON.stringify({ id: "foo" }); + } else { + return { status: 400 }; + } + } else { + return { status: 404 }; + } + }); + + const cli = new APIClient({ + origin: "https://calckey.test", + credential: "TOKEN", + }); + + const res = await cli.request("notes/show", { noteId: "aaaaa" }); + + expect(res).toEqual({ + id: "foo", + }); + + expect(getFetchCall(fetchMock.mock.calls[0])).toEqual({ + url: "https://calckey.test/api/notes/show", + method: "POST", + body: { i: "TOKEN", noteId: "aaaaa" }, + }); + }); + + test("204 No Content で null が返る", async () => { + fetchMock.resetMocks(); + fetchMock.mockResponse(async (req) => { + if ( + req.method === "POST" && + req.url === "https://calckey.test/api/reset-password" + ) { + return { status: 204 }; + } else { + return { status: 404 }; + } + }); + + const cli = new APIClient({ + origin: "https://calckey.test", + credential: "TOKEN", + }); + + const res = await cli.request("reset-password", { + token: "aaa", + password: "aaa", + }); + + expect(res).toEqual(null); + + expect(getFetchCall(fetchMock.mock.calls[0])).toEqual({ + url: "https://calckey.test/api/reset-password", + method: "POST", + body: { i: "TOKEN", token: "aaa", password: "aaa" }, + }); + }); + + test("インスタンスの credential が指定されていても引数で credential が null ならば null としてリクエストされる", async () => { + fetchMock.resetMocks(); + fetchMock.mockResponse(async (req) => { + const body = await req.json(); + if (req.method === "POST" && req.url === "https://calckey.test/api/i") { + if (typeof body.i === "string") { + return JSON.stringify({ id: "foo" }); + } else { + return { + status: 401, + body: JSON.stringify({ + error: { + message: "Credential required.", + code: "CREDENTIAL_REQUIRED", + id: "1384574d-a912-4b81-8601-c7b1c4085df1", + }, + }), + }; + } + } else { + return { status: 404 }; + } + }); + + try { + const cli = new APIClient({ + origin: "https://calckey.test", + credential: "TOKEN", + }); + + await cli.request("i", {}, null); + } catch (e) { + expect(isAPIError(e)).toEqual(true); + } + }); + + test("api error", async () => { + fetchMock.resetMocks(); + fetchMock.mockResponse(async (req) => { + return { + status: 500, + body: JSON.stringify({ + error: { + message: + "Internal error occurred. Please contact us if the error persists.", + code: "INTERNAL_ERROR", + id: "5d37dbcb-891e-41ca-a3d6-e690c97775ac", + kind: "server", + }, + }), + }; + }); + + try { + const cli = new APIClient({ + origin: "https://calckey.test", + credential: "TOKEN", + }); + + await cli.request("i"); + } catch (e: any) { + expect(isAPIError(e)).toEqual(true); + expect(e.id).toEqual("5d37dbcb-891e-41ca-a3d6-e690c97775ac"); + } + }); + + test("network error", async () => { + fetchMock.resetMocks(); + fetchMock.mockAbort(); + + try { + const cli = new APIClient({ + origin: "https://calckey.test", + credential: "TOKEN", + }); + + await cli.request("i"); + } catch (e) { + expect(isAPIError(e)).toEqual(false); + } + }); + + test("json parse error", async () => { + fetchMock.resetMocks(); + fetchMock.mockResponse(async (req) => { + return { + status: 500, + body: "I AM NOT JSON", + }; + }); + + try { + const cli = new APIClient({ + origin: "https://calckey.test", + credential: "TOKEN", + }); + + await cli.request("i"); + } catch (e) { + expect(isAPIError(e)).toEqual(false); + } + }); +}); diff --git a/fe_calckey/frontend/calckey-js/test/streaming.ts b/fe_calckey/frontend/calckey-js/test/streaming.ts new file mode 100644 index 0000000..1a3a713 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/test/streaming.ts @@ -0,0 +1,181 @@ +import WS from "jest-websocket-mock"; +import Stream from "../src/streaming"; + +describe("Streaming", () => { + test("useChannel", async () => { + const server = new WS("wss://calckey.test/streaming"); + const stream = new Stream("https://calckey.test", { token: "TOKEN" }); + const mainChannelReceived: any[] = []; + const main = stream.useChannel("main"); + main.on("meUpdated", (payload) => { + mainChannelReceived.push(payload); + }); + + const ws = await server.connected; + expect(new URLSearchParams(new URL(ws.url).search).get("i")).toEqual( + "TOKEN", + ); + + const msg = JSON.parse((await server.nextMessage) as string); + const mainChannelId = msg.body.id; + expect(msg.type).toEqual("connect"); + expect(msg.body.channel).toEqual("main"); + expect(mainChannelId != null).toEqual(true); + + server.send( + JSON.stringify({ + type: "channel", + body: { + id: mainChannelId, + type: "meUpdated", + body: { + id: "foo", + }, + }, + }), + ); + + expect(mainChannelReceived[0]).toEqual({ + id: "foo", + }); + + stream.close(); + server.close(); + }); + + test("useChannel with parameters", async () => { + const server = new WS("wss://calckey.test/streaming"); + const stream = new Stream("https://calckey.test", { token: "TOKEN" }); + const messagingChannelReceived: any[] = []; + const messaging = stream.useChannel("messaging", { otherparty: "aaa" }); + messaging.on("message", (payload) => { + messagingChannelReceived.push(payload); + }); + + const ws = await server.connected; + expect(new URLSearchParams(new URL(ws.url).search).get("i")).toEqual( + "TOKEN", + ); + + const msg = JSON.parse((await server.nextMessage) as string); + const messagingChannelId = msg.body.id; + expect(msg.type).toEqual("connect"); + expect(msg.body.channel).toEqual("messaging"); + expect(msg.body.params).toEqual({ otherparty: "aaa" }); + expect(messagingChannelId != null).toEqual(true); + + server.send( + JSON.stringify({ + type: "channel", + body: { + id: messagingChannelId, + type: "message", + body: { + id: "foo", + }, + }, + }), + ); + + expect(messagingChannelReceived[0]).toEqual({ + id: "foo", + }); + + stream.close(); + server.close(); + }); + + test("ちゃんとチャンネルごとにidが異なる", async () => { + const server = new WS("wss://calckey.test/streaming"); + const stream = new Stream("https://calckey.test", { token: "TOKEN" }); + + stream.useChannel("messaging", { otherparty: "aaa" }); + stream.useChannel("messaging", { otherparty: "bbb" }); + + const ws = await server.connected; + expect(new URLSearchParams(new URL(ws.url).search).get("i")).toEqual( + "TOKEN", + ); + + const msg = JSON.parse((await server.nextMessage) as string); + const messagingChannelId = msg.body.id; + const msg2 = JSON.parse((await server.nextMessage) as string); + const messagingChannelId2 = msg2.body.id; + + expect(messagingChannelId != null).toEqual(true); + expect(messagingChannelId2 != null).toEqual(true); + expect(messagingChannelId).not.toEqual(messagingChannelId2); + + stream.close(); + server.close(); + }); + + test("Connection#send", async () => { + const server = new WS("wss://calckey.test/streaming"); + const stream = new Stream("https://calckey.test", { token: "TOKEN" }); + + const messaging = stream.useChannel("messaging", { otherparty: "aaa" }); + messaging.send("read", { id: "aaa" }); + + const ws = await server.connected; + expect(new URLSearchParams(new URL(ws.url).search).get("i")).toEqual( + "TOKEN", + ); + + const connectMsg = JSON.parse((await server.nextMessage) as string); + const channelId = connectMsg.body.id; + const msg = JSON.parse((await server.nextMessage) as string); + + expect(msg.type).toEqual("ch"); + expect(msg.body.id).toEqual(channelId); + expect(msg.body.type).toEqual("read"); + expect(msg.body.body).toEqual({ id: "aaa" }); + + stream.close(); + server.close(); + }); + + test("Connection#dispose", async () => { + const server = new WS("wss://calckey.test/streaming"); + const stream = new Stream("https://calckey.test", { token: "TOKEN" }); + const mainChannelReceived: any[] = []; + const main = stream.useChannel("main"); + main.on("meUpdated", (payload) => { + mainChannelReceived.push(payload); + }); + + const ws = await server.connected; + expect(new URLSearchParams(new URL(ws.url).search).get("i")).toEqual( + "TOKEN", + ); + + const msg = JSON.parse((await server.nextMessage) as string); + const mainChannelId = msg.body.id; + expect(msg.type).toEqual("connect"); + expect(msg.body.channel).toEqual("main"); + expect(mainChannelId != null).toEqual(true); + main.dispose(); + + server.send( + JSON.stringify({ + type: "channel", + body: { + id: mainChannelId, + type: "meUpdated", + body: { + id: "foo", + }, + }, + }), + ); + + expect(mainChannelReceived.length).toEqual(0); + + stream.close(); + server.close(); + }); + + // TODO: SharedConnection#dispose して一定時間経ったら disconnect メッセージがサーバーに送られてくるかのテスト + + // TODO: チャンネル接続が使いまわされるかのテスト +}); diff --git a/fe_calckey/frontend/calckey-js/tsconfig.json b/fe_calckey/frontend/calckey-js/tsconfig.json new file mode 100644 index 0000000..642bcc4 --- /dev/null +++ b/fe_calckey/frontend/calckey-js/tsconfig.json @@ -0,0 +1,20 @@ +{ + "$schema": "http://json.schemastore.org/tsconfig", + "compilerOptions": { + "target": "es2020", + "module": "commonjs", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "outDir": "./built/", + "removeComments": true, + "strict": true, + "strictFunctionTypes": true, + "strictNullChecks": true, + "experimentalDecorators": true, + "noImplicitReturns": true, + "esModuleInterop": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "test/**/*"] +} diff --git a/fe_calckey/frontend/client/.prettierrc b/fe_calckey/frontend/client/.prettierrc new file mode 100644 index 0000000..77a5016 --- /dev/null +++ b/fe_calckey/frontend/client/.prettierrc @@ -0,0 +1,15 @@ +{ + "tabWidth": 4, + "useTabs": true, + "singleQuote": false, + "vueIndentScriptAndStyle": false, + "plugins": ["vue"], + "overrides": [ + { + "files": "*.vue", + "options": { + "parser": "vue" + } + } + ] +} diff --git a/fe_calckey/frontend/client/@types/global.d.ts b/fe_calckey/frontend/client/@types/global.d.ts new file mode 100644 index 0000000..c757482 --- /dev/null +++ b/fe_calckey/frontend/client/@types/global.d.ts @@ -0,0 +1,10 @@ +type FIXME = any; + +declare const _LANGS_: string[][]; +declare const _VERSION_: string; +declare const _ENV_: string; +declare const _DEV_: boolean; +declare const _PERF_PREFIX_: string; +declare const _DATA_TRANSFER_DRIVE_FILE_: string; +declare const _DATA_TRANSFER_DRIVE_FOLDER_: string; +declare const _DATA_TRANSFER_DECK_COLUMN_: string; diff --git a/fe_calckey/frontend/client/@types/theme.d.ts b/fe_calckey/frontend/client/@types/theme.d.ts new file mode 100644 index 0000000..5f1b816 --- /dev/null +++ b/fe_calckey/frontend/client/@types/theme.d.ts @@ -0,0 +1,7 @@ +declare module "@/themes/*.json5" { + import { Theme } from "@/scripts/theme"; + + const theme: Theme; + + export default theme; +} diff --git a/fe_calckey/frontend/client/@types/vue.d.ts b/fe_calckey/frontend/client/@types/vue.d.ts new file mode 100644 index 0000000..2cd2e39 --- /dev/null +++ b/fe_calckey/frontend/client/@types/vue.d.ts @@ -0,0 +1,7 @@ +/// + +declare module "*.vue" { + import type { DefineComponent } from "vue"; + const component: DefineComponent<{}, {}, any>; + export default component; +} diff --git a/fe_calckey/frontend/client/assets/about-icon.png b/fe_calckey/frontend/client/assets/about-icon.png new file mode 100644 index 0000000..a830bfa Binary files /dev/null and b/fe_calckey/frontend/client/assets/about-icon.png differ diff --git a/fe_calckey/frontend/client/assets/dummy.png b/fe_calckey/frontend/client/assets/dummy.png new file mode 100644 index 0000000..ee22bdb Binary files /dev/null and b/fe_calckey/frontend/client/assets/dummy.png differ diff --git a/fe_calckey/frontend/client/assets/dummy_original.png b/fe_calckey/frontend/client/assets/dummy_original.png new file mode 100644 index 0000000..55c1c59 Binary files /dev/null and b/fe_calckey/frontend/client/assets/dummy_original.png differ diff --git a/fe_calckey/frontend/client/assets/label-red.svg b/fe_calckey/frontend/client/assets/label-red.svg new file mode 100644 index 0000000..4b95a93 --- /dev/null +++ b/fe_calckey/frontend/client/assets/label-red.svg @@ -0,0 +1 @@ + diff --git a/fe_calckey/frontend/client/assets/label.svg b/fe_calckey/frontend/client/assets/label.svg new file mode 100644 index 0000000..e076c6b --- /dev/null +++ b/fe_calckey/frontend/client/assets/label.svg @@ -0,0 +1 @@ + diff --git a/fe_calckey/frontend/client/assets/misskey.svg b/fe_calckey/frontend/client/assets/misskey.svg new file mode 100644 index 0000000..e68af59 --- /dev/null +++ b/fe_calckey/frontend/client/assets/misskey.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + diff --git a/fe_calckey/frontend/client/assets/tagcanvas.min.js b/fe_calckey/frontend/client/assets/tagcanvas.min.js new file mode 100644 index 0000000..562fe02 --- /dev/null +++ b/fe_calckey/frontend/client/assets/tagcanvas.min.js @@ -0,0 +1,2553 @@ +/** + * Copyright (C) 2010-2021 Graham Breach + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ +/** + * TagCanvas 2.11 + * For more information, please contact + */ +(function () { + "use strict"; + var r, + C, + p = Math.abs, + o = Math.sin, + l = Math.cos, + g = Math.max, + h = Math.min, + af = Math.ceil, + E = Math.sqrt, + w = Math.pow, + I = {}, + D = {}, + R = { + 0: "0,", + 1: "17,", + 2: "34,", + 3: "51,", + 4: "68,", + 5: "85,", + 6: "102,", + 7: "119,", + 8: "136,", + 9: "153,", + a: "170,", + A: "170,", + b: "187,", + B: "187,", + c: "204,", + C: "204,", + d: "221,", + D: "221,", + e: "238,", + E: "238,", + f: "255,", + F: "255,", + }, + f, + d, + b, + T, + z, + F, + M, + c = document, + v, + e, + P, + j = {}; + for (r = 0; r < 256; ++r) + (C = r.toString(16)), + r < 16 && (C = "0" + C), + (D[C] = D[C.toUpperCase()] = r.toString() + ","); + function n(a) { + return typeof a != "undefined"; + } + function B(a) { + return typeof a == "object" && a != null; + } + function G(a, c, b) { + return isNaN(a) ? b : h(b, g(c, a)); + } + function x() { + return !1; + } + function q() { + return new Date().valueOf(); + } + function ak(c, d) { + var b = [], + e = c.length, + a; + for (a = 0; a < e; ++a) b.push(c[a]); + return b.sort(d), b; + } + function ai(a) { + for (var b = a.length - 1, d, c; b; ) + (c = ~~(Math.random() * b)), (d = a[b]), (a[b] = a[c]), (a[c] = d), --b; + } + function ag() { + var a = window.AudioContext || window.webkitAudioContext; + if (((e = new a()), !e)) { + e = "off"; + return; + } + return e; + } + function $(u, a, t, s, r, q, p) { + var j = s, + h = r, + i = t * 0.01, + n = 80 * i, + m = 100 * i, + o = 40 * i, + l = 30 * i, + c = l / 2, + b = j + n, + f = b - o, + k = h + m, + d = k - l, + g = h + l, + e = h + m / 2; + if ( + (a.setTransform(1, 0, 0, 1, 0, 0), + a.setLineDash([]), + (a.globalAlpha = 1), + (a.strokeStyle = p), + (a.lineWidth = q), + (a.lineJoin = "round"), + a.beginPath(), + a.moveTo(f, g), + a.lineTo(f, d), + a.moveTo(b, k), + a.lineTo(f, d), + a.lineTo(j, d), + a.lineTo(j, g), + a.lineTo(f, g), + a.lineTo(b, h), + u) + ) { + a.lineTo(b, g), + a.moveTo(b, d), + a.lineTo(b, k), + a.moveTo(b - c, e - c), + a.lineTo(b + c, e + c), + a.moveTo(b + c, e - c), + a.lineTo(b - c, e + c), + a.stroke(); + return; + } + a.closePath(), a.stroke(); + } + function s(a, b, c) { + (this.x = a), (this.y = b), (this.z = c); + } + (z = s.prototype), + (z.length = function () { + return E(this.x * this.x + this.y * this.y + this.z * this.z); + }), + (z.dot = function (a) { + return this.x * a.x + this.y * a.y + this.z * a.z; + }), + (z.cross = function (a) { + var b = this.y * a.z - this.z * a.y, + c = this.z * a.x - this.x * a.z, + d = this.x * a.y - this.y * a.x; + return new s(b, c, d); + }), + (z.angle = function (b) { + var c = this.dot(b), + a; + return c == 0 + ? Math.PI / 2 + : ((a = c / (this.length() * b.length())), a >= 1) + ? 0 + : a <= -1 + ? Math.PI + : Math.acos(a); + }), + (z.unit = function () { + var a = this.length(); + return new s(this.x / a, this.y / a, this.z / a); + }); + function ay(b, a) { + (a = (a * Math.PI) / 180), (b = (b * Math.PI) / 180); + var c = o(b) * l(a), + d = -o(a), + e = -l(b) * l(a); + return new s(c, d, e); + } + function m(a) { + (this[1] = { 1: a[0], 2: a[1], 3: a[2] }), + (this[2] = { 1: a[3], 2: a[4], 3: a[5] }), + (this[3] = { 1: a[6], 2: a[7], 3: a[8] }); + } + (T = m.prototype), + (m.Identity = function () { + return new m([1, 0, 0, 0, 1, 0, 0, 0, 1]); + }), + (m.Rotation = function (e, a) { + var c = o(e), + d = l(e), + b = 1 - d; + return new m([ + d + w(a.x, 2) * b, + a.x * a.y * b - a.z * c, + a.x * a.z * b + a.y * c, + a.y * a.x * b + a.z * c, + d + w(a.y, 2) * b, + a.y * a.z * b - a.x * c, + a.z * a.x * b - a.y * c, + a.z * a.y * b + a.x * c, + d + w(a.z, 2) * b, + ]); + }), + (T.mul = function (c) { + var d = [], + a, + b, + e = c.xform ? 1 : 0; + for (a = 1; a <= 3; ++a) + for (b = 1; b <= 3; ++b) + e + ? d.push( + this[a][1] * c[1][b] + + this[a][2] * c[2][b] + + this[a][3] * c[3][b], + ) + : d.push(this[a][b] * c); + return new m(d); + }), + (T.xform = function (b) { + var a = {}, + c = b.x, + d = b.y, + e = b.z; + return ( + (a.x = c * this[1][1] + d * this[2][1] + e * this[3][1]), + (a.y = c * this[1][2] + d * this[2][2] + e * this[3][2]), + (a.z = c * this[1][3] + d * this[2][3] + e * this[3][3]), + a + ); + }); + function aB(g, j, k, m, f) { + var a, + b, + c, + d, + e = [], + h = 2 / g, + i; + i = Math.PI * (3 - E(5) + (parseFloat(f) ? parseFloat(f) : 0)); + for (a = 0; a < g; ++a) + (b = a * h - 1 + h / 2), + (c = E(1 - b * b)), + (d = a * i), + e.push([l(d) * c * j, b * k, o(d) * c * m]); + return e; + } + function U(n, p, m, k, h, g) { + var b, + f = [], + i = 2 / n, + j, + a, + d, + c, + e; + j = Math.PI * (3 - E(5) + (parseFloat(g) ? parseFloat(g) : 0)); + for (a = 0; a < n; ++a) + (d = a * i - 1 + i / 2), + (b = a * j), + (c = l(b)), + (e = o(b)), + f.push(p ? [d * m, c * k, e * h] : [c * m, d * k, e * h]); + return f; + } + function aa(k, e, f, h, i, j) { + var b, + g = [], + m = (Math.PI * 2) / e, + a, + c, + d; + for (a = 0; a < e; ++a) + (b = a * m), + (c = l(b)), + (d = o(b)), + g.push(k ? [j * f, c * h, d * i] : [c * f, j * h, d * i]); + return g; + } + function ax(a, b, c, d, e) { + return U(a, 0, b, c, d, e); + } + function aH(a, b, c, d, e) { + return U(a, 1, b, c, d, e); + } + function aG(b, c, d, e, a) { + return (a = isNaN(a) ? 0 : a * 1), aa(0, b, c, d, e, a); + } + function aF(b, c, d, e, a) { + return (a = isNaN(a) ? 0 : a * 1), aa(1, b, c, d, e, a); + } + function av(b) { + var a = new Image(); + (a.onload = function () { + var c = a.width / 2, + d = a.height / 2; + b.centreFunc = function (b, g, h, e, f) { + b.setTransform(1, 0, 0, 1, 0, 0), + (b.globalAlpha = 1), + b.drawImage(a, e - c, f - d); + }; + }), + (a.src = b.centreImage); + } + function aE(a, c) { + var b = a, + d, + e, + f = (c * 1).toPrecision(3) + ")"; + return ( + a[0] === "#" + ? (I[a] || + (a.length === 4 + ? (I[a] = "rgba(" + R[a[1]] + R[a[2]] + R[a[3]]) + : (I[a] = + "rgba(" + + D[a.substr(1, 2)] + + D[a.substr(3, 2)] + + D[a.substr(5, 2)])), + (b = I[a] + f)) + : a.substr(0, 4) === "rgb(" || a.substr(0, 4) === "hsl(" + ? (b = a.replace("(", "a(").replace(")", "," + f)) + : (a.substr(0, 5) === "rgba(" || a.substr(0, 5) === "hsla(") && + ((d = a.lastIndexOf(",") + 1), + (e = a.indexOf(")")), + (c *= parseFloat(a.substring(d, e))), + (b = a.substr(0, d) + c.toPrecision(3) + ")")), + b + ); + } + function k(b, d) { + if (window.G_vmlCanvasManager) return null; + var a = c.createElement("canvas"); + return (a.width = b), (a.height = d), a; + } + function aD() { + var b = k(3, 3), + a, + c; + return ( + !!b && + ((a = b.getContext("2d")), + (a.strokeStyle = "#000"), + (a.shadowColor = "#fff"), + (a.shadowBlur = 3), + (a.globalAlpha = 0), + a.strokeRect(2, 2, 2, 2), + (a.globalAlpha = 1), + (c = a.getImageData(2, 2, 1, 1)), + (b = null), + c.data[0] > 0) + ); + } + function aC(a, c, f, d) { + var e = a.createLinearGradient(0, 0, c, 0), + b; + for (b in d) e.addColorStop(1 - b, d[b]); + (a.fillStyle = e), a.fillRect(0, f, c, 1); + } + function L(a, m, j) { + var l = 1024, + d = 1, + e = a.weightGradient, + i, + f, + b, + c; + if (a.gCanvas) (f = a.gCanvas.getContext("2d")), (d = a.gCanvas.height); + else { + if ((B(e[0]) ? (d = e.length) : (e = [e]), (a.gCanvas = i = k(l, d)), !i)) + return null; + f = i.getContext("2d"); + for (b = 0; b < d; ++b) aC(f, l, b, e[b]); + } + return ( + (j = g(h(j || 0, d - 1), 0)), + (c = f.getImageData(~~((l - 1) * m), j, 1, 1).data), + "rgba(" + c[0] + "," + c[1] + "," + c[2] + "," + c[3] / 255 + ")" + ); + } + function Y(b, i, q, k, o, n, h, d, a, g, f, l) { + var m = o + (d || 0) + (a.length && a[0] < 0 ? p(a[0]) : 0), + j = n + (d || 0) + (a.length && a[1] < 0 ? p(a[1]) : 0), + c, + e; + (b.font = i), + (b.textBaseline = "top"), + (b.fillStyle = q), + h && (b.shadowColor = h), + d && (b.shadowBlur = d), + a.length && ((b.shadowOffsetX = a[0]), (b.shadowOffsetY = a[1])); + for (c = 0; c < k.length; ++c) + (e = 0), + f && + ("right" == l + ? (e = g - f[c]) + : "centre" == l && (e = (g - f[c]) / 2)), + b.fillText(k[c], m + e, j), + (j += parseInt(i)); + } + function y(d, a, b, f, e, c, g) { + c + ? (d.beginPath(), + d.moveTo(a, b + e - c), + d.arcTo(a, b, a + c, b, c), + d.arcTo(a + f, b, a + f, b + c, c), + d.arcTo(a + f, b + e, a + f - c, b + e, c), + d.arcTo(a, b + e, a, b + e - c, c), + d.closePath(), + d[g ? "stroke" : "fill"]()) + : d[g ? "strokeRect" : "fillRect"](a, b, f, e); + } + function O(a, b, c, d, e, f, g, h, i) { + (this.strings = a), + (this.font = b), + (this.width = c), + (this.height = d), + (this.maxWidth = e), + (this.stringWidths = f), + (this.align = g), + (this.valign = h), + (this.scale = i); + } + (M = O.prototype), + (M.SetImage = function (a, b, c, d, e, f, g, h) { + (this.image = a), + (this.iwidth = b * this.scale), + (this.iheight = c * this.scale), + (this.ipos = d), + (this.ipad = e * this.scale), + (this.iscale = h), + (this.ialign = f), + (this.ivalign = g); + }), + (M.Align = function (c, d, a) { + var b = 0; + return ( + a == "right" || a == "bottom" + ? (b = d - c) + : a != "left" && a != "top" && (b = (d - c) / 2), + b + ); + }), + (M.Create = function (G, D, F, b, A, m, q, j, E) { + var o, + e, + f, + a, + l, + s, + i, + u, + v, + r, + w, + n, + c, + d, + x, + B = p(q[0]), + C = p(q[1]), + t, + z; + return ( + (j = g(j, B + m, C + m)), + (l = 2 * (j + b)), + (i = 2 * (j + b)), + (e = this.width + l), + (f = this.height + i), + (v = r = j + b), + this.image && + ((w = n = j + b), + (c = this.iwidth), + (d = this.iheight), + this.ipos == "top" || this.ipos == "bottom" + ? (c < this.width + ? (w += this.Align(c, this.width, this.ialign)) + : (v += this.Align(this.width, c, this.align)), + this.ipos == "top" + ? (r += d + this.ipad) + : (n += this.height + this.ipad), + (e = g(e, c + l)), + (f += d + this.ipad)) + : (d < this.height + ? (n += this.Align(d, this.height, this.ivalign)) + : (r += this.Align(this.height, d, this.valign)), + this.ipos == "right" + ? (w += this.width + this.ipad) + : (v += c + this.ipad), + (e += c + this.ipad), + (f = g(f, d + i)))), + (o = k(e, f)), + !o + ? null + : ((l = i = b / 2), + (s = e - b), + (u = f - b), + (x = h(E, s / 2, u / 2)), + (a = o.getContext("2d")), + D && ((a.fillStyle = D), y(a, l, i, s, u, x)), + b && + ((a.strokeStyle = F), (a.lineWidth = b), y(a, l, i, s, u, x, !0)), + (m || B || C) && + ((t = k(e, f)), t && ((z = a), (a = t.getContext("2d")))), + Y( + a, + this.font, + G, + this.strings, + v, + r, + 0, + 0, + [], + this.maxWidth, + this.stringWidths, + this.align, + ), + this.image && a.drawImage(this.image, w, n, c, d), + z && + ((a = z), + A && (a.shadowColor = A), + m && (a.shadowBlur = m), + (a.shadowOffsetX = q[0]), + (a.shadowOffsetY = q[1]), + a.drawImage(t, 0, 0)), + o) + ); + }); + function H(a, c, d) { + var b = k(c, d), + e; + return b + ? ((e = b.getContext("2d")), + e.drawImage(a, (c - a.width) / 2, (d - a.height) / 2), + b) + : null; + } + function S(e, b, c) { + var a = k(b, c), + d; + return a ? ((d = a.getContext("2d")), d.drawImage(e, 0, 0, b, c), a) : null; + } + function W(n, u, t, e, s, c, v, d, r, w) { + var g = u + (2 * d + c) * e, + f = t + (2 * d + c) * e, + l = k(g, f), + b, + i, + q, + m, + j, + o, + a, + p; + return l + ? ((c *= e), + (r *= e), + (i = q = c / 2), + (m = g - c), + (j = f - c), + (d = d * e + i), + (b = l.getContext("2d")), + (p = h(r, m / 2, j / 2)), + s && ((b.fillStyle = s), y(b, i, q, m, j, p)), + c && ((b.strokeStyle = v), (b.lineWidth = c), y(b, i, q, m, j, p, !0)), + w + ? ((o = k(g, f)), + (a = o.getContext("2d")), + a.drawImage(n, d, d, u, t), + (a.globalCompositeOperation = "source-in"), + (a.fillStyle = v), + a.fillRect(0, 0, g, f), + (a.globalCompositeOperation = "destination-over"), + a.drawImage(l, 0, 0), + (a.globalCompositeOperation = "source-over"), + b.drawImage(o, 0, 0)) + : b.drawImage(n, d, d, n.width, n.height), + { image: l, width: g / e, height: f / e }) + : null; + } + function at(l, f, c, d, j) { + var e, + a, + b = parseFloat(f), + i = g(c, d); + return ( + (e = k(c, d)), + !e + ? null + : (f.indexOf("%") > 0 ? (b = (i * b) / 100) : (b = b * j), + (a = e.getContext("2d")), + (a.globalCompositeOperation = "source-over"), + (a.fillStyle = "#fff"), + b >= i / 2 + ? ((b = h(c, d) / 2), + a.beginPath(), + a.moveTo(c / 2, d / 2), + a.arc(c / 2, d / 2, b, 0, 2 * Math.PI, !1), + a.fill(), + a.closePath()) + : ((b = h(c / 2, d / 2, b)), y(a, 0, 0, c, d, b, !0), a.fill()), + (a.globalCompositeOperation = "source-in"), + a.drawImage(l, 0, 0, c, d), + e) + ); + } + function ao(q, m, i, b, h, a, c) { + var g = p(c[0]), + f = p(c[1]), + j = m + (g > a ? g + a : a * 2) * b, + l = i + (f > a ? f + a : a * 2) * b, + n = b * ((a || 0) + (c[0] < 0 ? g : 0)), + o = b * ((a || 0) + (c[1] < 0 ? f : 0)), + e, + d; + return ( + (e = k(j, l)), + !e + ? null + : ((d = e.getContext("2d")), + h && (d.shadowColor = h), + a && (d.shadowBlur = a * b), + c && ((d.shadowOffsetX = c[0] * b), (d.shadowOffsetY = c[1] * b)), + d.drawImage(q, n, o, m, i), + { image: e, width: j / b, height: l / b }) + ); + } + function ae(m, o, l) { + var c = parseInt(m.toString().length * l), + h = parseInt(l * 2 * m.length), + j = k(c, h), + g, + i, + e, + f, + b, + d, + n, + a; + if (!j) return null; + (g = j.getContext("2d")), + (g.fillStyle = "#000"), + g.fillRect(0, 0, c, h), + Y(g, l + "px " + o, "#fff", m, 0, 0, 0, 0, [], "centre"), + (i = g.getImageData(0, 0, c, h)), + (e = i.width), + (f = i.height), + (a = { min: { x: e, y: f }, max: { x: -1, y: -1 } }); + for (d = 0; d < f; ++d) + for (b = 0; b < e; ++b) + (n = (d * e + b) * 4), + i.data[n + 1] > 0 && + (b < a.min.x && (a.min.x = b), + b > a.max.x && (a.max.x = b), + d < a.min.y && (a.min.y = d), + d > a.max.y && (a.max.y = d)); + return ( + e != c && ((a.min.x *= c / e), (a.max.x *= c / e)), + f != h && ((a.min.y *= c / f), (a.max.y *= c / f)), + (j = null), + a + ); + } + function Q(a) { + return "'" + a.replace(/(\'|\")/g, "").replace(/\s*,\s*/g, "', '") + "'"; + } + function t(b, d, a) { + (a = a || c), + a.addEventListener + ? a.addEventListener(b, d, !1) + : a.attachEvent("on" + b, d); + } + function am(b, d, a) { + (a = a || c), + a.removeEventListener + ? a.removeEventListener(b, d) + : a.detachEvent("on" + b, d); + } + function A(g, e, j, a, b) { + var l = b.imageScale, + h, + c, + k, + m, + f, + d; + if (!e.complete) + return t( + "load", + function () { + A(g, e, j, a, b); + }, + e, + ); + if (!g.complete) + return t( + "load", + function () { + A(g, e, j, a, b); + }, + g, + ); + if (j && !j.complete) + return t( + "load", + function () { + A(g, e, j, a, b); + }, + j, + ); + (e.width = e.width), + (e.height = e.height), + l && ((g.width = e.width * l), (g.height = e.height * l)), + (a.iw = g.width), + (a.ih = g.height), + b.txtOpt && + ((c = g), + (h = b.zoomMax * b.txtScale), + (f = a.iw * h), + (d = a.ih * h), + f < e.naturalWidth || d < e.naturalHeight + ? ((c = S(g, f, d)), c && (a.fimage = c)) + : ((f = a.iw), (d = a.ih), (h = 1)), + parseFloat(b.imageRadius) && + (a.image = a.fimage = g = at(a.image, b.imageRadius, f, d, h)), + a.HasText() || + (b.shadow && + ((c = ao(a.image, f, d, h, b.shadow, b.shadowBlur, b.shadowOffset)), + c && ((a.fimage = c.image), (a.w = c.width), (a.h = c.height))), + (b.bgColour || b.bgOutlineThickness) && + ((k = + b.bgColour == "tag" ? i(a.a, "background-color") : b.bgColour), + (m = + b.bgOutline == "tag" + ? i(a.a, "color") + : b.bgOutline || b.textColour), + (f = a.fimage.width), + (d = a.fimage.height), + b.outlineMethod == "colour" && + ((c = W( + a.fimage, + f, + d, + h, + k, + b.bgOutlineThickness, + a.outline.colour, + b.padding, + b.bgRadius, + 1, + )), + c && (a.oimage = c.image)), + (c = W( + a.fimage, + f, + d, + h, + k, + b.bgOutlineThickness, + m, + b.padding, + b.bgRadius, + )), + c && ((a.fimage = c.image), (a.w = c.width), (a.h = c.height))), + b.outlineMethod == "size" && + (b.outlineIncrease > 0 + ? ((a.iw += 2 * b.outlineIncrease), + (a.ih += 2 * b.outlineIncrease), + (f = h * a.iw), + (d = h * a.ih), + (c = S(a.fimage, f, d)), + (a.oimage = c), + (a.fimage = H(a.fimage, a.oimage.width, a.oimage.height))) + : ((f = h * (a.iw + 2 * b.outlineIncrease)), + (d = h * (a.ih + 2 * b.outlineIncrease)), + (c = S(a.fimage, f, d)), + (a.oimage = H(c, a.fimage.width, a.fimage.height)))))), + (a.alt = j), + a.Init(); + } + function i(a, d) { + var b = c.defaultView, + e = d.replace(/\-([a-z])/g, function (a) { + return a.charAt(1).toUpperCase(); + }); + return ( + (b && + b.getComputedStyle && + b.getComputedStyle(a, null).getPropertyValue(d)) || + (a.currentStyle && a.currentStyle[e]) + ); + } + function aj(c, d, e) { + var b = 1, + a; + return ( + d + ? (b = 1 * (c.getAttribute(d) || e)) + : (a = i(c, "font-size")) && + (b = + (a.indexOf("px") > -1 && a.replace("px", "") * 1) || + (a.indexOf("pt") > -1 && a.replace("pt", "") * 1.25) || + a * 3.3), + b + ); + } + function u(a) { + return a.target && n(a.target.id) + ? a.target.id + : a.srcElement.parentNode.id; + } + function K(a, c) { + var b, + d, + e = parseInt(i(c, "width")) / c.width, + f = parseInt(i(c, "height")) / c.height; + return ( + n(a.offsetX) + ? (b = { x: a.offsetX, y: a.offsetY }) + : ((d = X(c.id)), + n(a.changedTouches) && (a = a.changedTouches[0]), + a.pageX && (b = { x: a.pageX - d.x, y: a.pageY - d.y })), + b && e && f && ((b.x /= e), (b.y /= f)), + b + ); + } + function an(c) { + var d = c.target || c.fromElement.parentNode, + b = a.tc[d.id]; + b && ((b.mx = b.my = -1), b.UnFreeze(), b.EndDrag()); + } + function ad(e) { + var g, + c = a, + b, + d, + f = u(e); + for (g in c.tc) + (b = c.tc[g]), b.tttimer && (clearTimeout(b.tttimer), (b.tttimer = null)); + f && + c.tc[f] && + ((b = c.tc[f]), + (d = K(e, b.canvas)) && ((b.mx = d.x), (b.my = d.y), b.Drag(e, d)), + (b.drawn = 0)); + } + function ap(b) { + var e = a, + f = c.addEventListener ? 0 : 1, + d = u(b); + d && b.button == f && e.tc[d] && e.tc[d].BeginDrag(b); + } + function aq(b) { + var f = a, + g = c.addEventListener ? 0 : 1, + e = u(b), + d; + e && + b.button == g && + f.tc[e] && + ((d = f.tc[e]), ad(b), !d.EndDrag() && !d.touchState && d.Clicked(b)); + } + function ar(c) { + var e = u(c), + b = e && a.tc[e], + d; + b && + c.changedTouches && + (c.touches.length == 1 && b.touchState == 0 + ? ((b.touchState = 1), + b.BeginDrag(c), + (d = K(c, b.canvas)) && ((b.mx = d.x), (b.my = d.y), (b.drawn = 0))) + : c.targetTouches.length == 2 && b.pinchZoom + ? ((b.touchState = 3), b.EndDrag(), b.BeginPinch(c)) + : (b.EndDrag(), b.EndPinch(), (b.touchState = 0))); + } + function ac(c) { + var d = u(c), + b = d && a.tc[d]; + if (b && c.changedTouches) { + switch (b.touchState) { + case 1: + b.Draw(), b.Clicked(); + break; + break; + case 2: + b.EndDrag(); + break; + case 3: + b.EndPinch(); + } + b.touchState = 0; + } + } + function au(c) { + var f, + e = a, + b, + d, + g = u(c); + for (f in e.tc) + (b = e.tc[f]), b.tttimer && (clearTimeout(b.tttimer), (b.tttimer = null)); + if (((b = g && e.tc[g]), b && c.changedTouches && b.touchState)) { + switch (b.touchState) { + case 1: + case 2: + (d = K(c, b.canvas)) && + ((b.mx = d.x), (b.my = d.y), b.Drag(c, d) && (b.touchState = 2)); + break; + case 3: + b.Pinch(c); + } + b.drawn = 0; + } + } + function ab(b) { + var d = a, + c = u(b); + c && + d.tc[c] && + ((b.cancelBubble = !0), + (b.returnValue = !1), + b.preventDefault && b.preventDefault(), + d.tc[c].Wheel((b.wheelDelta || b.detail) > 0)); + } + function aw(d) { + var c, + b = a; + clearTimeout(b.scrollTimer); + for (c in b.tc) b.tc[c].Pause(); + b.scrollTimer = setTimeout(function () { + var b, + c = a; + for (b in c.tc) c.tc[b].Resume(); + }, b.scrollPause); + } + function al() { + Z(q()); + } + function Z(b) { + var c = a.tc, + d; + a.NextFrame(a.interval), (b = b || q()); + for (d in c) c[d].Draw(b); + } + function az() { + requestAnimationFrame(Z); + } + function aA(a) { + setTimeout(al, a); + } + function X(f) { + var g = c.getElementById(f), + b = g.getBoundingClientRect(), + a = c.documentElement, + d = c.body, + e = window, + h = e.pageXOffset || a.scrollLeft, + i = e.pageYOffset || a.scrollTop, + j = a.clientLeft || d.clientLeft, + k = a.clientTop || d.clientTop; + return { x: b.left + h - j, y: b.top + i - k }; + } + function aI(a, b, d, e) { + var c = (a.radius * a.z1) / (a.z1 + a.z2 + b.z); + return { x: b.x * c * d, y: b.y * c * e, z: b.z, w: (a.z1 - b.z) / a.z2 }; + } + function V(a) { + (this.e = a), + (this.br = 0), + (this.line = []), + (this.text = []), + (this.original = a.innerText || a.textContent); + } + (F = V.prototype), + (F.Empty = function () { + for (var a = 0; a < this.text.length; ++a) + if (this.text[a].length) return !1; + return !0; + }), + (F.Lines = function (c) { + var e = c ? 1 : 0, + b, + d, + a; + (c = c || this.e), (b = c.childNodes), (d = b.length); + for (a = 0; a < d; ++a) + b[a].nodeName == "BR" + ? (this.text.push(this.line.join(" ")), (this.br = 1)) + : b[a].nodeType == 3 + ? this.br + ? ((this.line = [b[a].nodeValue]), (this.br = 0)) + : this.line.push(b[a].nodeValue) + : this.Lines(b[a]); + return e || this.br || this.text.push(this.line.join(" ")), this.text; + }), + (F.SplitWidth = function (h, e, f, g) { + var c, + b, + a, + d = []; + e.font = g + "px " + f; + for (c = 0; c < this.text.length; ++c) { + (a = this.text[c].split(/\s+/)), (this.line = [a[0]]); + for (b = 1; b < a.length; ++b) + e.measureText(this.line.join(" ") + " " + a[b]).width > h + ? (d.push(this.line.join(" ")), (this.line = [a[b]])) + : this.line.push(a[b]); + d.push(this.line.join(" ")); + } + return (this.text = d); + }); + function _(a, b) { + (this.ts = null), + (this.tc = a), + (this.tag = b), + (this.x = this.y = this.w = this.h = this.sc = 1), + (this.z = 0), + (this.pulse = 1), + (this.pulsate = a.pulsateTo < 1), + (this.colour = a.outlineColour), + (this.adash = ~~a.outlineDash), + (this.agap = ~~a.outlineDashSpace || this.adash), + (this.aspeed = a.outlineDashSpeed * 1), + this.colour == "tag" + ? (this.colour = i(b.a, "color")) + : this.colour == "tagbg" && (this.colour = i(b.a, "background-color")), + (this.Draw = this.pulsate ? this.DrawPulsate : this.DrawSimple), + (this.radius = a.outlineRadius | 0), + this.SetMethod(a.outlineMethod, a.altImage); + } + (f = _.prototype), + (f.SetMethod = function (a, d) { + var b = { + block: ["PreDraw", "DrawBlock"], + colour: ["PreDraw", "DrawColour"], + outline: ["PostDraw", "DrawOutline"], + classic: ["LastDraw", "DrawOutline"], + size: ["PreDraw", "DrawSize"], + none: ["LastDraw"], + }, + c = b[a] || b.outline; + a == "none" + ? (this.Draw = function () { + return 1; + }) + : (this.drawFunc = this[c[1]]), + (this[c[0]] = this.Draw), + d && ((this.RealPreDraw = this.PreDraw), (this.PreDraw = this.DrawAlt)); + }), + (f.Update = function (d, e, i, j, a, f, g, h) { + var b = this.tc.outlineOffset, + c = 2 * b; + (this.x = a * d + g - b), + (this.y = a * e + h - b), + (this.w = a * i + c), + (this.h = a * j + c), + (this.sc = a), + (this.z = f); + }), + (f.Ants = function (k) { + if (!this.adash) return; + var b = this.adash, + c = this.agap, + a = this.aspeed, + j = b + c, + h = 0, + g = b, + f = c, + i = 0, + d = 0, + e; + a && + ((d = (p(a) * (q() - this.ts)) / 50), + a < 0 && (d = 864e4 - d), + (a = ~~d % j)), + a + ? (b >= a ? ((h = b - a), (g = a)) : ((f = j - a), (i = c - f)), + (e = [h, f, g, i])) + : (e = [b, c]), + k.setLineDash(e); + }), + (f.DrawOutline = function (a, d, e, b, c, f) { + var g = h(this.radius, c / 2, b / 2); + (a.strokeStyle = f), this.Ants(a), y(a, d, e, b, c, g, !0); + }), + (f.DrawSize = function (i, n, m, l, k, j, a, h, g) { + var f = a.w, + e = a.h, + c, + b, + d; + return ( + this.pulsate + ? (a.image + ? (d = + (a.image.height + this.tc.outlineIncrease) / a.image.height) + : (d = a.oscale), + (b = a.fimage || a.image), + (c = 1 + (d - 1) * (1 - this.pulse)), + (a.h *= c), + (a.w *= c)) + : (b = a.oimage), + (a.alpha = 1), + a.Draw(i, h, g, b), + (a.h = e), + (a.w = f), + 1 + ); + }), + (f.DrawColour = function (d, h, i, e, f, g, a, b, c) { + return a.oimage + ? (this.pulse < 1 + ? ((a.alpha = 1 - w(this.pulse, 2)), + a.Draw(d, b, c, a.fimage), + (a.alpha = this.pulse)) + : (a.alpha = 1), + a.Draw(d, b, c, a.oimage), + 1) + : this[a.image ? "DrawColourImage" : "DrawColourText"]( + d, + h, + i, + e, + f, + g, + a, + b, + c, + ); + }), + (f.DrawColourText = function (f, h, i, j, g, e, a, b, c) { + var d = a.colour; + return (a.colour = e), (a.alpha = 1), a.Draw(f, b, c), (a.colour = d), 1; + }), + (f.DrawColourImage = function (a, q, p, o, n, m, i, r, l) { + var f = a.canvas, + e = ~~g(q, 0), + d = ~~g(p, 0), + c = (h(f.width - e, o) + 0.5) | 0, + b = (h(f.height - d, n) + 0.5) | 0, + j; + return ( + v ? ((v.width = c), (v.height = b)) : (v = k(c, b)), + !v + ? this.SetMethod("outline") + : ((j = v.getContext("2d")), + j.drawImage(f, e, d, c, b, 0, 0, c, b), + a.clearRect(e, d, c, b), + this.pulsate ? (i.alpha = 1 - w(this.pulse, 2)) : (i.alpha = 1), + i.Draw(a, r, l), + a.setTransform(1, 0, 0, 1, 0, 0), + a.save(), + a.beginPath(), + a.rect(e, d, c, b), + a.clip(), + (a.globalCompositeOperation = "source-in"), + (a.fillStyle = m), + a.fillRect(e, d, c, b), + a.restore(), + (a.globalAlpha = 1), + (a.globalCompositeOperation = "destination-over"), + a.drawImage(v, 0, 0, c, b, e, d, c, b), + (a.globalCompositeOperation = "source-over"), + 1) + ); + }), + (f.DrawAlt = function (b, a, c, d, f, g) { + var e = this.RealPreDraw(b, a, c, d, f, g); + return a.alt && (a.DrawImage(b, c, d, a.alt), (e = 1)), e; + }), + (f.DrawBlock = function (a, d, e, b, c, f) { + var g = h(this.radius, c / 2, b / 2); + (a.fillStyle = f), y(a, d, e, b, c, g); + }), + (f.DrawSimple = function (a, b, c, d, e, f) { + var g = this.tc; + return ( + a.setTransform(1, 0, 0, 1, 0, 0), + (a.strokeStyle = this.colour), + (a.lineWidth = g.outlineThickness), + (a.shadowBlur = a.shadowOffsetX = a.shadowOffsetY = 0), + (a.globalAlpha = f ? e : 1), + this.drawFunc(a, this.x, this.y, this.w, this.h, this.colour, b, c, d) + ); + }), + (f.DrawPulsate = function (h, d, e, f) { + var g = q() - this.ts, + c = this.tc, + b = + c.pulsateTo + + (1 - c.pulsateTo) * + (0.5 + l((2 * Math.PI * g) / (1e3 * c.pulsateTime)) / 2); + return ( + (this.pulse = b = a.Smooth(1, b)), this.DrawSimple(h, d, e, f, b, 1) + ); + }), + (f.Active = function (d, a, b) { + var c = + a >= this.x && + b >= this.y && + a <= this.x + this.w && + b <= this.y + this.h; + return c ? (this.ts = this.ts || q()) : (this.ts = null), c; + }), + (f.PreDraw = f.PostDraw = f.LastDraw = x); + function J(a, h, c, b, e, f, g, d, i, j, k, l, m, n) { + (this.tc = a), + (this.image = null), + (this.text = h), + (this.text_original = n), + (this.line_widths = []), + (this.title = c.title || null), + (this.a = c), + (this.position = new s(b[0], b[1], b[2])), + (this.x = this.y = this.z = 0), + (this.w = e), + (this.h = f), + (this.colour = g || a.textColour), + (this.bgColour = d || a.bgColour), + (this.bgRadius = i | 0), + (this.bgOutline = j || this.colour), + (this.bgOutlineThickness = k | 0), + (this.textFont = l || a.textFont), + (this.padding = m | 0), + (this.sc = this.alpha = 1), + (this.weighted = !a.weight), + (this.outline = new _(a, this)), + (this.audio = null); + } + (d = J.prototype), + (d.Init = function (b) { + var a = this.tc; + (this.textHeight = a.textHeight), + this.HasText() + ? this.Measure(a.ctxt, a) + : ((this.w = this.iw), (this.h = this.ih)), + (this.SetShadowColour = a.shadowAlpha + ? this.SetShadowColourAlpha + : this.SetShadowColourFixed), + this.SetDraw(a); + }), + (d.Draw = x), + (d.HasText = function () { + return this.text && this.text[0].length > 0; + }), + (d.EqualTo = function (a) { + var b = a.getElementsByTagName("img"); + return this.a.href != a.href + ? 0 + : b.length + ? this.image.src == b[0].src + : (a.innerText || a.textContent) == this.text_original; + }), + (d.SetImage = function (a) { + this.image = this.fimage = a; + }), + (d.SetAudio = function (a) { + (this.audio = a), this.audio.load(); + }), + (d.SetDraw = function (a) { + (this.Draw = this.fimage + ? a.ie > 7 + ? this.DrawImageIE + : this.DrawImage + : this.DrawText), + a.noSelect && (this.CheckActive = x); + }), + (d.MeasureText = function (d) { + var a, + e = this.text.length, + b = 0, + c; + for (a = 0; a < e; ++a) + (this.line_widths[a] = c = d.measureText(this.text[a]).width), + (b = g(b, c)); + return b; + }), + (d.Measure = function (e, a) { + var f = ae(this.text, this.textFont, this.textHeight), + b, + k, + h, + i, + g, + l, + j, + c, + d; + (j = f ? f.max.y + f.min.y : this.textHeight), + (e.font = this.font = this.textHeight + "px " + this.textFont), + (l = this.MeasureText(e)), + a.txtOpt && + ((b = a.txtScale), + (k = b * this.textHeight), + (h = k + "px " + this.textFont), + (i = [b * a.shadowOffset[0], b * a.shadowOffset[1]]), + (e.font = h), + (g = this.MeasureText(e)), + (d = new O( + this.text, + h, + g + b, + b * j + b, + g, + this.line_widths, + a.textAlign, + a.textVAlign, + b, + )), + this.image && + d.SetImage( + this.image, + this.iw, + this.ih, + a.imagePosition, + a.imagePadding, + a.imageAlign, + a.imageVAlign, + a.imageScale, + ), + (c = d.Create( + this.colour, + this.bgColour, + this.bgOutline, + b * this.bgOutlineThickness, + a.shadow, + b * a.shadowBlur, + i, + b * this.padding, + b * this.bgRadius, + )), + a.outlineMethod == "colour" + ? (this.oimage = d.Create( + this.outline.colour, + this.bgColour, + this.outline.colour, + b * this.bgOutlineThickness, + a.shadow, + b * a.shadowBlur, + i, + b * this.padding, + b * this.bgRadius, + )) + : a.outlineMethod == "size" && + ((f = ae( + this.text, + this.textFont, + this.textHeight + a.outlineIncrease, + )), + (k = f.max.y + f.min.y), + (h = + b * (this.textHeight + a.outlineIncrease) + + "px " + + this.textFont), + (e.font = h), + (g = this.MeasureText(e)), + (d = new O( + this.text, + h, + g + b, + b * k + b, + g, + this.line_widths, + a.textAlign, + a.textVAlign, + b, + )), + this.image && + d.SetImage( + this.image, + this.iw + a.outlineIncrease, + this.ih + a.outlineIncrease, + a.imagePosition, + a.imagePadding, + a.imageAlign, + a.imageVAlign, + a.imageScale, + ), + (this.oimage = d.Create( + this.colour, + this.bgColour, + this.bgOutline, + b * this.bgOutlineThickness, + a.shadow, + b * a.shadowBlur, + i, + b * this.padding, + b * this.bgRadius, + )), + (this.oscale = this.oimage.width / c.width), + a.outlineIncrease > 0 + ? (c = H(c, this.oimage.width, this.oimage.height)) + : (this.oimage = H(this.oimage, c.width, c.height))), + c && + ((this.fimage = c), + (l = this.fimage.width / b), + (j = this.fimage.height / b)), + this.SetDraw(a), + (a.txtOpt = !!this.fimage)), + (this.h = j), + (this.w = l); + }), + (d.SetFont = function (a, b, c, d) { + (this.textFont = a), + (this.colour = b), + (this.bgColour = c), + (this.bgOutline = d), + this.Measure(this.tc.ctxt, this.tc); + }), + (d.SetWeight = function (c) { + var b = this.tc, + e = b.weightMode.split(/[, ]/), + d, + a, + f = c.length; + if (!this.HasText()) return; + this.weighted = !0; + for (a = 0; a < f; ++a) + (d = e[a] || "size"), + "both" == d + ? (this.Weight( + c[a], + b.ctxt, + b, + "size", + b.min_weight[a], + b.max_weight[a], + a, + ), + this.Weight( + c[a], + b.ctxt, + b, + "colour", + b.min_weight[a], + b.max_weight[a], + a, + )) + : this.Weight( + c[a], + b.ctxt, + b, + d, + b.min_weight[a], + b.max_weight[a], + a, + ); + this.Measure(b.ctxt, b); + }), + (d.Weight = function (b, i, a, d, f, h, e) { + b = isNaN(b) ? 1 : b; + var c = (b - f) / (h - f); + "colour" == d + ? (this.colour = L(a, c, e)) + : "bgcolour" == d + ? (this.bgColour = L(a, c, e)) + : "bgoutline" == d + ? (this.bgOutline = L(a, c, e)) + : "outline" == d + ? (this.outline.colour = L(a, c, e)) + : "size" == d && + (a.weightSizeMin > 0 && a.weightSizeMax > a.weightSizeMin + ? (this.textHeight = + a.weightSize * + (a.weightSizeMin + (a.weightSizeMax - a.weightSizeMin) * c)) + : (this.textHeight = g(1, b * a.weightSize))); + }), + (d.SetShadowColourFixed = function (a, b, c) { + a.shadowColor = b; + }), + (d.SetShadowColourAlpha = function (a, b, c) { + a.shadowColor = aE(b, c); + }), + (d.DrawText = function (a, h, i) { + var e = this.tc, + g = this.x, + f = this.y, + c = this.sc, + b, + d; + (a.globalAlpha = this.alpha), + (a.fillStyle = this.colour), + e.shadow && this.SetShadowColour(a, e.shadow, this.alpha), + (a.font = this.font), + (g += h / c), + (f += i / c - this.h / 2); + for (b = 0; b < this.text.length; ++b) + (d = g), + "right" == e.textAlign + ? (d += this.w / 2 - this.line_widths[b]) + : "centre" == e.textAlign + ? (d -= this.line_widths[b] / 2) + : (d -= this.w / 2), + a.setTransform(c, 0, 0, c, c * d, c * f), + a.fillText(this.text[b], 0, 0), + (f += this.textHeight); + }), + (d.DrawImage = function (b, i, k, l) { + var e = this.x, + f = this.y, + a = this.sc, + j = l || this.fimage, + c = this.w, + d = this.h, + g = this.alpha, + h = this.shadow; + (b.globalAlpha = g), + h && this.SetShadowColour(b, h, g), + (e += i / a - c / 2), + (f += k / a - d / 2), + b.setTransform(a, 0, 0, a, a * e, a * f), + b.drawImage(j, 0, 0, c, d); + }), + (d.DrawImageIE = function (b, d, e) { + var c = this.fimage, + a = this.sc, + f = (c.width = this.w * a), + g = (c.height = this.h * a), + h = this.x * a + d - f / 2, + i = this.y * a + e - g / 2; + b.setTransform(1, 0, 0, 1, 0, 0), + (b.globalAlpha = this.alpha), + b.drawImage(c, h, i); + }), + (d.Calc = function (g, e) { + var a, + b = this.tc, + d = b.minBrightness, + f = b.maxBrightness, + c = b.max_radius; + return ( + (a = g.xform(this.position)), + (this.xformed = a), + (a = aI(b, a, b.stretchX, b.stretchY)), + (this.x = a.x), + (this.y = a.y), + (this.z = a.z), + (this.sc = a.w), + (this.alpha = e * G(d + ((f - d) * (c - this.z)) / (2 * c), 0, 1)), + this.xformed + ); + }), + (d.UpdateActive = function (h, e, f) { + var a = this.outline, + b = this.w, + c = this.h, + d = this.x - b / 2, + g = this.y - c / 2; + return a.Update(d, g, b, c, this.sc, this.z, e, f), a; + }), + (d.CheckActive = function (a, d, e) { + var b = this.tc, + c = this.UpdateActive(a, d, e); + return c.Active(a, b.mx, b.my) ? c : null; + }), + (d.Clicked = function (f) { + var b = this.a, + a = b.target, + d = b.href, + e; + if (a != "" && a != "_self") { + if (self.frames[a]) self.frames[a].document.location = d; + else { + try { + if (top.frames[a]) { + top.frames[a].document.location = d; + return; + } + } catch (a) {} + window.open(d, a); + } + return; + } + if (c.createEvent) { + if ( + ((e = c.createEvent("MouseEvents")), + e.initMouseEvent( + "click", + 1, + 1, + window, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + null, + ), + !b.dispatchEvent(e)) + ) + return; + } else if (b.fireEvent) if (!b.fireEvent("onclick")) return; + c.location = d; + }), + (d.StopAudio = function () { + this.audio && this.playing && this.audio.pause(), + (this.stopped = 1), + (this.playing = 0); + }), + (d.PlayAudio = function () { + if (e === "off" || this.tc.audioOff) return; + if (!e && !ag()) return; + var a = this.tc.audio, + c = this.tc.gain, + d = "suspended", + b; + if (this.audio) + if ( + (this.track || + ((this.track = e.createMediaElementSource(this.audio)), + (this.gain = e.createGain()), + this.track.connect(this.gain), + this.gain.connect(e.destination)), + (a = this.audio), + (c = this.gain), + !a.paused) + ) + return 1; + if (a) { + if ((e.state == d && e.resume(), e.state == d)) return; + return ( + (c.gain.value = h(2, g(0, this.tc.audioVolume * 1))), + (a.currentTime = 0), + (this.stopped = 0), + (b = a.play()), + b !== void 0 && + b.then((a) => { + this.stopped ? this.audio.pause() : (this.playing = 1); + }), + 1 + ); + } + }); + function a(f, o, k) { + var d, + i, + b = c.getElementById(f), + l = ["id", "class", "innerHTML"]; + if (!b) throw 0; + if ( + (n(window.G_vmlCanvasManager) && + ((b = window.G_vmlCanvasManager.initElement(b)), + (this.ie = parseFloat(navigator.appVersion.split("MSIE")[1]))), + b && (!b.getContext || !b.getContext("2d").fillText)) + ) { + i = c.createElement("DIV"); + for (d = 0; d < l.length; ++d) i[l[d]] = b[l[d]]; + throw (b.parentNode.insertBefore(i, b), b.parentNode.removeChild(b), 0); + } + for (d in a.options) + this[d] = k && n(k[d]) ? k[d] : n(a[d]) ? a[d] : a.options[d]; + if ( + ((this.canvas = b), + (this.ctxt = b.getContext("2d")), + (this.z1 = 250 / g(this.depth, 0.001)), + (this.z2 = this.z1 / this.zoom), + (this.radius = h(b.height, b.width) * 0.0075), + (this.max_radius = 100), + (this.max_weight = []), + (this.min_weight = []), + (this.textFont = this.textFont && Q(this.textFont)), + (this.textHeight *= 1), + (this.imageRadius = this.imageRadius.toString()), + (this.pulsateTo = G(this.pulsateTo, 0, 1)), + (this.minBrightness = G(this.minBrightness, 0, 1)), + (this.maxBrightness = G(this.maxBrightness, this.minBrightness, 1)), + (this.ctxt.textBaseline = "top"), + (this.lx = (this.lock + "").indexOf("x") + 1), + (this.ly = (this.lock + "").indexOf("y") + 1), + (this.frozen = this.dx = this.dy = this.fixedAnim = this.touchState = 0), + (this.fixedAlpha = 1), + (this.source = o || f), + (this.repeatTags = h(64, ~~this.repeatTags)), + (this.minTags = h(200, ~~this.minTags)), + ~~this.scrollPause > 0 + ? (a.scrollPause = ~~this.scrollPause) + : (this.scrollPause = 0), + this.minTags > 0 && + this.repeatTags < 1 && + (d = this.GetTags().length) && + (this.repeatTags = af(this.minTags / d) - 1), + (this.transform = m.Identity()), + (this.startTime = this.time = q()), + (this.mx = this.my = -1), + this.centreImage && av(this), + (this.Animate = this.dragControl + ? this.AnimateDrag + : this.AnimatePosition), + (this.animTiming = + typeof a[this.animTiming] == "function" + ? a[this.animTiming] + : a.Smooth), + this.shadowBlur || this.shadowOffset[0] || this.shadowOffset[1] + ? ((this.ctxt.shadowColor = this.shadow), + (this.shadow = this.ctxt.shadowColor), + (this.shadowAlpha = aD())) + : delete this.shadow, + this.activeAudio === !1 + ? (e = "off") + : this.activeAudio && this.LoadAudio(), + this.Load(), + o && + this.hideTags && + (function (b) { + a.loaded + ? b.HideTags() + : t( + "load", + function () { + b.HideTags(); + }, + window, + ); + })(this), + (this.yaw = this.initial ? this.initial[0] * this.maxSpeed : 0), + (this.pitch = this.initial ? this.initial[1] * this.maxSpeed : 0), + this.tooltip + ? ((this.ctitle = b.title), + (b.title = ""), + this.tooltip == "native" + ? (this.Tooltip = this.TooltipNative) + : ((this.Tooltip = this.TooltipDiv), + this.ttdiv || + ((this.ttdiv = c.createElement("div")), + (this.ttdiv.className = this.tooltipClass), + (this.ttdiv.style.position = "absolute"), + (this.ttdiv.style.zIndex = b.style.zIndex + 1), + t( + "mouseover", + function (a) { + a.target.style.display = "none"; + }, + this.ttdiv, + ), + c.body.appendChild(this.ttdiv)))) + : (this.Tooltip = this.TooltipNone), + !this.noMouse && !j[f]) + ) { + (j[f] = [ + ["mousemove", ad], + ["mouseout", an], + ["mouseup", aq], + ["touchstart", ar], + ["touchend", ac], + ["touchcancel", ac], + ["touchmove", au], + ]), + this.dragControl && + (j[f].push(["mousedown", ap]), j[f].push(["selectstart", x])), + this.wheelZoom && + (j[f].push(["mousewheel", ab]), j[f].push(["DOMMouseScroll", ab])), + this.scrollPause && j[f].push(["scroll", aw, window]); + for (d = 0; d < j[f].length; ++d) + (i = j[f][d]), t(i[0], i[1], i[2] ? i[2] : b); + } + a.started || + ((a.NextFrame = window.requestAnimationFrame ? az : aA), + (a.interval = this.interval), + a.NextFrame(this.interval), + (a.started = 1)); + } + (b = a.prototype), + (b.SourceElements = function () { + return c.querySelectorAll + ? c.querySelectorAll("#" + this.source) + : [c.getElementById(this.source)]; + }), + (b.HideTags = function () { + var b = this.SourceElements(), + a; + for (a = 0; a < b.length; ++a) b[a].style.display = "none"; + }), + (b.GetTags = function () { + var e = this.SourceElements(), + c, + f = [], + a, + b, + d; + for (d = 0; d <= this.repeatTags; ++d) + for (a = 0; a < e.length; ++a) { + c = e[a].getElementsByTagName("a"); + for (b = 0; b < c.length; ++b) f.push(c[b]); + } + return f; + }), + (b.Message = function (j) { + var g = [], + a, + f, + b = j.split(""), + d, + e, + h, + i; + for (a = 0; a < b.length; ++a) + b[a] != " " && + ((f = a - b.length / 2), + (d = c.createElement("A")), + (d.href = "#"), + (d.innerText = b[a]), + (h = 100 * o(f / 9)), + (i = -100 * l(f / 9)), + (e = new J( + this, + b[a], + d, + [h, 0, i], + 2, + 18, + "#000", + "#fff", + 0, + 0, + 0, + "monospace", + 2, + b[a], + )), + e.Init(), + g.push(e)); + return g; + }), + (b.AddAudio = function (b, c) { + if (e === "off") return; + var a = b.getElementsByTagName("audio"); + a.length && (c.SetAudio(a[0]), (this.hasAudio = 1)); + }), + (b.CreateTag = function (b) { + var e, + c, + a, + f, + d, + g, + h, + j, + k = [0, 0, 0], + l; + if ("text" != this.imageMode) + if (((e = b.getElementsByTagName("img")), e.length)) + if (((c = new Image()), (c.src = e[0].src), !this.imageMode)) + return ( + (a = new J(this, "", b, k, 0, 0)), + a.SetImage(c), + A(c, e[0], e[1], a, this), + this.AddAudio(b, a), + a + ); + if ( + ("image" != this.imageMode && + ((d = new V(b)), + (f = d.Lines()), + d.Empty() + ? (d = null) + : ((g = this.textFont || Q(i(b, "font-family"))), + this.splitWidth && + (f = d.SplitWidth( + this.splitWidth, + this.ctxt, + g, + this.textHeight, + )), + (h = + this.bgColour == "tag" + ? i(b, "background-color") + : this.bgColour), + (j = this.bgOutline == "tag" ? i(b, "color") : this.bgOutline))), + d || c) + ) + return ( + (a = new J( + this, + f, + b, + k, + 2, + this.textHeight + 2, + this.textColour || i(b, "color"), + h, + this.bgRadius, + j, + this.bgOutlineThickness, + g, + this.padding, + d && d.original, + )), + c ? (a.SetImage(c), A(c, e[0], e[1], a, this)) : a.Init(), + this.AddAudio(b, a), + a + ); + }), + (b.UpdateTag = function (a, b) { + var c = this.textColour || i(b, "color"), + d = this.textFont || Q(i(b, "font-family")), + e = this.bgColour == "tag" ? i(b, "background-color") : this.bgColour, + f = this.bgOutline == "tag" ? i(b, "color") : this.bgOutline; + (a.a = b), + (a.title = b.title), + (a.colour != c || + a.textFont != d || + a.bgColour != e || + a.bgOutline != f) && + a.SetFont(d, c, e, f); + }), + (b.Weight = function (d) { + var f = d.length, + c, + b, + a, + e = [], + g, + h = this.weightFrom ? this.weightFrom.split(/[, ]/) : [null], + i = h.length; + for (b = 0; b < f; ++b) { + e[b] = []; + for (a = 0; a < i; ++a) + (c = aj(d[b].a, h[a], this.textHeight)), + (!this.max_weight[a] || c > this.max_weight[a]) && + (this.max_weight[a] = c), + (!this.min_weight[a] || c < this.min_weight[a]) && + (this.min_weight[a] = c), + (e[b][a] = c); + } + for (a = 0; a < i; ++a) + this.max_weight[a] > this.min_weight[a] && (g = 1); + if (g) for (b = 0; b < f; ++b) d[b].SetWeight(e[b]); + }), + (b.Load = function () { + var c = this.GetTags(), + b = [], + d, + k, + l, + h, + i, + j, + f, + a, + e = [], + m = { sphere: aB, vcylinder: ax, hcylinder: aH, vring: aG, hring: aF }; + if (c.length) { + e.length = c.length; + for (a = 0; a < c.length; ++a) e[a] = a; + this.shuffleTags && ai(e), + (h = 100 * this.radiusX), + (i = 100 * this.radiusY), + (j = 100 * this.radiusZ), + (this.max_radius = g(h, g(i, j))); + for (a = 0; a < c.length; ++a) + (k = this.CreateTag(c[e[a]])), k && b.push(k); + this.weight && this.Weight(b, !0), + this.shapeArgs + ? (this.shapeArgs[0] = b.length) + : ((l = this.shape.toString().split(/[(),]/)), + (d = l.shift()), + typeof window[d] == "function" + ? (this.shape = window[d]) + : (this.shape = m[d] || m.sphere), + (this.shapeArgs = [b.length, h, i, j].concat(l))), + (f = this.shape.apply(this, this.shapeArgs)), + (this.listLength = b.length); + for (a = 0; a < b.length; ++a) + b[a].position = new s(f[a][0], f[a][1], f[a][2]); + } + this.noTagsMessage && + !b.length && + ((a = + this.imageMode && this.imageMode != "both" + ? this.imageMode + " " + : ""), + (b = this.Message("No " + a + "tags"))), + (this.taglist = b); + }), + (b.Update = function () { + var e = this.GetTags(), + d = [], + j = this.taglist, + k, + f = [], + c = [], + h, + i, + g, + a, + b; + if (!this.shapeArgs) return this.Load(); + if (e.length) { + (g = this.listLength = e.length), (i = j.length); + for (a = 0; a < i; ++a) d.push(j[a]), c.push(a); + for (a = 0; a < g; ++a) { + for (b = 0, k = 0; b < i; ++b) + j[b].EqualTo(e[a]) && (this.UpdateTag(d[b], e[a]), (k = c[b] = -1)); + k || f.push(a); + } + for (a = 0, b = 0; a < i; ++a) c[b] == -1 ? c.splice(b, 1) : ++b; + if (c.length) { + for (ai(c); c.length && f.length; ) + (a = c.shift()), (b = f.shift()), (d[a] = this.CreateTag(e[b])); + for ( + c.sort(function (a, b) { + return a - b; + }); + c.length; + ) + d.splice(c.pop(), 1); + } + for (b = d.length / (f.length + 1), a = 0; f.length; ) + d.splice(af(++a * b), 0, this.CreateTag(e[f.shift()])); + (this.shapeArgs[0] = g = d.length), + (h = this.shape.apply(this, this.shapeArgs)); + for (a = 0; a < g; ++a) + d[a].position = new s(h[a][0], h[a][1], h[a][2]); + this.weight && this.Weight(d); + } + this.taglist = d; + }), + (b.SetShadow = function (a) { + (a.shadowBlur = this.shadowBlur), + (a.shadowOffsetX = this.shadowOffset[0]), + (a.shadowOffsetY = this.shadowOffset[1]); + }), + (b.LoadAudio = function () { + if (!e && !ag()) return; + (this.audio = c.createElement("audio")), + (this.audio.src = this.activeAudio), + (this.track = e.createMediaElementSource(this.audio)), + (this.gain = e.createGain()), + this.track.connect(this.gain), + this.gain.connect(e.destination), + (this.hasAudio = 1), + (P = function (a) { + e.resume(), c.removeEventListener("click", P); + }), + c.addEventListener("click", P); + }), + (b.ShowAudioIcon = function () { + var a = this.audioIconSize, + c = this.canvas, + d = this.ctxt, + k = c.width - a - 3, + f = c.height - a - 3, + g = this.audioIconThickness, + h = "#000", + i = "#fff", + j = this.audioIconDark, + b = this.audioOff, + l = "suspended"; + if (!e) return; + b || (b = e.state === l), + this.audioIcon && + this.hasAudio && + ($(b, d, a, k, f, g + 1, j ? i : h), $(b, d, a, k, f, g, j ? h : i)); + }), + (b.CheckAudioIcon = function () { + var a = this.audioIconSize, + b = this.canvas, + c = this.audioIconThickness / 2, + d = b.width - a - 3 - c, + e = b.height - a - 3 - c; + if (this.audioIcon && this.mx >= d && this.my >= e) return !0; + }), + (b.ToggleAudio = function () { + var a = this.audioOff || (e && e.state === "suspended"); + a || (this.currentAudio && this.currentAudio.StopAudio()), + (this.audioOff = !a); + }), + (b.Draw = function (s) { + if (this.paused) return; + var l = this.canvas, + i = l.width, + j = l.height, + q = 0, + p = ((s - this.time) * a.interval) / 1e3, + h = i / 2 + this.offsetX, + g = j / 2 + this.offsetY, + d = this.ctxt, + b, + f, + c, + o = -1, + e = this.taglist, + k = e.length, + t = this.active && this.active.tag, + m = "", + u = this.frontSelect, + r = this.centreFunc == x, + n; + if (((this.time = s), this.frozen && this.drawn)) + return this.Animate(i, j, p); + (n = this.AnimateFixed()), d.setTransform(1, 0, 0, 1, 0, 0); + for (c = 0; c < k; ++c) e[c].Calc(this.transform, this.fixedAlpha); + if ( + ((e = ak(e, function (a, b) { + return b.z - a.z; + })), + n && this.fixedAnim.active) + ) + b = this.fixedAnim.tag.UpdateActive(d, h, g); + else if (((this.active = null), this.CheckAudioIcon())) m = "pointer"; + else { + for (c = 0; c < k; ++c) + (f = + this.mx >= 0 && + this.my >= 0 && + this.taglist[c].CheckActive(d, h, g)), + f && + f.sc > q && + (!u || f.z <= 0) && + ((b = f), (o = c), (b.tag = this.taglist[c]), (q = f.sc)); + this.active = b; + } + this.txtOpt || (this.shadow && this.SetShadow(d)), + d.clearRect(0, 0, i, j); + for (c = 0; c < k; ++c) { + if (!r && e[c].z <= 0) { + try { + this.centreFunc(d, i, j, h, g); + } catch (a) { + alert(a), (this.centreFunc = x); + } + r = !0; + } + (b && b.tag == e[c] && b.PreDraw(d, e[c], h, g)) || e[c].Draw(d, h, g), + b && b.tag == e[c] && b.PostDraw(d); + } + this.freezeActive && b + ? this.Freeze() + : (this.UnFreeze(), (this.drawn = k == this.listLength)), + this.fixedCallback && + (this.fixedCallback(this, this.fixedCallbackTag), + (this.fixedCallback = null)), + n || this.Animate(i, j, p), + b && + (b.LastDraw(d), + b.tag != t && + (this.currentAudio && + this.currentAudio != b.tag && + this.currentAudio.StopAudio(), + b.tag.PlayAudio() && (this.currentAudio = b.tag)), + (m = this.activeCursor)), + (l.style.cursor = m), + this.Tooltip(b, this.taglist[o]), + this.audioIcon && this.ShowAudioIcon(); + }), + (b.TooltipNone = function () {}), + (b.TooltipNative = function (b, a) { + b + ? (this.canvas.title = a && a.title ? a.title : "") + : (this.canvas.title = this.ctitle); + }), + (b.SetTTDiv = function (c, d) { + var a = this, + b = a.ttdiv.style; + c != a.ttdiv.innerHTML && (b.display = "none"), + (a.ttdiv.innerHTML = c), + d && (d.title = a.ttdiv.innerHTML), + b.display == "none" && + !a.tttimer && + (a.tttimer = setTimeout(function () { + var c = X(a.canvas.id); + (b.display = "block"), + (b.left = c.x + a.mx + "px"), + (b.top = c.y + a.my + 24 + "px"), + (a.tttimer = null); + }, a.tooltipDelay)); + }), + (b.TooltipDiv = function (b, a) { + b && a && a.title + ? this.SetTTDiv(a.title, a) + : !b && this.mx != -1 && this.my != -1 && this.ctitle.length + ? this.SetTTDiv(this.ctitle) + : (this.ttdiv.style.display = "none"); + }), + (b.Transform = function (c, a, b) { + if (a || b) { + var d = o(a), + e = l(a), + f = o(b), + g = l(b), + h = new m([g, 0, f, 0, 1, 0, -f, 0, g]), + i = new m([1, 0, 0, 0, e, -d, 0, d, e]); + c.transform = c.transform.mul(h.mul(i)); + } + }), + (b.AnimateFixed = function () { + var a, b, c, d, e; + return ( + !!(this.fadeIn && + ((b = q() - this.startTime), + b >= this.fadeIn + ? ((this.fadeIn = 0), (this.fixedAlpha = 1)) + : (this.fixedAlpha = b / this.fadeIn)), + this.fixedAnim) && + (this.fixedAnim.transform || + (this.fixedAnim.transform = this.transform), + (a = this.fixedAnim), + (b = q() - a.t0), + (c = a.angle), + d, + (e = this.animTiming(a.t, b)), + (this.transform = a.transform), + b >= a.t + ? ((this.fixedCallbackTag = a.tag), + (this.fixedCallback = a.cb), + (this.fixedAnim = this.yaw = this.pitch = 0)) + : (c *= e), + (d = m.Rotation(c, a.axis)), + (this.transform = this.transform.mul(d)), + this.fixedAnim != 0) + ); + }), + (b.AnimatePosition = function (g, h, f) { + var a = this, + d = a.mx, + e = a.my, + b, + c; + !a.frozen && d >= 0 && e >= 0 && d < g && e < h + ? ((b = a.maxSpeed), + (c = a.reverse ? -1 : 1), + a.lx || (a.yaw = ((d * 2 * b) / g - b) * c * f), + a.ly || (a.pitch = ((e * 2 * b) / h - b) * -c * f), + (a.initial = null)) + : a.initial || + (a.frozen && !a.freezeDecel ? (a.yaw = a.pitch = 0) : a.Decel(a)), + this.Transform(a, a.pitch, a.yaw); + }), + (b.AnimateDrag = function (d, e, c) { + var a = this, + b = (100 * c * a.maxSpeed) / a.max_radius / a.zoom; + a.dx || a.dy + ? (a.lx || (a.yaw = (a.dx * b) / a.stretchX), + a.ly || (a.pitch = (a.dy * -b) / a.stretchY), + (a.dx = a.dy = 0), + (a.initial = null)) + : a.initial || a.Decel(a), + this.Transform(a, a.pitch, a.yaw); + }), + (b.Freeze = function () { + this.frozen || + ((this.preFreeze = [this.yaw, this.pitch]), + (this.frozen = 1), + (this.drawn = 0)); + }), + (b.UnFreeze = function () { + this.frozen && + ((this.yaw = this.preFreeze[0]), + (this.pitch = this.preFreeze[1]), + (this.frozen = 0)); + }), + (b.Decel = function (a) { + var b = a.minSpeed, + c = p(a.yaw), + d = p(a.pitch); + !a.lx && c > b && (a.yaw = c > a.z0 ? a.yaw * a.decel : 0), + !a.ly && d > b && (a.pitch = d > a.z0 ? a.pitch * a.decel : 0); + }), + (b.Zoom = function (a) { + (this.z2 = this.z1 * (1 / a)), (this.drawn = 0); + }), + (b.Clicked = function (b) { + if (this.CheckAudioIcon()) { + this.ToggleAudio(); + return; + } + var a = this.active; + try { + a && + a.tag && + (this.clickToFront === !1 || this.clickToFront === null + ? a.tag.Clicked(b) + : this.TagToFront( + a.tag, + this.clickToFront, + function () { + a.tag.Clicked(b); + }, + !0, + )); + } catch (a) {} + }), + (b.Wheel = function (a) { + var b = this.zoom + this.zoomStep * (a ? 1 : -1); + (this.zoom = h(this.zoomMax, g(this.zoomMin, b))), this.Zoom(this.zoom); + }), + (b.BeginDrag = function (a) { + (this.down = K(a, this.canvas)), + (a.cancelBubble = !0), + (a.returnValue = !1), + a.preventDefault && a.preventDefault(); + }), + (b.Drag = function (e, a) { + if (this.dragControl && this.down) { + var d = this.dragThreshold * this.dragThreshold, + b = a.x - this.down.x, + c = a.y - this.down.y; + (this.dragging || b * b + c * c > d) && + ((this.dx = b), (this.dy = c), (this.dragging = 1), (this.down = a)); + } + return this.dragging; + }), + (b.EndDrag = function () { + var a = this.dragging; + return (this.dragging = this.down = null), a; + }); + function ah(a) { + var b = a.targetTouches[0], + c = a.targetTouches[1]; + return E(w(c.pageX - b.pageX, 2) + w(c.pageY - b.pageY, 2)); + } + (b.BeginPinch = function (a) { + (this.pinched = [ah(a), this.zoom]), a.preventDefault && a.preventDefault(); + }), + (b.Pinch = function (d) { + var b, + c, + a = this.pinched; + if (!a) return; + (c = ah(d)), + (b = (a[1] * c) / a[0]), + (this.zoom = h(this.zoomMax, g(this.zoomMin, b))), + this.Zoom(this.zoom); + }), + (b.EndPinch = function (a) { + this.pinched = null; + }), + (b.Pause = function () { + this.paused = !0; + }), + (b.Resume = function () { + this.paused = !1; + }), + (b.SetSpeed = function (a) { + (this.initial = a), + (this.yaw = a[0] * this.maxSpeed), + (this.pitch = a[1] * this.maxSpeed); + }), + (b.FindTag = function (a) { + if (!n(a)) return null; + if ((n(a.index) && (a = a.index), !B(a))) return this.taglist[a]; + var c, d, b; + n(a.id) + ? ((c = "id"), (d = a.id)) + : n(a.text) && ((c = "innerText"), (d = a.text)); + for (b = 0; b < this.taglist.length; ++b) + if (this.taglist[b].a[c] == d) return this.taglist[b]; + }), + (b.RotateTag = function (a, h, i, j, f, g) { + var b = a.Calc(this.transform, 1), + c = new s(b.x, b.y, b.z), + d = ay(i, h), + e = c.angle(d), + k = c.cross(d).unit(); + e == 0 + ? ((this.fixedCallbackTag = a), (this.fixedCallback = f)) + : (this.fixedAnim = { + angle: -e, + axis: k, + t: j, + t0: q(), + cb: f, + tag: a, + active: g, + }); + }), + (b.TagToFront = function (a, b, c, d) { + this.RotateTag(a, 0, 0, b, c, d); + }), + (b.Volume = function (a) { + this.audioVolume = a * 1; + }), + (a.Start = function (b, c, d) { + a.Delete(b), (a.tc[b] = new a(b, c, d)); + }); + function N(c, b) { + a.tc[b] && a.tc[b][c](); + } + (a.Linear = function (a, b) { + return b / a; + }), + (a.Smooth = function (a, b) { + return 0.5 - l((b * Math.PI) / a) / 2; + }), + (a.Pause = function (a) { + N("Pause", a); + }), + (a.Resume = function (a) { + N("Resume", a); + }), + (a.Reload = function (a) { + N("Load", a); + }), + (a.Update = function (a) { + N("Update", a); + }), + (a.SetSpeed = function (c, b) { + return ( + !!(B(b) && a.tc[c] && !isNaN(b[0]) && !isNaN(b[1])) && + (a.tc[c].SetSpeed(b), !0) + ); + }), + (a.TagToFront = function (c, b) { + return !!B(b) && ((b.lat = b.lng = 0), a.RotateTag(c, b)); + }), + (a.RotateTag = function (c, b) { + if (B(b) && a.tc[c]) { + isNaN(b.time) && (b.time = 500); + var d = a.tc[c].FindTag(b); + if (d) + return ( + a.tc[c].RotateTag(d, b.lat, b.lng, b.time, b.callback, b.active), !0 + ); + } + return !1; + }), + (a.Delete = function (b) { + var d, e; + if (j[b]) + if (((e = c.getElementById(b)), e)) + for (d = 0; d < j[b].length; ++d) am(j[b][d][0], j[b][d][1], e); + delete j[b], delete a.tc[b]; + }), + (a.tc = {}), + (a.options = { + z1: 2e4, + z2: 2e4, + z0: 2e-4, + freezeActive: !1, + freezeDecel: !1, + activeCursor: "pointer", + pulsateTo: 1, + pulsateTime: 3, + reverse: !1, + depth: 0.5, + maxSpeed: 0.05, + minSpeed: 0, + decel: 0.95, + interval: 20, + minBrightness: 0.1, + maxBrightness: 1, + outlineColour: "#ffff99", + outlineThickness: 2, + outlineOffset: 5, + outlineMethod: "outline", + outlineRadius: 0, + textColour: "#ff99ff", + textHeight: 15, + textFont: "Helvetica, Arial, sans-serif", + shadow: "#000", + shadowBlur: 0, + shadowOffset: [0, 0], + initial: null, + hideTags: !0, + zoom: 1, + weight: !1, + weightMode: "size", + weightFrom: null, + weightSize: 1, + weightSizeMin: null, + weightSizeMax: null, + weightGradient: { 0: "#f00", 0.33: "#ff0", 0.66: "#0f0", 1: "#00f" }, + txtOpt: !0, + txtScale: 2, + frontSelect: !1, + wheelZoom: !0, + zoomMin: 0.3, + zoomMax: 3, + zoomStep: 0.05, + shape: "sphere", + lock: null, + tooltip: null, + tooltipDelay: 300, + tooltipClass: "tctooltip", + radiusX: 1, + radiusY: 1, + radiusZ: 1, + stretchX: 1, + stretchY: 1, + offsetX: 0, + offsetY: 0, + shuffleTags: !1, + noSelect: !1, + noMouse: !1, + imageScale: 1, + paused: !1, + dragControl: !1, + dragThreshold: 4, + centreFunc: x, + splitWidth: 0, + animTiming: "Smooth", + clickToFront: !1, + fadeIn: 0, + padding: 0, + bgColour: null, + bgRadius: 0, + bgOutline: null, + bgOutlineThickness: 0, + outlineIncrease: 4, + textAlign: "centre", + textVAlign: "middle", + imageMode: null, + imagePosition: null, + imagePadding: 2, + imageAlign: "centre", + imageVAlign: "middle", + noTagsMessage: !0, + centreImage: null, + pinchZoom: !1, + repeatTags: 0, + minTags: 0, + imageRadius: 0, + scrollPause: !1, + outlineDash: 0, + outlineDashSpace: 0, + outlineDashSpeed: 1, + activeAudio: "", + audioVolume: 1, + audioIcon: 1, + audioIconSize: 20, + audioIconThickness: 2, + audioIconDark: 0, + altImage: 0, + }); + for (r in a.options) a[r] = a.options[r]; + (window.TagCanvas = a), + t( + "load", + function () { + a.loaded = 1; + }, + window, + ); +})(); diff --git a/fe_calckey/frontend/client/package.json b/fe_calckey/frontend/client/package.json new file mode 100644 index 0000000..4cb60bb --- /dev/null +++ b/fe_calckey/frontend/client/package.json @@ -0,0 +1,95 @@ +{ + "name": "client", + "private": true, + "scripts": { + "watch": "pnpm vite build --watch --mode development", + "build": "pnpm vite build", + "lint": "pnpm rome check \"src/**/*.{ts,vue}\"", + "format": "pnpm prettier --write '**/*.vue'" + }, + "devDependencies": { + "@discordapp/twemoji": "14.1.2", + "@phosphor-icons/web": "^2.0.3", + "@rollup/plugin-alias": "3.1.9", + "@rollup/plugin-json": "4.1.0", + "@rollup/pluginutils": "^4.2.1", + "@syuilo/aiscript": "0.11.1", + "@types/escape-regexp": "0.0.1", + "@types/glob": "8.1.0", + "@types/gulp": "4.0.11", + "@types/gulp-rename": "2.0.2", + "@types/katex": "0.16.0", + "@types/matter-js": "0.18.2", + "@types/punycode": "2.1.0", + "@types/seedrandom": "3.0.5", + "@types/throttle-debounce": "5.0.0", + "@types/tinycolor2": "1.4.3", + "@types/uuid": "8.3.4", + "@vitejs/plugin-vue": "4.2.3", + "@vue/compiler-sfc": "3.3.4", + "autobind-decorator": "2.4.0", + "autosize": "5.0.2", + "blurhash": "1.1.5", + "broadcast-channel": "4.19.1", + "browser-image-resizer": "github:misskey-dev/browser-image-resizer", + "calckey-js": "workspace:*", + "chart.js": "4.3.0", + "chartjs-adapter-date-fns": "3.0.0", + "chartjs-chart-matrix": "^2.0.1", + "chartjs-plugin-gradient": "0.6.1", + "chartjs-plugin-zoom": "2.0.1", + "city-timezones": "^1.2.1", + "compare-versions": "5.0.3", + "cropperjs": "2.0.0-beta.2", + "cross-env": "7.0.3", + "cypress": "10.11.0", + "date-fns": "2.30.0", + "emojilib": "github:thatonecalculator/emojilib", + "escape-regexp": "0.0.1", + "eventemitter3": "4.0.7", + "focus-trap": "^7.4.3", + "focus-trap-vue": "^4.0.2", + "gsap": "^3.11.5", + "idb-keyval": "6.2.1", + "insert-text-at-cursor": "0.3.0", + "json5": "2.2.3", + "katex": "0.16.7", + "matter-js": "0.18.0", + "mfm-js": "0.23.3", + "photoswipe": "5.3.7", + "prettier": "2.8.8", + "prettier-plugin-vue": "1.1.6", + "prismjs": "1.29.0", + "punycode": "2.1.1", + "querystring": "0.2.1", + "rndstr": "1.0.0", + "rollup": "3.23.1", + "s-age": "1.1.2", + "sass": "1.62.1", + "seedrandom": "3.0.5", + "start-server-and-test": "1.15.2", + "strict-event-emitter-types": "2.0.0", + "stringz": "2.1.0", + "swiper": "9.3.2", + "syuilo-password-strength": "0.0.1", + "textarea-caret": "3.1.0", + "three": "0.146.0", + "throttle-debounce": "5.0.0", + "tinycolor2": "1.5.2", + "tsc-alias": "1.8.6", + "tsconfig-paths": "4.2.0", + "twemoji-parser": "14.0.0", + "typescript": "5.1.3", + "unicode-emoji-json": "^0.4.0", + "uuid": "9.0.0", + "vanilla-tilt": "1.8.0", + "vite": "4.3.9", + "vite-plugin-compression": "^0.5.1", + "vue": "3.3.4", + "vue-isyourpasswordsafe": "^2.0.0", + "vue-plyr": "^7.0.0", + "vue-prism-editor": "2.0.0-alpha.2", + "vue3-otp-input": "^0.4.1", + "vuedraggable": "4.1.0" + } +} diff --git a/fe_calckey/frontend/client/src/account.ts b/fe_calckey/frontend/client/src/account.ts new file mode 100644 index 0000000..6d85829 --- /dev/null +++ b/fe_calckey/frontend/client/src/account.ts @@ -0,0 +1,294 @@ +import { defineAsyncComponent, reactive } from "vue"; +import * as misskey from "calckey-js"; +import { i18n } from "./i18n"; +import { del, get, set } from "@/scripts/idb-proxy"; +import { apiUrl } from "@/config"; +import { waiting, api, popup, popupMenu, success, alert } from "@/os"; +import { unisonReload, reloadChannel } from "@/scripts/unison-reload"; + +// TODO: 他のタブと永続化されたstateを同期 + +type Account = misskey.entities.MeDetailed; + +const accountData = localStorage.getItem("account"); + +// TODO: 外部からはreadonlyに +export const $i = accountData + ? reactive(JSON.parse(accountData) as Account) + : null; + +export const iAmModerator = $i != null && ($i.isAdmin || $i.isModerator); +export const iAmAdmin = $i?.isAdmin; + +export async function signout() { + waiting(); + localStorage.removeItem("account"); + + await removeAccount($i.id); + + const accounts = await getAccounts(); + + //#region Remove service worker registration + try { + if (navigator.serviceWorker.controller) { + const registration = await navigator.serviceWorker.ready; + const push = await registration.pushManager.getSubscription(); + if (push) { + await fetch(`${apiUrl}/sw/unregister`, { + method: "POST", + body: JSON.stringify({ + i: $i.token, + endpoint: push.endpoint, + }), + }); + } + } + + if (accounts.length === 0) { + await navigator.serviceWorker.getRegistrations().then((registrations) => { + return Promise.all( + registrations.map((registration) => registration.unregister()), + ); + }); + } + } catch (err) {} + //#endregion + + document.cookie = "igi=; path=/"; + + if (accounts.length > 0) login(accounts[0].token); + else unisonReload("/"); +} + +export async function getAccounts(): Promise< + { id: Account["id"]; token: Account["token"] }[] +> { + return (await get("accounts")) || []; +} + +export async function addAccount(id: Account["id"], token: Account["token"]) { + const accounts = await getAccounts(); + if (!accounts.some((x) => x.id === id)) { + await set("accounts", accounts.concat([{ id, token }])); + } +} + +export async function removeAccount(id: Account["id"]) { + const accounts = await getAccounts(); + accounts.splice( + accounts.findIndex((x) => x.id === id), + 1, + ); + + if (accounts.length > 0) await set("accounts", accounts); + else await del("accounts"); +} + +function fetchAccount(token: string): Promise { + return new Promise((done, fail) => { + // Fetch user + fetch(`${apiUrl}/i`, { + method: "POST", + body: JSON.stringify({ + i: token, + }), + }) + .then((res) => res.json()) + .then((res) => { + if (res.error) { + if (res.error.id === "a8c724b3-6e9c-4b46-b1a8-bc3ed6258370") { + showSuspendedDialog().then(() => { + signout(); + }); + } else { + alert({ + type: "error", + title: i18n.ts.failedToFetchAccountInformation, + text: JSON.stringify(res.error), + }); + } + } else { + res.token = token; + done(res); + } + }) + .catch(fail); + }); +} + +export function updateAccount(accountData) { + for (const [key, value] of Object.entries(accountData)) { + $i[key] = value; + } + localStorage.setItem("account", JSON.stringify($i)); +} + +export function refreshAccount() { + return fetchAccount($i.token).then(updateAccount); +} + +export async function login(token: Account["token"], redirect?: string) { + waiting(); + if (_DEV_) console.log("logging as token ", token); + const me = await fetchAccount(token); + localStorage.setItem("account", JSON.stringify(me)); + document.cookie = `token=${token}; path=/; max-age=31536000`; // bull dashboardの認証とかで使う + await addAccount(me.id, token); + + if (redirect) { + // 他のタブは再読み込みするだけ + reloadChannel.postMessage(null); + // このページはredirectで指定された先に移動 + location.href = redirect; + return; + } + + unisonReload(); +} + +export async function openAccountMenu( + opts: { + includeCurrentAccount?: boolean; + withExtraOperation: boolean; + active?: misskey.entities.UserDetailed["id"]; + onChoose?: (account: misskey.entities.UserDetailed) => void; + }, + ev: MouseEvent, +) { + function showSigninDialog() { + popup( + defineAsyncComponent(() => import("@/components/MkSigninDialog.vue")), + {}, + { + done: (res) => { + addAccount(res.id, res.i); + success(); + }, + }, + "closed", + ); + } + + function createAccount() { + popup( + defineAsyncComponent(() => import("@/components/MkSignupDialog.vue")), + {}, + { + done: (res) => { + addAccount(res.id, res.i); + switchAccountWithToken(res.i); + }, + }, + "closed", + ); + } + + async function switchAccount(account: misskey.entities.UserDetailed) { + const storedAccounts = await getAccounts(); + const token = storedAccounts.find((x) => x.id === account.id).token; + switchAccountWithToken(token); + } + + function switchAccountWithToken(token: string) { + login(token); + } + + const storedAccounts = await getAccounts().then((accounts) => + accounts.filter((x) => x.id !== $i.id), + ); + const accountsPromise = api("users/show", { + userIds: storedAccounts.map((x) => x.id), + }); + + function createItem(account: misskey.entities.UserDetailed) { + return { + type: "user", + user: account, + active: opts.active != null ? opts.active === account.id : false, + action: () => { + if (opts.onChoose) { + opts.onChoose(account); + } else { + switchAccount(account); + } + }, + }; + } + + const accountItemPromises = storedAccounts.map( + (a) => + new Promise((res) => { + accountsPromise.then((accounts) => { + const account = accounts.find((x) => x.id === a.id); + if (account == null) return res(null); + res(createItem(account)); + }); + }), + ); + + if (opts.withExtraOperation) { + popupMenu( + [ + ...[ + { + type: "link", + text: i18n.ts.profile, + to: `/@${$i.username}`, + avatar: $i, + }, + null, + ...(opts.includeCurrentAccount ? [createItem($i)] : []), + ...accountItemPromises, + { + type: "parent", + icon: "ph-plus ph-bold ph-lg", + text: i18n.ts.addAccount, + children: [ + { + text: i18n.ts.existingAccount, + action: () => { + showSigninDialog(); + }, + }, + { + text: i18n.ts.createAccount, + action: () => { + createAccount(); + }, + }, + ], + }, + { + type: "link", + icon: "ph-users ph-bold ph-lg", + text: i18n.ts.manageAccounts, + to: "/settings/accounts", + }, + { + type: "button", + icon: "ph-sign-out ph-bold ph-lg", + text: i18n.ts.logout, + action: () => { + signout(); + }, + }, + ], + ], + ev.currentTarget ?? ev.target, + { + align: "left", + }, + ); + } else { + popupMenu( + [ + ...(opts.includeCurrentAccount ? [createItem($i)] : []), + ...accountItemPromises, + ], + ev.currentTarget ?? ev.target, + { + align: "left", + }, + ); + } +} diff --git a/fe_calckey/frontend/client/src/components/MkAbuseReport.vue b/fe_calckey/frontend/client/src/components/MkAbuseReport.vue new file mode 100644 index 0000000..ccb85d7 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkAbuseReport.vue @@ -0,0 +1,147 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkAbuseReportWindow.vue b/fe_calckey/frontend/client/src/components/MkAbuseReportWindow.vue new file mode 100644 index 0000000..19b8ba5 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkAbuseReportWindow.vue @@ -0,0 +1,86 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkAnalogClock.vue b/fe_calckey/frontend/client/src/components/MkAnalogClock.vue new file mode 100644 index 0000000..43d81f2 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkAnalogClock.vue @@ -0,0 +1,280 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkAutocomplete.vue b/fe_calckey/frontend/client/src/components/MkAutocomplete.vue new file mode 100644 index 0000000..37207a1 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkAutocomplete.vue @@ -0,0 +1,564 @@ + + + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkAvatars.vue b/fe_calckey/frontend/client/src/components/MkAvatars.vue new file mode 100644 index 0000000..d92eee2 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkAvatars.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkButton.vue b/fe_calckey/frontend/client/src/components/MkButton.vue new file mode 100644 index 0000000..aa0adb5 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkButton.vue @@ -0,0 +1,254 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkCaptcha.vue b/fe_calckey/frontend/client/src/components/MkCaptcha.vue new file mode 100644 index 0000000..554d4ac --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkCaptcha.vue @@ -0,0 +1,136 @@ + + + diff --git a/fe_calckey/frontend/client/src/components/MkChannelFollowButton.vue b/fe_calckey/frontend/client/src/components/MkChannelFollowButton.vue new file mode 100644 index 0000000..b4cb1a8 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkChannelFollowButton.vue @@ -0,0 +1,135 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkChannelList.vue b/fe_calckey/frontend/client/src/components/MkChannelList.vue new file mode 100644 index 0000000..c284736 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkChannelList.vue @@ -0,0 +1,42 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkChannelPreview.vue b/fe_calckey/frontend/client/src/components/MkChannelPreview.vue new file mode 100644 index 0000000..12df63b --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkChannelPreview.vue @@ -0,0 +1,174 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkChart.vue b/fe_calckey/frontend/client/src/components/MkChart.vue new file mode 100644 index 0000000..310d980 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkChart.vue @@ -0,0 +1,1112 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkChartTooltip.vue b/fe_calckey/frontend/client/src/components/MkChartTooltip.vue new file mode 100644 index 0000000..659dc6d --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkChartTooltip.vue @@ -0,0 +1,68 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkCheatSheetDialog.vue b/fe_calckey/frontend/client/src/components/MkCheatSheetDialog.vue new file mode 100644 index 0000000..3b723cd --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkCheatSheetDialog.vue @@ -0,0 +1,39 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkCode.core.vue b/fe_calckey/frontend/client/src/components/MkCode.core.vue new file mode 100644 index 0000000..c397a95 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkCode.core.vue @@ -0,0 +1,30 @@ + + + diff --git a/fe_calckey/frontend/client/src/components/MkCode.vue b/fe_calckey/frontend/client/src/components/MkCode.vue new file mode 100644 index 0000000..f012b53 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkCode.vue @@ -0,0 +1,17 @@ + + + diff --git a/fe_calckey/frontend/client/src/components/MkContainer.vue b/fe_calckey/frontend/client/src/components/MkContainer.vue new file mode 100644 index 0000000..62c198c --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkContainer.vue @@ -0,0 +1,308 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkContextMenu.vue b/fe_calckey/frontend/client/src/components/MkContextMenu.vue new file mode 100644 index 0000000..3e94dd5 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkContextMenu.vue @@ -0,0 +1,93 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkCropperDialog.vue b/fe_calckey/frontend/client/src/components/MkCropperDialog.vue new file mode 100644 index 0000000..cce9485 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkCropperDialog.vue @@ -0,0 +1,187 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkCwButton.vue b/fe_calckey/frontend/client/src/components/MkCwButton.vue new file mode 100644 index 0000000..f7fcb1d --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkCwButton.vue @@ -0,0 +1,119 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkDateSeparatedList.vue b/fe_calckey/frontend/client/src/components/MkDateSeparatedList.vue new file mode 100644 index 0000000..7ecc918 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkDateSeparatedList.vue @@ -0,0 +1,214 @@ + + + diff --git a/fe_calckey/frontend/client/src/components/MkDialog.vue b/fe_calckey/frontend/client/src/components/MkDialog.vue new file mode 100644 index 0000000..f870005 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkDialog.vue @@ -0,0 +1,520 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkDigitalClock.vue b/fe_calckey/frontend/client/src/components/MkDigitalClock.vue new file mode 100644 index 0000000..c4edecb --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkDigitalClock.vue @@ -0,0 +1,88 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkDrive.file.vue b/fe_calckey/frontend/client/src/components/MkDrive.file.vue new file mode 100644 index 0000000..ab3953f --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkDrive.file.vue @@ -0,0 +1,378 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkDrive.folder.vue b/fe_calckey/frontend/client/src/components/MkDrive.folder.vue new file mode 100644 index 0000000..aff6219 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkDrive.folder.vue @@ -0,0 +1,352 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkDrive.navFolder.vue b/fe_calckey/frontend/client/src/components/MkDrive.navFolder.vue new file mode 100644 index 0000000..aa0bea1 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkDrive.navFolder.vue @@ -0,0 +1,139 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkDrive.vue b/fe_calckey/frontend/client/src/components/MkDrive.vue new file mode 100644 index 0000000..d52e796 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkDrive.vue @@ -0,0 +1,915 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkDriveFileThumbnail.vue b/fe_calckey/frontend/client/src/components/MkDriveFileThumbnail.vue new file mode 100644 index 0000000..48b5428 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkDriveFileThumbnail.vue @@ -0,0 +1,111 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkDriveSelectDialog.vue b/fe_calckey/frontend/client/src/components/MkDriveSelectDialog.vue new file mode 100644 index 0000000..6b419e2 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkDriveSelectDialog.vue @@ -0,0 +1,78 @@ + + + diff --git a/fe_calckey/frontend/client/src/components/MkDriveWindow.vue b/fe_calckey/frontend/client/src/components/MkDriveWindow.vue new file mode 100644 index 0000000..9b94e67 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkDriveWindow.vue @@ -0,0 +1,30 @@ + + + diff --git a/fe_calckey/frontend/client/src/components/MkEmojiPicker.section.vue b/fe_calckey/frontend/client/src/components/MkEmojiPicker.section.vue new file mode 100644 index 0000000..ffe891a --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkEmojiPicker.section.vue @@ -0,0 +1,94 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkEmojiPicker.vue b/fe_calckey/frontend/client/src/components/MkEmojiPicker.vue new file mode 100644 index 0000000..260898e --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkEmojiPicker.vue @@ -0,0 +1,688 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkEmojiPickerDialog.vue b/fe_calckey/frontend/client/src/components/MkEmojiPickerDialog.vue new file mode 100644 index 0000000..4cff9f2 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkEmojiPickerDialog.vue @@ -0,0 +1,81 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkFeaturedPhotos.vue b/fe_calckey/frontend/client/src/components/MkFeaturedPhotos.vue new file mode 100644 index 0000000..3faf38c --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkFeaturedPhotos.vue @@ -0,0 +1,26 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkFileListForAdmin.vue b/fe_calckey/frontend/client/src/components/MkFileListForAdmin.vue new file mode 100644 index 0000000..1d485a1 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkFileListForAdmin.vue @@ -0,0 +1,142 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkFileTypeIcon.vue b/fe_calckey/frontend/client/src/components/MkFileTypeIcon.vue new file mode 100644 index 0000000..388b6d7 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkFileTypeIcon.vue @@ -0,0 +1,17 @@ + + + diff --git a/fe_calckey/frontend/client/src/components/MkFolder.vue b/fe_calckey/frontend/client/src/components/MkFolder.vue new file mode 100644 index 0000000..3ef54d9 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkFolder.vue @@ -0,0 +1,195 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkFollowButton.vue b/fe_calckey/frontend/client/src/components/MkFollowButton.vue new file mode 100644 index 0000000..a1c2317 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkFollowButton.vue @@ -0,0 +1,275 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkForgotPassword.vue b/fe_calckey/frontend/client/src/components/MkForgotPassword.vue new file mode 100644 index 0000000..07f0866 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkForgotPassword.vue @@ -0,0 +1,110 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkFormDialog.vue b/fe_calckey/frontend/client/src/components/MkFormDialog.vue new file mode 100644 index 0000000..9b1cab7 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkFormDialog.vue @@ -0,0 +1,228 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkFormula.vue b/fe_calckey/frontend/client/src/components/MkFormula.vue new file mode 100644 index 0000000..2dacad1 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkFormula.vue @@ -0,0 +1,26 @@ + + + diff --git a/fe_calckey/frontend/client/src/components/MkFormulaCore.vue b/fe_calckey/frontend/client/src/components/MkFormulaCore.vue new file mode 100644 index 0000000..2db4c7d --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkFormulaCore.vue @@ -0,0 +1,36 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkGalleryPostPreview.vue b/fe_calckey/frontend/client/src/components/MkGalleryPostPreview.vue new file mode 100644 index 0000000..2ef339a --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkGalleryPostPreview.vue @@ -0,0 +1,120 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkGoogle.vue b/fe_calckey/frontend/client/src/components/MkGoogle.vue new file mode 100644 index 0000000..ba909b3 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkGoogle.vue @@ -0,0 +1,59 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkHeatmap.vue b/fe_calckey/frontend/client/src/components/MkHeatmap.vue new file mode 100644 index 0000000..2d2aef2 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkHeatmap.vue @@ -0,0 +1,268 @@ + + + diff --git a/fe_calckey/frontend/client/src/components/MkImageViewer.vue b/fe_calckey/frontend/client/src/components/MkImageViewer.vue new file mode 100644 index 0000000..51173d9 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkImageViewer.vue @@ -0,0 +1,92 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkImgWithBlurhash.vue b/fe_calckey/frontend/client/src/components/MkImgWithBlurhash.vue new file mode 100644 index 0000000..c1d34ab --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkImgWithBlurhash.vue @@ -0,0 +1,84 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkInfo.vue b/fe_calckey/frontend/client/src/components/MkInfo.vue new file mode 100644 index 0000000..ba3a606 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkInfo.vue @@ -0,0 +1,91 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkInstanceCardMini.vue b/fe_calckey/frontend/client/src/components/MkInstanceCardMini.vue new file mode 100644 index 0000000..6bc46c0 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkInstanceCardMini.vue @@ -0,0 +1,169 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkInstanceSelectDialog.vue b/fe_calckey/frontend/client/src/components/MkInstanceSelectDialog.vue new file mode 100644 index 0000000..c79879d --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkInstanceSelectDialog.vue @@ -0,0 +1,183 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkInstanceStats.vue b/fe_calckey/frontend/client/src/components/MkInstanceStats.vue new file mode 100644 index 0000000..70397a6 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkInstanceStats.vue @@ -0,0 +1,297 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkInstanceTicker.vue b/fe_calckey/frontend/client/src/components/MkInstanceTicker.vue new file mode 100644 index 0000000..6deb428 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkInstanceTicker.vue @@ -0,0 +1,97 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkKeyValue.vue b/fe_calckey/frontend/client/src/components/MkKeyValue.vue new file mode 100644 index 0000000..3db05f0 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkKeyValue.vue @@ -0,0 +1,69 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkLaunchPad.vue b/fe_calckey/frontend/client/src/components/MkLaunchPad.vue new file mode 100644 index 0000000..b1f42ec --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkLaunchPad.vue @@ -0,0 +1,182 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkLink.vue b/fe_calckey/frontend/client/src/components/MkLink.vue new file mode 100644 index 0000000..e26e1ed --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkLink.vue @@ -0,0 +1,65 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkMarquee.vue b/fe_calckey/frontend/client/src/components/MkMarquee.vue new file mode 100644 index 0000000..d99ad95 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkMarquee.vue @@ -0,0 +1,108 @@ + + + diff --git a/fe_calckey/frontend/client/src/components/MkMediaBanner.vue b/fe_calckey/frontend/client/src/components/MkMediaBanner.vue new file mode 100644 index 0000000..5764558 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkMediaBanner.vue @@ -0,0 +1,138 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkMediaCaption.vue b/fe_calckey/frontend/client/src/components/MkMediaCaption.vue new file mode 100644 index 0000000..44f7b55 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkMediaCaption.vue @@ -0,0 +1,327 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkMediaImage.vue b/fe_calckey/frontend/client/src/components/MkMediaImage.vue new file mode 100644 index 0000000..9097a47 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkMediaImage.vue @@ -0,0 +1,162 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkMediaList.vue b/fe_calckey/frontend/client/src/components/MkMediaList.vue new file mode 100644 index 0000000..c01ccd5 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkMediaList.vue @@ -0,0 +1,321 @@ + + + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkMediaVideo.vue b/fe_calckey/frontend/client/src/components/MkMediaVideo.vue new file mode 100644 index 0000000..21f8ace --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkMediaVideo.vue @@ -0,0 +1,152 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkMention.vue b/fe_calckey/frontend/client/src/components/MkMention.vue new file mode 100644 index 0000000..59e0fb9 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkMention.vue @@ -0,0 +1,100 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkMenu.child.vue b/fe_calckey/frontend/client/src/components/MkMenu.child.vue new file mode 100644 index 0000000..83ae6b5 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkMenu.child.vue @@ -0,0 +1,78 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkMenu.vue b/fe_calckey/frontend/client/src/components/MkMenu.vue new file mode 100644 index 0000000..2d8fde6 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkMenu.vue @@ -0,0 +1,522 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkMiniChart.vue b/fe_calckey/frontend/client/src/components/MkMiniChart.vue new file mode 100644 index 0000000..b7db265 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkMiniChart.vue @@ -0,0 +1,74 @@ + + + diff --git a/fe_calckey/frontend/client/src/components/MkModal.vue b/fe_calckey/frontend/client/src/components/MkModal.vue new file mode 100644 index 0000000..e814c91 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkModal.vue @@ -0,0 +1,613 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkModalPageWindow.vue b/fe_calckey/frontend/client/src/components/MkModalPageWindow.vue new file mode 100644 index 0000000..bf4d8d0 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkModalPageWindow.vue @@ -0,0 +1,218 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkModalWindow.vue b/fe_calckey/frontend/client/src/components/MkModalWindow.vue new file mode 100644 index 0000000..740f84d --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkModalWindow.vue @@ -0,0 +1,172 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkMoved.vue b/fe_calckey/frontend/client/src/components/MkMoved.vue new file mode 100644 index 0000000..b2f8095 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkMoved.vue @@ -0,0 +1,35 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkNote.vue b/fe_calckey/frontend/client/src/components/MkNote.vue new file mode 100644 index 0000000..9de8770 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkNote.vue @@ -0,0 +1,958 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkNoteDetailed.vue b/fe_calckey/frontend/client/src/components/MkNoteDetailed.vue new file mode 100644 index 0000000..2058161 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkNoteDetailed.vue @@ -0,0 +1,687 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkNoteHeader.vue b/fe_calckey/frontend/client/src/components/MkNoteHeader.vue new file mode 100644 index 0000000..b25ffa3 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkNoteHeader.vue @@ -0,0 +1,173 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkNotePreview.vue b/fe_calckey/frontend/client/src/components/MkNotePreview.vue new file mode 100644 index 0000000..607df89 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkNotePreview.vue @@ -0,0 +1,97 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkNoteSimple.vue b/fe_calckey/frontend/client/src/components/MkNoteSimple.vue new file mode 100644 index 0000000..49b5f93 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkNoteSimple.vue @@ -0,0 +1,67 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkNoteSub.vue b/fe_calckey/frontend/client/src/components/MkNoteSub.vue new file mode 100644 index 0000000..12b8ac4 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkNoteSub.vue @@ -0,0 +1,779 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkNotes.vue b/fe_calckey/frontend/client/src/components/MkNotes.vue new file mode 100644 index 0000000..bf3631c --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkNotes.vue @@ -0,0 +1,74 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkNotification.vue b/fe_calckey/frontend/client/src/components/MkNotification.vue new file mode 100644 index 0000000..ac51008 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkNotification.vue @@ -0,0 +1,543 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkNotificationSettingWindow.vue b/fe_calckey/frontend/client/src/components/MkNotificationSettingWindow.vue new file mode 100644 index 0000000..00a61bb --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkNotificationSettingWindow.vue @@ -0,0 +1,105 @@ + + + diff --git a/fe_calckey/frontend/client/src/components/MkNotificationToast.vue b/fe_calckey/frontend/client/src/components/MkNotificationToast.vue new file mode 100644 index 0000000..ba95e11 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkNotificationToast.vue @@ -0,0 +1,77 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkNotifications.vue b/fe_calckey/frontend/client/src/components/MkNotifications.vue new file mode 100644 index 0000000..439a1d4 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkNotifications.vue @@ -0,0 +1,153 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkNumber.vue b/fe_calckey/frontend/client/src/components/MkNumber.vue new file mode 100644 index 0000000..5fa0f76 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkNumber.vue @@ -0,0 +1,27 @@ + + + diff --git a/fe_calckey/frontend/client/src/components/MkNumberDiff.vue b/fe_calckey/frontend/client/src/components/MkNumberDiff.vue new file mode 100644 index 0000000..11b0ad3 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkNumberDiff.vue @@ -0,0 +1,48 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkObjectView.value.vue b/fe_calckey/frontend/client/src/components/MkObjectView.value.vue new file mode 100644 index 0000000..8b02422 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkObjectView.value.vue @@ -0,0 +1,190 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkObjectView.vue b/fe_calckey/frontend/client/src/components/MkObjectView.vue new file mode 100644 index 0000000..b3fce68 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkObjectView.vue @@ -0,0 +1,19 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkPagePreview.vue b/fe_calckey/frontend/client/src/components/MkPagePreview.vue new file mode 100644 index 0000000..034c6fe --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkPagePreview.vue @@ -0,0 +1,171 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkPageWindow.vue b/fe_calckey/frontend/client/src/components/MkPageWindow.vue new file mode 100644 index 0000000..a5951fd --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkPageWindow.vue @@ -0,0 +1,167 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkPagination.vue b/fe_calckey/frontend/client/src/components/MkPagination.vue new file mode 100644 index 0000000..4caea73 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkPagination.vue @@ -0,0 +1,497 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkPoll.vue b/fe_calckey/frontend/client/src/components/MkPoll.vue new file mode 100644 index 0000000..1fdbc7a --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkPoll.vue @@ -0,0 +1,214 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkPollEditor.vue b/fe_calckey/frontend/client/src/components/MkPollEditor.vue new file mode 100644 index 0000000..95cc113 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkPollEditor.vue @@ -0,0 +1,257 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkPopupMenu.vue b/fe_calckey/frontend/client/src/components/MkPopupMenu.vue new file mode 100644 index 0000000..12a1822 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkPopupMenu.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/MkPostForm.vue b/fe_calckey/frontend/client/src/components/MkPostForm.vue new file mode 100644 index 0000000..16acfcc --- /dev/null +++ b/fe_calckey/frontend/client/src/components/MkPostForm.vue @@ -0,0 +1,1312 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/global/MkA.vue b/fe_calckey/frontend/client/src/components/global/MkA.vue new file mode 100644 index 0000000..d276a4d --- /dev/null +++ b/fe_calckey/frontend/client/src/components/global/MkA.vue @@ -0,0 +1,119 @@ + + + diff --git a/fe_calckey/frontend/client/src/components/global/MkAcct.vue b/fe_calckey/frontend/client/src/components/global/MkAcct.vue new file mode 100644 index 0000000..c77ad6a --- /dev/null +++ b/fe_calckey/frontend/client/src/components/global/MkAcct.vue @@ -0,0 +1,31 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/global/MkAd.vue b/fe_calckey/frontend/client/src/components/global/MkAd.vue new file mode 100644 index 0000000..e826e14 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/global/MkAd.vue @@ -0,0 +1,222 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/global/MkAvatar.vue b/fe_calckey/frontend/client/src/components/global/MkAvatar.vue new file mode 100644 index 0000000..d904ece --- /dev/null +++ b/fe_calckey/frontend/client/src/components/global/MkAvatar.vue @@ -0,0 +1,199 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/global/MkEllipsis.vue b/fe_calckey/frontend/client/src/components/global/MkEllipsis.vue new file mode 100644 index 0000000..6226c12 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/global/MkEllipsis.vue @@ -0,0 +1,36 @@ + + + diff --git a/fe_calckey/frontend/client/src/components/global/MkEmoji.vue b/fe_calckey/frontend/client/src/components/global/MkEmoji.vue new file mode 100644 index 0000000..eb08ff5 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/global/MkEmoji.vue @@ -0,0 +1,94 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/global/MkError.vue b/fe_calckey/frontend/client/src/components/global/MkError.vue new file mode 100644 index 0000000..38d6244 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/global/MkError.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/global/MkLoading.vue b/fe_calckey/frontend/client/src/components/global/MkLoading.vue new file mode 100644 index 0000000..343108f --- /dev/null +++ b/fe_calckey/frontend/client/src/components/global/MkLoading.vue @@ -0,0 +1,129 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/global/MkMisskeyFlavoredMarkdown.vue b/fe_calckey/frontend/client/src/components/global/MkMisskeyFlavoredMarkdown.vue new file mode 100644 index 0000000..4ecb058 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/global/MkMisskeyFlavoredMarkdown.vue @@ -0,0 +1,372 @@ + + + + + + + diff --git a/fe_calckey/frontend/client/src/components/global/MkPageHeader.vue b/fe_calckey/frontend/client/src/components/global/MkPageHeader.vue new file mode 100644 index 0000000..08c27bc --- /dev/null +++ b/fe_calckey/frontend/client/src/components/global/MkPageHeader.vue @@ -0,0 +1,571 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/global/MkSpacer.vue b/fe_calckey/frontend/client/src/components/global/MkSpacer.vue new file mode 100644 index 0000000..2c3ce81 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/global/MkSpacer.vue @@ -0,0 +1,87 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/global/MkStickyContainer.vue b/fe_calckey/frontend/client/src/components/global/MkStickyContainer.vue new file mode 100644 index 0000000..0818dd3 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/global/MkStickyContainer.vue @@ -0,0 +1,68 @@ + + + + + + + diff --git a/fe_calckey/frontend/client/src/components/global/MkTime.vue b/fe_calckey/frontend/client/src/components/global/MkTime.vue new file mode 100644 index 0000000..72a51f1 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/global/MkTime.vue @@ -0,0 +1,97 @@ + + + diff --git a/fe_calckey/frontend/client/src/components/global/MkUrl.vue b/fe_calckey/frontend/client/src/components/global/MkUrl.vue new file mode 100644 index 0000000..5f2a81e --- /dev/null +++ b/fe_calckey/frontend/client/src/components/global/MkUrl.vue @@ -0,0 +1,108 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/global/MkUserName.vue b/fe_calckey/frontend/client/src/components/global/MkUserName.vue new file mode 100644 index 0000000..a79add3 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/global/MkUserName.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/global/RouterView.vue b/fe_calckey/frontend/client/src/components/global/RouterView.vue new file mode 100644 index 0000000..0fa244f --- /dev/null +++ b/fe_calckey/frontend/client/src/components/global/RouterView.vue @@ -0,0 +1,79 @@ + + + diff --git a/fe_calckey/frontend/client/src/components/global/i18n.ts b/fe_calckey/frontend/client/src/components/global/i18n.ts new file mode 100644 index 0000000..4475b62 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/global/i18n.ts @@ -0,0 +1,51 @@ +import { h, defineComponent } from "vue"; + +export default defineComponent({ + props: { + src: { + type: String, + required: true, + }, + tag: { + type: String, + required: false, + default: "span", + }, + textTag: { + type: String, + required: false, + default: null, + }, + }, + render() { + let str = this.src; + const parsed = [] as (string | { arg: string })[]; + while (true) { + const nextBracketOpen = str.indexOf("{"); + const nextBracketClose = str.indexOf("}"); + + if (nextBracketOpen === -1) { + parsed.push(str); + break; + } else { + if (nextBracketOpen > 0) parsed.push(str.substr(0, nextBracketOpen)); + parsed.push({ + arg: str.substring(nextBracketOpen + 1, nextBracketClose), + }); + } + + str = str.substr(nextBracketClose + 1); + } + + return h( + this.tag, + parsed.map((x) => + typeof x === "string" + ? this.textTag + ? h(this.textTag, x) + : x + : this.$slots[x.arg](), + ), + ); + }, +}); diff --git a/fe_calckey/frontend/client/src/components/index.ts b/fe_calckey/frontend/client/src/components/index.ts new file mode 100644 index 0000000..7da095e --- /dev/null +++ b/fe_calckey/frontend/client/src/components/index.ts @@ -0,0 +1,61 @@ +import { App } from "vue"; + +import Mfm from "./global/MkMisskeyFlavoredMarkdown.vue"; +import MkA from "./global/MkA.vue"; +import MkAcct from "./global/MkAcct.vue"; +import MkAvatar from "./global/MkAvatar.vue"; +import MkEmoji from "./global/MkEmoji.vue"; +import MkUserName from "./global/MkUserName.vue"; +import MkEllipsis from "./global/MkEllipsis.vue"; +import MkTime from "./global/MkTime.vue"; +import MkUrl from "./global/MkUrl.vue"; +import I18n from "./global/i18n"; +import RouterView from "./global/RouterView.vue"; +import MkLoading from "./global/MkLoading.vue"; +import MkError from "./global/MkError.vue"; +import MkAd from "./global/MkAd.vue"; +import MkPageHeader from "./global/MkPageHeader.vue"; +import MkSpacer from "./global/MkSpacer.vue"; +import MkStickyContainer from "./global/MkStickyContainer.vue"; + +export default function (app: App) { + app.component("I18n", I18n); + app.component("RouterView", RouterView); + app.component("Mfm", Mfm); + app.component("MkA", MkA); + app.component("MkAcct", MkAcct); + app.component("MkAvatar", MkAvatar); + app.component("MkEmoji", MkEmoji); + app.component("MkUserName", MkUserName); + app.component("MkEllipsis", MkEllipsis); + app.component("MkTime", MkTime); + app.component("MkUrl", MkUrl); + app.component("MkLoading", MkLoading); + app.component("MkError", MkError); + app.component("MkAd", MkAd); + app.component("MkPageHeader", MkPageHeader); + app.component("MkSpacer", MkSpacer); + app.component("MkStickyContainer", MkStickyContainer); +} + +declare module "@vue/runtime-core" { + export interface GlobalComponents { + I18n: typeof I18n; + RouterView: typeof RouterView; + Mfm: typeof Mfm; + MkA: typeof MkA; + MkAcct: typeof MkAcct; + MkAvatar: typeof MkAvatar; + MkEmoji: typeof MkEmoji; + MkUserName: typeof MkUserName; + MkEllipsis: typeof MkEllipsis; + MkTime: typeof MkTime; + MkUrl: typeof MkUrl; + MkLoading: typeof MkLoading; + MkError: typeof MkError; + MkAd: typeof MkAd; + MkPageHeader: typeof MkPageHeader; + MkSpacer: typeof MkSpacer; + MkStickyContainer: typeof MkStickyContainer; + } +} diff --git a/fe_calckey/frontend/client/src/components/mfm.ts b/fe_calckey/frontend/client/src/components/mfm.ts new file mode 100644 index 0000000..cb0942a --- /dev/null +++ b/fe_calckey/frontend/client/src/components/mfm.ts @@ -0,0 +1,563 @@ +import { defineComponent, h } from "vue"; +import * as mfm from "mfm-js"; +import type { VNode } from "vue"; +import MkUrl from "@/components/global/MkUrl.vue"; +import MkLink from "@/components/MkLink.vue"; +import MkMention from "@/components/MkMention.vue"; +import MkEmoji from "@/components/global/MkEmoji.vue"; +import { concat } from "@/scripts/array"; +import MkFormula from "@/components/MkFormula.vue"; +import MkCode from "@/components/MkCode.vue"; +import MkGoogle from "@/components/MkGoogle.vue"; +import MkSparkle from "@/components/MkSparkle.vue"; +import MkA from "@/components/global/MkA.vue"; +import { host } from "@/config"; +import { reducedMotion } from "@/scripts/reduced-motion"; +import { defaultStore } from "@/store"; + +export default defineComponent({ + props: { + text: { + type: String, + required: true, + }, + plain: { + type: Boolean, + default: false, + }, + nowrap: { + type: Boolean, + default: false, + }, + author: { + type: Object, + default: null, + }, + i: { + type: Object, + default: null, + }, + customEmojis: { + required: false, + }, + isNote: { + type: Boolean, + default: true, + }, + }, + + render() { + if (this.text == null || this.text === "") return; + + const isPlain = this.plain; + + const ast = (isPlain ? mfm.parseSimple : mfm.parse)(this.text); + + const validTime = (t: string | null | undefined) => { + if (t == null) return null; + return t.match(/^[0-9.]+s$/) ? t : null; + }; + + const validNumber = (n: string | null | undefined) => { + if (n == null) return null; + const parsed = parseFloat(n); + return !isNaN(parsed) && isFinite(parsed) && parsed > 0; + }; + // const validEase = (e: string | null | undefined) => { + // if (e == null) return null; + // return e.match(/(steps)?\(-?[0-9.]+,-?[0-9.]+,-?[0-9.]+,-?[0-9.]+\)/) + // ? (e.startsWith("steps") ? e : "cubic-bezier" + e) + // : null + // } + + const genEl = (ast: mfm.MfmNode[]) => + concat( + ast.map((token, index): VNode[] => { + switch (token.type) { + case "text": { + const text = token.props.text.replace(/(\r\n|\n|\r)/g, "\n"); + + if (!this.plain) { + const res = []; + for (const t of text.split("\n")) { + res.push(h("br")); + res.push(t); + } + res.shift(); + return res; + } else { + return [text.replace(/\n/g, " ")]; + } + } + + case "bold": { + return [h("b", genEl(token.children))]; + } + + case "strike": { + return [h("del", genEl(token.children))]; + } + + case "italic": { + return h( + "i", + { + style: "font-style: oblique;", + }, + genEl(token.children), + ); + } + + case "fn": { + // TODO: CSSを文字列で組み立てていくと token.props.args.~~~ 経由でCSSインジェクションできるのでよしなにやる + let style: string; + switch (token.props.name) { + case "tada": { + const speed = validTime(token.props.args.speed) || "1s"; + const delay = validTime(token.props.args.delay) || "0s"; + const loop = validNumber(token.props.args.loop) || "infinite"; + // const ease = validEase(token.props.args.ease) || "linear"; + style = `font-size: 150%; animation: tada ${speed} ${delay} linear ${loop} both;`; + break; + } + case "jelly": { + const speed = validTime(token.props.args.speed) || "1s"; + const delay = validTime(token.props.args.delay) || "0s"; + const loop = validNumber(token.props.args.loop) || "infinite"; + style = `animation: mfm-rubberBand ${speed} ${delay} linear ${loop} both;`; + break; + } + case "twitch": { + const speed = validTime(token.props.args.speed) || "0.5s"; + const delay = validTime(token.props.args.delay) || "0s"; + const loop = validNumber(token.props.args.loop) || "infinite"; + style = `animation: mfm-twitch ${speed} ${delay} ease ${loop};`; + break; + } + case "shake": { + const speed = validTime(token.props.args.speed) || "0.5s"; + const delay = validTime(token.props.args.delay) || "0s"; + const loop = validNumber(token.props.args.loop) || "infinite"; + style = `animation: mfm-shake ${speed} ${delay} ease ${loop};`; + break; + } + case "spin": { + const direction = token.props.args.left + ? "reverse" + : token.props.args.alternate + ? "alternate" + : "normal"; + const anime = token.props.args.x + ? "mfm-spinX" + : token.props.args.y + ? "mfm-spinY" + : "mfm-spin"; + const speed = validTime(token.props.args.speed) || "1.5s"; + const delay = validTime(token.props.args.delay) || "0s"; + const loop = validNumber(token.props.args.loop) || "infinite"; + style = `animation: ${anime} ${speed} ${delay} linear ${loop}; animation-direction: ${direction};`; + break; + } + case "jump": { + const speed = validTime(token.props.args.speed) || "0.75s"; + const delay = validTime(token.props.args.delay) || "0s"; + const loop = validNumber(token.props.args.loop) || "infinite"; + style = `animation: mfm-jump ${speed} ${delay} linear ${loop};`; + break; + } + case "bounce": { + const speed = validTime(token.props.args.speed) || "0.75s"; + const delay = validTime(token.props.args.delay) || "0s"; + const loop = validNumber(token.props.args.loop) || "infinite"; + style = `animation: mfm-bounce ${speed} ${delay} linear ${loop}; transform-origin: center bottom;`; + break; + } + case "rainbow": { + const speed = validTime(token.props.args.speed) || "1s"; + const delay = validTime(token.props.args.delay) || "0s"; + const loop = validNumber(token.props.args.loop) || "infinite"; + style = `animation: mfm-rainbow ${speed} ${delay} linear ${loop};`; + break; + } + case "sparkle": { + if (reducedMotion()) { + return genEl(token.children); + } + return h(MkSparkle, {}, genEl(token.children)); + } + case "fade": { + const direction = token.props.args.out + ? "alternate-reverse" + : "alternate"; + const speed = validTime(token.props.args.speed) || "1.5s"; + const delay = validTime(token.props.args.delay) || "0s"; + const loop = validNumber(token.props.args.loop) || "infinite"; + style = `animation: mfm-fade ${speed} ${delay} linear ${loop}; animation-direction: ${direction};`; + break; + } + case "flip": { + const transform = + token.props.args.h && token.props.args.v + ? "scale(-1, -1)" + : token.props.args.v + ? "scaleY(-1)" + : "scaleX(-1)"; + style = `transform: ${transform};`; + break; + } + case "x2": { + return h( + "span", + { + class: "mfm-x2", + }, + genEl(token.children), + ); + } + case "x3": { + return h( + "span", + { + class: "mfm-x3", + }, + genEl(token.children), + ); + } + case "x4": { + return h( + "span", + { + class: "mfm-x4", + }, + genEl(token.children), + ); + } + case "font": { + const family = token.props.args.serif + ? "serif" + : token.props.args.monospace + ? "monospace" + : token.props.args.cursive + ? "cursive" + : token.props.args.fantasy + ? "fantasy" + : token.props.args.emoji + ? "emoji" + : token.props.args.math + ? "math" + : null; + if (family) style = `font-family: ${family};`; + break; + } + case "blur": { + return h( + "span", + { + class: "_blur_text", + }, + genEl(token.children), + ); + } + case "rotate": { + const rotate = token.props.args.x + ? "perspective(128px) rotateX" + : token.props.args.y + ? "perspective(128px) rotateY" + : "rotate"; + const degrees = parseInt(token.props.args.deg) || "90"; + style = `transform: ${rotate}(${degrees}deg); transform-origin: center center;`; + break; + } + case "position": { + const x = parseFloat(token.props.args.x ?? "0"); + const y = parseFloat(token.props.args.y ?? "0"); + style = `transform: translateX(${x}em) translateY(${y}em);`; + break; + } + case "crop": { + const top = parseFloat(token.props.args.top ?? "0"); + const right = parseFloat(token.props.args.right ?? "0"); + const bottom = parseFloat(token.props.args.bottom ?? "0"); + const left = parseFloat(token.props.args.left ?? "0"); + style = `clip-path: inset(${top}% ${right}% ${bottom}% ${left}%);`; + break; + } + case "scale": { + const x = Math.min(parseFloat(token.props.args.x ?? "1"), 5); + const y = Math.min(parseFloat(token.props.args.y ?? "1"), 5); + style = `transform: scale(${x}, ${y});`; + break; + } + case "fg": { + let color = token.props.args.color; + if (!/^[0-9a-f]{3,6}$/i.test(color)) color = "f00"; + style = `color: #${color};`; + break; + } + case "bg": { + let color = token.props.args.color; + if (!/^[0-9a-f]{3,6}$/i.test(color)) color = "f00"; + style = `background-color: #${color};`; + break; + } + case "small": { + return h( + "small", + { + style: "opacity: 0.7;", + }, + genEl(token.children), + ); + } + case "center": { + return h( + "div", + { + style: "text-align: center;", + }, + genEl(token.children), + ); + } + } + if (style == null) { + return h("span", {}, [ + "$[", + token.props.name, + " ", + ...genEl(token.children), + "]", + ]); + } else { + return h( + "span", + { + style: `display: inline-block;${style}`, + }, + genEl(token.children), + ); + } + } + + case "small": { + return [ + h( + "small", + { + style: "opacity: 0.7;", + }, + genEl(token.children), + ), + ]; + } + + case "center": { + return [ + h( + "div", + { + style: "text-align: center;", + }, + genEl(token.children), + ), + ]; + } + + case "url": { + return [ + h(MkUrl, { + key: Math.random(), + url: token.props.url, + rel: "nofollow noopener", + }), + ]; + } + + case "link": { + return [ + h( + MkLink, + { + key: Math.random(), + url: token.props.url, + rel: "nofollow noopener", + }, + genEl(token.children), + ), + ]; + } + + case "mention": { + return [ + h(MkMention, { + key: Math.random(), + host: + (token.props.host == null && + this.author && + this.author.host != null + ? this.author.host + : token.props.host) || host, + username: token.props.username, + }), + ]; + } + + case "hashtag": { + return [ + h( + MkA, + { + key: Math.random(), + to: `/tags/${encodeURIComponent(token.props.hashtag)}`, + style: "color:var(--hashtag);", + }, + `#${token.props.hashtag}`, + ), + ]; + } + + case "blockCode": { + return [ + h(MkCode, { + key: Math.random(), + code: token.props.code, + lang: token.props.lang, + }), + ]; + } + + case "inlineCode": { + return [ + h(MkCode, { + key: Math.random(), + code: token.props.code, + inline: true, + }), + ]; + } + + case "quote": { + if (!this.nowrap) { + return [h("blockquote", genEl(token.children))]; + } else { + return [ + h( + "span", + { + class: "quote", + }, + genEl(token.children), + ), + ]; + } + } + + case "emojiCode": { + return [ + h(MkEmoji, { + key: Math.random(), + emoji: `:${token.props.name}:`, + customEmojis: this.customEmojis, + normal: this.plain, + }), + ]; + } + + case "unicodeEmoji": { + return [ + h(MkEmoji, { + key: Math.random(), + emoji: token.props.emoji, + customEmojis: this.customEmojis, + normal: this.plain, + }), + ]; + } + + case "mathInline": { + return [ + h(MkFormula, { + key: Math.random(), + formula: token.props.formula, + block: false, + }), + ]; + } + + case "mathBlock": { + return [ + h(MkFormula, { + key: Math.random(), + formula: token.props.formula, + block: true, + }), + ]; + } + + case "search": { + // Disable "search" keyword + // (see the issue #9816 on Codeberg) + if (token.props.content.slice(-6).toLowerCase() === "search") { + const sentinel = "#"; + let ast2 = (isPlain ? mfm.parseSimple : mfm.parse)( + token.props.content.slice(0, -6) + sentinel, + ); + if ( + ast2[ast2.length - 1].type === "text" && + ast2[ast2.length - 1].props.text.endsWith(sentinel) + ) { + ast2[ast2.length - 1].props.text = ast2[ + ast2.length - 1 + ].props.text.slice(0, -1); + } else { + // I don't think this scope is reachable + console.warn( + "Something went wrong while parsing MFM. Please send a bug report, if possible.", + ); + } + + let prefix = "\n"; + if ( + index === 0 || + [ + "blockCode", + "center", + "mathBlock", + "quote", + "search", + ].includes(ast[index - 1].type) + ) { + prefix = ""; + } + + return [ + prefix, + ...genEl(ast2), + `${token.props.content.slice(-6)}\n`, + ]; + } + + return [ + h(MkGoogle, { + key: Math.random(), + q: token.props.query, + }), + ]; + } + + case "plain": { + return [h("span", genEl(token.children))]; + } + + default: { + console.error("unrecognized ast type:", token.type); + + return []; + } + } + }), + ); + + // Parse ast to DOM + return h("span", genEl(ast)); + }, +}); diff --git a/fe_calckey/frontend/client/src/components/page/page.block.vue b/fe_calckey/frontend/client/src/components/page/page.block.vue new file mode 100644 index 0000000..edeb33a --- /dev/null +++ b/fe_calckey/frontend/client/src/components/page/page.block.vue @@ -0,0 +1,64 @@ + + + diff --git a/fe_calckey/frontend/client/src/components/page/page.button.vue b/fe_calckey/frontend/client/src/components/page/page.button.vue new file mode 100644 index 0000000..b3c42eb --- /dev/null +++ b/fe_calckey/frontend/client/src/components/page/page.button.vue @@ -0,0 +1,70 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/page/page.canvas.vue b/fe_calckey/frontend/client/src/components/page/page.canvas.vue new file mode 100644 index 0000000..1ed96e2 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/page/page.canvas.vue @@ -0,0 +1,49 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/page/page.counter.vue b/fe_calckey/frontend/client/src/components/page/page.counter.vue new file mode 100644 index 0000000..9ee49fe --- /dev/null +++ b/fe_calckey/frontend/client/src/components/page/page.counter.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/page/page.if.vue b/fe_calckey/frontend/client/src/components/page/page.if.vue new file mode 100644 index 0000000..7cc25f2 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/page/page.if.vue @@ -0,0 +1,37 @@ + + + diff --git a/fe_calckey/frontend/client/src/components/page/page.image.vue b/fe_calckey/frontend/client/src/components/page/page.image.vue new file mode 100644 index 0000000..0b82975 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/page/page.image.vue @@ -0,0 +1,37 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/page/page.note.vue b/fe_calckey/frontend/client/src/components/page/page.note.vue new file mode 100644 index 0000000..9e10d0f --- /dev/null +++ b/fe_calckey/frontend/client/src/components/page/page.note.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/page/page.number-input.vue b/fe_calckey/frontend/client/src/components/page/page.number-input.vue new file mode 100644 index 0000000..3426cf6 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/page/page.number-input.vue @@ -0,0 +1,60 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/page/page.post.vue b/fe_calckey/frontend/client/src/components/page/page.post.vue new file mode 100644 index 0000000..ee30da1 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/page/page.post.vue @@ -0,0 +1,121 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/page/page.radio-button.vue b/fe_calckey/frontend/client/src/components/page/page.radio-button.vue new file mode 100644 index 0000000..3d3878e --- /dev/null +++ b/fe_calckey/frontend/client/src/components/page/page.radio-button.vue @@ -0,0 +1,52 @@ + + + diff --git a/fe_calckey/frontend/client/src/components/page/page.section.vue b/fe_calckey/frontend/client/src/components/page/page.section.vue new file mode 100644 index 0000000..04de165 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/page/page.section.vue @@ -0,0 +1,66 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/page/page.switch.vue b/fe_calckey/frontend/client/src/components/page/page.switch.vue new file mode 100644 index 0000000..7a00694 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/page/page.switch.vue @@ -0,0 +1,59 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/page/page.text-input.vue b/fe_calckey/frontend/client/src/components/page/page.text-input.vue new file mode 100644 index 0000000..eb76d18 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/page/page.text-input.vue @@ -0,0 +1,60 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/page/page.text.vue b/fe_calckey/frontend/client/src/components/page/page.text.vue new file mode 100644 index 0000000..c380f48 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/page/page.text.vue @@ -0,0 +1,67 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/components/page/page.textarea-input.vue b/fe_calckey/frontend/client/src/components/page/page.textarea-input.vue new file mode 100644 index 0000000..fab665c --- /dev/null +++ b/fe_calckey/frontend/client/src/components/page/page.textarea-input.vue @@ -0,0 +1,50 @@ + + + diff --git a/fe_calckey/frontend/client/src/components/page/page.textarea.vue b/fe_calckey/frontend/client/src/components/page/page.textarea.vue new file mode 100644 index 0000000..aa72032 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/page/page.textarea.vue @@ -0,0 +1,28 @@ + + + diff --git a/fe_calckey/frontend/client/src/components/page/page.vue b/fe_calckey/frontend/client/src/components/page/page.vue new file mode 100644 index 0000000..f2079c9 --- /dev/null +++ b/fe_calckey/frontend/client/src/components/page/page.vue @@ -0,0 +1,104 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/config.ts b/fe_calckey/frontend/client/src/config.ts new file mode 100644 index 0000000..8a18ba9 --- /dev/null +++ b/fe_calckey/frontend/client/src/config.ts @@ -0,0 +1,19 @@ +const address = new URL(location.href); +const siteName = ( + document.querySelector('meta[property="og:site_name"]') as HTMLMetaElement +)?.content; + +export const host = _HOST || address.host; +export const hostname = address.hostname; +export const url = _REMOTE_URL || address.origin; +export const apiUrl = `${url}/api`; +export const wsUrl = `${url + .replace("http://", "ws://") + .replace("https://", "wss://")}/streaming`; +export const lang = localStorage.getItem("lang"); +export const langs = _LANGS_; +export const locale = JSON.parse(localStorage.getItem("locale")); +export const version = _VERSION_; +export const instanceName = siteName === "Calckey" ? host : siteName; +export const ui = localStorage.getItem("ui"); +export const debug = localStorage.getItem("debug") === "true"; diff --git a/fe_calckey/frontend/client/src/const.ts b/fe_calckey/frontend/client/src/const.ts new file mode 100644 index 0000000..a73e097 --- /dev/null +++ b/fe_calckey/frontend/client/src/const.ts @@ -0,0 +1,45 @@ +// ブラウザで直接表示することを許可するファイルの種類のリスト +// ここに含まれないものは application/octet-stream としてレスポンスされる +// SVGはXSSを生むので許可しない +export const FILE_TYPE_BROWSERSAFE = [ + // Images + "image/png", + "image/gif", + "image/jpeg", + "image/webp", + "image/apng", + "image/bmp", + "image/tiff", + "image/x-icon", + "image/avif", + + // OggS + "audio/opus", + "video/ogg", + "audio/ogg", + "application/ogg", + + // ISO/IEC base media file format + "video/quicktime", + "video/mp4", + "audio/mp4", + "video/x-m4v", + "audio/x-m4a", + "video/3gpp", + "video/3gpp2", + + "video/mpeg", + "audio/mpeg", + + "video/webm", + "audio/webm", + + "audio/aac", + "audio/x-flac", + "audio/vnd.wave", +]; +/* +https://github.com/sindresorhus/file-type/blob/main/supported.js +https://github.com/sindresorhus/file-type/blob/main/core.js +https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Containers +*/ diff --git a/fe_calckey/frontend/client/src/directives/adaptive-border.ts b/fe_calckey/frontend/client/src/directives/adaptive-border.ts new file mode 100644 index 0000000..c882c49 --- /dev/null +++ b/fe_calckey/frontend/client/src/directives/adaptive-border.ts @@ -0,0 +1,29 @@ +import { Directive } from "vue"; + +export default { + mounted(src, binding, vn) { + const getBgColor = (el: HTMLElement) => { + const style = window.getComputedStyle(el); + if ( + style.backgroundColor && + !["rgba(0, 0, 0, 0)", "rgba(0,0,0,0)", "transparent"].includes( + style.backgroundColor, + ) + ) { + return style.backgroundColor; + } else { + return el.parentElement ? getBgColor(el.parentElement) : "transparent"; + } + }; + + const parentBg = getBgColor(src.parentElement); + + const myBg = window.getComputedStyle(src).backgroundColor; + + if (parentBg === myBg) { + src.style.borderColor = "var(--divider)"; + } else { + src.style.borderColor = myBg; + } + }, +} as Directive; diff --git a/fe_calckey/frontend/client/src/directives/anim.ts b/fe_calckey/frontend/client/src/directives/anim.ts new file mode 100644 index 0000000..9e69e11 --- /dev/null +++ b/fe_calckey/frontend/client/src/directives/anim.ts @@ -0,0 +1,18 @@ +import { Directive } from "vue"; + +export default { + beforeMount(src, binding, vn) { + src.style.opacity = "0"; + src.style.transform = "scale(0.9)"; + // ページネーションと相性が悪いので + //if (typeof binding.value === 'number') src.style.transitionDelay = `${binding.value * 30}ms`; + src.classList.add("_zoom"); + }, + + mounted(src, binding, vn) { + window.setTimeout(() => { + src.style.opacity = "1"; + src.style.transform = "none"; + }, 1); + }, +} as Directive; diff --git a/fe_calckey/frontend/client/src/directives/appear.ts b/fe_calckey/frontend/client/src/directives/appear.ts new file mode 100644 index 0000000..16f3218 --- /dev/null +++ b/fe_calckey/frontend/client/src/directives/appear.ts @@ -0,0 +1,22 @@ +import { Directive } from "vue"; + +export default { + mounted(src, binding, vn) { + const fn = binding.value; + if (fn == null) return; + + const observer = new IntersectionObserver((entries) => { + if (entries.some((entry) => entry.isIntersecting)) { + fn(); + } + }); + + observer.observe(src); + + src._observer_ = observer; + }, + + unmounted(src, binding, vn) { + if (src._observer_) src._observer_.disconnect(); + }, +} as Directive; diff --git a/fe_calckey/frontend/client/src/directives/click-anime.ts b/fe_calckey/frontend/client/src/directives/click-anime.ts new file mode 100644 index 0000000..ee1cc59 --- /dev/null +++ b/fe_calckey/frontend/client/src/directives/click-anime.ts @@ -0,0 +1,31 @@ +import { Directive } from "vue"; +import { defaultStore } from "@/store"; + +export default { + mounted(el, binding, vn) { + /* + if (!defaultStore.state.animation) return; + + el.classList.add('_anime_bounce_standBy'); + + el.addEventListener('mousedown', () => { + el.classList.add('_anime_bounce_standBy'); + el.classList.add('_anime_bounce_ready'); + + el.addEventListener('mouseleave', () => { + el.classList.remove('_anime_bounce_ready'); + }); + }); + + el.addEventListener('click', () => { + el.classList.add('_anime_bounce'); + }); + + el.addEventListener('animationend', () => { + el.classList.remove('_anime_bounce_ready'); + el.classList.remove('_anime_bounce'); + el.classList.add('_anime_bounce_standBy'); + }); + */ + }, +} as Directive; diff --git a/fe_calckey/frontend/client/src/directives/focus.ts b/fe_calckey/frontend/client/src/directives/focus.ts new file mode 100644 index 0000000..36b2c2d --- /dev/null +++ b/fe_calckey/frontend/client/src/directives/focus.ts @@ -0,0 +1,3 @@ +export default { + mounted: (el) => el.focus(), +}; diff --git a/fe_calckey/frontend/client/src/directives/follow-append.ts b/fe_calckey/frontend/client/src/directives/follow-append.ts new file mode 100644 index 0000000..1c50062 --- /dev/null +++ b/fe_calckey/frontend/client/src/directives/follow-append.ts @@ -0,0 +1,39 @@ +import { Directive } from "vue"; +import { getScrollContainer, getScrollPosition } from "@/scripts/scroll"; + +export default { + mounted(src, binding, vn) { + if (binding.value === false) return; + + let isBottom = true; + + const container = getScrollContainer(src)!; + container.addEventListener( + "scroll", + () => { + const pos = getScrollPosition(container); + const viewHeight = container.clientHeight; + const height = container.scrollHeight; + isBottom = pos + viewHeight > height - 32; + }, + { passive: true }, + ); + container.scrollTop = container.scrollHeight; + + const ro = new ResizeObserver((entries, observer) => { + if (isBottom) { + const height = container.scrollHeight; + container.scrollTop = height; + } + }); + + ro.observe(src); + + // TODO: 新たにプロパティを作るのをやめMapを使う + src._ro_ = ro; + }, + + unmounted(src, binding, vn) { + if (src._ro_) src._ro_.unobserve(src); + }, +} as Directive; diff --git a/fe_calckey/frontend/client/src/directives/get-size.ts b/fe_calckey/frontend/client/src/directives/get-size.ts new file mode 100644 index 0000000..69278a2 --- /dev/null +++ b/fe_calckey/frontend/client/src/directives/get-size.ts @@ -0,0 +1,57 @@ +import { Directive } from "vue"; + +const mountings = new Map< + Element, + { + resize: ResizeObserver; + intersection?: IntersectionObserver; + fn: (w: number, h: number) => void; + } +>(); + +function calc(src: Element) { + const info = mountings.get(src); + const height = src.clientHeight; + const width = src.clientWidth; + + if (!info) return; + + // アクティベート前などでsrcが描画されていない場合 + if (!height) { + // IntersectionObserverで表示検出する + if (!info.intersection) { + info.intersection = new IntersectionObserver((entries) => { + if (entries.some((entry) => entry.isIntersecting)) calc(src); + }); + } + info.intersection.observe(src); + return; + } + if (info.intersection) { + info.intersection.disconnect(); + info.intersection = undefined; + } + + info.fn(width, height); +} + +export default { + mounted(src, binding, vn) { + const resize = new ResizeObserver((entries, observer) => { + calc(src); + }); + resize.observe(src); + + mountings.set(src, { resize, fn: binding.value }); + calc(src); + }, + + unmounted(src, binding, vn) { + binding.value(0, 0); + const info = mountings.get(src); + if (!info) return; + info.resize.disconnect(); + if (info.intersection) info.intersection.disconnect(); + mountings.delete(src); + }, +} as Directive void>; diff --git a/fe_calckey/frontend/client/src/directives/hotkey.ts b/fe_calckey/frontend/client/src/directives/hotkey.ts new file mode 100644 index 0000000..8df74c4 --- /dev/null +++ b/fe_calckey/frontend/client/src/directives/hotkey.ts @@ -0,0 +1,24 @@ +import { Directive } from "vue"; +import { makeHotkey } from "../scripts/hotkey"; + +export default { + mounted(el, binding) { + el._hotkey_global = binding.modifiers.global === true; + + el._keyHandler = makeHotkey(binding.value); + + if (el._hotkey_global) { + document.addEventListener("keydown", el._keyHandler); + } else { + el.addEventListener("keydown", el._keyHandler); + } + }, + + unmounted(el) { + if (el._hotkey_global) { + document.removeEventListener("keydown", el._keyHandler); + } else { + el.removeEventListener("keydown", el._keyHandler); + } + }, +} as Directive; diff --git a/fe_calckey/frontend/client/src/directives/index.ts b/fe_calckey/frontend/client/src/directives/index.ts new file mode 100644 index 0000000..77639e2 --- /dev/null +++ b/fe_calckey/frontend/client/src/directives/index.ts @@ -0,0 +1,30 @@ +import { App } from "vue"; + +import userPreview from "./user-preview"; +import size from "./size"; +import getSize from "./get-size"; +import ripple from "./ripple"; +import tooltip from "./tooltip"; +import hotkey from "./hotkey"; +import appear from "./appear"; +import anim from "./anim"; +import clickAnime from "./click-anime"; +import panel from "./panel"; +import adaptiveBorder from "./adaptive-border"; +import focus from "./focus"; + +export default function (app: App) { + app.directive("userPreview", userPreview); + app.directive("user-preview", userPreview); + app.directive("size", size); + app.directive("get-size", getSize); + app.directive("ripple", ripple); + app.directive("tooltip", tooltip); + app.directive("hotkey", hotkey); + app.directive("appear", appear); + app.directive("anim", anim); + app.directive("click-anime", clickAnime); + app.directive("panel", panel); + app.directive("adaptive-border", adaptiveBorder); + app.directive("focus", focus); +} diff --git a/fe_calckey/frontend/client/src/directives/panel.ts b/fe_calckey/frontend/client/src/directives/panel.ts new file mode 100644 index 0000000..229f726 --- /dev/null +++ b/fe_calckey/frontend/client/src/directives/panel.ts @@ -0,0 +1,31 @@ +import { Directive } from "vue"; + +export default { + mounted(src, binding, vn) { + const getBgColor = (el: HTMLElement) => { + const style = window.getComputedStyle(el); + if ( + style.backgroundColor && + !["rgba(0, 0, 0, 0)", "rgba(0,0,0,0)", "transparent"].includes( + style.backgroundColor, + ) + ) { + return style.backgroundColor; + } else { + return el.parentElement ? getBgColor(el.parentElement) : "transparent"; + } + }; + + const parentBg = getBgColor(src.parentElement); + + const myBg = getComputedStyle(document.documentElement).getPropertyValue( + "--panel", + ); + + if (parentBg === myBg) { + src.style.backgroundColor = "var(--bg)"; + } else { + src.style.backgroundColor = "var(--panel)"; + } + }, +} as Directive; diff --git a/fe_calckey/frontend/client/src/directives/ripple.ts b/fe_calckey/frontend/client/src/directives/ripple.ts new file mode 100644 index 0000000..395f1a0 --- /dev/null +++ b/fe_calckey/frontend/client/src/directives/ripple.ts @@ -0,0 +1,18 @@ +import Ripple from "@/components/MkRipple.vue"; +import { popup } from "@/os"; + +export default { + mounted(el, binding, vn) { + // 明示的に false であればバインドしない + if (binding.value === false) return; + + el.addEventListener("click", () => { + const rect = el.getBoundingClientRect(); + + const x = rect.left + el.offsetWidth / 2; + const y = rect.top + el.offsetHeight / 2; + + popup(Ripple, { x, y }, {}, "end"); + }); + }, +}; diff --git a/fe_calckey/frontend/client/src/directives/size.ts b/fe_calckey/frontend/client/src/directives/size.ts new file mode 100644 index 0000000..90d868c --- /dev/null +++ b/fe_calckey/frontend/client/src/directives/size.ts @@ -0,0 +1,119 @@ +import { Directive } from "vue"; + +type Value = { max?: number[]; min?: number[] }; + +//const observers = new Map(); +const mountings = new Map< + Element, + { + value: Value; + resize: ResizeObserver; + intersection?: IntersectionObserver; + previousWidth: number; + } +>(); + +type ClassOrder = { + add: string[]; + remove: string[]; +}; + +const cache = new Map(); + +function getClassOrder(width: number, queue: Value): ClassOrder { + const getMaxClass = (v: number) => `max-width_${v}px`; + const getMinClass = (v: number) => `min-width_${v}px`; + + return { + add: [ + ...(queue.max + ? queue.max.filter((v) => width <= v).map(getMaxClass) + : []), + ...(queue.min + ? queue.min.filter((v) => width >= v).map(getMinClass) + : []), + ], + remove: [ + ...(queue.max ? queue.max.filter((v) => width > v).map(getMaxClass) : []), + ...(queue.min ? queue.min.filter((v) => width < v).map(getMinClass) : []), + ], + }; +} + +function applyClassOrder(el: Element, order: ClassOrder) { + el.classList.add(...order.add); + el.classList.remove(...order.remove); +} + +function getOrderName(width: number, queue: Value): string { + return `${width}|${queue.max ? queue.max.join(",") : ""}|${ + queue.min ? queue.min.join(",") : "" + }`; +} + +function calc(el: Element) { + const info = mountings.get(el); + const width = el.clientWidth; + + if (!info || info.previousWidth === width) return; + + // アクティベート前などでsrcが描画されていない場合 + if (!width) { + // IntersectionObserverで表示検出する + if (!info.intersection) { + info.intersection = new IntersectionObserver((entries) => { + if (entries.some((entry) => entry.isIntersecting)) calc(el); + }); + } + info.intersection.observe(el); + return; + } + if (info.intersection) { + info.intersection.disconnect(); + info.intersection = undefined; + } + + mountings.set(el, Object.assign(info, { previousWidth: width })); + + const cached = cache.get(getOrderName(width, info.value)); + if (cached) { + applyClassOrder(el, cached); + } else { + const order = getClassOrder(width, info.value); + cache.set(getOrderName(width, info.value), order); + applyClassOrder(el, order); + } +} + +export default { + mounted(src, binding, vn) { + const resize = new ResizeObserver((entries, observer) => { + calc(src); + }); + + mountings.set(src, { + value: binding.value, + resize, + previousWidth: 0, + }); + + calc(src); + resize.observe(src); + }, + + updated(src, binding, vn) { + mountings.set( + src, + Object.assign({}, mountings.get(src), { value: binding.value }), + ); + calc(src); + }, + + unmounted(src, binding, vn) { + const info = mountings.get(src); + if (!info) return; + info.resize.disconnect(); + if (info.intersection) info.intersection.disconnect(); + mountings.delete(src); + }, +} as Directive; diff --git a/fe_calckey/frontend/client/src/directives/tooltip.ts b/fe_calckey/frontend/client/src/directives/tooltip.ts new file mode 100644 index 0000000..e2db3fb --- /dev/null +++ b/fe_calckey/frontend/client/src/directives/tooltip.ts @@ -0,0 +1,121 @@ +// TODO: useTooltip関数使うようにしたい +// ただディレクティブ内でonUnmountedなどのcomposition api使えるのか不明 + +import { defineAsyncComponent, Directive, ref } from "vue"; +import { isTouchUsing } from "@/scripts/touch"; +import { popup, alert } from "@/os"; +import { mainRouter } from "@/router"; + +const start = isTouchUsing ? "touchstart" : "mouseover"; +const end = isTouchUsing ? "touchend" : "mouseleave"; + +export default { + mounted(el: HTMLElement, binding, vn) { + const delay = binding.modifiers.noDelay ? 0 : 100; + + const self = ((el as any)._tooltipDirective_ = {} as any); + + self.text = binding.value as string; + self._close = null; + self.showTimer = null; + self.hideTimer = null; + self.checkTimer = null; + + if (!binding.modifiers.noLabel) { + if (!document.body.contains(el)) return; + if (self.text == null) return; + el.setAttribute("aria-label", self.text); + } + + self.close = () => { + if (self._close) { + window.clearInterval(self.checkTimer); + self._close(); + self._close = null; + } + }; + + if (binding.arg === "dialog") { + el.addEventListener("click", (ev) => { + ev.preventDefault(); + ev.stopPropagation(); + alert({ + type: "info", + text: binding.value, + }); + return false; + }); + } + + self.show = () => { + if (!document.body.contains(el)) return; + if (self._close) return; + if (self.text == null) return; + + const showing = ref(true); + popup( + defineAsyncComponent(() => import("@/components/MkTooltip.vue")), + { + showing, + text: self.text, + asMfm: binding.modifiers.mfm, + direction: binding.modifiers.left + ? "left" + : binding.modifiers.right + ? "right" + : binding.modifiers.top + ? "top" + : binding.modifiers.bottom + ? "bottom" + : "top", + targetElement: el, + }, + {}, + "closed", + ); + + self._close = () => { + showing.value = false; + }; + }; + + el.addEventListener("selectstart", (ev) => { + ev.preventDefault(); + }); + + function showTooltip() { + window.clearTimeout(self.showTimer); + window.clearTimeout(self.hideTimer); + self.showTimer = window.setTimeout(self.show, delay); + } + function hideTooltip() { + window.clearTimeout(self.showTimer); + window.clearTimeout(self.hideTimer); + self.hideTimer = window.setTimeout(self.close, delay); + } + + el.addEventListener(start, showTooltip, { passive: true }); + el.addEventListener("focusin", showTooltip, { passive: true }); + + el.addEventListener(end, hideTooltip, { passive: true }); + el.addEventListener("focusout", hideTooltip, { passive: true }); + + mainRouter.on("change", hideTooltip); + + el.addEventListener("click", () => { + window.clearTimeout(self.showTimer); + self.close(); + }); + }, + + updated(el, binding) { + const self = el._tooltipDirective_; + self.text = binding.value as string; + }, + + unmounted(el, binding, vn) { + const self = el._tooltipDirective_; + window.clearInterval(self.checkTimer); + self.close(); + }, +} as Directive; diff --git a/fe_calckey/frontend/client/src/directives/user-preview.ts b/fe_calckey/frontend/client/src/directives/user-preview.ts new file mode 100644 index 0000000..a021093 --- /dev/null +++ b/fe_calckey/frontend/client/src/directives/user-preview.ts @@ -0,0 +1,123 @@ +import { defineAsyncComponent, Directive, ref } from "vue"; +import autobind from "autobind-decorator"; +import { popup } from "@/os"; + +export class UserPreview { + private el; + private user; + private showTimer; + private hideTimer; + private checkTimer; + private promise; + + constructor(el, user) { + this.el = el; + this.user = user; + + this.attach(); + } + + @autobind + private show() { + if (!document.body.contains(this.el)) return; + if (this.promise) return; + + const showing = ref(true); + + popup( + defineAsyncComponent(() => import("@/components/MkUserPreview.vue")), + { + showing, + q: this.user, + source: this.el, + }, + { + mouseover: () => { + window.clearTimeout(this.hideTimer); + }, + mouseleave: () => { + window.clearTimeout(this.showTimer); + this.hideTimer = window.setTimeout(this.close, 500); + }, + }, + "closed", + ); + + this.promise = { + cancel: () => { + showing.value = false; + }, + }; + + this.checkTimer = window.setInterval(() => { + if (!document.body.contains(this.el)) { + window.clearTimeout(this.showTimer); + window.clearTimeout(this.hideTimer); + this.close(); + } + }, 1000); + } + + @autobind + private close() { + if (this.promise) { + window.clearInterval(this.checkTimer); + this.promise.cancel(); + this.promise = null; + } + } + + @autobind + private onMouseover() { + window.clearTimeout(this.showTimer); + window.clearTimeout(this.hideTimer); + this.showTimer = window.setTimeout(this.show, 500); + } + + @autobind + private onMouseleave() { + window.clearTimeout(this.showTimer); + window.clearTimeout(this.hideTimer); + this.hideTimer = window.setTimeout(this.close, 500); + } + + @autobind + private onClick() { + window.clearTimeout(this.showTimer); + this.close(); + } + + @autobind + public attach() { + this.el.addEventListener("mouseover", this.onMouseover); + this.el.addEventListener("mouseleave", this.onMouseleave); + this.el.addEventListener("click", this.onClick); + } + + @autobind + public detach() { + this.el.removeEventListener("mouseover", this.onMouseover); + this.el.removeEventListener("mouseleave", this.onMouseleave); + this.el.removeEventListener("click", this.onClick); + window.clearInterval(this.checkTimer); + } +} + +export default { + mounted(el: HTMLElement, binding, vn) { + if (binding.value == null) return; + + // TODO: 新たにプロパティを作るのをやめMapを使う + // ただメモリ的には↓の方が省メモリかもしれないので検討中 + const self = ((el as any)._userPreviewDirective_ = {} as any); + + self.preview = new UserPreview(el, binding.value); + }, + + unmounted(el, binding, vn) { + if (binding.value == null) return; + + const self = el._userPreviewDirective_; + self.preview.detach(); + }, +} as Directive; diff --git a/fe_calckey/frontend/client/src/events.ts b/fe_calckey/frontend/client/src/events.ts new file mode 100644 index 0000000..e8fc1d1 --- /dev/null +++ b/fe_calckey/frontend/client/src/events.ts @@ -0,0 +1,4 @@ +import { EventEmitter } from "eventemitter3"; + +// TODO: 型付け +export const globalEvents = new EventEmitter(); diff --git a/fe_calckey/frontend/client/src/filters/bytes.ts b/fe_calckey/frontend/client/src/filters/bytes.ts new file mode 100644 index 0000000..45cd7bf --- /dev/null +++ b/fe_calckey/frontend/client/src/filters/bytes.ts @@ -0,0 +1,13 @@ +export default (v, digits = 0) => { + if (v == null) return "?"; + const sizes = ["B", "KB", "MB", "GB", "TB"]; + if (v === 0) return "0"; + const isMinus = v < 0; + if (isMinus) v = -v; + const i = Math.floor(Math.log(v) / Math.log(1024)); + return ( + (isMinus ? "-" : "") + + (v / Math.pow(1024, i)).toFixed(digits).replace(/\.0+$/, "") + + sizes[i] + ); +}; diff --git a/fe_calckey/frontend/client/src/filters/note.ts b/fe_calckey/frontend/client/src/filters/note.ts new file mode 100644 index 0000000..5677f6b --- /dev/null +++ b/fe_calckey/frontend/client/src/filters/note.ts @@ -0,0 +1,3 @@ +export const notePage = (note) => { + return `/notes/${note.id}`; +}; diff --git a/fe_calckey/frontend/client/src/filters/number.ts b/fe_calckey/frontend/client/src/filters/number.ts new file mode 100644 index 0000000..35e10fc --- /dev/null +++ b/fe_calckey/frontend/client/src/filters/number.ts @@ -0,0 +1 @@ +export default (n) => (n == null ? "N/A" : n.toLocaleString()); diff --git a/fe_calckey/frontend/client/src/filters/user.ts b/fe_calckey/frontend/client/src/filters/user.ts new file mode 100644 index 0000000..99c96cb --- /dev/null +++ b/fe_calckey/frontend/client/src/filters/user.ts @@ -0,0 +1,15 @@ +import * as misskey from "calckey-js"; +import * as Acct from "calckey-js/built/acct"; +import { url } from "@/config"; + +export const acct = (user: misskey.Acct) => { + return Acct.toString(user); +}; + +export const userName = (user: misskey.entities.User) => { + return user.name || user.username; +}; + +export const userPage = (user: misskey.Acct, path?, absolute = false) => { + return `${absolute ? url : ""}/@${acct(user)}${path ? `/${path}` : ""}`; +}; diff --git a/fe_calckey/frontend/client/src/i18n.ts b/fe_calckey/frontend/client/src/i18n.ts new file mode 100644 index 0000000..5b0a7f9 --- /dev/null +++ b/fe_calckey/frontend/client/src/i18n.ts @@ -0,0 +1,13 @@ +import { markRaw } from "vue"; +import { locale } from "@/config"; +import { I18n } from "@/scripts/i18n"; + +export const i18n = markRaw(new I18n(locale)); + +// このファイルに書きたくないけどここに書かないと何故かVeturが認識しない +declare module "@vue/runtime-core" { + interface ComponentCustomProperties { + $t: typeof i18n["t"]; + $ts: typeof i18n["locale"]; + } +} diff --git a/fe_calckey/frontend/client/src/init.ts b/fe_calckey/frontend/client/src/init.ts new file mode 100644 index 0000000..85213f8 --- /dev/null +++ b/fe_calckey/frontend/client/src/init.ts @@ -0,0 +1,486 @@ +/** + * Client entry point + */ + +// https://vitejs.dev/config/build-options.html#build-modulepreload +import "vite/modulepreload-polyfill"; + +import "@/style.scss"; +import "@phosphor-icons/web/bold"; +import "@phosphor-icons/web/fill"; + +//#region account indexedDB migration +import { set } from "@/scripts/idb-proxy"; + +const accounts = localStorage.getItem("accounts") +if (accounts) { + set("accounts", JSON.parse(accounts)); + localStorage.removeItem("accounts"); +} +//#endregion + +import { + computed, + createApp, + watch, + markRaw, + version as vueVersion, + defineAsyncComponent, +} from "vue"; +import { compareVersions } from "compare-versions"; + +import widgets from "@/widgets"; +import directives from "@/directives"; +import components from "@/components"; +import { version, ui, lang, host } from "@/config"; +import { applyTheme } from "@/scripts/theme"; +import { isDeviceDarkmode } from "@/scripts/is-device-darkmode"; +import { i18n } from "@/i18n"; +import { confirm, alert, post, popup, toast } from "@/os"; +import { stream } from "@/stream"; +import * as sound from "@/scripts/sound"; +import { $i, refreshAccount, login, updateAccount, signout } from "@/account"; +import { defaultStore, ColdDeviceStorage } from "@/store"; +import { fetchInstance, instance } from "@/instance"; +import { makeHotkey } from "@/scripts/hotkey"; +import { search } from "@/scripts/search"; +import { deviceKind } from "@/scripts/device-kind"; +import { initializeSw } from "@/scripts/initialize-sw"; +import { reloadChannel } from "@/scripts/unison-reload"; +import { reactionPicker } from "@/scripts/reaction-picker"; +import { getUrlWithoutLoginId } from "@/scripts/login-id"; +import { getAccountFromId } from "@/scripts/get-account-from-id"; + +function checkForSplash() { + const splash = document.getElementById("splash"); + // 念のためnullチェック(HTMLが古い場合があるため(そのうち消す)) + if (splash) { + splash.style.opacity = "0"; + splash.style.pointerEvents = "none"; + splash.addEventListener("transitionend", () => { + splash.remove(); + }); + } +} + +(async () => { + console.info(`Calckey v${version}`); + + if (_DEV_) { + console.warn("Development mode!!!"); + + console.info(`vue ${vueVersion}`); + + (window as any).$i = $i; + (window as any).$store = defaultStore; + + window.addEventListener("error", (event) => { + console.error(event); + /* + alert({ + type: 'error', + title: 'DEV: Unhandled error', + text: event.message + }); + */ + }); + + window.addEventListener("unhandledrejection", (event) => { + console.error(event); + /* + alert({ + type: 'error', + title: 'DEV: Unhandled promise rejection', + text: event.reason + }); + */ + }); + } + + // タッチデバイスでCSSの:hoverを機能させる + document.addEventListener("touchend", () => {}, { passive: true }); + + // 一斉リロード + reloadChannel.addEventListener("message", (path) => { + if (path !== null) location.href = path; + else location.reload(); + }); + + //#region SEE: https://css-tricks.com/the-trick-to-viewport-units-on-mobile/ + // TODO: いつの日にか消したい + const vh = window.innerHeight * 0.01; + document.documentElement.style.setProperty("--vh", `${vh}px`); + window.addEventListener("resize", () => { + const vh = window.innerHeight * 0.01; + document.documentElement.style.setProperty("--vh", `${vh}px`); + }); + //#endregion + + //#region Set lang attr + const html = document.documentElement; + html.setAttribute("lang", lang || "en-US"); + //#endregion + + //#region loginId + const params = new URLSearchParams(location.search); + const loginId = params.get("loginId"); + + if (loginId) { + const target = getUrlWithoutLoginId(location.href); + + if (!$i || $i.id !== loginId) { + const account = await getAccountFromId(loginId); + if (account) { + await login(account.token, target); + } + } + + history.replaceState({ misskey: "loginId" }, "", target); + } + + //#endregion + + //#region Fetch user + if ($i?.token) { + if (_DEV_) { + console.log("account cache found. refreshing..."); + } + + refreshAccount(); + } else { + if (_DEV_) { + console.log("no account cache found."); + } + + // 連携ログインの場合用にCookieを参照する + const i = (document.cookie.match(/igi=(\w+)/) || [null, null])[1]; + + if (i != null && i !== "null") { + if (_DEV_) { + console.log("signing..."); + } + + try { + document.body.innerHTML = "
Please wait...
"; + await login(i); + } catch (err) { + // Render the error screen + // TODO: ちゃんとしたコンポーネントをレンダリングする(v10とかのトラブルシューティングゲーム付きのやつみたいな) + document.body.innerHTML = '
Oops!
'; + } + } else { + if (_DEV_) { + console.log("not signed in"); + } + } + } + //#endregion + + const fetchInstanceMetaPromise = fetchInstance(); + + fetchInstanceMetaPromise.then(() => { + localStorage.setItem("v", instance.version); + + // Init service worker + initializeSw(); + }); + + const app = createApp( + window.location.search === "?zen" + ? defineAsyncComponent(() => import("@/ui/zen.vue")) + : !$i + ? defineAsyncComponent(() => import("@/ui/visitor.vue")) + : ui === "deck" + ? defineAsyncComponent(() => import("@/ui/deck.vue")) + : defineAsyncComponent(() => import("@/ui/universal.vue")), + ); + + if (_DEV_) { + app.config.performance = true; + } + + app.config.globalProperties = { + $i, + $store: defaultStore, + $instance: instance, + $t: i18n.t, + $ts: i18n.ts, + }; + + widgets(app); + directives(app); + components(app); + + checkForSplash(); + + // https://github.com/misskey-dev/misskey/pull/8575#issuecomment-1114239210 + // なぜかinit.tsの内容が2回実行されることがあるため、mountするdivを1つに制限する + const rootEl = (() => { + const MISSKEY_MOUNT_DIV_ID = "calckey_app"; + + const currentEl = document.getElementById(MISSKEY_MOUNT_DIV_ID); + + if (currentEl) { + console.warn("multiple import detected"); + return currentEl; + } + + const rootEl = document.createElement("div"); + rootEl.id = MISSKEY_MOUNT_DIV_ID; + document.body.appendChild(rootEl); + return rootEl; + })(); + + app.mount(rootEl); + + // boot.jsのやつを解除 + window.onerror = null; + window.onunhandledrejection = null; + + reactionPicker.init(); + + checkForSplash(); + + // クライアントが更新されたか? + const lastVersion = localStorage.getItem("lastVersion"); + + if (lastVersion !== version) { + localStorage.setItem("lastVersion", version); + + // テーマリビルドするため + localStorage.removeItem("theme"); + + try { + // 変なバージョン文字列来るとcompareVersionsでエラーになるため + if ( + lastVersion != null && + compareVersions(version, lastVersion) === 1 && + defaultStore.state.showUpdates + ) { + // ログインしてる場合だけ + if ($i) { + popup( + defineAsyncComponent(() => import("@/components/MkUpdated.vue")), + {}, + {}, + "closed", + ); + } + } + } catch (err) { + console.error(err); + } + } + + // NOTE: この処理は必ず↑のクライアント更新時処理より後に来ること(テーマ再構築のため) + watch( + defaultStore.reactiveState.darkMode, + (darkMode) => { + applyTheme( + darkMode + ? ColdDeviceStorage.get("darkTheme") + : ColdDeviceStorage.get("lightTheme"), + ); + }, + { immediate: localStorage.theme == null }, + ); + + const darkTheme = computed(ColdDeviceStorage.makeGetterSetter("darkTheme")); + const lightTheme = computed(ColdDeviceStorage.makeGetterSetter("lightTheme")); + + watch(darkTheme, (theme) => { + if (defaultStore.state.darkMode) { + applyTheme(theme); + } + }); + + watch(lightTheme, (theme) => { + if (!defaultStore.state.darkMode) { + applyTheme(theme); + } + }); + + //#region Sync dark mode + if (ColdDeviceStorage.get("syncDeviceDarkMode")) { + defaultStore.set("darkMode", isDeviceDarkmode()); + } + window.matchMedia("(prefers-color-scheme: dark)").onchange = (mql) => { + if (ColdDeviceStorage.get("syncDeviceDarkMode")) { + defaultStore.set("darkMode", mql.matches); + } + }; + //#endregion + + fetchInstanceMetaPromise.then(() => { + if (defaultStore.state.themeInitial) { + if (instance.defaultLightTheme != null) + ColdDeviceStorage.set( + "lightTheme", + JSON.parse(instance.defaultLightTheme), + ); + if (instance.defaultDarkTheme != null) + ColdDeviceStorage.set( + "darkTheme", + JSON.parse(instance.defaultDarkTheme), + ); + defaultStore.set("themeInitial", false); + } + }); + + watch( + defaultStore.reactiveState.useBlurEffectForModal, + (v) => { + document.documentElement.style.setProperty( + "--modalBgFilter", + v ? "blur(4px)" : "none", + ); + }, + { immediate: true }, + ); + + watch( + defaultStore.reactiveState.useBlurEffect, + (v) => { + if (v && deviceKind !== "smartphone") { + document.documentElement.style.removeProperty("--blur"); + } else { + document.documentElement.style.setProperty("--blur", "none"); + } + }, + { immediate: true }, + ); + + let reloadDialogShowing = false; + stream.on("_disconnected_", async () => { + if (defaultStore.state.serverDisconnectedBehavior === "reload") { + location.reload(); + } else if (defaultStore.state.serverDisconnectedBehavior === "dialog") { + if (reloadDialogShowing) return; + reloadDialogShowing = true; + const { canceled } = await confirm({ + type: "warning", + title: i18n.ts.disconnectedFromServer, + text: i18n.ts.reloadConfirm, + }); + reloadDialogShowing = false; + if (!canceled) { + location.reload(); + } + } + }); + + stream.on("emojiAdded", (emojiData) => { + // TODO + //store.commit('instance/set', ); + }); + + for (const plugin of ColdDeviceStorage.get("plugins").filter( + (p) => p.active, + )) { + import("./plugin").then(({ install }) => { + install(plugin); + }); + } + + const hotkeys = { + d: (): void => { + defaultStore.set("darkMode", !defaultStore.state.darkMode); + }, + s: search, + }; + + if ($i) { + // only add post shortcuts if logged in + hotkeys["p|n"] = post; + + if ($i.isDeleted) { + alert({ + type: "warning", + text: i18n.ts.accountDeletionInProgress, + }); + } + + const lastUsed = localStorage.getItem("lastUsed"); + if (lastUsed) { + const lastUsedDate = parseInt(lastUsed, 10); + // 二時間以上前なら + if (Date.now() - lastUsedDate > 1000 * 60 * 60 * 2) { + toast( + i18n.t("welcomeBackWithName", { + name: $i.name || $i.username, + }), + ); + } + } + localStorage.setItem("lastUsed", Date.now().toString()); + + if ("Notification" in window) { + // 許可を得ていなかったらリクエスト + if (Notification.permission === "default") { + Notification.requestPermission(); + } + } + + const main = markRaw(stream.useChannel("main", null, "System")); + + // 自分の情報が更新されたとき + main.on("meUpdated", (i) => { + updateAccount(i); + }); + + main.on("readAllNotifications", () => { + updateAccount({ hasUnreadNotification: false }); + }); + + main.on("unreadNotification", () => { + updateAccount({ hasUnreadNotification: true }); + }); + + main.on("unreadMention", () => { + updateAccount({ hasUnreadMentions: true }); + }); + + main.on("readAllUnreadMentions", () => { + updateAccount({ hasUnreadMentions: false }); + }); + + main.on("unreadSpecifiedNote", () => { + updateAccount({ hasUnreadSpecifiedNotes: true }); + }); + + main.on("readAllUnreadSpecifiedNotes", () => { + updateAccount({ hasUnreadSpecifiedNotes: false }); + }); + + main.on("readAllAntennas", () => { + updateAccount({ hasUnreadAntenna: false }); + }); + + main.on("unreadAntenna", () => { + updateAccount({ hasUnreadAntenna: true }); + sound.play("antenna"); + }); + + main.on("readAllAnnouncements", () => { + updateAccount({ hasUnreadAnnouncement: false }); + }); + + main.on("readAllChannels", () => { + updateAccount({ hasUnreadChannel: false }); + }); + + main.on("unreadChannel", () => { + updateAccount({ hasUnreadChannel: true }); + sound.play("channel"); + }); + + // トークンが再生成されたとき + // このままではMisskeyが利用できないので強制的にサインアウトさせる + main.on("myTokenRegenerated", () => { + signout(); + }); + } + + // shortcut + document.addEventListener("keydown", makeHotkey(hotkeys)); +})(); diff --git a/fe_calckey/frontend/client/src/instance.ts b/fe_calckey/frontend/client/src/instance.ts new file mode 100644 index 0000000..69df633 --- /dev/null +++ b/fe_calckey/frontend/client/src/instance.ts @@ -0,0 +1,55 @@ +import { computed, reactive } from "vue"; +import { api } from "./os"; +import type * as Misskey from "calckey-js"; + +// TODO: 他のタブと永続化されたstateを同期 + +const instanceData = localStorage.getItem("instance"); +// TODO: instanceをリアクティブにするかは再考の余地あり + +export const instance: Misskey.entities.DetailedInstanceMetadata = reactive( + instanceData + ? JSON.parse(instanceData) + : { + // TODO: set default values + }, +); + +export async function fetchInstance() { + const meta = await api("meta", { + detail: true, + }); + + for (const [k, v] of Object.entries(meta)) { + instance[k] = v; + } + + localStorage.setItem("instance", JSON.stringify(instance)); +} + +export const emojiCategories = computed(() => { + if (instance.emojis == null) return []; + const categories = new Set(); + for (const emoji of instance.emojis) { + categories.add(emoji.category); + } + return Array.from(categories); +}); + +export const emojiTags = computed(() => { + if (instance.emojis == null) return []; + const tags = new Set(); + for (const emoji of instance.emojis) { + for (const tag of emoji.aliases) { + tags.add(tag); + } + } + return Array.from(tags); +}); + +// このファイルに書きたくないけどここに書かないと何故かVeturが認識しない +declare module "@vue/runtime-core" { + interface ComponentCustomProperties { + $instance: typeof instance; + } +} diff --git a/fe_calckey/frontend/client/src/navbar.ts b/fe_calckey/frontend/client/src/navbar.ts new file mode 100644 index 0000000..7ee4892 --- /dev/null +++ b/fe_calckey/frontend/client/src/navbar.ts @@ -0,0 +1,144 @@ +import { computed, ref, reactive } from "vue"; +import { $i } from "./account"; +import { search } from "@/scripts/search"; +import * as os from "@/os"; +import { i18n } from "@/i18n"; +import { ui } from "@/config"; +import { unisonReload } from "@/scripts/unison-reload"; +import { defaultStore } from "@/store"; +import { instance } from "@/instance"; +import { host } from "@/config"; +import XTutorial from "@/components/MkTutorialDialog.vue"; + +export const navbarItemDef = reactive({ + notifications: { + title: "notifications", + icon: "ph-bell ph-bold ph-lg", + show: computed(() => $i != null), + indicated: computed(() => $i?.hasUnreadNotification), + to: "/my/notifications", + }, + drive: { + title: "drive", + icon: "ph-cloud ph-bold ph-lg", + show: computed(() => $i != null), + to: "/my/drive", + }, + followRequests: { + title: "followRequests", + icon: "ph-hand-waving ph-bold ph-lg", + show: computed(() => $i?.isLocked || $i?.hasPendingReceivedFollowRequest), + indicated: computed(() => $i?.hasPendingReceivedFollowRequest), + to: "/my/follow-requests", + }, + explore: { + title: "explore", + icon: "ph-compass ph-bold ph-lg", + to: "/explore", + }, + announcements: { + title: "announcements", + icon: "ph-megaphone-simple ph-bold ph-lg", + indicated: computed(() => $i?.hasUnreadAnnouncement), + to: "/announcements", + }, + search: { + title: "search", + icon: "ph-magnifying-glass ph-bold ph-lg", + action: () => search(), + }, + lists: { + title: "lists", + icon: "ph-list-bullets ph-bold ph-lg", + show: computed(() => $i != null), + to: "/my/lists", + }, + /* + groups: { + title: 'groups', + icon: 'ph-users-three ph-bold ph-lg', + show: computed(() => $i != null), + to: '/my/groups', + }, + */ + antennas: { + title: "antennas", + icon: "ph-flying-saucer ph-bold ph-lg", + show: computed(() => $i != null), + to: "/my/antennas", + }, + favorites: { + title: "favorites", + icon: "ph-bookmark-simple ph-bold ph-lg", + show: computed(() => $i != null), + to: "/my/favorites", + }, + pages: { + title: "pages", + icon: "ph-file-text ph-bold ph-lg", + to: "/pages", + }, + gallery: { + title: "gallery", + icon: "ph-image-square ph-bold ph-lg", + to: "/gallery", + }, + clips: { + title: "clips", + icon: "ph-paperclip ph-bold ph-lg", + show: computed(() => $i != null), + to: "/my/clips", + }, + channels: { + title: "channel", + icon: "ph-television ph-bold ph-lg", + to: "/channels", + }, + groups: { + title: "groups", + icon: "ph-users-three ph-bold ph-lg", + to: "/my/groups", + }, + ui: { + title: "switchUi", + icon: "ph-layout ph-bold ph-lg", + action: (ev) => { + os.popupMenu( + [ + { + text: i18n.ts.default, + active: ui === "default" || ui === null, + action: () => { + localStorage.setItem("ui", "default"); + unisonReload(); + }, + }, + { + text: i18n.ts.classic, + active: ui === "classic", + action: () => { + localStorage.setItem("ui", "classic"); + unisonReload(); + }, + }, + { + text: i18n.ts.deck, + active: ui === "deck", + action: () => { + localStorage.setItem("ui", "deck"); + unisonReload(); + }, + }, + ], + ev.currentTarget ?? ev.target, + ); + }, + }, + reload: { + title: "reload", + icon: "ph-arrows-clockwise ph-bold ph-lg", + action: (ev) => { + location.reload(); + }, + }, +}); diff --git a/fe_calckey/frontend/client/src/nirax.ts b/fe_calckey/frontend/client/src/nirax.ts new file mode 100644 index 0000000..7e481f1 --- /dev/null +++ b/fe_calckey/frontend/client/src/nirax.ts @@ -0,0 +1,287 @@ +// NIRAX --- A lightweight router + +import { EventEmitter } from "eventemitter3"; +import { Ref, Component, ref, shallowRef, ShallowRef } from "vue"; +import { pleaseLogin } from "@/scripts/please-login"; +import { safeURIDecode } from "@/scripts/safe-uri-decode"; + +type RouteDef = { + path: string; + component: Component; + query?: Record; + loginRequired?: boolean; + name?: string; + hash?: string; + globalCacheKey?: string; + children?: RouteDef[]; +}; + +type ParsedPath = ( + | string + | { + name: string; + startsWith?: string; + wildcard?: boolean; + optional?: boolean; + } +)[]; + +export type Resolved = { + route: RouteDef; + props: Map; + child?: Resolved; +}; + +function parsePath(path: string): ParsedPath { + const res = [] as ParsedPath; + + path = path.substring(1); + + for (const part of path.split("/")) { + if (part.includes(":")) { + const prefix = part.substring(0, part.indexOf(":")); + const placeholder = part.substring(part.indexOf(":") + 1); + const wildcard = placeholder.includes("(*)"); + const optional = placeholder.endsWith("?"); + res.push({ + name: placeholder.replace("(*)", "").replace("?", ""), + startsWith: prefix !== "" ? prefix : undefined, + wildcard, + optional, + }); + } else if (part.length !== 0) { + res.push(part); + } + } + + return res; +} + +export class Router extends EventEmitter<{ + change: (ctx: { + beforePath: string; + path: string; + resolved: Resolved; + key: string; + }) => void; + replace: (ctx: { + path: string; + key: string; + }) => void; + push: (ctx: { + beforePath: string; + path: string; + route: RouteDef | null; + props: Map | null; + key: string; + }) => void; + same: () => void; +}> { + private routes: RouteDef[]; + public current: Resolved; + public currentRef: ShallowRef = shallowRef(); + public currentRoute: ShallowRef = shallowRef(); + private currentPath: string; + private currentKey = Date.now().toString(); + + public navHook: ((path: string, flag?: any) => boolean) | null = null; + + constructor(routes: Router["routes"], currentPath: Router["currentPath"]) { + super(); + + this.routes = routes; + this.currentPath = currentPath; + this.navigate(currentPath, null, false); + } + + public resolve(path: string): Resolved | null { + let queryString: string | null = null; + let hash: string | null = null; + if (path[0] === "/") path = path.substring(1); + if (path.includes("#")) { + hash = path.substring(path.indexOf("#") + 1); + path = path.substring(0, path.indexOf("#")); + } + if (path.includes("?")) { + queryString = path.substring(path.indexOf("?") + 1); + path = path.substring(0, path.indexOf("?")); + } + + if (_DEV_) console.log("Routing: ", path, queryString); + + function check(routes: RouteDef[], _parts: string[]): Resolved | null { + forEachRouteLoop: for (const route of routes) { + let parts = [..._parts]; + const props = new Map(); + + pathMatchLoop: for (const p of parsePath(route.path)) { + if (typeof p === "string") { + if (p === parts[0]) { + parts.shift(); + } else { + continue forEachRouteLoop; + } + } else { + if (parts[0] == null && !p.optional) { + continue forEachRouteLoop; + } + if (p.wildcard) { + if (parts.length !== 0) { + props.set(p.name, safeURIDecode(parts.join("/"))); + parts = []; + } + break pathMatchLoop; + } else { + if (p.startsWith) { + if (parts[0] == null || !parts[0].startsWith(p.startsWith)) + continue forEachRouteLoop; + + props.set( + p.name, + safeURIDecode(parts[0].substring(p.startsWith.length)), + ); + parts.shift(); + } else { + if (parts[0]) { + props.set(p.name, safeURIDecode(parts[0])); + } + parts.shift(); + } + } + } + } + + if (parts.length === 0) { + if (route.children) { + const child = check(route.children, []); + if (child) { + return { + route, + props, + child, + }; + } else { + continue forEachRouteLoop; + } + } + + if (route.hash != null && hash != null) { + props.set(route.hash, safeURIDecode(hash)); + } + + if (route.query != null && queryString != null) { + const queryObject = [ + ...new URLSearchParams(queryString).entries(), + ].reduce((obj, entry) => ({ ...obj, [entry[0]]: entry[1] }), {}); + + for (const q in route.query) { + const as = route.query[q]; + if (queryObject[q]) { + props.set(as, safeURIDecode(queryObject[q])); + } + } + } + + return { + route, + props, + }; + } else { + if (route.children) { + const child = check(route.children, parts); + if (child) { + return { + route, + props, + child, + }; + } else { + } + } else { + } + } + } + + return null; + } + + const _parts = path.split("/").filter((part) => part.length !== 0); + + return check(this.routes, _parts); + } + + private navigate( + path: string, + key: string | null | undefined, + emitChange = true, + ) { + const beforePath = this.currentPath; + this.currentPath = path; + + const res = this.resolve(this.currentPath); + + if (res == null) { + throw new Error(`no route found for: ${path}`); + } + + if (res.route.loginRequired) { + pleaseLogin("/"); + } + + const isSamePath = beforePath === path; + if (isSamePath && key == null) key = this.currentKey; + this.current = res; + this.currentRef.value = res; + this.currentRoute.value = res.route; + this.currentKey = res.route.globalCacheKey ?? key ?? path; + + if (emitChange) { + this.emit("change", { + beforePath, + path, + resolved: res, + key: this.currentKey, + }); + } + + return res; + } + + public getCurrentPath() { + return this.currentPath; + } + + public getCurrentKey() { + return this.currentKey; + } + + public push(path: string, flag?: any) { + const beforePath = this.currentPath; + if (path === beforePath) { + this.emit("same"); + return; + } + if (this.navHook) { + const cancel = this.navHook(path, flag); + if (cancel) return; + } + const res = this.navigate(path, null); + this.emit("push", { + beforePath, + path, + route: res.route, + props: res.props, + key: this.currentKey, + }); + } + + public replace(path: string, key?: string | null, emitEvent = true) { + this.navigate(path, key); + if (emitEvent) { + this.emit("replace", { + path, + key: this.currentKey, + }); + } + } +} diff --git a/fe_calckey/frontend/client/src/os.ts b/fe_calckey/frontend/client/src/os.ts new file mode 100644 index 0000000..32bb8f7 --- /dev/null +++ b/fe_calckey/frontend/client/src/os.ts @@ -0,0 +1,924 @@ +// TODO: なんでもかんでもos.tsに突っ込むのやめたいのでよしなに分割する + +import { Component, markRaw, Ref, ref, defineAsyncComponent } from "vue"; +import { EventEmitter } from "eventemitter3"; +import insertTextAtCursor from "insert-text-at-cursor"; +import * as Misskey from "calckey-js"; +import { apiUrl, url } from "@/config"; +import MkPostFormDialog from "@/components/MkPostFormDialog.vue"; +import MkWaitingDialog from "@/components/MkWaitingDialog.vue"; +import MkToast from "@/components/MkToast.vue"; +import MkDialog from "@/components/MkDialog.vue"; +import { MenuItem } from "@/types/menu"; +import { $i } from "@/account"; +import { i18n } from "./i18n"; + +export const pendingApiRequestsCount = ref(0); + +const apiClient = new Misskey.api.APIClient({ + origin: url, +}); + +export const api = (( + endpoint: string, + data: Record = {}, + token?: string | null | undefined, +) => { + pendingApiRequestsCount.value++; + + const onFinally = () => { + pendingApiRequestsCount.value--; + }; + + const authorizationToken = token ?? $i?.token ?? undefined; + const authorization = authorizationToken + ? `Bearer ${authorizationToken}` + : undefined; + + const promise = new Promise((resolve, reject) => { + fetch(endpoint.indexOf("://") > -1 ? endpoint : `${apiUrl}/${endpoint}`, { + method: "POST", + body: JSON.stringify(data), + credentials: "omit", + cache: "no-cache", + headers: authorization ? { authorization } : {}, + }) + .then(async (res) => { + const body = res.status === 204 ? null : await res.json(); + + if (res.status === 200) { + resolve(body); + } else if (res.status === 204) { + resolve(); + } else { + reject(body.error); + } + }) + .catch(reject); + }); + + promise.then(onFinally, onFinally); + + return promise; +}) as typeof apiClient.request; + +export const apiGet = (( + endpoint: string, + data: Record = {}, + token?: string | null | undefined, +) => { + pendingApiRequestsCount.value++; + + const onFinally = () => { + pendingApiRequestsCount.value--; + }; + + const query = new URLSearchParams(data); + + const authorizationToken = token ?? $i?.token ?? undefined; + const authorization = authorizationToken + ? `Bearer ${authorizationToken}` + : undefined; + + const promise = new Promise((resolve, reject) => { + // Send request + fetch(`${apiUrl}/${endpoint}?${query}`, { + method: "GET", + credentials: "omit", + cache: "default", + headers: authorization ? { authorization } : {}, + }) + .then(async (res) => { + const body = res.status === 204 ? null : await res.json(); + + if (res.status === 200) { + resolve(body); + } else if (res.status === 204) { + resolve(); + } else { + reject(body.error); + } + }) + .catch(reject); + }); + + promise.then(onFinally, onFinally); + + return promise; +}) as typeof apiClient.request; + +export const apiWithDialog = (( + endpoint: string, + data: Record = {}, + token?: string | null | undefined, +) => { + const promise = api(endpoint, data, token); + promiseDialog(promise, null, (err) => { + alert({ + type: "error", + text: err.message + "\n" + (err as any).id, + }); + }); + + return promise; +}) as typeof api; + +export function promiseDialog>( + promise: T, + onSuccess?: ((res: any) => void) | null, + onFailure?: ((err: Error) => void) | null, + text?: string, +): T { + const showing = ref(true); + const success = ref(false); + + promise + .then((res) => { + if (onSuccess) { + showing.value = false; + onSuccess(res); + } else { + success.value = true; + window.setTimeout(() => { + showing.value = false; + }, 1000); + } + }) + .catch((err) => { + showing.value = false; + if (onFailure) { + onFailure(err); + } else { + alert({ + type: "error", + text: err, + }); + } + }); + + // NOTE: dynamic importすると挙動がおかしくなる(showingの変更が伝播しない) + popup( + MkWaitingDialog, + { + success: success, + showing: showing, + text: text, + }, + {}, + "closed", + ); + + return promise; +} + +let popupIdCount = 0; +export const popups = ref([]) as Ref< + { + id: any; + component: any; + props: Record; + }[] +>; + +const zIndexes = { + low: 1000000, + middle: 2000000, + high: 3000000, +}; +export function claimZIndex( + priority: "low" | "middle" | "high" = "low", +): number { + zIndexes[priority] += 100; + return zIndexes[priority]; +} + +let uniqueId = 0; +export function getUniqueId(): string { + return uniqueId++ + ""; +} + +export async function popup( + component: Component, + props: Record, + events = {}, + disposeEvent?: string, +) { + markRaw(component); + + const id = ++popupIdCount; + const dispose = () => { + // このsetTimeoutが無いと挙動がおかしくなる(autocompleteが閉じなくなる)。Vueのバグ? + window.setTimeout(() => { + popups.value = popups.value.filter((popup) => popup.id !== id); + }, 0); + }; + const state = { + component, + props, + events: disposeEvent + ? { + ...events, + [disposeEvent]: dispose, + } + : events, + id, + }; + + popups.value.push(state); + + return { + dispose, + }; +} + +export function pageWindow(path: string) { + popup( + defineAsyncComponent({ + loader: () => import("@/components/MkPageWindow.vue"), + loadingComponent: MkWaitingDialog, + delay: 1000, + }), + { + initialPath: path, + }, + {}, + "closed", + ); +} + +export function modalPageWindow(path: string) { + popup( + defineAsyncComponent({ + loader: () => import("@/components/MkModalPageWindow.vue"), + loadingComponent: MkWaitingDialog, + delay: 1000, + }), + { + initialPath: path, + }, + {}, + "closed", + ); +} + +export function toast(message: string) { + popup( + MkToast, + { + message, + }, + {}, + "closed", + ); +} + +export function alert(props: { + type?: "error" | "info" | "success" | "warning" | "waiting" | "question"; + title?: string | null; + text?: string | null; +}): Promise { + return new Promise((resolve, reject) => { + if (props.text == null && props.type === "error") { + props.text = i18n.ts.somethingHappened; + } + popup( + MkDialog, + props, + { + done: (result) => { + resolve(); + }, + }, + "closed", + ); + }); +} + +export function confirm(props: { + type: "error" | "info" | "success" | "warning" | "waiting" | "question"; + title?: string | null; + text?: string | null; + okText?: string; + cancelText?: string; +}): Promise<{ canceled: boolean }> { + return new Promise((resolve, reject) => { + popup( + MkDialog, + { + ...props, + showCancelButton: true, + }, + { + done: (result) => { + resolve(result ? result : { canceled: true }); + }, + }, + "closed", + ); + }); +} + +export function yesno(props: { + type: "error" | "info" | "success" | "warning" | "waiting" | "question"; + title?: string | null; + text?: string | null; +}): Promise<{ canceled: boolean }> { + return new Promise((resolve, reject) => { + popup( + defineAsyncComponent({ + loader: () => import("@/components/MkDialog.vue"), + loadingComponent: MkWaitingDialog, + delay: 1000, + }), + { + ...props, + showCancelButton: true, + isYesNo: true, + }, + { + done: (result) => { + resolve(result ? result : { canceled: true }); + }, + }, + "closed", + ); + }); +} + +export function inputText(props: { + type?: "text" | "email" | "password" | "url" | "search"; + title?: string | null; + text?: string | null; + placeholder?: string | null; + autocomplete?: string; + default?: string | null; + minLength?: number; + maxLength?: number; +}): Promise< + | { canceled: true; result: undefined } + | { + canceled: false; + result: string; + } +> { + return new Promise((resolve, reject) => { + popup( + MkDialog, + { + title: props.title, + text: props.text, + input: { + type: props.type, + placeholder: props.placeholder, + autocomplete: props.autocomplete, + default: props.default, + minLength: props.minLength, + maxLength: props.maxLength, + }, + }, + { + done: (result) => { + resolve(result ? result : { canceled: true }); + }, + }, + "closed", + ); + }); +} + +export function inputParagraph(props: { + title?: string | null; + text?: string | null; + placeholder?: string | null; + default?: string | null; +}): Promise< + | { canceled: true; result: undefined } + | { + canceled: false; + result: string; + } +> { + return new Promise((resolve, reject) => { + popup( + defineAsyncComponent({ + loader: () => import("@/components/MkDialog.vue"), + loadingComponent: MkWaitingDialog, + delay: 1000, + }), + { + title: props.title, + text: props.text, + input: { + type: "paragraph", + placeholder: props.placeholder, + default: props.default, + }, + }, + { + done: (result) => { + resolve(result ? result : { canceled: true }); + }, + }, + "closed", + ); + }); +} + +export function inputNumber(props: { + title?: string | null; + text?: string | null; + placeholder?: string | null; + default?: number | null; + autocomplete?: string; +}): Promise< + | { canceled: true; result: undefined } + | { + canceled: false; + result: number; + } +> { + return new Promise((resolve, reject) => { + popup( + defineAsyncComponent({ + loader: () => import("@/components/MkDialog.vue"), + loadingComponent: MkWaitingDialog, + delay: 1000, + }), + { + title: props.title, + text: props.text, + input: { + type: "number", + placeholder: props.placeholder, + autocomplete: props.autocomplete, + default: props.default, + }, + }, + { + done: (result) => { + resolve(result ? result : { canceled: true }); + }, + }, + "closed", + ); + }); +} + +export function inputDate(props: { + title?: string | null; + text?: string | null; + placeholder?: string | null; + default?: Date | null; +}): Promise< + | { canceled: true; result: undefined } + | { + canceled: false; + result: Date; + } +> { + return new Promise((resolve, reject) => { + popup( + MkDialog, + { + title: props.title, + text: props.text, + input: { + type: "date", + placeholder: props.placeholder, + default: props.default, + }, + }, + { + done: (result) => { + resolve( + result + ? { + result: new Date(result.result), + canceled: false, + } + : { canceled: true }, + ); + }, + }, + "closed", + ); + }); +} + +export function select( + props: { + title?: string | null; + text?: string | null; + default?: string | null; + } & ( + | { + items: { + value: C; + text: string; + }[]; + } + | { + groupedItems: { + label: string; + items: { + value: C; + text: string; + }[]; + }[]; + } + ), +): Promise< + | { canceled: true; result: undefined } + | { + canceled: false; + result: C; + } +> { + return new Promise((resolve, reject) => { + popup( + MkDialog, + { + title: props.title, + text: props.text, + select: { + items: props.items, + groupedItems: props.groupedItems, + default: props.default, + }, + }, + { + done: (result) => { + resolve(result ? result : { canceled: true }); + }, + }, + "closed", + ); + }); +} + +export function success(): Promise { + return new Promise((resolve, reject) => { + const showing = ref(true); + window.setTimeout(() => { + showing.value = false; + }, 1000); + popup( + MkWaitingDialog, + { + success: true, + showing: showing, + }, + { + done: () => resolve(), + }, + "closed", + ); + }); +} + +export function waiting(): Promise { + return new Promise((resolve, reject) => { + const showing = ref(true); + popup( + MkWaitingDialog, + { + success: false, + showing: showing, + }, + { + done: () => resolve(), + }, + "closed", + ); + }); +} + +export function form(title, form) { + return new Promise((resolve, reject) => { + popup( + defineAsyncComponent({ + loader: () => import("@/components/MkFormDialog.vue"), + loadingComponent: MkWaitingDialog, + delay: 1000, + }), + { title, form }, + { + done: (result) => { + resolve(result); + }, + }, + "closed", + ); + }); +} + +export async function selectUser() { + return new Promise((resolve, reject) => { + popup( + defineAsyncComponent({ + loader: () => import("@/components/MkUserSelectDialog.vue"), + loadingComponent: MkWaitingDialog, + delay: 1000, + }), + {}, + { + ok: (user) => { + resolve(user); + }, + }, + "closed", + ); + }); +} + +export async function selectInstance(): Promise { + return new Promise((resolve, reject) => { + popup( + defineAsyncComponent({ + loader: () => import("@/components/MkInstanceSelectDialog.vue"), + loadingComponent: MkWaitingDialog, + delay: 1000, + }), + {}, + { + ok: (instance) => { + resolve(instance); + }, + }, + "closed", + ); + }); +} + +export async function selectDriveFile(multiple: boolean) { + return new Promise((resolve, reject) => { + popup( + defineAsyncComponent({ + loader: () => import("@/components/MkDriveSelectDialog.vue"), + loadingComponent: MkWaitingDialog, + delay: 1000, + }), + { + type: "file", + multiple, + }, + { + done: (files) => { + if (files) { + resolve(multiple ? files : files[0]); + } + }, + }, + "closed", + ); + }); +} + +export async function selectDriveFolder(multiple: boolean) { + return new Promise((resolve, reject) => { + popup( + defineAsyncComponent({ + loader: () => import("@/components/MkDriveSelectDialog.vue"), + loadingComponent: MkWaitingDialog, + delay: 1000, + }), + { + type: "folder", + multiple, + }, + { + done: (folders) => { + if (folders) { + resolve(multiple ? folders : folders[0]); + } + }, + }, + "closed", + ); + }); +} + +export async function pickEmoji(src: HTMLElement | null, opts) { + return new Promise((resolve, reject) => { + popup( + defineAsyncComponent({ + loader: () => import("@/components/MkEmojiPickerDialog.vue"), + loadingComponent: MkWaitingDialog, + delay: 1000, + }), + { + src, + ...opts, + }, + { + done: (emoji) => { + resolve(emoji); + }, + }, + "closed", + ); + }); +} + +export async function cropImage( + image: Misskey.entities.DriveFile, + options: { + aspectRatio: number; + }, +): Promise { + return new Promise((resolve, reject) => { + popup( + defineAsyncComponent({ + loader: () => import("@/components/MkCropperDialog.vue"), + loadingComponent: MkWaitingDialog, + delay: 1000, + }), + { + file: image, + aspectRatio: options.aspectRatio, + }, + { + ok: (x) => { + resolve(x); + }, + }, + "closed", + ); + }); +} + +type AwaitType = T extends Promise + ? U + : T extends (...args: any[]) => Promise + ? V + : T; +let openingEmojiPicker: AwaitType> | null = null; +let activeTextarea: HTMLTextAreaElement | HTMLInputElement | null = null; +export async function openEmojiPicker( + src?: HTMLElement, + opts, + initialTextarea: typeof activeTextarea, +) { + if (openingEmojiPicker) return; + + activeTextarea = initialTextarea; + + const textareas = document.querySelectorAll("textarea, input"); + for (const textarea of Array.from(textareas)) { + textarea.addEventListener("focus", () => { + activeTextarea = textarea; + }); + } + + const observer = new MutationObserver((records) => { + for (const record of records) { + for (const node of Array.from(record.addedNodes).filter( + (node) => node instanceof HTMLElement, + ) as HTMLElement[]) { + const textareas = node.querySelectorAll("textarea, input"); + for (const textarea of Array.from(textareas).filter( + (textarea) => textarea.dataset.preventEmojiInsert == null, + )) { + if (document.activeElement === textarea) activeTextarea = textarea; + textarea.addEventListener("focus", () => { + activeTextarea = textarea; + }); + } + } + } + }); + + observer.observe(document.body, { + childList: true, + subtree: true, + attributes: false, + characterData: false, + }); + + openingEmojiPicker = await popup( + defineAsyncComponent({ + loader: () => import("@/components/MkEmojiPickerDialog.vue"), + loadingComponent: MkWaitingDialog, + delay: 1000, + }), + { + src, + ...opts, + }, + { + chosen: (emoji) => { + insertTextAtCursor(activeTextarea, emoji); + }, + done: (emoji) => { + insertTextAtCursor(activeTextarea, emoji); + }, + closed: () => { + openingEmojiPicker!.dispose(); + openingEmojiPicker = null; + observer.disconnect(); + }, + }, + ); +} + +export function popupMenu( + items: MenuItem[] | Ref, + src?: HTMLElement, + options?: { + align?: string; + width?: number; + viaKeyboard?: boolean; + noReturnFocus?: boolean; + }, +) { + return new Promise((resolve, reject) => { + let dispose; + popup( + defineAsyncComponent({ + loader: () => import("@/components/MkPopupMenu.vue"), + loadingComponent: MkWaitingDialog, + delay: 1000, + }), + { + items, + src, + width: options?.width, + align: options?.align, + viaKeyboard: options?.viaKeyboard, + noReturnFocus: options?.noReturnFocus, + }, + { + closed: () => { + resolve(); + dispose(); + }, + }, + ).then((res) => { + dispose = res.dispose; + }); + }); +} + +export function contextMenu( + items: MenuItem[] | Ref, + ev: MouseEvent, +) { + ev.preventDefault(); + return new Promise((resolve, reject) => { + let dispose; + popup( + defineAsyncComponent({ + loader: () => import("@/components/MkContextMenu.vue"), + loadingComponent: MkWaitingDialog, + delay: 1000, + }), + { + items, + ev, + }, + { + closed: () => { + resolve(); + dispose(); + }, + }, + ).then((res) => { + dispose = res.dispose; + }); + }); +} + +export function post(props: Record = {}) { + return new Promise((resolve, reject) => { + // NOTE: MkPostFormDialogをdynamic importするとiOSでテキストエリアに自動フォーカスできない + // NOTE: ただ、dynamic importしない場合、MkPostFormDialogインスタンスが使いまわされ、 + // Vueが渡されたコンポーネントに内部的に__propsというプロパティを生やす影響で、 + // 複数のpost formを開いたときに場合によってはエラーになる + // もちろん複数のpost formを開けること自体Misskeyサイドのバグなのだが + let dispose; + popup(MkPostFormDialog, props, { + closed: () => { + resolve(); + dispose(); + }, + }).then((res) => { + dispose = res.dispose; + }); + }); +} + +export const deckGlobalEvents = new EventEmitter(); + +/* +export function checkExistence(fileData: ArrayBuffer): Promise { + return new Promise((resolve, reject) => { + const data = new FormData(); + data.append('md5', getMD5(fileData)); + + os.api('drive/files/find-by-hash', { + md5: getMD5(fileData) + }).then(resp => { + resolve(resp.length > 0 ? resp[0] : null); + }); + }); +}*/ diff --git a/fe_calckey/frontend/client/src/pages/_empty_.vue b/fe_calckey/frontend/client/src/pages/_empty_.vue new file mode 100644 index 0000000..3dee6cd --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/_empty_.vue @@ -0,0 +1,7 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/_error_.vue b/fe_calckey/frontend/client/src/pages/_error_.vue new file mode 100644 index 0000000..ac0c808 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/_error_.vue @@ -0,0 +1,111 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/_loading_.vue b/fe_calckey/frontend/client/src/pages/_loading_.vue new file mode 100644 index 0000000..832c059 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/_loading_.vue @@ -0,0 +1,5 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/about-calckey.vue b/fe_calckey/frontend/client/src/pages/about-calckey.vue new file mode 100644 index 0000000..1e16356 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/about-calckey.vue @@ -0,0 +1,275 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/about.emojis.vue b/fe_calckey/frontend/client/src/pages/about.emojis.vue new file mode 100644 index 0000000..90d9fb8 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/about.emojis.vue @@ -0,0 +1,170 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/about.federation.vue b/fe_calckey/frontend/client/src/pages/about.federation.vue new file mode 100644 index 0000000..ca9a6d7 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/about.federation.vue @@ -0,0 +1,170 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/about.vue b/fe_calckey/frontend/client/src/pages/about.vue new file mode 100644 index 0000000..3e951c0 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/about.vue @@ -0,0 +1,462 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/admin-file.vue b/fe_calckey/frontend/client/src/pages/admin-file.vue new file mode 100644 index 0000000..63a8132 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin-file.vue @@ -0,0 +1,294 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/_header_.vue b/fe_calckey/frontend/client/src/pages/admin/_header_.vue new file mode 100644 index 0000000..a1a8c97 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/_header_.vue @@ -0,0 +1,338 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/abuses.vue b/fe_calckey/frontend/client/src/pages/admin/abuses.vue new file mode 100644 index 0000000..27d8a70 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/abuses.vue @@ -0,0 +1,140 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/announcements.vue b/fe_calckey/frontend/client/src/pages/admin/announcements.vue new file mode 100644 index 0000000..9853158 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/announcements.vue @@ -0,0 +1,144 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/bot-protection.vue b/fe_calckey/frontend/client/src/pages/admin/bot-protection.vue new file mode 100644 index 0000000..f47300e --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/bot-protection.vue @@ -0,0 +1,123 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/custom-css.vue b/fe_calckey/frontend/client/src/pages/admin/custom-css.vue new file mode 100644 index 0000000..2362c1f --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/custom-css.vue @@ -0,0 +1,56 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/database.vue b/fe_calckey/frontend/client/src/pages/admin/database.vue new file mode 100644 index 0000000..4154e90 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/database.vue @@ -0,0 +1,63 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/email-settings.vue b/fe_calckey/frontend/client/src/pages/admin/email-settings.vue new file mode 100644 index 0000000..3eaee55 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/email-settings.vue @@ -0,0 +1,174 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/emoji-edit-dialog.vue b/fe_calckey/frontend/client/src/pages/admin/emoji-edit-dialog.vue new file mode 100644 index 0000000..053f3d3 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/emoji-edit-dialog.vue @@ -0,0 +1,123 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/emojis.vue b/fe_calckey/frontend/client/src/pages/admin/emojis.vue new file mode 100644 index 0000000..2db08cf --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/emojis.vue @@ -0,0 +1,549 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/experiments.vue b/fe_calckey/frontend/client/src/pages/admin/experiments.vue new file mode 100644 index 0000000..0c9a258 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/experiments.vue @@ -0,0 +1,91 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/federation.vue b/fe_calckey/frontend/client/src/pages/admin/federation.vue new file mode 100644 index 0000000..d288a56 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/federation.vue @@ -0,0 +1,33 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/files.vue b/fe_calckey/frontend/client/src/pages/admin/files.vue new file mode 100644 index 0000000..e808ab6 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/files.vue @@ -0,0 +1,148 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/hashtags.vue b/fe_calckey/frontend/client/src/pages/admin/hashtags.vue new file mode 100644 index 0000000..d10ee44 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/hashtags.vue @@ -0,0 +1,61 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/index.vue b/fe_calckey/frontend/client/src/pages/admin/index.vue new file mode 100644 index 0000000..e6932fb --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/index.vue @@ -0,0 +1,487 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/instance-block.vue b/fe_calckey/frontend/client/src/pages/admin/instance-block.vue new file mode 100644 index 0000000..f3c4f54 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/instance-block.vue @@ -0,0 +1,85 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/integrations.discord.vue b/fe_calckey/frontend/client/src/pages/admin/integrations.discord.vue new file mode 100644 index 0000000..2bf0470 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/integrations.discord.vue @@ -0,0 +1,69 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/integrations.github.vue b/fe_calckey/frontend/client/src/pages/admin/integrations.github.vue new file mode 100644 index 0000000..67c57a7 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/integrations.github.vue @@ -0,0 +1,69 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/integrations.vue b/fe_calckey/frontend/client/src/pages/admin/integrations.vue new file mode 100644 index 0000000..510b32a --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/integrations.vue @@ -0,0 +1,69 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/object-storage.vue b/fe_calckey/frontend/client/src/pages/admin/object-storage.vue new file mode 100644 index 0000000..46760b8 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/object-storage.vue @@ -0,0 +1,223 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/other-settings.vue b/fe_calckey/frontend/client/src/pages/admin/other-settings.vue new file mode 100644 index 0000000..1d74e75 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/other-settings.vue @@ -0,0 +1,48 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/overview.active-users.vue b/fe_calckey/frontend/client/src/pages/admin/overview.active-users.vue new file mode 100644 index 0000000..25dcac4 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/overview.active-users.vue @@ -0,0 +1,181 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/overview.ap-requests.vue b/fe_calckey/frontend/client/src/pages/admin/overview.ap-requests.vue new file mode 100644 index 0000000..c655336 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/overview.ap-requests.vue @@ -0,0 +1,297 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/overview.federation.vue b/fe_calckey/frontend/client/src/pages/admin/overview.federation.vue new file mode 100644 index 0000000..ab4dd2c --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/overview.federation.vue @@ -0,0 +1,217 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/overview.heatmap.vue b/fe_calckey/frontend/client/src/pages/admin/overview.heatmap.vue new file mode 100644 index 0000000..e926fdc --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/overview.heatmap.vue @@ -0,0 +1,31 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/overview.instances.vue b/fe_calckey/frontend/client/src/pages/admin/overview.instances.vue new file mode 100644 index 0000000..e5d0d1d --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/overview.instances.vue @@ -0,0 +1,61 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/overview.metrics.vue b/fe_calckey/frontend/client/src/pages/admin/overview.metrics.vue new file mode 100644 index 0000000..cfd4974 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/overview.metrics.vue @@ -0,0 +1,145 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/overview.moderators.vue b/fe_calckey/frontend/client/src/pages/admin/overview.moderators.vue new file mode 100644 index 0000000..a29cc20 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/overview.moderators.vue @@ -0,0 +1,68 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/overview.pie.vue b/fe_calckey/frontend/client/src/pages/admin/overview.pie.vue new file mode 100644 index 0000000..9de9f5c --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/overview.pie.vue @@ -0,0 +1,87 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/overview.queue-chart.vue b/fe_calckey/frontend/client/src/pages/admin/overview.queue-chart.vue new file mode 100644 index 0000000..ebc344f --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/overview.queue-chart.vue @@ -0,0 +1,222 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/overview.queue.chart.vue b/fe_calckey/frontend/client/src/pages/admin/overview.queue.chart.vue new file mode 100644 index 0000000..01a0d0e --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/overview.queue.chart.vue @@ -0,0 +1,149 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/overview.queue.vue b/fe_calckey/frontend/client/src/pages/admin/overview.queue.vue new file mode 100644 index 0000000..5b00388 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/overview.queue.vue @@ -0,0 +1,139 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/overview.stats.vue b/fe_calckey/frontend/client/src/pages/admin/overview.stats.vue new file mode 100644 index 0000000..b6d9e0b --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/overview.stats.vue @@ -0,0 +1,196 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/overview.user.vue b/fe_calckey/frontend/client/src/pages/admin/overview.user.vue new file mode 100644 index 0000000..89370ce --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/overview.user.vue @@ -0,0 +1,87 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/overview.users.vue b/fe_calckey/frontend/client/src/pages/admin/overview.users.vue new file mode 100644 index 0000000..9017eb2 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/overview.users.vue @@ -0,0 +1,65 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/overview.vue b/fe_calckey/frontend/client/src/pages/admin/overview.vue new file mode 100644 index 0000000..d880225 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/overview.vue @@ -0,0 +1,211 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/promotions.vue b/fe_calckey/frontend/client/src/pages/admin/promotions.vue new file mode 100644 index 0000000..50e7646 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/promotions.vue @@ -0,0 +1,158 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/proxy-account.vue b/fe_calckey/frontend/client/src/pages/admin/proxy-account.vue new file mode 100644 index 0000000..87b3c68 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/proxy-account.vue @@ -0,0 +1,80 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/queue.chart.chart.vue b/fe_calckey/frontend/client/src/pages/admin/queue.chart.chart.vue new file mode 100644 index 0000000..bb7d3c1 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/queue.chart.chart.vue @@ -0,0 +1,193 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/queue.chart.vue b/fe_calckey/frontend/client/src/pages/admin/queue.chart.vue new file mode 100644 index 0000000..ee4f372 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/queue.chart.vue @@ -0,0 +1,174 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/queue.vue b/fe_calckey/frontend/client/src/pages/admin/queue.vue new file mode 100644 index 0000000..b8920f3 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/queue.vue @@ -0,0 +1,68 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/relays.vue b/fe_calckey/frontend/client/src/pages/admin/relays.vue new file mode 100644 index 0000000..2565ac1 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/relays.vue @@ -0,0 +1,134 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/security.vue b/fe_calckey/frontend/client/src/pages/admin/security.vue new file mode 100644 index 0000000..b93c803 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/security.vue @@ -0,0 +1,360 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/settings.vue b/fe_calckey/frontend/client/src/pages/admin/settings.vue new file mode 100644 index 0000000..e67c44b --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/settings.vue @@ -0,0 +1,544 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/admin/users.vue b/fe_calckey/frontend/client/src/pages/admin/users.vue new file mode 100644 index 0000000..cf956c6 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/admin/users.vue @@ -0,0 +1,243 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/announcements.vue b/fe_calckey/frontend/client/src/pages/announcements.vue new file mode 100644 index 0000000..8e99750 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/announcements.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/antenna-timeline.vue b/fe_calckey/frontend/client/src/pages/antenna-timeline.vue new file mode 100644 index 0000000..2100be8 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/antenna-timeline.vue @@ -0,0 +1,170 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/api-console.vue b/fe_calckey/frontend/client/src/pages/api-console.vue new file mode 100644 index 0000000..214145d --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/api-console.vue @@ -0,0 +1,120 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/auth.form.vue b/fe_calckey/frontend/client/src/pages/auth.form.vue new file mode 100644 index 0000000..189650f --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/auth.form.vue @@ -0,0 +1,68 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/auth.vue b/fe_calckey/frontend/client/src/pages/auth.vue new file mode 100644 index 0000000..8762f54 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/auth.vue @@ -0,0 +1,154 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/channel-editor.vue b/fe_calckey/frontend/client/src/pages/channel-editor.vue new file mode 100644 index 0000000..433c87c --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/channel-editor.vue @@ -0,0 +1,144 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/channel.vue b/fe_calckey/frontend/client/src/pages/channel.vue new file mode 100644 index 0000000..4c9124a --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/channel.vue @@ -0,0 +1,262 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/channels.vue b/fe_calckey/frontend/client/src/pages/channels.vue new file mode 100644 index 0000000..b79985b --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/channels.vue @@ -0,0 +1,238 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/clip.vue b/fe_calckey/frontend/client/src/pages/clip.vue new file mode 100644 index 0000000..bd6788b --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/clip.vue @@ -0,0 +1,157 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/drive.vue b/fe_calckey/frontend/client/src/pages/drive.vue new file mode 100644 index 0000000..8aeb97b --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/drive.vue @@ -0,0 +1,27 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/emojis.emoji.vue b/fe_calckey/frontend/client/src/pages/emojis.emoji.vue new file mode 100644 index 0000000..c8b7d64 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/emojis.emoji.vue @@ -0,0 +1,92 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/explore.featured.vue b/fe_calckey/frontend/client/src/pages/explore.featured.vue new file mode 100644 index 0000000..2d21bfc --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/explore.featured.vue @@ -0,0 +1,47 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/explore.users.vue b/fe_calckey/frontend/client/src/pages/explore.users.vue new file mode 100644 index 0000000..73caf4b --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/explore.users.vue @@ -0,0 +1,265 @@ +4.8 KiB + + + + + diff --git a/fe_calckey/frontend/client/src/pages/explore.vue b/fe_calckey/frontend/client/src/pages/explore.vue new file mode 100644 index 0000000..9202d78 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/explore.vue @@ -0,0 +1,97 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/favorites.vue b/fe_calckey/frontend/client/src/pages/favorites.vue new file mode 100644 index 0000000..84b5979 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/favorites.vue @@ -0,0 +1,63 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/follow-requests.vue b/fe_calckey/frontend/client/src/pages/follow-requests.vue new file mode 100644 index 0000000..e320914 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/follow-requests.vue @@ -0,0 +1,202 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/follow.vue b/fe_calckey/frontend/client/src/pages/follow.vue new file mode 100644 index 0000000..6af698f --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/follow.vue @@ -0,0 +1,61 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/gallery/edit.vue b/fe_calckey/frontend/client/src/pages/gallery/edit.vue new file mode 100644 index 0000000..f03201c --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/gallery/edit.vue @@ -0,0 +1,195 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/gallery/index.vue b/fe_calckey/frontend/client/src/pages/gallery/index.vue new file mode 100644 index 0000000..92fb223 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/gallery/index.vue @@ -0,0 +1,223 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/gallery/post.vue b/fe_calckey/frontend/client/src/pages/gallery/post.vue new file mode 100644 index 0000000..9a48a5e --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/gallery/post.vue @@ -0,0 +1,361 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/instance-info.vue b/fe_calckey/frontend/client/src/pages/instance-info.vue new file mode 100644 index 0000000..73c1051 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/instance-info.vue @@ -0,0 +1,559 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/mfm-cheat-sheet.vue b/fe_calckey/frontend/client/src/pages/mfm-cheat-sheet.vue new file mode 100644 index 0000000..bf85af4 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/mfm-cheat-sheet.vue @@ -0,0 +1,567 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/miauth.vue b/fe_calckey/frontend/client/src/pages/miauth.vue new file mode 100644 index 0000000..bf4c254 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/miauth.vue @@ -0,0 +1,110 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/my-antennas/create.vue b/fe_calckey/frontend/client/src/pages/my-antennas/create.vue new file mode 100644 index 0000000..040a6b0 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/my-antennas/create.vue @@ -0,0 +1,42 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/my-antennas/edit.vue b/fe_calckey/frontend/client/src/pages/my-antennas/edit.vue new file mode 100644 index 0000000..97c433f --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/my-antennas/edit.vue @@ -0,0 +1,47 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/my-antennas/editor.vue b/fe_calckey/frontend/client/src/pages/my-antennas/editor.vue new file mode 100644 index 0000000..27889b4 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/my-antennas/editor.vue @@ -0,0 +1,253 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/my-antennas/index.vue b/fe_calckey/frontend/client/src/pages/my-antennas/index.vue new file mode 100644 index 0000000..259c6db --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/my-antennas/index.vue @@ -0,0 +1,153 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/my-clips/index.vue b/fe_calckey/frontend/client/src/pages/my-clips/index.vue new file mode 100644 index 0000000..f88ee5a --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/my-clips/index.vue @@ -0,0 +1,118 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/my-groups/group.vue b/fe_calckey/frontend/client/src/pages/my-groups/group.vue new file mode 100644 index 0000000..192572d --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/my-groups/group.vue @@ -0,0 +1,201 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/my-groups/index.vue b/fe_calckey/frontend/client/src/pages/my-groups/index.vue new file mode 100644 index 0000000..ce04f9f --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/my-groups/index.vue @@ -0,0 +1,136 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/my-lists/index.vue b/fe_calckey/frontend/client/src/pages/my-lists/index.vue new file mode 100644 index 0000000..cb3a74f --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/my-lists/index.vue @@ -0,0 +1,115 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/my-lists/list.vue b/fe_calckey/frontend/client/src/pages/my-lists/list.vue new file mode 100644 index 0000000..e90776d --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/my-lists/list.vue @@ -0,0 +1,196 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/no-graze.vue b/fe_calckey/frontend/client/src/pages/no-graze.vue new file mode 100644 index 0000000..b6e01eb --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/no-graze.vue @@ -0,0 +1,37 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/not-found.vue b/fe_calckey/frontend/client/src/pages/not-found.vue new file mode 100644 index 0000000..d4ec84c --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/not-found.vue @@ -0,0 +1,26 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/note.vue b/fe_calckey/frontend/client/src/pages/note.vue new file mode 100644 index 0000000..c127ad0 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/note.vue @@ -0,0 +1,235 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/notifications.vue b/fe_calckey/frontend/client/src/pages/notifications.vue new file mode 100644 index 0000000..bda42a8 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/notifications.vue @@ -0,0 +1,190 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.button.vue b/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.button.vue new file mode 100644 index 0000000..bd3c0e6 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.button.vue @@ -0,0 +1,130 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.canvas.vue b/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.canvas.vue new file mode 100644 index 0000000..3909044 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.canvas.vue @@ -0,0 +1,51 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.counter.vue b/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.counter.vue new file mode 100644 index 0000000..8a387a1 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.counter.vue @@ -0,0 +1,47 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.if.vue b/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.if.vue new file mode 100644 index 0000000..b4a262f --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.if.vue @@ -0,0 +1,88 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.image.vue b/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.image.vue new file mode 100644 index 0000000..023df80 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.image.vue @@ -0,0 +1,71 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.note.vue b/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.note.vue new file mode 100644 index 0000000..b961850 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.note.vue @@ -0,0 +1,79 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.number-input.vue b/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.number-input.vue new file mode 100644 index 0000000..aab3ba5 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.number-input.vue @@ -0,0 +1,47 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.post.vue b/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.post.vue new file mode 100644 index 0000000..27129d6 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.post.vue @@ -0,0 +1,48 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.radio-button.vue b/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.radio-button.vue new file mode 100644 index 0000000..62254b7 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.radio-button.vue @@ -0,0 +1,66 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.section.vue b/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.section.vue new file mode 100644 index 0000000..3db5a7d --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.section.vue @@ -0,0 +1,79 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.switch.vue b/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.switch.vue new file mode 100644 index 0000000..78302e9 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.switch.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.text-input.vue b/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.text-input.vue new file mode 100644 index 0000000..e2b14b8 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.text-input.vue @@ -0,0 +1,46 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.text.vue b/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.text.vue new file mode 100644 index 0000000..08572b3 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.text.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.textarea-input.vue b/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.textarea-input.vue new file mode 100644 index 0000000..5f020f7 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.textarea-input.vue @@ -0,0 +1,47 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.textarea.vue b/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.textarea.vue new file mode 100644 index 0000000..3c956f0 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/page-editor/els/page-editor.el.textarea.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/page-editor/page-editor.blocks.vue b/fe_calckey/frontend/client/src/pages/page-editor/page-editor.blocks.vue new file mode 100644 index 0000000..2200b4a --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/page-editor/page-editor.blocks.vue @@ -0,0 +1,108 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/page-editor/page-editor.container.vue b/fe_calckey/frontend/client/src/pages/page-editor/page-editor.container.vue new file mode 100644 index 0000000..400c705 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/page-editor/page-editor.container.vue @@ -0,0 +1,180 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/page-editor/page-editor.script-block.vue b/fe_calckey/frontend/client/src/pages/page-editor/page-editor.script-block.vue new file mode 100644 index 0000000..7d88ec7 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/page-editor/page-editor.script-block.vue @@ -0,0 +1,408 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/page-editor/page-editor.vue b/fe_calckey/frontend/client/src/pages/page-editor/page-editor.vue new file mode 100644 index 0000000..da951b7 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/page-editor/page-editor.vue @@ -0,0 +1,645 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/page.vue b/fe_calckey/frontend/client/src/pages/page.vue new file mode 100644 index 0000000..57e963a --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/page.vue @@ -0,0 +1,466 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/pages.vue b/fe_calckey/frontend/client/src/pages/pages.vue new file mode 100644 index 0000000..1724ab2 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/pages.vue @@ -0,0 +1,196 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/preview.vue b/fe_calckey/frontend/client/src/pages/preview.vue new file mode 100644 index 0000000..41e662f --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/preview.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/registry.keys.vue b/fe_calckey/frontend/client/src/pages/registry.keys.vue new file mode 100644 index 0000000..bdc2584 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/registry.keys.vue @@ -0,0 +1,109 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/registry.value.vue b/fe_calckey/frontend/client/src/pages/registry.value.vue new file mode 100644 index 0000000..b95061c --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/registry.value.vue @@ -0,0 +1,138 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/registry.vue b/fe_calckey/frontend/client/src/pages/registry.vue new file mode 100644 index 0000000..7bb300c --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/registry.vue @@ -0,0 +1,84 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/reset-password.vue b/fe_calckey/frontend/client/src/pages/reset-password.vue new file mode 100644 index 0000000..3f57e89 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/reset-password.vue @@ -0,0 +1,79 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/scratchpad.vue b/fe_calckey/frontend/client/src/pages/scratchpad.vue new file mode 100644 index 0000000..06c6a8c --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/scratchpad.vue @@ -0,0 +1,164 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/search.vue b/fe_calckey/frontend/client/src/pages/search.vue new file mode 100644 index 0000000..be09dae --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/search.vue @@ -0,0 +1,123 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/settings/2fa.qrdialog.vue b/fe_calckey/frontend/client/src/pages/settings/2fa.qrdialog.vue new file mode 100644 index 0000000..5f14d06 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/settings/2fa.qrdialog.vue @@ -0,0 +1,100 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/settings/2fa.vue b/fe_calckey/frontend/client/src/pages/settings/2fa.vue new file mode 100644 index 0000000..56a4cca --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/settings/2fa.vue @@ -0,0 +1,330 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/settings/account-info.vue b/fe_calckey/frontend/client/src/pages/settings/account-info.vue new file mode 100644 index 0000000..faaee07 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/settings/account-info.vue @@ -0,0 +1,204 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/settings/accounts.vue b/fe_calckey/frontend/client/src/pages/settings/accounts.vue new file mode 100644 index 0000000..3010354 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/settings/accounts.vue @@ -0,0 +1,187 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/settings/api.vue b/fe_calckey/frontend/client/src/pages/settings/api.vue new file mode 100644 index 0000000..a694c45 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/settings/api.vue @@ -0,0 +1,62 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/settings/apps.vue b/fe_calckey/frontend/client/src/pages/settings/apps.vue new file mode 100644 index 0000000..f42bb77 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/settings/apps.vue @@ -0,0 +1,113 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/settings/custom-css.vue b/fe_calckey/frontend/client/src/pages/settings/custom-css.vue new file mode 100644 index 0000000..e24ff33 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/settings/custom-css.vue @@ -0,0 +1,52 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/settings/custom-katex-macro.vue b/fe_calckey/frontend/client/src/pages/settings/custom-katex-macro.vue new file mode 100644 index 0000000..88a8e2c --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/settings/custom-katex-macro.vue @@ -0,0 +1,70 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/settings/deck.vue b/fe_calckey/frontend/client/src/pages/settings/deck.vue new file mode 100644 index 0000000..821c5ed --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/settings/deck.vue @@ -0,0 +1,46 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/settings/delete-account.vue b/fe_calckey/frontend/client/src/pages/settings/delete-account.vue new file mode 100644 index 0000000..574806c --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/settings/delete-account.vue @@ -0,0 +1,64 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/settings/drive.vue b/fe_calckey/frontend/client/src/pages/settings/drive.vue new file mode 100644 index 0000000..42961fd --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/settings/drive.vue @@ -0,0 +1,174 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/settings/email.vue b/fe_calckey/frontend/client/src/pages/settings/email.vue new file mode 100644 index 0000000..fef21c1 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/settings/email.vue @@ -0,0 +1,158 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/settings/general.vue b/fe_calckey/frontend/client/src/pages/settings/general.vue new file mode 100644 index 0000000..36a4e2a --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/settings/general.vue @@ -0,0 +1,402 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/settings/import-export.vue b/fe_calckey/frontend/client/src/pages/settings/import-export.vue new file mode 100644 index 0000000..b2ac12c --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/settings/import-export.vue @@ -0,0 +1,294 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/settings/index.vue b/fe_calckey/frontend/client/src/pages/settings/index.vue new file mode 100644 index 0000000..429186c --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/settings/index.vue @@ -0,0 +1,380 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/settings/instance-mute.vue b/fe_calckey/frontend/client/src/pages/settings/instance-mute.vue new file mode 100644 index 0000000..4c8ce7a --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/settings/instance-mute.vue @@ -0,0 +1,65 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/settings/integration.vue b/fe_calckey/frontend/client/src/pages/settings/integration.vue new file mode 100644 index 0000000..4a413e3 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/settings/integration.vue @@ -0,0 +1,130 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/settings/migration.vue b/fe_calckey/frontend/client/src/pages/settings/migration.vue new file mode 100644 index 0000000..df65e6e --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/settings/migration.vue @@ -0,0 +1,108 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/settings/mute-block.vue b/fe_calckey/frontend/client/src/pages/settings/mute-block.vue new file mode 100644 index 0000000..81e9ec8 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/settings/mute-block.vue @@ -0,0 +1,73 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/settings/navbar.vue b/fe_calckey/frontend/client/src/pages/settings/navbar.vue new file mode 100644 index 0000000..10aeb97 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/settings/navbar.vue @@ -0,0 +1,111 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/settings/notifications.vue b/fe_calckey/frontend/client/src/pages/settings/notifications.vue new file mode 100644 index 0000000..57a054d --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/settings/notifications.vue @@ -0,0 +1,134 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/settings/other.vue b/fe_calckey/frontend/client/src/pages/settings/other.vue new file mode 100644 index 0000000..6a06949 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/settings/other.vue @@ -0,0 +1,61 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/settings/plugin.install.vue b/fe_calckey/frontend/client/src/pages/settings/plugin.install.vue new file mode 100644 index 0000000..ab678cf --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/settings/plugin.install.vue @@ -0,0 +1,153 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/settings/plugin.vue b/fe_calckey/frontend/client/src/pages/settings/plugin.vue new file mode 100644 index 0000000..6120c48 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/settings/plugin.vue @@ -0,0 +1,127 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/settings/preferences-backups.vue b/fe_calckey/frontend/client/src/pages/settings/preferences-backups.vue new file mode 100644 index 0000000..313024d --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/settings/preferences-backups.vue @@ -0,0 +1,537 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/settings/privacy.vue b/fe_calckey/frontend/client/src/pages/settings/privacy.vue new file mode 100644 index 0000000..07ae24e --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/settings/privacy.vue @@ -0,0 +1,189 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/settings/profile.vue b/fe_calckey/frontend/client/src/pages/settings/profile.vue new file mode 100644 index 0000000..17ce2d1 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/settings/profile.vue @@ -0,0 +1,331 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/settings/reaction.vue b/fe_calckey/frontend/client/src/pages/settings/reaction.vue new file mode 100644 index 0000000..8d8bca8 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/settings/reaction.vue @@ -0,0 +1,271 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/settings/security.vue b/fe_calckey/frontend/client/src/pages/settings/security.vue new file mode 100644 index 0000000..88ef2ba --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/settings/security.vue @@ -0,0 +1,180 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/settings/sounds.vue b/fe_calckey/frontend/client/src/pages/settings/sounds.vue new file mode 100644 index 0000000..d01fc36 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/settings/sounds.vue @@ -0,0 +1,133 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/settings/statusbar.statusbar.vue b/fe_calckey/frontend/client/src/pages/settings/statusbar.statusbar.vue new file mode 100644 index 0000000..b64f167 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/settings/statusbar.statusbar.vue @@ -0,0 +1,211 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/settings/statusbar.vue b/fe_calckey/frontend/client/src/pages/settings/statusbar.vue new file mode 100644 index 0000000..96a80e8 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/settings/statusbar.vue @@ -0,0 +1,54 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/settings/theme.install.vue b/fe_calckey/frontend/client/src/pages/settings/theme.install.vue new file mode 100644 index 0000000..0428de0 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/settings/theme.install.vue @@ -0,0 +1,96 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/settings/theme.manage.vue b/fe_calckey/frontend/client/src/pages/settings/theme.manage.vue new file mode 100644 index 0000000..a1b675e --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/settings/theme.manage.vue @@ -0,0 +1,112 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/settings/theme.vue b/fe_calckey/frontend/client/src/pages/settings/theme.vue new file mode 100644 index 0000000..9ed3001 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/settings/theme.vue @@ -0,0 +1,536 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/settings/webhook.edit.vue b/fe_calckey/frontend/client/src/pages/settings/webhook.edit.vue new file mode 100644 index 0000000..9d171c4 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/settings/webhook.edit.vue @@ -0,0 +1,114 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/settings/webhook.new.vue b/fe_calckey/frontend/client/src/pages/settings/webhook.new.vue new file mode 100644 index 0000000..3ff25c3 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/settings/webhook.new.vue @@ -0,0 +1,102 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/settings/webhook.vue b/fe_calckey/frontend/client/src/pages/settings/webhook.vue new file mode 100644 index 0000000..156db5f --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/settings/webhook.vue @@ -0,0 +1,77 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/settings/word-mute.vue b/fe_calckey/frontend/client/src/pages/settings/word-mute.vue new file mode 100644 index 0000000..9c69358 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/settings/word-mute.vue @@ -0,0 +1,162 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/share.vue b/fe_calckey/frontend/client/src/pages/share.vue new file mode 100644 index 0000000..5b4231f --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/share.vue @@ -0,0 +1,200 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/signup-complete.vue b/fe_calckey/frontend/client/src/pages/signup-complete.vue new file mode 100644 index 0000000..deb1f78 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/signup-complete.vue @@ -0,0 +1,37 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/tag.vue b/fe_calckey/frontend/client/src/pages/tag.vue new file mode 100644 index 0000000..e5d8c67 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/tag.vue @@ -0,0 +1,121 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/theme-editor.vue b/fe_calckey/frontend/client/src/pages/theme-editor.vue new file mode 100644 index 0000000..28a50f9 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/theme-editor.vue @@ -0,0 +1,410 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/timeline.vue b/fe_calckey/frontend/client/src/pages/timeline.vue new file mode 100644 index 0000000..2633d0e --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/timeline.vue @@ -0,0 +1,359 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/user-info.vue b/fe_calckey/frontend/client/src/pages/user-info.vue new file mode 100644 index 0000000..7a4ebde --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/user-info.vue @@ -0,0 +1,724 @@ + + + + + + + diff --git a/fe_calckey/frontend/client/src/pages/user-list-timeline.vue b/fe_calckey/frontend/client/src/pages/user-list-timeline.vue new file mode 100644 index 0000000..7b33e8c --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/user-list-timeline.vue @@ -0,0 +1,137 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/user/clips.vue b/fe_calckey/frontend/client/src/pages/user/clips.vue new file mode 100644 index 0000000..5eb5748 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/user/clips.vue @@ -0,0 +1,59 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/user/follow-list.vue b/fe_calckey/frontend/client/src/pages/user/follow-list.vue new file mode 100644 index 0000000..b4715d8 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/user/follow-list.vue @@ -0,0 +1,61 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/user/followers.vue b/fe_calckey/frontend/client/src/pages/user/followers.vue new file mode 100644 index 0000000..b229227 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/user/followers.vue @@ -0,0 +1,81 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/user/following.vue b/fe_calckey/frontend/client/src/pages/user/following.vue new file mode 100644 index 0000000..be994f8 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/user/following.vue @@ -0,0 +1,81 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/user/gallery.vue b/fe_calckey/frontend/client/src/pages/user/gallery.vue new file mode 100644 index 0000000..47a4ab7 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/user/gallery.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/user/home.vue b/fe_calckey/frontend/client/src/pages/user/home.vue new file mode 100644 index 0000000..9e9dfcc --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/user/home.vue @@ -0,0 +1,897 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/user/index.activity.vue b/fe_calckey/frontend/client/src/pages/user/index.activity.vue new file mode 100644 index 0000000..1e57ece --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/user/index.activity.vue @@ -0,0 +1,75 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/user/index.photos.vue b/fe_calckey/frontend/client/src/pages/user/index.photos.vue new file mode 100644 index 0000000..77bab8f --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/user/index.photos.vue @@ -0,0 +1,118 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/user/index.timeline.vue b/fe_calckey/frontend/client/src/pages/user/index.timeline.vue new file mode 100644 index 0000000..1792b63 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/user/index.timeline.vue @@ -0,0 +1,45 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/user/index.vue b/fe_calckey/frontend/client/src/pages/user/index.vue new file mode 100644 index 0000000..2452f1d --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/user/index.vue @@ -0,0 +1,155 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/user/pages.vue b/fe_calckey/frontend/client/src/pages/user/pages.vue new file mode 100644 index 0000000..ff9777a --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/user/pages.vue @@ -0,0 +1,33 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/user/reactions.vue b/fe_calckey/frontend/client/src/pages/user/reactions.vue new file mode 100644 index 0000000..4ae1472 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/user/reactions.vue @@ -0,0 +1,71 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/verify-email.vue b/fe_calckey/frontend/client/src/pages/verify-email.vue new file mode 100644 index 0000000..b5830ae --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/verify-email.vue @@ -0,0 +1,39 @@ + + + diff --git a/fe_calckey/frontend/client/src/pages/welcome.entrance.a.vue b/fe_calckey/frontend/client/src/pages/welcome.entrance.a.vue new file mode 100644 index 0000000..3866b08 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/welcome.entrance.a.vue @@ -0,0 +1,387 @@ + + + + + + + diff --git a/fe_calckey/frontend/client/src/pages/welcome.entrance.b.vue b/fe_calckey/frontend/client/src/pages/welcome.entrance.b.vue new file mode 100644 index 0000000..82651ae --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/welcome.entrance.b.vue @@ -0,0 +1,304 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/welcome.entrance.c.vue b/fe_calckey/frontend/client/src/pages/welcome.entrance.c.vue new file mode 100644 index 0000000..69c1d51 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/welcome.entrance.c.vue @@ -0,0 +1,359 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/welcome.setup.vue b/fe_calckey/frontend/client/src/pages/welcome.setup.vue new file mode 100644 index 0000000..97008e2 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/welcome.setup.vue @@ -0,0 +1,118 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/welcome.timeline.vue b/fe_calckey/frontend/client/src/pages/welcome.timeline.vue new file mode 100644 index 0000000..26f5fa4 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/welcome.timeline.vue @@ -0,0 +1,114 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/pages/welcome.vue b/fe_calckey/frontend/client/src/pages/welcome.vue new file mode 100644 index 0000000..564c6d1 --- /dev/null +++ b/fe_calckey/frontend/client/src/pages/welcome.vue @@ -0,0 +1,32 @@ + + + diff --git a/fe_calckey/frontend/client/src/pizzax.ts b/fe_calckey/frontend/client/src/pizzax.ts new file mode 100644 index 0000000..1c3817d --- /dev/null +++ b/fe_calckey/frontend/client/src/pizzax.ts @@ -0,0 +1,249 @@ +// PIZZAX --- A lightweight store + +import { onUnmounted, Ref, ref, watch } from "vue"; +import { $i } from "./account"; +import { api } from "./os"; +import { stream } from "./stream"; + +type StateDef = Record< + string, + { + where: "account" | "device" | "deviceAccount"; + default: any; + } +>; + +type ArrayElement = A extends readonly (infer T)[] ? T : never; + +const connection = $i && stream.useChannel("main"); + +export class Storage { + public readonly key: string; + public readonly keyForLocalStorage: string; + + public readonly def: T; + + // TODO: これが実装されたらreadonlyにしたい: https://github.com/microsoft/TypeScript/issues/37487 + public readonly state: { + [K in keyof T]: T[K]["default"]; + }; + public readonly reactiveState: { + [K in keyof T]: Ref; + }; + + constructor(key: string, def: T) { + this.key = key; + this.keyForLocalStorage = `pizzax::${key}`; + this.def = def; + + // TODO: indexedDBにする + const deviceState = JSON.parse( + localStorage.getItem(this.keyForLocalStorage) || "{}", + ); + const deviceAccountState = $i + ? JSON.parse( + localStorage.getItem(`${this.keyForLocalStorage}::${$i.id}`) || "{}", + ) + : {}; + const registryCache = $i + ? JSON.parse( + localStorage.getItem(`${this.keyForLocalStorage}::cache::${$i.id}`) || + "{}", + ) + : {}; + + const state = {}; + const reactiveState = {}; + for (const [k, v] of Object.entries(def)) { + if ( + v.where === "device" && + Object.prototype.hasOwnProperty.call(deviceState, k) + ) { + state[k] = deviceState[k]; + } else if ( + v.where === "account" && + $i && + Object.prototype.hasOwnProperty.call(registryCache, k) + ) { + state[k] = registryCache[k]; + } else if ( + v.where === "deviceAccount" && + Object.prototype.hasOwnProperty.call(deviceAccountState, k) + ) { + state[k] = deviceAccountState[k]; + } else { + state[k] = v.default; + if (_DEV_) console.log("Use default value", k, v.default); + } + } + for (const [k, v] of Object.entries(state)) { + reactiveState[k] = ref(v); + } + this.state = state as any; + this.reactiveState = reactiveState as any; + + if ($i) { + // なぜかsetTimeoutしないとapi関数内でエラーになる(おそらく循環参照してることに原因がありそう) + window.setTimeout(() => { + api("i/registry/get-all", { scope: ["client", this.key] }).then( + (kvs) => { + const cache = {}; + for (const [k, v] of Object.entries(def)) { + if (v.where === "account") { + if (Object.prototype.hasOwnProperty.call(kvs, k)) { + state[k] = kvs[k]; + reactiveState[k].value = kvs[k]; + cache[k] = kvs[k]; + } else { + state[k] = v.default; + reactiveState[k].value = v.default; + } + } + } + localStorage.setItem( + `${this.keyForLocalStorage}::cache::${$i.id}`, + JSON.stringify(cache), + ); + }, + ); + }, 1); + // streamingのuser storage updateイベントを監視して更新 + connection?.on( + "registryUpdated", + ({ + scope, + key, + value, + }: { + scope: string[]; + key: keyof T; + value: T[typeof key]["default"]; + }) => { + if ( + scope.length !== 2 || + scope[0] !== "client" || + scope[1] !== this.key || + this.state[key] === value + ) + return; + + this.state[key] = value; + this.reactiveState[key].value = value; + + const cache = JSON.parse( + localStorage.getItem( + `${this.keyForLocalStorage}::cache::${$i.id}`, + ) || "{}", + ); + if (cache[key] !== value) { + cache[key] = value; + localStorage.setItem( + `${this.keyForLocalStorage}::cache::${$i.id}`, + JSON.stringify(cache), + ); + } + }, + ); + } + } + + public set(key: K, value: T[K]["default"]): void { + if (_DEV_) console.log("set", key, value); + + this.state[key] = value; + this.reactiveState[key].value = value; + + switch (this.def[key].where) { + case "device": { + const deviceState = JSON.parse( + localStorage.getItem(this.keyForLocalStorage) || "{}", + ); + deviceState[key] = value; + localStorage.setItem( + this.keyForLocalStorage, + JSON.stringify(deviceState), + ); + break; + } + case "deviceAccount": { + if ($i == null) break; + const deviceAccountState = JSON.parse( + localStorage.getItem(`${this.keyForLocalStorage}::${$i.id}`) || "{}", + ); + deviceAccountState[key] = value; + localStorage.setItem( + `${this.keyForLocalStorage}::${$i.id}`, + JSON.stringify(deviceAccountState), + ); + break; + } + case "account": { + if ($i == null) break; + const cache = JSON.parse( + localStorage.getItem(`${this.keyForLocalStorage}::cache::${$i.id}`) || + "{}", + ); + cache[key] = value; + localStorage.setItem( + `${this.keyForLocalStorage}::cache::${$i.id}`, + JSON.stringify(cache), + ); + api("i/registry/set", { + scope: ["client", this.key], + key: key, + value: value, + }); + break; + } + } + } + + public push( + key: K, + value: ArrayElement, + ): void { + const currentState = this.state[key]; + this.set(key, [...currentState, value]); + } + + public reset(key: keyof T) { + this.set(key, this.def[key].default); + } + + /** + * 特定のキーの、簡易的なgetter/setterを作ります + * 主にvue場で設定コントロールのmodelとして使う用 + */ + public makeGetterSetter( + key: K, + getter?: (v: T[K]) => unknown, + setter?: (v: unknown) => T[K], + ) { + const valueRef = ref(this.state[key]); + + const stop = watch(this.reactiveState[key], (val) => { + valueRef.value = val; + }); + + // NOTE: vueコンポーネント内で呼ばれない限りは、onUnmounted は無意味なのでメモリリークする + onUnmounted(() => { + stop(); + }); + + // TODO: VueのcustomRef使うと良い感じになるかも + return { + get: () => { + if (getter) { + return getter(valueRef.value); + } else { + return valueRef.value; + } + }, + set: (value: unknown) => { + const val = setter ? setter(value) : value; + this.set(key, val); + valueRef.value = val; + }, + }; + } +} diff --git a/fe_calckey/frontend/client/src/plugin.ts b/fe_calckey/frontend/client/src/plugin.ts new file mode 100644 index 0000000..2e1297a --- /dev/null +++ b/fe_calckey/frontend/client/src/plugin.ts @@ -0,0 +1,176 @@ +import { AiScript, utils, values } from "@syuilo/aiscript"; +import { deserialize } from "@syuilo/aiscript/built/serializer"; +import { jsToVal } from "@syuilo/aiscript/built/interpreter/util"; +import { createAiScriptEnv } from "@/scripts/aiscript/api"; +import { inputText } from "@/os"; +import { + noteActions, + notePostInterruptors, + noteViewInterruptors, + postFormActions, + userActions, +} from "@/store"; + +const pluginContexts = new Map(); + +export function install(plugin) { + console.info("Plugin installed:", plugin.name, `v${plugin.version}`); + + const aiscript = new AiScript( + createPluginEnv({ + plugin: plugin, + storageKey: `plugins:${plugin.id}`, + }), + { + in: (q) => { + return new Promise((ok) => { + inputText({ + title: q, + }).then(({ canceled, result: a }) => { + ok(a); + }); + }); + }, + out: (value) => { + console.log(value); + }, + log: (type, params) => {}, + }, + ); + + initPlugin({ plugin, aiscript }); + + aiscript.exec(deserialize(plugin.ast)); +} + +function createPluginEnv(opts) { + const config = new Map(); + for (const [k, v] of Object.entries(opts.plugin.config || {})) { + config.set( + k, + jsToVal( + typeof opts.plugin.configData[k] !== "undefined" + ? opts.plugin.configData[k] + : v.default, + ), + ); + } + + return { + ...createAiScriptEnv({ ...opts, token: opts.plugin.token }), + //#region Deprecated + "Mk:register_post_form_action": values.FN_NATIVE(([title, handler]) => { + registerPostFormAction({ + pluginId: opts.plugin.id, + title: title.value, + handler, + }); + }), + "Mk:register_user_action": values.FN_NATIVE(([title, handler]) => { + registerUserAction({ + pluginId: opts.plugin.id, + title: title.value, + handler, + }); + }), + "Mk:register_note_action": values.FN_NATIVE(([title, handler]) => { + registerNoteAction({ + pluginId: opts.plugin.id, + title: title.value, + handler, + }); + }), + //#endregion + "Plugin:register_post_form_action": values.FN_NATIVE(([title, handler]) => { + registerPostFormAction({ + pluginId: opts.plugin.id, + title: title.value, + handler, + }); + }), + "Plugin:register_user_action": values.FN_NATIVE(([title, handler]) => { + registerUserAction({ + pluginId: opts.plugin.id, + title: title.value, + handler, + }); + }), + "Plugin:register_note_action": values.FN_NATIVE(([title, handler]) => { + registerNoteAction({ + pluginId: opts.plugin.id, + title: title.value, + handler, + }); + }), + "Plugin:register_note_view_interruptor": values.FN_NATIVE(([handler]) => { + registerNoteViewInterruptor({ pluginId: opts.plugin.id, handler }); + }), + "Plugin:register_note_post_interruptor": values.FN_NATIVE(([handler]) => { + registerNotePostInterruptor({ pluginId: opts.plugin.id, handler }); + }), + "Plugin:open_url": values.FN_NATIVE(([url]) => { + window.open(url.value, "_blank"); + }), + "Plugin:config": values.OBJ(config), + }; +} + +function initPlugin({ plugin, aiscript }) { + pluginContexts.set(plugin.id, aiscript); +} + +function registerPostFormAction({ pluginId, title, handler }) { + postFormActions.push({ + title, + handler: (form, update) => { + pluginContexts.get(pluginId).execFn(handler, [ + utils.jsToVal(form), + values.FN_NATIVE(([key, value]) => { + update(key.value, value.value); + }), + ]); + }, + }); +} + +function registerUserAction({ pluginId, title, handler }) { + userActions.push({ + title, + handler: (user) => { + pluginContexts.get(pluginId).execFn(handler, [utils.jsToVal(user)]); + }, + }); +} + +function registerNoteAction({ pluginId, title, handler }) { + noteActions.push({ + title, + handler: (note) => { + pluginContexts.get(pluginId).execFn(handler, [utils.jsToVal(note)]); + }, + }); +} + +function registerNoteViewInterruptor({ pluginId, handler }) { + noteViewInterruptors.push({ + handler: async (note) => { + return utils.valToJs( + await pluginContexts + .get(pluginId) + .execFn(handler, [utils.jsToVal(note)]), + ); + }, + }); +} + +function registerNotePostInterruptor({ pluginId, handler }) { + notePostInterruptors.push({ + handler: async (note) => { + return utils.valToJs( + await pluginContexts + .get(pluginId) + .execFn(handler, [utils.jsToVal(note)]), + ); + }, + }); +} diff --git a/fe_calckey/frontend/client/src/router.ts b/fe_calckey/frontend/client/src/router.ts new file mode 100644 index 0000000..b1ee585 --- /dev/null +++ b/fe_calckey/frontend/client/src/router.ts @@ -0,0 +1,708 @@ +import { AsyncComponentLoader, defineAsyncComponent, inject } from "vue"; +import { Router } from "@/nirax"; +import { $i, iAmModerator } from "@/account"; +import MkLoading from "@/pages/_loading_.vue"; +import MkError from "@/pages/_error_.vue"; +import { api } from "@/os"; +import { ui } from "@/config"; + +function getGuestTimelineStatus() { + api("meta", { + detail: false, + }).then((meta) => { + return meta.enableGuestTimeline; + }); +} + +const guestTimeline = getGuestTimelineStatus(); + +const page = (loader: AsyncComponentLoader) => + defineAsyncComponent({ + loader: loader, + loadingComponent: MkLoading, + errorComponent: MkError, + }); + +export const routes = [ + { + path: "/@:initUser/pages/:initPageName/view-source", + component: page(() => import("./pages/page-editor/page-editor.vue")), + }, + { + path: "/@:username/pages/:pageName", + component: page(() => import("./pages/page.vue")), + }, + { + path: "/@:acct/following", + component: page(() => import("./pages/user/following.vue")), + }, + { + path: "/@:acct/followers", + component: page(() => import("./pages/user/followers.vue")), + }, + { + name: "user", + path: "/@:acct/:page?", + component: page(() => import("./pages/user/index.vue")), + }, + { + name: "note", + path: "/notes/:noteId", + component: page(() => import("./pages/note.vue")), + }, + { + path: "/clips/:clipId", + component: page(() => import("./pages/clip.vue")), + }, + { + path: "/user-info/:userId", + component: page(() => import("./pages/user-info.vue")), + }, + { + path: "/instance-info/:host", + component: page(() => import("./pages/instance-info.vue")), + }, + { + path: "/public/local", + component: page(() => import("./pages/no-graze.vue")), + }, + { + name: "settings", + path: "/settings", + component: page(() => import("./pages/settings/index.vue")), + loginRequired: true, + children: [ + { + path: "/profile", + name: "profile", + component: page(() => import("./pages/settings/profile.vue")), + }, + { + path: "/privacy", + name: "privacy", + component: page(() => import("./pages/settings/privacy.vue")), + }, + { + path: "/reaction", + name: "reaction", + component: page(() => import("./pages/settings/reaction.vue")), + }, + { + path: "/drive", + name: "drive", + component: page(() => import("./pages/settings/drive.vue")), + }, + { + path: "/notifications", + name: "notifications", + component: page(() => import("./pages/settings/notifications.vue")), + }, + { + path: "/email", + name: "email", + component: page(() => import("./pages/settings/email.vue")), + }, + { + path: "/integration", + name: "integration", + component: page(() => import("./pages/settings/integration.vue")), + }, + { + path: "/security", + name: "security", + component: page(() => import("./pages/settings/security.vue")), + }, + { + path: "/general", + name: "general", + component: page(() => import("./pages/settings/general.vue")), + }, + { + path: "/theme/install", + name: "theme", + component: page(() => import("./pages/settings/theme.install.vue")), + }, + { + path: "/theme/manage", + name: "theme", + component: page(() => import("./pages/settings/theme.manage.vue")), + }, + { + path: "/theme", + name: "theme", + component: page(() => import("./pages/settings/theme.vue")), + }, + { + path: "/custom-css", + name: "custom-css", + component: page(() => import("./pages/settings/custom-css.vue")), + }, + { + path: "/custom-katex-macro", + name: "custom-katex-macro", + component: page( + () => import("./pages/settings/custom-katex-macro.vue"), + ), + }, + { + path: "/account-info", + name: "account-info", + component: page(() => import("./pages/settings/account-info.vue")), + }, + { + path: "/navbar", + name: "navbar", + component: page(() => import("./pages/settings/navbar.vue")), + }, + { + path: "/statusbar", + name: "statusbar", + component: page(() => import("./pages/settings/statusbar.vue")), + }, + { + path: "/sounds", + name: "sounds", + component: page(() => import("./pages/settings/sounds.vue")), + }, + { + path: "/plugin/install", + name: "plugin", + component: page(() => import("./pages/settings/plugin.install.vue")), + }, + { + path: "/plugin", + name: "plugin", + component: page(() => import("./pages/settings/plugin.vue")), + }, + { + path: "/import-export", + name: "import-export", + component: page(() => import("./pages/settings/import-export.vue")), + }, + { + path: "/instance-mute", + name: "instance-mute", + component: page(() => import("./pages/settings/instance-mute.vue")), + }, + { + path: "/mute-block", + name: "mute-block", + component: page(() => import("./pages/settings/mute-block.vue")), + }, + { + path: "/word-mute", + name: "word-mute", + component: page(() => import("./pages/settings/word-mute.vue")), + }, + { + path: "/api", + name: "api", + component: page(() => import("./pages/settings/api.vue")), + }, + { + path: "/apps", + name: "apps", + component: page(() => import("./pages/settings/apps.vue")), + }, + { + path: "/webhook/edit/:webhookId", + name: "webhook", + component: page(() => import("./pages/settings/webhook.edit.vue")), + }, + { + path: "/webhook/new", + name: "webhook", + component: page(() => import("./pages/settings/webhook.new.vue")), + }, + { + path: "/webhook", + name: "webhook", + component: page(() => import("./pages/settings/webhook.vue")), + }, + { + path: "/deck", + name: "deck", + component: page(() => import("./pages/settings/deck.vue")), + }, + { + path: "/delete-account", + name: "delete-account", + component: page(() => import("./pages/settings/delete-account.vue")), + }, + { + path: "/preferences-backups", + name: "preferences-backups", + component: page( + () => import("./pages/settings/preferences-backups.vue"), + ), + }, + { + path: "/migration", + name: "migration", + component: page(() => import("./pages/settings/migration.vue")), + }, + { + path: "/custom-css", + name: "general", + component: page(() => import("./pages/settings/custom-css.vue")), + }, + { + path: "/custom-katex-macro", + name: "general", + component: page( + () => import("./pages/settings/custom-katex-macro.vue"), + ), + }, + { + path: "/accounts", + name: "profile", + component: page(() => import("./pages/settings/accounts.vue")), + }, + { + path: "/account-info", + name: "other", + component: page(() => import("./pages/settings/account-info.vue")), + }, + { + path: "/delete-account", + name: "other", + component: page(() => import("./pages/settings/delete-account.vue")), + }, + { + path: "/other", + name: "other", + component: page(() => import("./pages/settings/other.vue")), + }, + { + path: "/", + component: page(() => import("./pages/_empty_.vue")), + }, + ], + }, + { + path: "/reset-password/:token?", + component: page(() => import("./pages/reset-password.vue")), + }, + { + path: "/signup-complete/:code", + component: page(() => import("./pages/signup-complete.vue")), + }, + { + path: "/verify-email/:code", + component: page(() => import("./pages/verify-email.vue")), + }, + { + path: "/announcements", + component: page(() => import("./pages/announcements.vue")), + }, + { + path: "/about", + component: page(() => import("./pages/about.vue")), + hash: "initialTab", + }, + { + path: "/about-calckey", + component: page(() => import("./pages/about-calckey.vue")), + }, + { + path: "/theme-editor", + component: page(() => import("./pages/theme-editor.vue")), + loginRequired: true, + }, + { + path: "/explore/tags/:tag", + component: page(() => import("./pages/explore.vue")), + }, + { + path: "/explore", + component: page(() => import("./pages/explore.vue")), + }, + { + path: "/search", + component: page(() => import("./pages/search.vue")), + query: { + q: "query", + channel: "channel", + }, + }, + { + path: "/authorize-follow", + component: page(() => import("./pages/follow.vue")), + loginRequired: true, + }, + { + path: "/share", + component: page(() => import("./pages/share.vue")), + loginRequired: true, + }, + { + path: "/api-console", + component: page(() => import("./pages/api-console.vue")), + loginRequired: true, + }, + { + path: "/mfm-cheat-sheet", + component: page(() => import("./pages/mfm-cheat-sheet.vue")), + }, + { + path: "/scratchpad", + component: page(() => import("./pages/scratchpad.vue")), + }, + { + path: "/preview", + component: page(() => import("./pages/preview.vue")), + }, + { + path: "/auth/:token", + component: page(() => import("./pages/auth.vue")), + }, + { + path: "/miauth/:session", + component: page(() => import("./pages/miauth.vue")), + query: { + callback: "callback", + name: "name", + icon: "icon", + permission: "permission", + }, + }, + { + path: "/tags/:tag", + component: page(() => import("./pages/tag.vue")), + }, + { + path: "/pages/new", + component: page(() => import("./pages/page-editor/page-editor.vue")), + loginRequired: true, + }, + { + path: "/pages/edit/:initPageId", + component: page(() => import("./pages/page-editor/page-editor.vue")), + loginRequired: true, + }, + { + path: "/pages", + component: page(() => import("./pages/pages.vue")), + }, + { + path: "/gallery/:postId/edit", + component: page(() => import("./pages/gallery/edit.vue")), + loginRequired: true, + }, + { + path: "/gallery/new", + component: page(() => import("./pages/gallery/edit.vue")), + loginRequired: true, + }, + { + path: "/gallery/:postId", + component: page(() => import("./pages/gallery/post.vue")), + }, + { + path: "/gallery", + component: page(() => import("./pages/gallery/index.vue")), + }, + { + path: "/channels/:channelId/edit", + component: page(() => import("./pages/channel-editor.vue")), + loginRequired: true, + }, + { + path: "/channels/new", + component: page(() => import("./pages/channel-editor.vue")), + loginRequired: true, + }, + { + path: "/channels/:channelId", + component: page(() => import("./pages/channel.vue")), + }, + { + path: "/channels", + component: page(() => import("./pages/channels.vue")), + }, + { + path: "/registry/keys/system/:path(*)?", + component: page(() => import("./pages/registry.keys.vue")), + }, + { + path: "/registry/value/system/:path(*)?", + component: page(() => import("./pages/registry.value.vue")), + }, + { + path: "/registry", + component: page(() => import("./pages/registry.vue")), + }, + { + path: "/admin/file/:fileId", + component: iAmModerator + ? page(() => import("./pages/admin-file.vue")) + : page(() => import("./pages/not-found.vue")), + }, + { + path: "/admin", + component: iAmModerator + ? page(() => import("./pages/admin/index.vue")) + : page(() => import("./pages/not-found.vue")), + children: [ + { + path: "/overview", + name: "overview", + component: page(() => import("./pages/admin/overview.vue")), + }, + { + path: "/users", + name: "users", + component: page(() => import("./pages/admin/users.vue")), + }, + { + path: "/hashtags", + name: "hashtags", + component: page(() => import("./pages/admin/hashtags.vue")), + }, + { + path: "/emojis", + name: "emojis", + component: page(() => import("./pages/admin/emojis.vue")), + }, + { + path: "/federation", + name: "federation", + component: page(() => import("./pages/admin/federation.vue")), + }, + { + path: "/queue", + name: "queue", + component: page(() => import("./pages/admin/queue.vue")), + }, + { + path: "/files", + name: "files", + component: page(() => import("./pages/admin/files.vue")), + }, + { + path: "/announcements", + name: "announcements", + component: page(() => import("./pages/admin/announcements.vue")), + }, + { + path: "/ads", + name: "ads", + component: page(() => import("./pages/admin/promotions.vue")), + }, + { + path: "/database", + name: "database", + component: page(() => import("./pages/admin/database.vue")), + }, + { + path: "/abuses", + name: "abuses", + component: page(() => import("./pages/admin/abuses.vue")), + }, + { + path: "/settings", + name: "settings", + component: page(() => import("./pages/admin/settings.vue")), + }, + { + path: "/email-settings", + name: "email-settings", + component: page(() => import("./pages/admin/email-settings.vue")), + }, + { + path: "/object-storage", + name: "object-storage", + component: page(() => import("./pages/admin/object-storage.vue")), + }, + { + path: "/security", + name: "security", + component: page(() => import("./pages/admin/security.vue")), + }, + { + path: "/relays", + name: "relays", + component: page(() => import("./pages/admin/relays.vue")), + }, + { + path: "/integrations", + name: "integrations", + component: page(() => import("./pages/admin/integrations.vue")), + }, + { + path: "/instance-block", + name: "instance-block", + component: page(() => import("./pages/admin/instance-block.vue")), + }, + { + path: "/proxy-account", + name: "proxy-account", + component: page(() => import("./pages/admin/proxy-account.vue")), + }, + { + path: "/other-settings", + name: "other-settings", + component: page(() => import("./pages/admin/other-settings.vue")), + }, + { + path: "/other-settings", + name: "other-settings", + component: page(() => import("./pages/admin/custom-css.vue")), + }, + { + path: "/experiments", + name: "experiments", + component: page(() => import("./pages/admin/experiments.vue")), + }, + { + path: "/", + component: page(() => import("./pages/_empty_.vue")), + }, + ], + }, + { + path: "/my/notifications", + component: page(() => import("./pages/notifications.vue")), + loginRequired: true, + }, + { + path: "/my/favorites", + component: page(() => import("./pages/favorites.vue")), + loginRequired: true, + }, + { + path: "/my/drive/folder/:folder", + component: page(() => import("./pages/drive.vue")), + loginRequired: true, + }, + { + path: "/my/drive", + component: page(() => import("./pages/drive.vue")), + loginRequired: true, + }, + { + path: "/my/follow-requests", + component: page(() => import("./pages/follow-requests.vue")), + loginRequired: true, + }, + { + path: "/my/lists/:listId", + component: page(() => import("./pages/my-lists/list.vue")), + loginRequired: true, + }, + { + path: "/my/lists", + component: page(() => import("./pages/my-lists/index.vue")), + loginRequired: true, + }, + { + path: "/my/clips", + component: page(() => import("./pages/my-clips/index.vue")), + loginRequired: true, + }, + { + path: "/my/groups", + component: page(() => import("./pages/my-groups/index.vue")), + loginRequired: true, + }, + { + path: "/my/groups/:groupId", + component: page(() => import("./pages/my-groups/group.vue")), + loginRequired: true, + }, + { + path: "/my/antennas/create", + component: page(() => import("./pages/my-antennas/create.vue")), + loginRequired: true, + }, + { + path: "/my/antennas/:antennaId", + component: page(() => import("./pages/my-antennas/edit.vue")), + loginRequired: true, + }, + { + path: "/my/antennas", + component: page(() => import("./pages/my-antennas/index.vue")), + loginRequired: true, + }, + { + path: "/timeline/list/:listId", + component: page(() => import("./pages/user-list-timeline.vue")), + loginRequired: true, + }, + { + path: "/timeline/antenna/:antennaId", + component: page(() => import("./pages/antenna-timeline.vue")), + loginRequired: true, + }, + { + name: "index", + path: "/", + component: $i + ? page(() => import("./pages/timeline.vue")) + : page(() => import("./pages/welcome.vue")), + globalCacheKey: "index", + }, + { + path: "/:(*)", + component: page(() => import("./pages/not-found.vue")), + }, +]; + +export const mainRouter = new Router( + routes, + location.pathname + location.search + location.hash, +); + +window.history.replaceState( + { key: mainRouter.getCurrentKey() }, + "", + location.href, +); + +// TODO: このファイルでスクロール位置も管理する設計だとdeckに対応できないのでなんとかする +// スクロール位置取得+スクロール位置設定関数をprovideする感じでも良いかも + +const scrollPosStore = new Map(); + +window.setInterval(() => { + scrollPosStore.set(window.history.state?.key, window.scrollY); +}, 1000); + +mainRouter.addListener("push", (ctx) => { + window.history.pushState({ key: ctx.key }, "", ctx.path); + const scrollPos = scrollPosStore.get(ctx.key) ?? 0; + window.scroll({ top: scrollPos, behavior: "instant" }); + if (scrollPos !== 0) { + window.setTimeout(() => { + // 遷移直後はタイミングによってはコンポーネントが復元し切ってない可能性も考えられるため少し時間を空けて再度スクロール + window.scroll({ top: scrollPos, behavior: "instant" }); + }, 100); + } +}); + +mainRouter.addListener("replace", (ctx) => { + window.history.replaceState({ key: ctx.key }, "", ctx.path); +}); + +mainRouter.addListener("same", () => { + window.scroll({ top: 0, behavior: "smooth" }); +}); + +window.addEventListener("popstate", (event) => { + mainRouter.replace( + location.pathname + location.search + location.hash, + event.state?.key, + false, + ); + const scrollPos = scrollPosStore.get(event.state?.key) ?? 0; + window.scroll({ top: scrollPos, behavior: "instant" }); + window.setTimeout(() => { + // 遷移直後はタイミングによってはコンポーネントが復元し切ってない可能性も考えられるため少し時間を空けて再度スクロール + window.scroll({ top: scrollPos, behavior: "instant" }); + }, 100); +}); + +export function useRouter(): Router { + return inject("router", null) ?? mainRouter; +} diff --git a/fe_calckey/frontend/client/src/scripts/2fa.ts b/fe_calckey/frontend/client/src/scripts/2fa.ts new file mode 100644 index 0000000..14d59be --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/2fa.ts @@ -0,0 +1,26 @@ +export function byteify(string: string, encoding: "ascii" | "base64" | "hex") { + switch (encoding) { + case "ascii": + return Uint8Array.from(string, (c) => c.charCodeAt(0)); + case "base64": + return Uint8Array.from( + atob(string.replace(/-/g, "+").replace(/_/g, "/")), + (c) => c.charCodeAt(0), + ); + case "hex": + return new Uint8Array( + string.match(/.{1,2}/g).map((byte) => parseInt(byte, 16)), + ); + } +} + +export function hexify(buffer: ArrayBuffer) { + return Array.from(new Uint8Array(buffer)).reduce( + (str, byte) => str + byte.toString(16).padStart(2, "0"), + "", + ); +} + +export function stringify(buffer: ArrayBuffer) { + return String.fromCharCode(...new Uint8Array(buffer)); +} diff --git a/fe_calckey/frontend/client/src/scripts/aiscript/api.ts b/fe_calckey/frontend/client/src/scripts/aiscript/api.ts new file mode 100644 index 0000000..9ec2db9 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/aiscript/api.ts @@ -0,0 +1,58 @@ +import { utils, values } from "@syuilo/aiscript"; +import * as os from "@/os"; +import { $i } from "@/account"; + +export function createAiScriptEnv(opts) { + let apiRequests = 0; + return { + USER_ID: $i ? values.STR($i.id) : values.NULL, + USER_NAME: $i ? values.STR($i.name) : values.NULL, + USER_USERNAME: $i ? values.STR($i.username) : values.NULL, + "Mk:dialog": values.FN_NATIVE(async ([title, text, type]) => { + await os.alert({ + type: type ? type.value : "info", + title: title.value, + text: text.value, + }); + }), + "Mk:confirm": values.FN_NATIVE(async ([title, text, type]) => { + const confirm = await os.confirm({ + type: type ? type.value : "question", + title: title.value, + text: text.value, + }); + return confirm.canceled ? values.FALSE : values.TRUE; + }), + "Mk:api": values.FN_NATIVE(async ([ep, param, token]) => { + if (token) { + utils.assertString(token); + // バグがあればundefinedもあり得るため念のため + if (typeof token.value !== "string") throw new Error("invalid token"); + } + apiRequests++; + if (apiRequests > 16) return values.NULL; + const res = await os.api( + ep.value, + utils.valToJs(param), + token ? token.value : opts.token || null, + ); + return utils.jsToVal(res); + }), + "Mk:save": values.FN_NATIVE(([key, value]) => { + utils.assertString(key); + localStorage.setItem( + `aiscript:${opts.storageKey}:${key.value}`, + JSON.stringify(utils.valToJs(value)), + ); + return values.NULL; + }), + "Mk:load": values.FN_NATIVE(([key]) => { + utils.assertString(key); + return utils.jsToVal( + JSON.parse( + localStorage.getItem(`aiscript:${opts.storageKey}:${key.value}`), + ), + ); + }), + }; +} diff --git a/fe_calckey/frontend/client/src/scripts/array.ts b/fe_calckey/frontend/client/src/scripts/array.ts new file mode 100644 index 0000000..bc6f4d4 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/array.ts @@ -0,0 +1,152 @@ +import { EndoRelation, Predicate } from "./relation"; + +/** + * Count the number of elements that satisfy the predicate + */ + +export function countIf(f: Predicate, xs: T[]): number { + return xs.filter(f).length; +} + +/** + * Count the number of elements that is equal to the element + */ +export function count(a: T, xs: T[]): number { + return countIf((x) => x === a, xs); +} + +/** + * Concatenate an array of arrays + */ +export function concat(xss: T[][]): T[] { + return ([] as T[]).concat(...xss); +} + +/** + * Intersperse the element between the elements of the array + * @param sep The element to be interspersed + */ +export function intersperse(sep: T, xs: T[]): T[] { + return concat(xs.map((x) => [sep, x])).slice(1); +} + +/** + * Returns the array of elements that is not equal to the element + */ +export function erase(a: T, xs: T[]): T[] { + return xs.filter((x) => x !== a); +} + +/** + * Finds the array of all elements in the first array not contained in the second array. + * The order of result values are determined by the first array. + */ +export function difference(xs: T[], ys: T[]): T[] { + return xs.filter((x) => !ys.includes(x)); +} + +/** + * Remove all but the first element from every group of equivalent elements + */ +export function unique(xs: T[]): T[] { + return [...new Set(xs)]; +} + +export function uniqueBy( + values: TValue[], + keySelector: (value: TValue) => TKey, +): TValue[] { + const map = new Map(); + + for (const value of values) { + const key = keySelector(value); + if (!map.has(key)) map.set(key, value); + } + + return [...map.values()]; +} + +export function sum(xs: number[]): number { + return xs.reduce((a, b) => a + b, 0); +} + +export function maximum(xs: number[]): number { + return Math.max(...xs); +} + +/** + * Splits an array based on the equivalence relation. + * The concatenation of the result is equal to the argument. + */ +export function groupBy(f: EndoRelation, xs: T[]): T[][] { + const groups = [] as T[][]; + for (const x of xs) { + if (groups.length !== 0 && f(groups[groups.length - 1][0], x)) { + groups[groups.length - 1].push(x); + } else { + groups.push([x]); + } + } + return groups; +} + +/** + * Splits an array based on the equivalence relation induced by the function. + * The concatenation of the result is equal to the argument. + */ +export function groupOn(f: (x: T) => S, xs: T[]): T[][] { + return groupBy((a, b) => f(a) === f(b), xs); +} + +export function groupByX(collections: T[], keySelector: (x: T) => string) { + return collections.reduce((obj: Record, item: T) => { + const key = keySelector(item); + if (typeof obj[key] === "undefined") { + obj[key] = []; + } + + obj[key].push(item); + + return obj; + }, {}); +} + +/** + * Compare two arrays by lexicographical order + */ +export function lessThan(xs: number[], ys: number[]): boolean { + for (let i = 0; i < Math.min(xs.length, ys.length); i++) { + if (xs[i] < ys[i]) return true; + if (xs[i] > ys[i]) return false; + } + return xs.length < ys.length; +} + +/** + * Returns the longest prefix of elements that satisfy the predicate + */ +export function takeWhile(f: Predicate, xs: T[]): T[] { + const ys = []; + for (const x of xs) { + if (f(x)) { + ys.push(x); + } else { + break; + } + } + return ys; +} + +export function cumulativeSum(xs: number[]): number[] { + const ys = Array.from(xs); // deep copy + for (let i = 1; i < ys.length; i++) ys[i] += ys[i - 1]; + return ys; +} + +export function toArray(x: T | T[] | undefined): T[] { + return Array.isArray(x) ? x : x != null ? [x] : []; +} + +export function toSingle(x: T | T[] | undefined): T | undefined { + return Array.isArray(x) ? x[0] : x; +} diff --git a/fe_calckey/frontend/client/src/scripts/autocomplete.ts b/fe_calckey/frontend/client/src/scripts/autocomplete.ts new file mode 100644 index 0000000..59b8d34 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/autocomplete.ts @@ -0,0 +1,282 @@ +import { nextTick, Ref, ref, defineAsyncComponent } from "vue"; +import getCaretCoordinates from "textarea-caret"; +import { toASCII } from "punycode/"; +import { popup } from "@/os"; + +export class Autocomplete { + private suggestion: { + x: Ref; + y: Ref; + q: Ref; + close: () => void; + } | null; + private textarea: HTMLInputElement | HTMLTextAreaElement; + private currentType: string; + private textRef: Ref; + private opening: boolean; + + private get text(): string { + return this.textRef.value; + } + + private set text(text: string) { + this.textRef.value = text; + } + + /** + * 対象のテキストエリアを与えてインスタンスを初期化します。 + */ + constructor( + textarea: HTMLInputElement | HTMLTextAreaElement, + textRef: Ref, + ) { + //#region BIND + this.onInput = this.onInput.bind(this); + this.complete = this.complete.bind(this); + this.close = this.close.bind(this); + //#endregion + + this.suggestion = null; + this.textarea = textarea; + this.textRef = textRef; + this.opening = false; + + this.attach(); + } + + /** + * このインスタンスにあるテキストエリアの入力のキャプチャを開始します。 + */ + public attach() { + this.textarea.addEventListener("input", this.onInput); + } + + /** + * このインスタンスにあるテキストエリアの入力のキャプチャを解除します。 + */ + public detach() { + this.textarea.removeEventListener("input", this.onInput); + this.close(); + } + + /** + * テキスト入力時 + */ + private onInput() { + const caretPos = this.textarea.selectionStart; + const text = this.text.substr(0, caretPos).split("\n").pop()!; + + const mentionIndex = text.lastIndexOf("@"); + const hashtagIndex = text.lastIndexOf("#"); + const emojiIndex = text.lastIndexOf(":"); + const mfmTagIndex = text.lastIndexOf("$"); + + const max = Math.max(mentionIndex, hashtagIndex, emojiIndex, mfmTagIndex); + + if (max === -1) { + this.close(); + return; + } + + const isMention = mentionIndex !== -1; + const isHashtag = hashtagIndex !== -1; + const isMfmTag = mfmTagIndex !== -1; + const isEmoji = + emojiIndex !== -1 && text.split(/:[a-z0-9_+\-]+:/).pop()!.includes(":"); + + let opened = false; + + if (isMention) { + const username = text.substr(mentionIndex + 1); + if (username !== "" && username.match(/^[a-zA-Z0-9_]+$/)) { + this.open("user", username); + opened = true; + } else if (username === "") { + this.open("user", null); + opened = true; + } + } + + if (isHashtag && !opened) { + const hashtag = text.substr(hashtagIndex + 1); + if (!hashtag.includes(" ")) { + this.open("hashtag", hashtag); + opened = true; + } + } + + if (isEmoji && !opened) { + const emoji = text.substr(emojiIndex + 1); + if (!emoji.includes(" ")) { + this.open("emoji", emoji); + opened = true; + } + } + + if (isMfmTag && !opened) { + const mfmTag = text.substr(mfmTagIndex + 1); + if (!mfmTag.includes(" ")) { + this.open("mfmTag", mfmTag.replace("[", "")); + opened = true; + } + } + + if (!opened) { + this.close(); + } + } + + /** + * サジェストを提示します。 + */ + private async open(type: string, q: string | null) { + if (type !== this.currentType) { + this.close(); + } + if (this.opening) return; + this.opening = true; + this.currentType = type; + + //#region サジェストを表示すべき位置を計算 + const caretPosition = getCaretCoordinates( + this.textarea, + this.textarea.selectionStart, + ); + + const rect = this.textarea.getBoundingClientRect(); + + const x = rect.left + caretPosition.left - this.textarea.scrollLeft; + const y = rect.top + caretPosition.top - this.textarea.scrollTop; + //#endregion + + if (this.suggestion) { + this.suggestion.x.value = x; + this.suggestion.y.value = y; + this.suggestion.q.value = q; + + this.opening = false; + } else { + const _x = ref(x); + const _y = ref(y); + const _q = ref(q); + + const { dispose } = await popup( + defineAsyncComponent(() => import("@/components/MkAutocomplete.vue")), + { + textarea: this.textarea, + close: this.close, + type: type, + q: _q, + x: _x, + y: _y, + }, + { + done: (res) => { + this.complete(res); + }, + }, + ); + + this.suggestion = { + q: _q, + x: _x, + y: _y, + close: () => dispose(), + }; + + this.opening = false; + } + } + + /** + * サジェストを閉じます。 + */ + private close() { + if (this.suggestion == null) return; + + this.suggestion.close(); + this.suggestion = null; + + this.textarea.focus(); + } + + /** + * オートコンプリートする + */ + private complete({ type, value }) { + this.close(); + + const caret = this.textarea.selectionStart; + + if (type === "user") { + const source = this.text; + + const before = source.substr(0, caret); + const trimmedBefore = before.substring(0, before.lastIndexOf("@")); + const after = source.substr(caret); + + const acct = + value.host === null + ? value.username + : `${value.username}@${toASCII(value.host)}`; + + // 挿入 + this.text = `${trimmedBefore}@${acct} ${after}`; + + // キャレットを戻す + nextTick(() => { + this.textarea.focus(); + const pos = trimmedBefore.length + (acct.length + 2); + this.textarea.setSelectionRange(pos, pos); + }); + } else if (type === "hashtag") { + const source = this.text; + + const before = source.substr(0, caret); + const trimmedBefore = before.substring(0, before.lastIndexOf("#")); + const after = source.substr(caret); + + // 挿入 + this.text = `${trimmedBefore}#${value} ${after}`; + + // キャレットを戻す + nextTick(() => { + this.textarea.focus(); + const pos = trimmedBefore.length + (value.length + 2); + this.textarea.setSelectionRange(pos, pos); + }); + } else if (type === "emoji") { + const source = this.text; + + const before = source.substr(0, caret); + const trimmedBefore = before.substring(0, before.lastIndexOf(":")); + const after = source.substr(caret); + + // 挿入 + this.text = trimmedBefore + value + after; + + // キャレットを戻す + nextTick(() => { + this.textarea.focus(); + const pos = trimmedBefore.length + value.length; + this.textarea.setSelectionRange(pos, pos); + }); + } else if (type === "mfmTag") { + const source = this.text; + + const before = source.substr(0, caret); + const trimmedBefore = before.substring(0, before.lastIndexOf("$")); + const after = source.substr(caret); + + // 挿入 + this.text = `${trimmedBefore}$[${value} ]${after}`; + + // キャレットを戻す + nextTick(() => { + this.textarea.focus(); + const pos = trimmedBefore.length + (value.length + 3); + this.textarea.setSelectionRange(pos, pos); + }); + } + } +} diff --git a/fe_calckey/frontend/client/src/scripts/chart-vline.ts b/fe_calckey/frontend/client/src/scripts/chart-vline.ts new file mode 100644 index 0000000..94ba0ab --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/chart-vline.ts @@ -0,0 +1,24 @@ +import { Plugin } from "chart.js"; + +export const chartVLine = (vLineColor: string) => + ({ + id: "vLine", + beforeDraw(chart, args, options) { + if (chart.tooltip?._active?.length) { + const ctx = chart.ctx; + const xs = chart.tooltip._active.map((a) => a.element.x); + const x = xs.reduce((a, b) => a + b, 0) / xs.length; + const topY = chart.scales.y.top; + const bottomY = chart.scales.y.bottom; + + ctx.save(); + ctx.beginPath(); + ctx.moveTo(x, bottomY); + ctx.lineTo(x, topY); + ctx.lineWidth = 1; + ctx.strokeStyle = vLineColor; + ctx.stroke(); + ctx.restore(); + } + }, + }) as Plugin; diff --git a/fe_calckey/frontend/client/src/scripts/check-word-mute.ts b/fe_calckey/frontend/client/src/scripts/check-word-mute.ts new file mode 100644 index 0000000..f789d0c --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/check-word-mute.ts @@ -0,0 +1,94 @@ +export type Muted = { + muted: boolean; + matched: string[]; + what?: string; // "note" || "reply" || "renote" || "quote" +}; + +const NotMuted = { muted: false, matched: [] }; + +function checkWordMute( + note: NoteLike, + mutedWords: Array, +): Muted { + let text = `${note.cw ?? ""} ${note.text ?? ""}`; + if (note.files != null) + text += ` ${note.files.map((f) => f.comment ?? "").join(" ")}`; + text = text.trim(); + + if (text === "") return NotMuted; + + let result = { muted: false, matched: [] }; + + for (const mutePattern of mutedWords) { + if (Array.isArray(mutePattern)) { + // Clean up + const keywords = mutePattern.filter((keyword) => keyword !== ""); + + if ( + keywords.length > 0 && + keywords.every((keyword) => text.includes(keyword)) + ) { + result.muted = true; + result.matched.push(...keywords); + } + } else { + // represents RegExp + const regexp = mutePattern.match(/^\/(.+)\/(.*)$/); + + // This should never happen due to input sanitisation. + if (!regexp) { + console.warn(`Found invalid regex in word mutes: ${mutePattern}`); + continue; + } + + try { + if (new RegExp(regexp[1], regexp[2]).test(text)) { + result.muted = true; + result.matched.push(mutePattern); + } + } catch (err) { + // This should never happen due to input sanitisation. + } + } + } + + result.matched = [...new Set(result.matched)]; + return result; +} + +export function getWordSoftMute( + note: Record, + me: Record | null | undefined, + mutedWords: Array, +): Muted { + // 自分自身 + if (me && note.userId === me.id) { + return NotMuted; + } + + if (mutedWords.length > 0) { + let noteMuted = checkWordMute(note, mutedWords); + if (noteMuted.muted) { + noteMuted.what = "note"; + return noteMuted; + } + + if (note.renote) { + let renoteMuted = checkWordMute(note.renote, mutedWords); + if (renoteMuted.muted) { + renoteMuted.what = note.text == null ? "renote" : "quote"; + return renoteMuted; + } + } + + if (note.reply) { + let replyMuted = checkWordMute(note.reply, mutedWords); + if (replyMuted.muted) { + replyMuted.what = "reply"; + return replyMuted; + } + } + } + + return NotMuted; +} diff --git a/fe_calckey/frontend/client/src/scripts/clone.ts b/fe_calckey/frontend/client/src/scripts/clone.ts new file mode 100644 index 0000000..4322e2e --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/clone.ts @@ -0,0 +1,24 @@ +// structredCloneが遅いため +// SEE: http://var.blog.jp/archives/86038606.html + +type Cloneable = + | string + | number + | boolean + | null + | { [key: string]: Cloneable } + | Cloneable[]; + +export function deepClone(x: T): T { + if (typeof x === "object") { + if (x === null) return x; + if (Array.isArray(x)) return x.map(deepClone) as T; + const obj = {} as Record; + for (const [k, v] of Object.entries(x)) { + obj[k] = deepClone(v); + } + return obj as T; + } else { + return x; + } +} diff --git a/fe_calckey/frontend/client/src/scripts/collect-page-vars.ts b/fe_calckey/frontend/client/src/scripts/collect-page-vars.ts new file mode 100644 index 0000000..e7d4a6d --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/collect-page-vars.ts @@ -0,0 +1,48 @@ +export function collectPageVars(content) { + const pageVars = []; + const collect = (xs: any[]) => { + for (const x of xs) { + if (x.type === "textInput") { + pageVars.push({ + name: x.name, + type: "string", + value: x.default || "", + }); + } else if (x.type === "textareaInput") { + pageVars.push({ + name: x.name, + type: "string", + value: x.default || "", + }); + } else if (x.type === "numberInput") { + pageVars.push({ + name: x.name, + type: "number", + value: x.default || 0, + }); + } else if (x.type === "switch") { + pageVars.push({ + name: x.name, + type: "boolean", + value: x.default, + }); + } else if (x.type === "counter") { + pageVars.push({ + name: x.name, + type: "number", + value: 0, + }); + } else if (x.type === "radioButton") { + pageVars.push({ + name: x.name, + type: "string", + value: x.default || "", + }); + } else if (x.children) { + collect(x.children); + } + } + }; + collect(content); + return pageVars; +} diff --git a/fe_calckey/frontend/client/src/scripts/color.ts b/fe_calckey/frontend/client/src/scripts/color.ts new file mode 100644 index 0000000..10a99a5 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/color.ts @@ -0,0 +1,7 @@ +export const alpha = (hex: string, a: number): string => { + const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex)!; + const r = parseInt(result[1], 16); + const g = parseInt(result[2], 16); + const b = parseInt(result[3], 16); + return `rgba(${r}, ${g}, ${b}, ${a})`; +}; diff --git a/fe_calckey/frontend/client/src/scripts/contains.ts b/fe_calckey/frontend/client/src/scripts/contains.ts new file mode 100644 index 0000000..256e09d --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/contains.ts @@ -0,0 +1,9 @@ +export default (parent, child, checkSame = true) => { + if (checkSame && parent === child) return true; + let node = child.parentNode; + while (node) { + if (node === parent) return true; + node = node.parentNode; + } + return false; +}; diff --git a/fe_calckey/frontend/client/src/scripts/copy-to-clipboard.ts b/fe_calckey/frontend/client/src/scripts/copy-to-clipboard.ts new file mode 100644 index 0000000..a4835d8 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/copy-to-clipboard.ts @@ -0,0 +1,33 @@ +/** + * Clipboardに値をコピー(TODO: 文字列以外も対応) + */ +export default (val) => { + // 空div 生成 + const tmp = document.createElement("div"); + // 選択用のタグ生成 + const pre = document.createElement("pre"); + + // 親要素のCSSで user-select: none だとコピーできないので書き換える + pre.style.webkitUserSelect = "auto"; + pre.style.userSelect = "auto"; + + tmp.appendChild(pre).textContent = val; + + // 要素を画面外へ + const s = tmp.style; + s.position = "fixed"; + s.right = "200%"; + + // body に追加 + document.body.appendChild(tmp); + // 要素を選択 + document.getSelection().selectAllChildren(tmp); + + // クリップボードにコピー + const result = document.execCommand("copy"); + + // 要素削除 + document.body.removeChild(tmp); + + return result; +}; diff --git a/fe_calckey/frontend/client/src/scripts/device-kind.ts b/fe_calckey/frontend/client/src/scripts/device-kind.ts new file mode 100644 index 0000000..8c62924 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/device-kind.ts @@ -0,0 +1,15 @@ +import { defaultStore } from "@/store"; + +const ua = navigator.userAgent.toLowerCase(); +const isTablet = + /ipad/.test(ua) || + (/mobile|iphone|android/.test(ua) && window.innerWidth > 700); +const isSmartphone = !isTablet && /mobile|iphone|android/.test(ua); + +export const deviceKind = defaultStore.state.overridedDeviceKind + ? defaultStore.state.overridedDeviceKind + : isSmartphone + ? "smartphone" + : isTablet + ? "tablet" + : "desktop"; diff --git a/fe_calckey/frontend/client/src/scripts/emojilist.ts b/fe_calckey/frontend/client/src/scripts/emojilist.ts new file mode 100644 index 0000000..a5ad7e3 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/emojilist.ts @@ -0,0 +1,124 @@ +import data from "unicode-emoji-json/data-by-group.json"; +import emojiComponents from "unicode-emoji-json/data-emoji-components.json"; +import keywordSet from "emojilib"; +import { defaultStore } from "@/store"; + +export type UnicodeEmojiDef = { + emoji: string; + category: typeof unicodeEmojiCategories[number]; + skin_tone_support: boolean; + slug: string; + keywords?: string[]; +}; + +export const unicodeEmojiCategories = [ + "emotion", + "people", + "animals_and_nature", + "food_and_drink", + "activity", + "travel_and_places", + "objects", + "symbols", + "flags", +] as const; + +export const categoryMapping = { + "Smileys & Emotion": "emotion", + "People & Body": "people", + "Animals & Nature": "animals_and_nature", + "Food & Drink": "food_and_drink", + Activities: "activity", + "Travel & Places": "travel_and_places", + Objects: "objects", + Symbols: "symbols", + Flags: "flags", +} as const; + +export const unicodeEmojiSkinTones = [ + "#FFDC5E", + "#F7DFCF", + "#F3D3A3", + "#D6AE89", + "#B17F56", + "#7D523C", +]; + +export function addSkinTone(emoji: string, skinTone?: number) { + const chosenSkinTone = skinTone || defaultStore.state.reactionPickerSkinTone; + const skinToneModifiers = [ + "", + emojiComponents.light_skin_tone, + emojiComponents.medium_light_skin_tone, + emojiComponents.medium_skin_tone, + emojiComponents.medium_dark_skin_tone, + emojiComponents.dark_skin_tone, + ]; + return emoji + (skinToneModifiers[chosenSkinTone - 1] || ""); +} + +const unicodeFifteenEmojis = [ + "🫨", + "🩷", + "🩵", + "🩶", + "🫷", + "🫸", + "🫎", + "🫏", + "🪽", + "🐦‍⬛", + "🪿", + "🪼", + "🪻", + "🫚", + "🫛", + "🪭", + "🪮", + "🪇", + "🪈", + "🪯", + "🛜", +]; + +const newData = {}; + +Object.keys(data).forEach((originalCategory) => { + const newCategory = categoryMapping[originalCategory]; + if (newCategory) { + newData[newCategory] = newData[newCategory] || []; + Object.keys(data[originalCategory]).forEach((emojiIndex) => { + const emojiObj = { ...data[originalCategory][emojiIndex] }; + if (unicodeFifteenEmojis.includes(emojiObj.emoji)) { + return; + } + emojiObj.category = newCategory; + emojiObj.keywords = keywordSet[emojiObj.emoji]; + newData[newCategory].push(emojiObj); + }); + } +}); + +export const emojilist: UnicodeEmojiDef[] = Object.keys(newData).reduce( + (acc, category) => { + const categoryItems = newData[category].map((item) => { + return { + emoji: item.emoji, + slug: item.slug, + category: item.category, + skin_tone_support: item.skin_tone_support || false, + keywords: item.keywords || [], + }; + }); + return acc.concat(categoryItems); + }, + [], +); + +export function getNicelyLabeledCategory(internalName) { + return ( + Object.keys(categoryMapping).find( + (key) => categoryMapping[key] === internalName, + ) || internalName + ); +} diff --git a/fe_calckey/frontend/client/src/scripts/extract-avg-color-from-blurhash.ts b/fe_calckey/frontend/client/src/scripts/extract-avg-color-from-blurhash.ts new file mode 100644 index 0000000..9f758cd --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/extract-avg-color-from-blurhash.ts @@ -0,0 +1,13 @@ +export function extractAvgColorFromBlurhash(hash: string) { + return typeof hash === "string" + ? `#${[...hash.slice(2, 6)] + .map((x) => + "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz#$%*+,-.:;=?@[]^_{|}~".indexOf( + x, + ), + ) + .reduce((a, c) => a * 83 + c, 0) + .toString(16) + .padStart(6, "0")}` + : undefined; +} diff --git a/fe_calckey/frontend/client/src/scripts/extract-mentions.ts b/fe_calckey/frontend/client/src/scripts/extract-mentions.ts new file mode 100644 index 0000000..259f78e --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/extract-mentions.ts @@ -0,0 +1,13 @@ +// test is located in test/extract-mentions + +import * as mfm from "mfm-js"; + +export function extractMentions( + nodes: mfm.MfmNode[], +): mfm.MfmMention["props"][] { + // TODO: 重複を削除 + const mentionNodes = mfm.extract(nodes, (node) => node.type === "mention"); + const mentions = mentionNodes.map((x) => x.props); + + return mentions; +} diff --git a/fe_calckey/frontend/client/src/scripts/extract-mfm.ts b/fe_calckey/frontend/client/src/scripts/extract-mfm.ts new file mode 100644 index 0000000..c62547c --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/extract-mfm.ts @@ -0,0 +1,22 @@ +import * as mfm from "mfm-js"; + +const animatedMfm = [ + "tada", + "jelly", + "twitch", + "shake", + "spin", + "jump", + "bounce", + "rainbow", + "fade", +]; + +export function extractMfmWithAnimation(nodes: mfm.MfmNode[]): string[] { + const mfmNodes = mfm.extract(nodes, (node) => { + return node.type === "fn" && animatedMfm.indexOf(node.props.name) > -1; + }); + const mfms = mfmNodes.map((x) => x.props.fn); + + return mfms; +} diff --git a/fe_calckey/frontend/client/src/scripts/extract-url-from-mfm.ts b/fe_calckey/frontend/client/src/scripts/extract-url-from-mfm.ts new file mode 100644 index 0000000..0c580b6 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/extract-url-from-mfm.ts @@ -0,0 +1,26 @@ +import * as mfm from "mfm-js"; +import { unique } from "@/scripts/array"; + +// unique without hash +// [ http://a/#1, http://a/#2, http://b/#3 ] => [ http://a/#1, http://b/#3 ] +const removeHash = (x: string) => x.replace(/#[^#]*$/, ""); + +export function extractUrlFromMfm( + nodes: mfm.MfmNode[], + respectSilentFlag = true, +): string[] { + const urlNodes = mfm.extract(nodes, (node) => { + return ( + node.type === "url" || + (node.type === "link" && !(respectSilentFlag && node.props.silent)) + ); + }); + const urls: string[] = unique(urlNodes.map((x) => x.props.url)); + + return urls.reduce((array, url) => { + const urlWithoutHash = removeHash(url); + if (!array.map((x) => removeHash(x)).includes(urlWithoutHash)) + array.push(url); + return array; + }, [] as string[]); +} diff --git a/fe_calckey/frontend/client/src/scripts/focus.ts b/fe_calckey/frontend/client/src/scripts/focus.ts new file mode 100644 index 0000000..878132f --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/focus.ts @@ -0,0 +1,27 @@ +export function focusPrev(el: Element | null, self = false, scroll = true) { + if (el == null) return; + if (!self) el = el.previousElementSibling; + if (el) { + if (el.hasAttribute("tabindex")) { + (el as HTMLElement).focus({ + preventScroll: !scroll, + }); + } else { + focusPrev(el.previousElementSibling, true); + } + } +} + +export function focusNext(el: Element | null, self = false, scroll = true) { + if (el == null) return; + if (!self) el = el.nextElementSibling; + if (el) { + if (el.hasAttribute("tabindex")) { + (el as HTMLElement).focus({ + preventScroll: !scroll, + }); + } else { + focusPrev(el.nextElementSibling, true); + } + } +} diff --git a/fe_calckey/frontend/client/src/scripts/form.ts b/fe_calckey/frontend/client/src/scripts/form.ts new file mode 100644 index 0000000..dc7393d --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/form.ts @@ -0,0 +1,72 @@ +export type FormItem = + | { + label?: string; + type: "string"; + default: string | null; + hidden?: boolean; + multiline?: boolean; + } + | { + label?: string; + type: "number"; + default: number | null; + hidden?: boolean; + step?: number; + } + | { + label?: string; + type: "boolean"; + default: boolean | null; + hidden?: boolean; + } + | { + label?: string; + type: "enum"; + default: string | null; + hidden?: boolean; + enum: string[]; + } + | { + label?: string; + type: "radio"; + default: unknown | null; + hidden?: boolean; + options: { + label: string; + value: unknown; + }[]; + } + | { + label?: string; + type: "object"; + default: Record | null; + hidden: true; + } + | { + label?: string; + type: "array"; + default: unknown[] | null; + hidden: true; + }; + +export type Form = Record; + +type GetItemType = Item["type"] extends "string" + ? string + : Item["type"] extends "number" + ? number + : Item["type"] extends "boolean" + ? boolean + : Item["type"] extends "radio" + ? unknown + : Item["type"] extends "enum" + ? string + : Item["type"] extends "array" + ? unknown[] + : Item["type"] extends "object" + ? Record + : never; + +export type GetFormResultType = { + [P in keyof F]: GetItemType; +}; diff --git a/fe_calckey/frontend/client/src/scripts/format-time-string.ts b/fe_calckey/frontend/client/src/scripts/format-time-string.ts new file mode 100644 index 0000000..f2f0d70 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/format-time-string.ts @@ -0,0 +1,81 @@ +const defaultLocaleStringFormats: { [index: string]: string } = { + weekday: "narrow", + era: "narrow", + year: "numeric", + month: "numeric", + day: "numeric", + hour: "numeric", + minute: "numeric", + second: "numeric", + timeZoneName: "short", +}; + +function formatLocaleString(date: Date, format: string): string { + return format.replace( + /\{\{(\w+)(:(\w+))?\}\}/g, + (match: string, kind: string, unused?, option?: string) => { + if ( + [ + "weekday", + "era", + "year", + "month", + "day", + "hour", + "minute", + "second", + "timeZoneName", + ].includes(kind) + ) { + return date.toLocaleString(window.navigator.language, { + [kind]: option ? option : defaultLocaleStringFormats[kind], + }); + } else { + return match; + } + }, + ); +} + +export function formatDateTimeString(date: Date, format: string): string { + return format + .replace(/yyyy/g, date.getFullYear().toString()) + .replace(/yy/g, date.getFullYear().toString().slice(-2)) + .replace( + /MMMM/g, + date.toLocaleString(window.navigator.language, { month: "long" }), + ) + .replace( + /MMM/g, + date.toLocaleString(window.navigator.language, { month: "short" }), + ) + .replace(/MM/g, `0${date.getMonth() + 1}`.slice(-2)) + .replace(/M/g, (date.getMonth() + 1).toString()) + .replace(/dd/g, `0${date.getDate()}`.slice(-2)) + .replace(/d/g, date.getDate().toString()) + .replace(/HH/g, `0${date.getHours()}`.slice(-2)) + .replace(/H/g, date.getHours().toString()) + .replace(/hh/g, `0${date.getHours() % 12 || 12}`.slice(-2)) + .replace(/h/g, (date.getHours() % 12 || 12).toString()) + .replace(/mm/g, `0${date.getMinutes()}`.slice(-2)) + .replace(/m/g, date.getMinutes().toString()) + .replace(/ss/g, `0${date.getSeconds()}`.slice(-2)) + .replace(/s/g, date.getSeconds().toString()) + .replace(/tt/g, date.getHours() >= 12 ? "PM" : "AM"); +} + +export function formatTimeString(date: Date, format: string): string { + return format.replace( + /\[(([^\[]|\[\])*)\]|(([yMdHhmst])\4{0,3})/g, + ( + match: string, + localeformat?: string, + unused?, + datetimeformat?: string, + ) => { + if (localeformat) return formatLocaleString(date, localeformat); + if (datetimeformat) return formatDateTimeString(date, datetimeformat); + return match; + }, + ); +} diff --git a/fe_calckey/frontend/client/src/scripts/gen-search-query.ts b/fe_calckey/frontend/client/src/scripts/gen-search-query.ts new file mode 100644 index 0000000..822572d --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/gen-search-query.ts @@ -0,0 +1,38 @@ +import * as Acct from "calckey-js/built/acct"; +import { host as localHost } from "@/config"; + +export async function genSearchQuery(v: any, q: string) { + let host: string; + let userId: string; + if (q.split(" ").some((x) => x.startsWith("@"))) { + for (const at of q + .split(" ") + .filter((x) => x.startsWith("@")) + .map((x) => x.substr(1))) { + if (at.includes(".")) { + if (at === localHost || at === ".") { + host = null; + } else { + host = at; + } + } else { + const user = await v.os + .api("users/show", Acct.parse(at)) + .catch((x) => null); + if (user) { + userId = user.id; + } else { + // todo: show error + } + } + } + } + return { + query: q + .split(" ") + .filter((x) => !(x.startsWith("/") || x.startsWith("@"))) + .join(" "), + host: host, + userId: userId, + }; +} diff --git a/fe_calckey/frontend/client/src/scripts/get-account-from-id.ts b/fe_calckey/frontend/client/src/scripts/get-account-from-id.ts new file mode 100644 index 0000000..c46cd13 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/get-account-from-id.ts @@ -0,0 +1,7 @@ +import { get } from "@/scripts/idb-proxy"; + +export async function getAccountFromId(id: string) { + const accounts = (await get("accounts")) as { token: string; id: string }[]; + if (!accounts) console.log("Accounts are not recorded"); + return accounts.find((account) => account.id === id); +} diff --git a/fe_calckey/frontend/client/src/scripts/get-note-menu.ts b/fe_calckey/frontend/client/src/scripts/get-note-menu.ts new file mode 100644 index 0000000..4e1d3c8 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/get-note-menu.ts @@ -0,0 +1,496 @@ +import { defineAsyncComponent, Ref } from "vue"; +import * as misskey from "calckey-js"; +import { $i } from "@/account"; +import { i18n } from "@/i18n"; +import { instance } from "@/instance"; +import * as os from "@/os"; +import copyToClipboard from "@/scripts/copy-to-clipboard"; +import { url } from "@/config"; +import { noteActions } from "@/store"; +import { shareAvailable } from "@/scripts/share-available"; +import { getUserMenu } from "@/scripts/get-user-menu"; + +export function getNoteMenu(props: { + note: misskey.entities.Note; + menuButton: Ref; + translation: Ref; + translating: Ref; + isDeleted: Ref; + currentClipPage?: Ref; +}) { + const isRenote = + props.note.renote != null && + props.note.text == null && + props.note.fileIds.length === 0 && + props.note.poll == null; + + const appearNote = isRenote + ? (props.note.renote as misskey.entities.Note) + : props.note; + + function del(): void { + os.confirm({ + type: "warning", + text: i18n.ts.noteDeleteConfirm, + }).then(({ canceled }) => { + if (canceled) return; + + os.api("notes/delete", { + noteId: appearNote.id, + }); + }); + } + + function delEdit(): void { + os.confirm({ + type: "warning", + text: i18n.ts.deleteAndEditConfirm, + }).then(({ canceled }) => { + if (canceled) return; + + os.api("notes/delete", { + noteId: appearNote.id, + }); + + os.post({ + initialNote: appearNote, + renote: appearNote.renote, + reply: appearNote.reply, + channel: appearNote.channel, + }); + }); + } + + function edit(): void { + os.post({ + initialNote: appearNote, + renote: appearNote.renote, + reply: appearNote.reply, + channel: appearNote.channel, + editId: appearNote.id, + }); + } + + function toggleFavorite(favorite: boolean): void { + os.apiWithDialog( + favorite ? "notes/favorites/create" : "notes/favorites/delete", + { + noteId: appearNote.id, + }, + ); + } + + function toggleWatch(watch: boolean): void { + os.apiWithDialog( + watch ? "notes/watching/create" : "notes/watching/delete", + { + noteId: appearNote.id, + }, + ); + } + + function toggleThreadMute(mute: boolean): void { + os.apiWithDialog( + mute ? "notes/thread-muting/create" : "notes/thread-muting/delete", + { + noteId: appearNote.id, + }, + ); + } + + function copyContent(): void { + copyToClipboard(appearNote.text); + os.success(); + } + + function copyLink(): void { + copyToClipboard(`${url}/notes/${appearNote.id}`); + os.success(); + } + + function copyOriginal(): void { + copyToClipboard(appearNote.url ?? appearNote.uri); + os.success(); + } + + function togglePin(pin: boolean): void { + os.apiWithDialog( + pin ? "i/pin" : "i/unpin", + { + noteId: appearNote.id, + }, + undefined, + ).catch((res) => { + if (res.id === "72dab508-c64d-498f-8740-a8eec1ba385a") { + os.alert({ + type: "error", + text: i18n.ts.pinLimitExceeded, + }); + } + }); + } + + async function clip(): Promise { + const clips = await os.api("clips/list"); + os.popupMenu( + [ + { + icon: "ph-plus ph-bold ph-lg", + text: i18n.ts.createNew, + action: async () => { + const { canceled, result } = await os.form(i18n.ts.createNewClip, { + name: { + type: "string", + label: i18n.ts.name, + }, + description: { + type: "string", + required: false, + multiline: true, + label: i18n.ts.description, + }, + isPublic: { + type: "boolean", + label: i18n.ts.public, + default: false, + }, + }); + if (canceled) return; + + const clip = await os.apiWithDialog("clips/create", result); + + os.apiWithDialog("clips/add-note", { + clipId: clip.id, + noteId: appearNote.id, + }); + }, + }, + null, + ...clips.map((clip) => ({ + text: clip.name, + action: () => { + os.promiseDialog( + os.api("clips/add-note", { + clipId: clip.id, + noteId: appearNote.id, + }), + null, + async (err) => { + if (err.id === "734806c4-542c-463a-9311-15c512803965") { + const confirm = await os.confirm({ + type: "warning", + text: i18n.t("confirmToUnclipAlreadyClippedNote", { + name: clip.name, + }), + }); + if (!confirm.canceled) { + os.apiWithDialog("clips/remove-note", { + clipId: clip.id, + noteId: appearNote.id, + }); + if (props.currentClipPage?.value.id === clip.id) + props.isDeleted.value = true; + } + } else { + os.alert({ + type: "error", + text: err.message + "\n" + err.id, + }); + } + }, + ); + }, + })), + ], + props.menuButton.value, + {}, + ).then(focus); + } + + async function unclip(): Promise { + os.apiWithDialog("clips/remove-note", { + clipId: props.currentClipPage.value.id, + noteId: appearNote.id, + }); + props.isDeleted.value = true; + } + + async function promote(): Promise { + const { canceled, result: days } = await os.inputNumber({ + title: i18n.ts.numberOfDays, + }); + + if (canceled) return; + + os.apiWithDialog("admin/promo/create", { + noteId: appearNote.id, + expiresAt: Date.now() + 86400000 * days, + }); + } + + function share(): void { + navigator.share({ + title: i18n.t("noteOf", { user: appearNote.user.name }), + text: appearNote.text, + url: `${url}/notes/${appearNote.id}`, + }); + } + + async function translate(): Promise { + if (props.translation.value != null) return; + props.translating.value = true; + const res = await os.api("notes/translate", { + noteId: appearNote.id, + targetLang: localStorage.getItem("lang") || navigator.language, + }); + props.translating.value = false; + props.translation.value = res; + } + + let menu; + if ($i) { + const statePromise = os.api("notes/state", { + noteId: appearNote.id, + }); + + const isAppearAuthor = appearNote.userId === $i.id; + const isModerator = $i.isAdmin || $i.isModerator; + + menu = [ + ...(props.currentClipPage?.value.userId === $i.id + ? [ + { + icon: "ph-minus-circle ph-bold ph-lg", + text: i18n.ts.unclip, + danger: true, + action: unclip, + }, + null, + ] + : []), + statePromise.then((state) => + state?.isFavorited + ? { + icon: "ph-bookmark-simple ph-bold ph-lg", + text: i18n.ts.unfavorite, + action: () => toggleFavorite(false), + } + : { + icon: "ph-bookmark-simple ph-bold ph-lg", + text: i18n.ts.favorite, + action: () => toggleFavorite(true), + }, + ), + { + icon: "ph-paperclip ph-bold ph-lg", + text: i18n.ts.clip, + action: () => clip(), + }, + !isAppearAuthor + ? statePromise.then((state) => + state.isWatching + ? { + icon: "ph-eye-slash ph-bold ph-lg", + text: i18n.ts.unwatch, + action: () => toggleWatch(false), + } + : { + icon: "ph-eye ph-bold ph-lg", + text: i18n.ts.watch, + action: () => toggleWatch(true), + }, + ) + : undefined, + statePromise.then((state) => + state.isMutedThread + ? { + icon: "ph-speaker-x ph-bold ph-lg", + text: i18n.ts.unmuteThread, + action: () => toggleThreadMute(false), + } + : { + icon: "ph-speaker-x ph-bold ph-lg", + text: i18n.ts.muteThread, + action: () => toggleThreadMute(true), + }, + ), + isAppearAuthor + ? ($i.pinnedNoteIds || []).includes(appearNote.id) + ? { + icon: "ph-push-pin ph-bold ph-lg", + text: i18n.ts.unpin, + action: () => togglePin(false), + } + : { + icon: "ph-push-pin ph-bold ph-lg", + text: i18n.ts.pin, + action: () => togglePin(true), + } + : undefined, + instance.translatorAvailable + ? { + icon: "ph-translate ph-bold ph-lg", + text: i18n.ts.translate, + action: translate, + } + : undefined, + appearNote.url || appearNote.uri + ? { + icon: "ph-arrow-square-out ph-bold ph-lg", + text: i18n.ts.showOnRemote, + action: () => { + window.open(appearNote.url || appearNote.uri, "_blank"); + }, + } + : undefined, + { + type: "parent", + icon: "ph-share-network ph-bold ph-lg", + text: i18n.ts.share, + children: [ + { + icon: "ph-clipboard-text ph-bold ph-lg", + text: i18n.ts.copyContent, + action: copyContent, + }, + { + icon: "ph-link-simple ph-bold ph-lg", + text: i18n.ts.copyLink, + action: copyLink, + }, + appearNote.url || appearNote.uri + ? { + icon: "ph-link-simple ph-bold ph-lg", + text: `${i18n.ts.copyLink} (${i18n.ts.remote})`, + action: copyOriginal, + } + : undefined, + shareAvailable() + ? { + icon: "ph-share-network ph-bold ph-lg", + text: i18n.ts.share, + action: share, + } + : undefined, + ], + }, + /* + ...($i.isModerator || $i.isAdmin ? [ + null, + { + icon: 'ph-megaphone-simple ph-bold ph-lg', + text: i18n.ts.promote, + action: promote + }] + : [] + ),*/ + null, + !isAppearAuthor + ? { + icon: "ph-warning-circle ph-bold ph-lg", + text: i18n.ts.reportAbuse, + action: () => { + const u = + appearNote.url || + appearNote.uri || + `${url}/notes/${appearNote.id}`; + os.popup( + defineAsyncComponent( + () => import("@/components/MkAbuseReportWindow.vue"), + ), + { + user: appearNote.user, + initialComment: `Note: ${u}\n-----\n`, + }, + {}, + "closed", + ); + }, + } + : undefined, + instance.features.postEditing && isAppearAuthor + ? { + icon: "ph-pencil-line ph-bold ph-lg", + text: i18n.ts.edit, + accent: true, + action: edit, + } + : undefined, + isAppearAuthor + ? { + icon: "ph-eraser ph-bold ph-lg", + text: i18n.ts.deleteAndEdit, + action: delEdit, + } + : undefined, + isAppearAuthor || isModerator + ? { + icon: "ph-trash ph-bold ph-lg", + text: i18n.ts.delete, + danger: true, + action: del, + } + : undefined, + !isAppearAuthor ? null : undefined, + !isAppearAuthor + ? { + type: "parent", + icon: "ph-user ph-bold ph-lg", + text: i18n.ts.user, + children: getUserMenu(appearNote.user), + } + : undefined, + ].filter((x) => x !== undefined); + } else { + menu = [ + appearNote.url || appearNote.uri + ? { + icon: "ph-arrow-square-out ph-bold ph-lg", + text: i18n.ts.showOnRemote, + action: () => { + window.open(appearNote.url || appearNote.uri, "_blank"); + }, + } + : undefined, + { + icon: "ph-clipboard-text ph-bold ph-lg", + text: i18n.ts.copyContent, + action: copyContent, + }, + { + icon: "ph-link-simple ph-bold ph-lg", + text: i18n.ts.copyLink, + action: copyLink, + }, + appearNote.url || appearNote.uri + ? { + icon: "ph-link-simple ph-bold ph-lg", + text: `${i18n.ts.copyLink} (${i18n.ts.remote})`, + action: copyOriginal, + } + : undefined, + shareAvailable() + ? { + icon: "ph-share-network ph-bold ph-lg", + text: i18n.ts.share, + action: share, + } + : undefined, + ].filter((x) => x !== undefined); + } + + if (noteActions.length > 0) { + menu = menu.concat([ + null, + ...noteActions.map((action) => ({ + icon: "ph-plug ph-bold ph-lg", + text: action.title, + action: () => { + action.handler(appearNote); + }, + })), + ]); + } + + return menu; +} diff --git a/fe_calckey/frontend/client/src/scripts/get-note-summary.ts b/fe_calckey/frontend/client/src/scripts/get-note-summary.ts new file mode 100644 index 0000000..bbbe4af --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/get-note-summary.ts @@ -0,0 +1,58 @@ +import * as misskey from "calckey-js"; +import { i18n } from "@/i18n"; + +/** + * 投稿を表す文字列を取得します。 + * @param {*} note (packされた)投稿 + */ +export const getNoteSummary = (note: misskey.entities.Note): string => { + /* + if (note.deletedAt) { + return `(${i18n.ts.deletedNote})`; + } + */ + + let summary = ""; + + // 本文 + if (note.cw != null) { + summary += note.cw; + } else { + summary += note.text ? note.text : ""; + } + + // ファイルが添付されているとき + if ((note.files || []).length !== 0) { + const len = note.files?.length; + summary += ` 📎${len !== 1 ? ` (${len})` : ""}`; + } + + // 投票が添付されているとき + if (note.poll) { + summary += " 📊"; + } + + /* + + // 返信のとき + if (note.replyId) { + if (note.reply) { + summary += `\n\nRE: ${getNoteSummary(note.reply)}`; + } else { + summary += '\n\nRE: ...'; + } + } + + // Renoteのとき + if (note.renoteId) { + if (note.renote) { + summary += `\n\nRN: ${getNoteSummary(note.renote)}`; + } else { + summary += '\n\nRN: ...'; + } + } + + */ + + return summary.trim(); +}; diff --git a/fe_calckey/frontend/client/src/scripts/get-static-image-url.ts b/fe_calckey/frontend/client/src/scripts/get-static-image-url.ts new file mode 100644 index 0000000..6560744 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/get-static-image-url.ts @@ -0,0 +1,16 @@ +import { url as instanceUrl } from "@/config"; +import * as url from "@/scripts/url"; + +export function getStaticImageUrl(baseUrl: string): string { + const u = new URL(baseUrl); + if (u.href.startsWith(`${instanceUrl}/proxy/`)) { + // もう既にproxyっぽそうだったらsearchParams付けるだけ + u.searchParams.set("static", "1"); + return u.href; + } + const dummy = `${u.host}${u.pathname}`; // 拡張子がないとキャッシュしてくれないCDNがあるので + return `${instanceUrl}/proxy/${dummy}?${url.query({ + url: u.href, + static: "1", + })}`; +} diff --git a/fe_calckey/frontend/client/src/scripts/get-user-menu.ts b/fe_calckey/frontend/client/src/scripts/get-user-menu.ts new file mode 100644 index 0000000..c39a9db --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/get-user-menu.ts @@ -0,0 +1,357 @@ +import * as Acct from "calckey-js/built/acct"; +import { defineAsyncComponent } from "vue"; +import { i18n } from "@/i18n"; +import copyToClipboard from "@/scripts/copy-to-clipboard"; +import { host } from "@/config"; +import * as os from "@/os"; +import { userActions } from "@/store"; +import { $i, iAmModerator } from "@/account"; +import { mainRouter } from "@/router"; +import { Router } from "@/nirax"; + +export function getUserMenu(user, router: Router = mainRouter) { + const meId = $i ? $i.id : null; + + async function pushList() { + const t = i18n.ts.selectList; // なぜか後で参照すると null になるので最初にメモリに確保しておく + const lists = await os.api("users/lists/list"); + if (lists.length === 0) { + os.alert({ + type: "error", + text: i18n.ts.youHaveNoLists, + }); + return; + } + const { canceled, result: listId } = await os.select({ + title: t, + items: lists.map((list) => ({ + value: list.id, + text: list.name, + })), + }); + if (canceled) return; + os.apiWithDialog("users/lists/push", { + listId: listId, + userId: user.id, + }); + } + + async function inviteGroup() { + const groups = await os.api("users/groups/owned"); + if (groups.length === 0) { + os.alert({ + type: "error", + text: i18n.ts.youHaveNoGroups, + }); + return; + } + const { canceled, result: groupId } = await os.select({ + title: i18n.ts.group, + items: groups.map((group) => ({ + value: group.id, + text: group.name, + })), + }); + if (canceled) return; + os.apiWithDialog("users/groups/invite", { + groupId: groupId, + userId: user.id, + }); + } + + async function toggleMute() { + if (user.isMuted) { + os.apiWithDialog("mute/delete", { + userId: user.id, + }).then(() => { + user.isMuted = false; + }); + } else { + const { canceled, result: period } = await os.select({ + title: i18n.ts.mutePeriod, + items: [ + { + value: "indefinitely", + text: i18n.ts.indefinitely, + }, + { + value: "tenMinutes", + text: i18n.ts.tenMinutes, + }, + { + value: "oneHour", + text: i18n.ts.oneHour, + }, + { + value: "oneDay", + text: i18n.ts.oneDay, + }, + { + value: "oneWeek", + text: i18n.ts.oneWeek, + }, + ], + default: "indefinitely", + }); + if (canceled) return; + + const expiresAt = + period === "indefinitely" + ? null + : period === "tenMinutes" + ? Date.now() + 1000 * 60 * 10 + : period === "oneHour" + ? Date.now() + 1000 * 60 * 60 + : period === "oneDay" + ? Date.now() + 1000 * 60 * 60 * 24 + : period === "oneWeek" + ? Date.now() + 1000 * 60 * 60 * 24 * 7 + : null; + + os.apiWithDialog("mute/create", { + userId: user.id, + expiresAt, + }).then(() => { + user.isMuted = true; + }); + } + } + + async function toggleRenoteMute(): Promise { + os.apiWithDialog( + user.isRenoteMuted ? "renote-mute/delete" : "renote-mute/create", + { + userId: user.id, + }, + ).then(() => { + user.isRenoteMuted = !user.isRenoteMuted; + }); + } + + async function toggleBlock(): Promise { + if ( + !(await getConfirmed( + user.isBlocking ? i18n.ts.unblockConfirm : i18n.ts.blockConfirm, + )) + ) + return; + + await os.apiWithDialog( + user.isBlocking ? "blocking/delete" : "blocking/create", + { + userId: user.id, + }, + ); + user.isBlocking = !user.isBlocking; + await os.api(user.isBlocking ? "mute/create" : "mute/delete", { + userId: user.id, + }); + user.isMuted = user.isBlocking; + if (user.isBlocking) { + await os.api("following/delete", { + userId: user.id, + }); + user.isFollowing = false; + } + } + + async function toggleSilence() { + if ( + !(await getConfirmed( + i18n.t(user.isSilenced ? "unsilenceConfirm" : "silenceConfirm"), + )) + ) + return; + + os.apiWithDialog( + user.isSilenced ? "admin/unsilence-user" : "admin/silence-user", + { + userId: user.id, + }, + ).then(() => { + user.isSilenced = !user.isSilenced; + }); + } + + async function toggleSuspend() { + if ( + !(await getConfirmed( + i18n.t(user.isSuspended ? "unsuspendConfirm" : "suspendConfirm"), + )) + ) + return; + + os.apiWithDialog( + user.isSuspended ? "admin/unsuspend-user" : "admin/suspend-user", + { + userId: user.id, + }, + ).then(() => { + user.isSuspended = !user.isSuspended; + }); + } + + function reportAbuse() { + os.popup( + defineAsyncComponent( + () => import("@/components/MkAbuseReportWindow.vue"), + ), + { + user: user, + }, + {}, + "closed", + ); + } + + async function getConfirmed(text: string): Promise { + const confirm = await os.confirm({ + type: "warning", + title: "confirm", + text, + }); + + return !confirm.canceled; + } + + async function invalidateFollow() { + if (!(await getConfirmed(i18n.ts.breakFollowConfirm))) return; + + os.apiWithDialog("following/invalidate", { + userId: user.id, + }).then(() => { + user.isFollowed = !user.isFollowed; + }); + } + + let menu = [ + { + type: "label", + text: user.host + ? `@${user.username}@${user.host || host}` + : `@${user.username}`, + }, + { + icon: "ph-at ph-bold ph-lg", + text: i18n.ts.copyUsername, + action: () => { + copyToClipboard(`@${user.username}@${user.host || host}`); + }, + }, + { + icon: "ph-info ph-bold ph-lg", + text: i18n.ts.info, + action: () => { + router.push(`/user-info/${user.id}`); + }, + }, + { + icon: "ph-envelope-simple-open ph-bold ph-lg", + text: i18n.ts.sendMessage, + action: () => { + os.post({ specified: user }); + }, + }, + { + icon: "ph-list-bullets ph-bold ph-lg", + text: i18n.ts.addToList, + action: pushList, + }, + meId !== user.id + ? { + icon: "ph-users-three ph-bold ph-lg", + text: i18n.ts.inviteToGroup, + action: inviteGroup, + } + : undefined, + null, + { + icon: user.isRenoteMuted + ? "ph-eye ph-bold ph-lg" + : "ph-eye-slash ph-bold ph-lg", + text: user.isRenoteMuted ? i18n.ts.renoteUnmute : i18n.ts.renoteMute, + action: toggleRenoteMute, + }, + ] as any; + + if ($i && meId !== user.id) { + menu = menu.concat([ + { + icon: user.isMuted + ? "ph-eye ph-bold ph-lg" + : "ph-eye-slash ph-bold ph-lg", + text: user.isMuted ? i18n.ts.unmute : i18n.ts.mute, + hidden: user.isBlocking === true, + action: toggleMute, + }, + { + icon: "ph-prohibit ph-bold ph-lg", + text: user.isBlocking ? i18n.ts.unblock : i18n.ts.block, + action: toggleBlock, + }, + ]); + + if (user.isFollowed) { + menu = menu.concat([ + { + icon: "ph-link-break ph-bold ph-lg", + text: i18n.ts.breakFollow, + action: invalidateFollow, + }, + ]); + } + + menu = menu.concat([ + null, + { + icon: "ph-warning-circle ph-bold ph-lg", + text: i18n.ts.reportAbuse, + action: reportAbuse, + }, + ]); + + if (iAmModerator) { + menu = menu.concat([ + null, + { + icon: "ph-microphone-slash ph-bold ph-lg", + text: user.isSilenced ? i18n.ts.unsilence : i18n.ts.silence, + action: toggleSilence, + }, + { + icon: "ph-snowflake ph-bold ph-lg", + text: user.isSuspended ? i18n.ts.unsuspend : i18n.ts.suspend, + action: toggleSuspend, + }, + ]); + } + } + + if ($i && meId === user.id) { + menu = menu.concat([ + null, + { + icon: "ph-pencil ph-bold ph-lg", + text: i18n.ts.editProfile, + action: () => { + router.push("/settings/profile"); + }, + }, + ]); + } + + if (userActions.length > 0) { + menu = menu.concat([ + null, + ...userActions.map((action) => ({ + icon: "ph-plug ph-bold ph-lg", + text: action.title, + action: () => { + action.handler(user); + }, + })), + ]); + } + + return menu; +} diff --git a/fe_calckey/frontend/client/src/scripts/get-user-name.ts b/fe_calckey/frontend/client/src/scripts/get-user-name.ts new file mode 100644 index 0000000..0f8916d --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/get-user-name.ts @@ -0,0 +1,6 @@ +export default function (user: { + name?: string | null; + username: string; +}): string { + return user.name || user.username; +} diff --git a/fe_calckey/frontend/client/src/scripts/helpMenu.ts b/fe_calckey/frontend/client/src/scripts/helpMenu.ts new file mode 100644 index 0000000..7e33c22 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/helpMenu.ts @@ -0,0 +1,82 @@ +import { defaultStore } from "@/store"; +import { instance } from "@/instance"; +import { host } from "@/config"; +import * as os from "@/os"; +import XTutorial from "../components/MkTutorialDialog.vue"; +import { i18n } from "@/i18n"; + +export function openHelpMenu_(ev: MouseEvent) { + os.popupMenu( + [ + { + text: instance.name ?? host, + type: "label", + }, + { + type: "link", + text: i18n.ts.instanceInfo, + icon: "ph-info ph-bold ph-lg", + to: "/about", + }, + { + type: "link", + text: i18n.ts.aboutMisskey, + icon: "ph-lightbulb ph-bold ph-lg", + to: "/about-calckey", + }, + { + type: "button", + text: i18n.ts.tos, + icon: "ph-scroll ph-bold ph-lg", + action: () => { + window.open(instance.tosUrl, "_blank"); + }, + }, + { + type: "button", + text: i18n.ts.apps, + icon: "ph-device-mobile ph-bold ph-lg", + action: () => { + window.open("https://calckey.org/apps", "_blank"); + }, + }, + { + type: "button", + action: async () => { + defaultStore.set("tutorial", 0); + os.popup(XTutorial, {}, {}, "closed"); + }, + text: i18n.ts.replayTutorial, + icon: "ph-circle-wavy-question ph-bold ph-lg", + }, + null, + { + type: "parent", + text: i18n.ts.developer, + icon: "ph-code ph-bold ph-lg", + children: [ + { + type: "link", + to: "/api-console", + text: "API Console", + icon: "ph-terminal-window ph-bold ph-lg", + }, + { + text: i18n.ts.document, + icon: "ph-file-doc ph-bold ph-lg", + action: () => { + window.open("/api-doc", "_blank"); + }, + }, + { + type: "link", + to: "/scratchpad", + text: "AiScript Scratchpad", + icon: "ph-scribble-loop ph-bold ph-lg", + }, + ], + }, + ], + ev.currentTarget ?? ev.target, + ); +} diff --git a/fe_calckey/frontend/client/src/scripts/hotkey.ts b/fe_calckey/frontend/client/src/scripts/hotkey.ts new file mode 100644 index 0000000..02d4157 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/hotkey.ts @@ -0,0 +1,104 @@ +import keyCode from "./keycode"; + +type Callback = (ev: KeyboardEvent) => void; + +type Keymap = Record; + +type Pattern = { + which: string[]; + ctrl?: boolean; + shift?: boolean; + alt?: boolean; +}; + +type Action = { + patterns: Pattern[]; + callback: Callback; + allowRepeat: boolean; +}; + +const parseKeymap = (keymap: Keymap) => + Object.entries(keymap).map(([patterns, callback]): Action => { + const result = { + patterns: [], + callback, + allowRepeat: true, + } as Action; + + if (patterns.match(/^\(.*\)$/) !== null) { + result.allowRepeat = false; + patterns = patterns.slice(1, -1); + } + + result.patterns = patterns.split("|").map((part) => { + const pattern = { + which: [], + ctrl: false, + alt: false, + shift: false, + } as Pattern; + + const keys = part + .trim() + .split("+") + .map((x) => x.trim().toLowerCase()); + for (const key of keys) { + switch (key) { + case "ctrl": + pattern.ctrl = true; + break; + case "alt": + pattern.alt = true; + break; + case "shift": + pattern.shift = true; + break; + default: + pattern.which = keyCode(key).map((k) => k.toLowerCase()); + } + } + + return pattern; + }); + + return result; + }); + +const ignoreElemens = ["input", "textarea"]; + +function match(ev: KeyboardEvent, patterns: Action["patterns"]): boolean { + const key = ev.code.toLowerCase(); + return patterns.some( + (pattern) => + pattern.which.includes(key) && + pattern.ctrl === ev.ctrlKey && + pattern.shift === ev.shiftKey && + pattern.alt === ev.altKey && + !ev.metaKey, + ); +} + +export const makeHotkey = (keymap: Keymap) => { + const actions = parseKeymap(keymap); + + return (ev: KeyboardEvent) => { + if (document.activeElement) { + if (ignoreElemens.some((el) => document.activeElement!.matches(el))) + return; + if (document.activeElement.attributes["contenteditable"]) return; + } + + for (const action of actions) { + const matched = match(ev, action.patterns); + + if (matched) { + if (!action.allowRepeat && ev.repeat) return; + + ev.preventDefault(); + ev.stopPropagation(); + action.callback(ev); + break; + } + } + }; +}; diff --git a/fe_calckey/frontend/client/src/scripts/hpml/block.ts b/fe_calckey/frontend/client/src/scripts/hpml/block.ts new file mode 100644 index 0000000..1cdb50b --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/hpml/block.ts @@ -0,0 +1,128 @@ +// blocks + +export type BlockBase = { + id: string; + type: string; +}; + +export type TextBlock = BlockBase & { + type: "text"; + text: string; +}; + +export type SectionBlock = BlockBase & { + type: "section"; + title: string; + children: (Block | VarBlock)[]; +}; + +export type ImageBlock = BlockBase & { + type: "image"; + fileId: string | null; +}; + +export type ButtonBlock = BlockBase & { + type: "button"; + text: any; + primary: boolean; + action: string; + content: string; + event: string; + message: string; + var: string; + fn: string; +}; + +export type IfBlock = BlockBase & { + type: "if"; + var: string; + children: Block[]; +}; + +export type TextareaBlock = BlockBase & { + type: "textarea"; + text: string; +}; + +export type PostBlock = BlockBase & { + type: "post"; + text: string; + attachCanvasImage: boolean; + canvasId: string; +}; + +export type CanvasBlock = BlockBase & { + type: "canvas"; + name: string; // canvas id + width: number; + height: number; +}; + +export type NoteBlock = BlockBase & { + type: "note"; + detailed: boolean; + note: string | null; +}; + +export type Block = + | TextBlock + | SectionBlock + | ImageBlock + | ButtonBlock + | IfBlock + | TextareaBlock + | PostBlock + | CanvasBlock + | NoteBlock + | VarBlock; + +// variable blocks + +export type VarBlockBase = BlockBase & { + name: string; +}; + +export type NumberInputVarBlock = VarBlockBase & { + type: "numberInput"; + text: string; +}; + +export type TextInputVarBlock = VarBlockBase & { + type: "textInput"; + text: string; +}; + +export type SwitchVarBlock = VarBlockBase & { + type: "switch"; + text: string; +}; + +export type RadioButtonVarBlock = VarBlockBase & { + type: "radioButton"; + title: string; + values: string[]; +}; + +export type CounterVarBlock = VarBlockBase & { + type: "counter"; + text: string; + inc: number; +}; + +export type VarBlock = + | NumberInputVarBlock + | TextInputVarBlock + | SwitchVarBlock + | RadioButtonVarBlock + | CounterVarBlock; + +const varBlock = [ + "numberInput", + "textInput", + "switch", + "radioButton", + "counter", +]; +export function isVarBlock(block: Block): block is VarBlock { + return varBlock.includes(block.type); +} diff --git a/fe_calckey/frontend/client/src/scripts/hpml/evaluator.ts b/fe_calckey/frontend/client/src/scripts/hpml/evaluator.ts new file mode 100644 index 0000000..6bd795c --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/hpml/evaluator.ts @@ -0,0 +1,257 @@ +import autobind from "autobind-decorator"; +import { PageVar, envVarsDef, Fn, HpmlScope, HpmlError } from "."; +import { version } from "@/config"; +import { AiScript, utils, values } from "@syuilo/aiscript"; +import { createAiScriptEnv } from "../aiscript/api"; +import { collectPageVars } from "../collect-page-vars"; +import { initHpmlLib, initAiLib } from "./lib"; +import * as os from "@/os"; +import { markRaw, ref, Ref, unref } from "vue"; +import { Expr, isLiteralValue, Variable } from "./expr"; + +/** + * Hpml evaluator + */ +export class Hpml { + private variables: Variable[]; + private pageVars: PageVar[]; + private envVars: Record; + public aiscript?: AiScript; + public pageVarUpdatedCallback?: values.VFn; + public canvases: Record = {}; + public vars: Ref> = ref({}); + public page: Record; + + private opts: { + randomSeed: string; + visitor?: any; + url?: string; + enableAiScript: boolean; + }; + + constructor(page: Hpml["page"], opts: Hpml["opts"]) { + this.page = page; + this.variables = this.page.variables; + this.pageVars = collectPageVars(this.page.content); + this.opts = opts; + + if (this.opts.enableAiScript) { + this.aiscript = markRaw( + new AiScript( + { + ...createAiScriptEnv({ + storageKey: `pages:${this.page.id}`, + }), + ...initAiLib(this), + }, + { + in: (q) => { + return new Promise((ok) => { + os.inputText({ + title: q, + }).then(({ canceled, result: a }) => { + ok(a); + }); + }); + }, + out: (value) => { + console.log(value); + }, + log: (type, params) => {}, + }, + ), + ); + + this.aiscript.scope.opts.onUpdated = (name, value) => { + this.eval(); + }; + } + + const date = new Date(); + + this.envVars = { + AI: "kawaii", + VERSION: version, + URL: this.page + ? `${opts.url}/@${this.page.user.username}/pages/${this.page.name}` + : "", + LOGIN: opts.visitor != null, + NAME: opts.visitor ? opts.visitor.name || opts.visitor.username : "", + USERNAME: opts.visitor ? opts.visitor.username : "", + USERID: opts.visitor ? opts.visitor.id : "", + NOTES_COUNT: opts.visitor ? opts.visitor.notesCount : 0, + FOLLOWERS_COUNT: opts.visitor ? opts.visitor.followersCount : 0, + FOLLOWING_COUNT: opts.visitor ? opts.visitor.followingCount : 0, + IS_CAT: opts.visitor ? opts.visitor.isCat : false, + SEED: opts.randomSeed ? opts.randomSeed : "", + YMD: `${date.getFullYear()}/${date.getMonth() + 1}/${date.getDate()}`, + AISCRIPT_DISABLED: !this.opts.enableAiScript, + NULL: null, + }; + + this.eval(); + } + + @autobind + public eval() { + try { + this.vars.value = this.evaluateVars(); + } catch (err) { + //this.onError(e); + } + } + + @autobind + public interpolate(str: string) { + if (str == null) return null; + return str.replace(/{(.+?)}/g, (match) => { + const v = unref(this.vars)[match.slice(1, -1).trim()]; + return v == null ? "NULL" : v.toString(); + }); + } + + @autobind + public callAiScript(fn: string) { + try { + if (this.aiscript) this.aiscript.execFn(this.aiscript.scope.get(fn), []); + } catch (err) {} + } + + @autobind + public registerCanvas(id: string, canvas: any) { + this.canvases[id] = canvas; + } + + @autobind + public updatePageVar(name: string, value: any) { + const pageVar = this.pageVars.find((v) => v.name === name); + if (pageVar !== undefined) { + pageVar.value = value; + if (this.pageVarUpdatedCallback) { + if (this.aiscript) + this.aiscript.execFn(this.pageVarUpdatedCallback, [ + values.STR(name), + utils.jsToVal(value), + ]); + } + } else { + throw new HpmlError(`No such page var '${name}'`); + } + } + + @autobind + public updateRandomSeed(seed: string) { + this.opts.randomSeed = seed; + this.envVars.SEED = seed; + } + + @autobind + private _interpolateScope(str: string, scope: HpmlScope) { + return str.replace(/{(.+?)}/g, (match) => { + const v = scope.getState(match.slice(1, -1).trim()); + return v == null ? "NULL" : v.toString(); + }); + } + + @autobind + public evaluateVars(): Record { + const values: Record = {}; + + for (const [k, v] of Object.entries(this.envVars)) { + values[k] = v; + } + + for (const v of this.pageVars) { + values[v.name] = v.value; + } + + for (const v of this.variables) { + values[v.name] = this.evaluate(v, new HpmlScope([values])); + } + + return values; + } + + @autobind + private evaluate(expr: Expr, scope: HpmlScope): any { + if (isLiteralValue(expr)) { + if (expr.type === null) { + return null; + } + + if (expr.type === "number") { + return parseInt(expr.value as any, 10); + } + + if (expr.type === "text" || expr.type === "multiLineText") { + return this._interpolateScope(expr.value || "", scope); + } + + if (expr.type === "textList") { + return this._interpolateScope(expr.value || "", scope) + .trim() + .split("\n"); + } + + if (expr.type === "ref") { + return scope.getState(expr.value); + } + + if (expr.type === "aiScriptVar") { + if (this.aiscript) { + try { + return utils.valToJs(this.aiscript.scope.get(expr.value)); + } catch (err) { + return null; + } + } else { + return null; + } + } + + // Define user function + if (expr.type === "fn") { + return { + slots: expr.value.slots.map((x) => x.name), + exec: (slotArg: Record) => { + return this.evaluate( + expr.value.expression, + scope.createChildScope(slotArg, expr.id), + ); + }, + } as Fn; + } + return; + } + + // Call user function + if (expr.type.startsWith("fn:")) { + const fnName = expr.type.split(":")[1]; + const fn = scope.getState(fnName); + const args = {} as Record; + for (let i = 0; i < fn.slots.length; i++) { + const name = fn.slots[i]; + args[name] = this.evaluate(expr.args[i], scope); + } + return fn.exec(args); + } + + if (expr.args === undefined) return null; + + const funcs = initHpmlLib( + expr, + scope, + this.opts.randomSeed, + this.opts.visitor, + ); + + // Call function + const fnName = expr.type; + const fn = (funcs as any)[fnName]; + if (fn == null) { + throw new HpmlError(`No such function '${fnName}'`); + } else { + return fn(...expr.args.map((x) => this.evaluate(x, scope))); + } + } +} diff --git a/fe_calckey/frontend/client/src/scripts/hpml/expr.ts b/fe_calckey/frontend/client/src/scripts/hpml/expr.ts new file mode 100644 index 0000000..a39ae4a --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/hpml/expr.ts @@ -0,0 +1,87 @@ +import { literalDefs, Type } from "."; + +export type ExprBase = { + id: string; +}; + +// value + +export type EmptyValue = ExprBase & { + type: null; + value: null; +}; + +export type TextValue = ExprBase & { + type: "text"; + value: string; +}; + +export type MultiLineTextValue = ExprBase & { + type: "multiLineText"; + value: string; +}; + +export type TextListValue = ExprBase & { + type: "textList"; + value: string; +}; + +export type NumberValue = ExprBase & { + type: "number"; + value: number; +}; + +export type RefValue = ExprBase & { + type: "ref"; + value: string; // value is variable name +}; + +export type AiScriptRefValue = ExprBase & { + type: "aiScriptVar"; + value: string; // value is variable name +}; + +export type UserFnValue = ExprBase & { + type: "fn"; + value: UserFnInnerValue; +}; +type UserFnInnerValue = { + slots: { + name: string; + type: Type; + }[]; + expression: Expr; +}; + +export type Value = + | EmptyValue + | TextValue + | MultiLineTextValue + | TextListValue + | NumberValue + | RefValue + | AiScriptRefValue + | UserFnValue; + +export function isLiteralValue(expr: Expr): expr is Value { + if (expr.type == null) return true; + if (literalDefs[expr.type]) return true; + return false; +} + +// call function + +export type CallFn = ExprBase & { + // "fn:hoge" or string + type: string; + args: Expr[]; + value: null; +}; + +// variable +export type Variable = (Value | CallFn) & { + name: string; +}; + +// expression +export type Expr = Variable | Value | CallFn; diff --git a/fe_calckey/frontend/client/src/scripts/hpml/index.ts b/fe_calckey/frontend/client/src/scripts/hpml/index.ts new file mode 100644 index 0000000..914d714 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/hpml/index.ts @@ -0,0 +1,133 @@ +/** + * Hpml + */ + +import autobind from "autobind-decorator"; +import { Hpml } from "./evaluator"; +import { funcDefs } from "./lib"; + +export type Fn = { + slots: string[]; + exec: (args: Record) => ReturnType; +}; + +export type Type = "string" | "number" | "boolean" | "stringArray" | null; + +export const literalDefs: Record< + string, + { out: any; category: string; icon: any } +> = { + text: { out: "string", category: "value", icon: "ph-quotes ph-bold ph-lg" }, + multiLineText: { + out: "string", + category: "value", + icon: "ph-align-left ph-bold ph-lg", + }, + textList: { + out: "stringArray", + category: "value", + icon: "ph-list ph-bold ph-lg", + }, + number: { + out: "number", + category: "value", + icon: "ph-sort-descending-up ph-bold ph-lg", + }, + ref: { out: null, category: "value", icon: "ph-magic-wand ph-bold ph-lg" }, + aiScriptVar: { + out: null, + category: "value", + icon: "ph-magic-wand ph-bold ph-lg", + }, + fn: { out: "function", category: "value", icon: "ph-radical ph-bold ph-lg" }, +}; + +export const blockDefs = [ + ...Object.entries(literalDefs).map(([k, v]) => ({ + type: k, + out: v.out, + category: v.category, + icon: v.icon, + })), + ...Object.entries(funcDefs).map(([k, v]) => ({ + type: k, + out: v.out, + category: v.category, + icon: v.icon, + })), +]; + +export type PageVar = { name: string; value: any; type: Type }; + +export const envVarsDef: Record = { + AI: "string", + URL: "string", + VERSION: "string", + LOGIN: "boolean", + NAME: "string", + USERNAME: "string", + USERID: "string", + NOTES_COUNT: "number", + FOLLOWERS_COUNT: "number", + FOLLOWING_COUNT: "number", + IS_CAT: "boolean", + SEED: null, + YMD: "string", + AISCRIPT_DISABLED: "boolean", + NULL: null, +}; + +export class HpmlScope { + private layerdStates: Record[]; + public name: string; + + constructor( + layerdStates: HpmlScope["layerdStates"], + name?: HpmlScope["name"], + ) { + this.layerdStates = layerdStates; + this.name = name || "anonymous"; + } + + @autobind + public createChildScope( + states: Record, + name?: HpmlScope["name"], + ): HpmlScope { + const layer = [states, ...this.layerdStates]; + return new HpmlScope(layer, name); + } + + /** + * 指定した名前の変数の値を取得します + * @param name 変数名 + */ + @autobind + public getState(name: string): any { + for (const later of this.layerdStates) { + const state = later[name]; + if (state !== undefined) { + return state; + } + } + + throw new HpmlError(`No such variable '${name}' in scope '${this.name}'`, { + scope: this.layerdStates, + }); + } +} + +export class HpmlError extends Error { + public info?: any; + + constructor(message: string, info?: any) { + super(message); + + this.info = info; + + // Maintains proper stack trace for where our error was thrown (only available on V8) + if (Error.captureStackTrace) { + Error.captureStackTrace(this, HpmlError); + } + } +} diff --git a/fe_calckey/frontend/client/src/scripts/hpml/lib.ts b/fe_calckey/frontend/client/src/scripts/hpml/lib.ts new file mode 100644 index 0000000..d0f774e --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/hpml/lib.ts @@ -0,0 +1,556 @@ +import tinycolor from "tinycolor2"; +import { Hpml } from "./evaluator"; +import { values, utils } from "@syuilo/aiscript"; +import { Fn, HpmlScope } from "."; +import { Expr } from "./expr"; +import seedrandom from "seedrandom"; + +/* TODO: https://www.chartjs.org/docs/latest/configuration/canvas-background.html#color +// https://stackoverflow.com/questions/38493564/chart-area-background-color-chartjs +Chart.pluginService.register({ + beforeDraw: (chart, easing) => { + if (chart.config.options.chartArea && chart.config.options.chartArea.backgroundColor) { + const ctx = chart.chart.ctx; + ctx.save(); + ctx.fillStyle = chart.config.options.chartArea.backgroundColor; + ctx.fillRect(0, 0, chart.chart.width, chart.chart.height); + ctx.restore(); + } + } +}); +*/ + +export function initAiLib(hpml: Hpml) { + return { + "MkPages:updated": values.FN_NATIVE(([callback]) => { + hpml.pageVarUpdatedCallback = callback as values.VFn; + }), + "MkPages:get_canvas": values.FN_NATIVE(([id]) => { + utils.assertString(id); + const canvas = hpml.canvases[id.value]; + const ctx = canvas.getContext("2d"); + return values.OBJ( + new Map([ + [ + "clear_rect", + values.FN_NATIVE(([x, y, width, height]) => { + ctx.clearRect(x.value, y.value, width.value, height.value); + }), + ], + [ + "fill_rect", + values.FN_NATIVE(([x, y, width, height]) => { + ctx.fillRect(x.value, y.value, width.value, height.value); + }), + ], + [ + "stroke_rect", + values.FN_NATIVE(([x, y, width, height]) => { + ctx.strokeRect(x.value, y.value, width.value, height.value); + }), + ], + [ + "fill_text", + values.FN_NATIVE(([text, x, y, width]) => { + ctx.fillText( + text.value, + x.value, + y.value, + width ? width.value : undefined, + ); + }), + ], + [ + "stroke_text", + values.FN_NATIVE(([text, x, y, width]) => { + ctx.strokeText( + text.value, + x.value, + y.value, + width ? width.value : undefined, + ); + }), + ], + [ + "set_line_width", + values.FN_NATIVE(([width]) => { + ctx.lineWidth = width.value; + }), + ], + [ + "set_font", + values.FN_NATIVE(([font]) => { + ctx.font = font.value; + }), + ], + [ + "set_fill_style", + values.FN_NATIVE(([style]) => { + ctx.fillStyle = style.value; + }), + ], + [ + "set_stroke_style", + values.FN_NATIVE(([style]) => { + ctx.strokeStyle = style.value; + }), + ], + [ + "begin_path", + values.FN_NATIVE(() => { + ctx.beginPath(); + }), + ], + [ + "close_path", + values.FN_NATIVE(() => { + ctx.closePath(); + }), + ], + [ + "move_to", + values.FN_NATIVE(([x, y]) => { + ctx.moveTo(x.value, y.value); + }), + ], + [ + "line_to", + values.FN_NATIVE(([x, y]) => { + ctx.lineTo(x.value, y.value); + }), + ], + [ + "arc", + values.FN_NATIVE(([x, y, radius, startAngle, endAngle]) => { + ctx.arc( + x.value, + y.value, + radius.value, + startAngle.value, + endAngle.value, + ); + }), + ], + [ + "rect", + values.FN_NATIVE(([x, y, width, height]) => { + ctx.rect(x.value, y.value, width.value, height.value); + }), + ], + [ + "fill", + values.FN_NATIVE(() => { + ctx.fill(); + }), + ], + [ + "stroke", + values.FN_NATIVE(() => { + ctx.stroke(); + }), + ], + ]), + ); + }), + "MkPages:chart": values.FN_NATIVE(([id, opts]) => { + /* TODO + utils.assertString(id); + utils.assertObject(opts); + const canvas = hpml.canvases[id.value]; + const color = getComputedStyle(document.documentElement).getPropertyValue('--accent'); + Chart.defaults.color = '#555'; + const chart = new Chart(canvas, { + type: opts.value.get('type').value, + data: { + labels: opts.value.get('labels').value.map(x => x.value), + datasets: opts.value.get('datasets').value.map(x => ({ + label: x.value.has('label') ? x.value.get('label').value : '', + data: x.value.get('data').value.map(x => x.value), + pointRadius: 0, + lineTension: 0, + borderWidth: 2, + borderColor: x.value.has('color') ? x.value.get('color') : color, + backgroundColor: tinycolor(x.value.has('color') ? x.value.get('color') : color).setAlpha(0.1).toRgbString(), + })) + }, + options: { + responsive: false, + devicePixelRatio: 1.5, + title: { + display: opts.value.has('title'), + text: opts.value.has('title') ? opts.value.get('title').value : '', + fontSize: 14, + }, + layout: { + padding: { + left: 32, + right: 32, + top: opts.value.has('title') ? 16 : 32, + bottom: 16 + } + }, + legend: { + display: opts.value.get('datasets').value.filter(x => x.value.has('label') && x.value.get('label').value).length === 0 ? false : true, + position: 'bottom', + labels: { + boxWidth: 16, + } + }, + tooltips: { + enabled: false, + }, + chartArea: { + backgroundColor: '#fff' + }, + ...(opts.value.get('type').value === 'radar' ? { + scale: { + ticks: { + display: opts.value.has('show_tick_label') ? opts.value.get('show_tick_label').value : false, + min: opts.value.has('min') ? opts.value.get('min').value : undefined, + max: opts.value.has('max') ? opts.value.get('max').value : undefined, + maxTicksLimit: 8, + }, + pointLabels: { + fontSize: 12 + } + } + } : { + scales: { + yAxes: [{ + ticks: { + display: opts.value.has('show_tick_label') ? opts.value.get('show_tick_label').value : true, + min: opts.value.has('min') ? opts.value.get('min').value : undefined, + max: opts.value.has('max') ? opts.value.get('max').value : undefined, + } + }] + } + }) + } + }); + */ + }), + }; +} + +export const funcDefs: Record< + string, + { in: any[]; out: any; category: string; icon: any } +> = { + if: { + in: ["boolean", 0, 0], + out: 0, + category: "flow", + icon: "ph-share-network ph-bold ph-lg", + }, + for: { + in: ["number", "function"], + out: null, + category: "flow", + icon: "ph-recycle ph-bold ph-lg", + }, + not: { + in: ["boolean"], + out: "boolean", + category: "logical", + icon: "ph-flag ph-bold ph-lg", + }, + or: { + in: ["boolean", "boolean"], + out: "boolean", + category: "logical", + icon: "ph-flag ph-bold ph-lg", + }, + and: { + in: ["boolean", "boolean"], + out: "boolean", + category: "logical", + icon: "ph-flag ph-bold ph-lg", + }, + add: { + in: ["number", "number"], + out: "number", + category: "operation", + icon: "ph-plus ph-bold ph-lg", + }, + subtract: { + in: ["number", "number"], + out: "number", + category: "operation", + icon: "ph-minus ph-bold ph-lg", + }, + multiply: { + in: ["number", "number"], + out: "number", + category: "operation", + icon: "ph-x ph-bold ph-lg", + }, + divide: { + in: ["number", "number"], + out: "number", + category: "operation", + icon: "ph-divide ph-bold ph-lg", + }, + mod: { + in: ["number", "number"], + out: "number", + category: "operation", + icon: "ph-divide ph-bold ph-lg", + }, + round: { + in: ["number"], + out: "number", + category: "operation", + icon: "ph-calculator ph-bold ph-lg", + }, + eq: { + in: [0, 0], + out: "boolean", + category: "comparison", + icon: "ph-equals ph-bold ph-lg", + }, + notEq: { + in: [0, 0], + out: "boolean", + category: "comparison", + icon: "ph-prohibit-insert ph-bold ph-lg", + }, + gt: { + in: ["number", "number"], + out: "boolean", + category: "comparison", + icon: "ph-caret-right ph-bold ph-lg", + }, + lt: { + in: ["number", "number"], + out: "boolean", + category: "comparison", + icon: "ph-caret-left ph-bold ph-lg", + }, + gtEq: { + in: ["number", "number"], + out: "boolean", + category: "comparison", + icon: "ph-caret-double-right ph-bold ph-lg", + }, + ltEq: { + in: ["number", "number"], + out: "boolean", + category: "comparison", + icon: "ph-caret-double-right ph-bold ph-lg", + }, + strLen: { + in: ["string"], + out: "number", + category: "text", + icon: "ph-quotes ph-bold ph-lg", + }, + strPick: { + in: ["string", "number"], + out: "string", + category: "text", + icon: "ph-quotes ph-bold ph-lg", + }, + strReplace: { + in: ["string", "string", "string"], + out: "string", + category: "text", + icon: "ph-quotes ph-bold ph-lg", + }, + strReverse: { + in: ["string"], + out: "string", + category: "text", + icon: "ph-quotes ph-bold ph-lg", + }, + join: { + in: ["stringArray", "string"], + out: "string", + category: "text", + icon: "ph-quotes ph-bold ph-lg", + }, + stringToNumber: { + in: ["string"], + out: "number", + category: "convert", + icon: "ph-swap ph-bold ph-lg", + }, + numberToString: { + in: ["number"], + out: "string", + category: "convert", + icon: "ph-swap ph-bold ph-lg", + }, + splitStrByLine: { + in: ["string"], + out: "stringArray", + category: "convert", + icon: "ph-swap ph-bold ph-lg", + }, + pick: { + in: [null, "number"], + out: null, + category: "list", + icon: "ph-text-indent ph-bold ph-lg", + }, + listLen: { + in: [null], + out: "number", + category: "list", + icon: "ph-text-indent ph-bold ph-lg", + }, + rannum: { + in: ["number", "number"], + out: "number", + category: "random", + icon: "ph-dice-five ph-bold ph-lg", + }, + dailyRannum: { + in: ["number", "number"], + out: "number", + category: "random", + icon: "ph-dice-five ph-bold ph-lg", + }, + seedRannum: { + in: [null, "number", "number"], + out: "number", + category: "random", + icon: "ph-dice-five ph-bold ph-lg", + }, + random: { + in: ["number"], + out: "boolean", + category: "random", + icon: "ph-dice-five ph-bold ph-lg", + }, + dailyRandom: { + in: ["number"], + out: "boolean", + category: "random", + icon: "ph-dice-five ph-bold ph-lg", + }, + seedRandom: { + in: [null, "number"], + out: "boolean", + category: "random", + icon: "ph-dice-five ph-bold ph-lg", + }, + randomPick: { + in: [0], + out: 0, + category: "random", + icon: "ph-dice-five ph-bold ph-lg", + }, + dailyRandomPick: { + in: [0], + out: 0, + category: "random", + icon: "ph-dice-five ph-bold ph-lg", + }, + seedRandomPick: { + in: [null, 0], + out: 0, + category: "random", + icon: "ph-dice-five ph-bold ph-lg", + }, + DRPWPM: { + in: ["stringArray"], + out: "string", + category: "random", + icon: "ph-dice-five ph-bold ph-lg", + }, // dailyRandomPickWithProbabilityMapping +}; + +export function initHpmlLib( + expr: Expr, + scope: HpmlScope, + randomSeed: string, + visitor?: any, +) { + const date = new Date(); + const day = `${visitor ? visitor.id : ""} ${date.getFullYear()}/${ + date.getMonth() + 1 + }/${date.getDate()}`; + + // SHOULD be fine to ignore since it's intended + function shape isn't defined + const funcs: Record = { + not: (a: boolean) => !a, + or: (a: boolean, b: boolean) => a || b, + and: (a: boolean, b: boolean) => a && b, + eq: (a: any, b: any) => a === b, + notEq: (a: any, b: any) => a !== b, + gt: (a: number, b: number) => a > b, + lt: (a: number, b: number) => a < b, + gtEq: (a: number, b: number) => a >= b, + ltEq: (a: number, b: number) => a <= b, + if: (bool: boolean, a: any, b: any) => (bool ? a : b), + for: (times: number, fn: Fn) => { + const result: any[] = []; + for (let i = 0; i < times; i++) { + result.push( + fn.exec({ + [fn.slots[0]]: i + 1, + }), + ); + } + return result; + }, + add: (a: number, b: number) => a + b, + subtract: (a: number, b: number) => a - b, + multiply: (a: number, b: number) => a * b, + divide: (a: number, b: number) => a / b, + mod: (a: number, b: number) => a % b, + round: (a: number) => Math.round(a), + strLen: (a: string) => a.length, + strPick: (a: string, b: number) => a[b - 1], + strReplace: (a: string, b: string, c: string) => a.split(b).join(c), + strReverse: (a: string) => a.split("").reverse().join(""), + join: (texts: string[], separator: string) => texts.join(separator || ""), + stringToNumber: (a: string) => parseInt(a), + numberToString: (a: number) => a.toString(), + splitStrByLine: (a: string) => a.split("\n"), + pick: (list: any[], i: number) => list[i - 1], + listLen: (list: any[]) => list.length, + random: (probability: number) => + Math.floor(seedrandom(`${randomSeed}:${expr.id}`)() * 100) < probability, + rannum: (min: number, max: number) => + min + + Math.floor(seedrandom(`${randomSeed}:${expr.id}`)() * (max - min + 1)), + randomPick: (list: any[]) => + list[Math.floor(seedrandom(`${randomSeed}:${expr.id}`)() * list.length)], + dailyRandom: (probability: number) => + Math.floor(seedrandom(`${day}:${expr.id}`)() * 100) < probability, + dailyRannum: (min: number, max: number) => + min + Math.floor(seedrandom(`${day}:${expr.id}`)() * (max - min + 1)), + dailyRandomPick: (list: any[]) => + list[Math.floor(seedrandom(`${day}:${expr.id}`)() * list.length)], + seedRandom: (seed: any, probability: number) => + Math.floor(seedrandom(seed)() * 100) < probability, + seedRannum: (seed: any, min: number, max: number) => + min + Math.floor(seedrandom(seed)() * (max - min + 1)), + seedRandomPick: (seed: any, list: any[]) => + list[Math.floor(seedrandom(seed)() * list.length)], + DRPWPM: (list: string[]) => { + const xs: any[] = []; + let totalFactor = 0; + for (const x of list) { + const parts = x.split(" "); + const factor = parseInt(parts.pop()!, 10); + const text = parts.join(" "); + totalFactor += factor; + xs.push({ factor, text }); + } + const r = seedrandom(`${day}:${expr.id}`)() * totalFactor; + let stackedFactor = 0; + for (const x of xs) { + if (r >= stackedFactor && r <= stackedFactor + x.factor) { + return x.text; + } else { + stackedFactor += x.factor; + } + } + return xs[0].text; + }, + }; + + return funcs; +} diff --git a/fe_calckey/frontend/client/src/scripts/hpml/type-checker.ts b/fe_calckey/frontend/client/src/scripts/hpml/type-checker.ts new file mode 100644 index 0000000..eaae600 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/hpml/type-checker.ts @@ -0,0 +1,196 @@ +import autobind from "autobind-decorator"; +import { Type, envVarsDef, PageVar } from "."; +import { Expr, isLiteralValue, Variable } from "./expr"; +import { funcDefs } from "./lib"; + +type TypeError = { + arg: number; + expect: Type; + actual: Type; +}; + +/** + * Hpml type checker + */ +export class HpmlTypeChecker { + public variables: Variable[]; + public pageVars: PageVar[]; + + constructor( + variables: HpmlTypeChecker["variables"] = [], + pageVars: HpmlTypeChecker["pageVars"] = [], + ) { + this.variables = variables; + this.pageVars = pageVars; + } + + @autobind + public typeCheck(v: Expr): TypeError | null { + if (isLiteralValue(v)) return null; + + const def = funcDefs[v.type || ""]; + if (def == null) { + throw new Error(`Unknown type: ${v.type}`); + } + + const generic: Type[] = []; + + for (let i = 0; i < def.in.length; i++) { + const arg = def.in[i]; + const type = this.infer(v.args[i]); + if (type === null) continue; + + if (typeof arg === "number") { + if (generic[arg] === undefined) { + generic[arg] = type; + } else if (type !== generic[arg]) { + return { + arg: i, + expect: generic[arg], + actual: type, + }; + } + } else if (type !== arg) { + return { + arg: i, + expect: arg, + actual: type, + }; + } + } + + return null; + } + + @autobind + public getExpectedType(v: Expr, slot: number): Type { + const def = funcDefs[v.type || ""]; + if (def == null) { + throw new Error(`Unknown type: ${v.type}`); + } + + const generic: Type[] = []; + + for (let i = 0; i < def.in.length; i++) { + const arg = def.in[i]; + const type = this.infer(v.args[i]); + if (type === null) continue; + + if (typeof arg === "number") { + if (generic[arg] === undefined) { + generic[arg] = type; + } + } + } + + if (typeof def.in[slot] === "number") { + return generic[def.in[slot]] || null; + } else { + return def.in[slot]; + } + } + + @autobind + public infer(v: Expr): Type { + if (v.type === null) return null; + if (v.type === "text") return "string"; + if (v.type === "multiLineText") return "string"; + if (v.type === "textList") return "stringArray"; + if (v.type === "number") return "number"; + if (v.type === "ref") { + const variable = this.variables.find((va) => va.name === v.value); + if (variable) { + return this.infer(variable); + } + + const pageVar = this.pageVars.find((va) => va.name === v.value); + if (pageVar) { + return pageVar.type; + } + + const envVar = envVarsDef[v.value || ""]; + if (envVar !== undefined) { + return envVar; + } + + return null; + } + if (v.type === "aiScriptVar") return null; + if (v.type === "fn") return null; // todo + if (v.type.startsWith("fn:")) return null; // todo + + const generic: Type[] = []; + + const def = funcDefs[v.type]; + + for (let i = 0; i < def.in.length; i++) { + const arg = def.in[i]; + if (typeof arg === "number") { + const type = this.infer(v.args[i]); + + if (generic[arg] === undefined) { + generic[arg] = type; + } else { + if (type !== generic[arg]) { + generic[arg] = null; + } + } + } + } + + if (typeof def.out === "number") { + return generic[def.out]; + } else { + return def.out; + } + } + + @autobind + public getVarByName(name: string): Variable { + const v = this.variables.find((x) => x.name === name); + if (v !== undefined) { + return v; + } else { + throw new Error(`No such variable '${name}'`); + } + } + + @autobind + public getVarsByType(type: Type): Variable[] { + if (type == null) return this.variables; + return this.variables.filter( + (x) => this.infer(x) === null || this.infer(x) === type, + ); + } + + @autobind + public getEnvVarsByType(type: Type): string[] { + if (type == null) return Object.keys(envVarsDef); + return Object.entries(envVarsDef) + .filter(([k, v]) => v === null || type === v) + .map(([k, v]) => k); + } + + @autobind + public getPageVarsByType(type: Type): string[] { + if (type == null) return this.pageVars.map((v) => v.name); + return this.pageVars.filter((v) => type === v.type).map((v) => v.name); + } + + @autobind + public isUsedName(name: string) { + if (this.variables.some((v) => v.name === name)) { + return true; + } + + if (this.pageVars.some((v) => v.name === name)) { + return true; + } + + if (envVarsDef[name]) { + return true; + } + + return false; + } +} diff --git a/fe_calckey/frontend/client/src/scripts/i18n.ts b/fe_calckey/frontend/client/src/scripts/i18n.ts new file mode 100644 index 0000000..8531b79 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/i18n.ts @@ -0,0 +1,31 @@ +export class I18n> { + public ts: T; + + constructor(locale: T) { + this.ts = locale; + + //#region BIND + this.t = this.t.bind(this); + //#endregion + } + + // string にしているのは、ドット区切りでのパス指定を許可するため + // なるべくこのメソッド使うよりもlocale直接参照の方がvueのキャッシュ効いてパフォーマンスが良いかも + public t(key: string, args?: Record): string { + try { + let str = key + .split(".") + .reduce((o, i) => o[i], this.ts) as unknown as string; + + if (args) { + for (const [k, v] of Object.entries(args)) { + str = str.replace(`{${k}}`, v.toString()); + } + } + return str; + } catch (err) { + console.warn(`missing localization '${key}'`); + return key; + } + } +} diff --git a/fe_calckey/frontend/client/src/scripts/idb-proxy.ts b/fe_calckey/frontend/client/src/scripts/idb-proxy.ts new file mode 100644 index 0000000..a85faa0 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/idb-proxy.ts @@ -0,0 +1,32 @@ +// FirefoxのプライベートモードなどではindexedDBが使用不可能なので、 +// indexedDBが使えない環境ではlocalStorageを使う +import { get as iget, set as iset, del as idel } from "idb-keyval"; + +const fallbackName = (key: string) => `idbfallback::${key}`; + +let idbAvailable = typeof window !== "undefined" ? !!window.indexedDB : true; + +if (idbAvailable) { + iset("idb-test", "test").catch((err) => { + console.error("idb error", err); + console.error("indexedDB is unavailable. It will use localStorage."); + idbAvailable = false; + }); +} else { + console.error("indexedDB is unavailable. It will use localStorage."); +} + +export async function get(key: string) { + if (idbAvailable) return iget(key); + return JSON.parse(localStorage.getItem(fallbackName(key))); +} + +export async function set(key: string, val: any) { + if (idbAvailable) return iset(key, val); + return localStorage.setItem(fallbackName(key), JSON.stringify(val)); +} + +export async function del(key: string) { + if (idbAvailable) return idel(key); + return localStorage.removeItem(fallbackName(key)); +} diff --git a/fe_calckey/frontend/client/src/scripts/index-posts.ts b/fe_calckey/frontend/client/src/scripts/index-posts.ts new file mode 100644 index 0000000..94b545e --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/index-posts.ts @@ -0,0 +1,26 @@ +import { i18n } from "@/i18n"; +import * as os from "@/os"; + +export async function indexPosts() { + const { canceled, result: index } = await os.inputText({ + title: i18n.ts.indexFrom, + text: i18n.ts.indexFromDescription, + }); + if (canceled) return; + + if (index == null || index === "") { + await os.api("admin/search/index-all"); + await os.alert({ + type: "info", + text: i18n.ts.indexNotice, + }); + } else { + await os.api("admin/search/index-all", { + cursor: index, + }); + await os.alert({ + type: "info", + text: i18n.ts.indexNotice, + }); + } +} diff --git a/fe_calckey/frontend/client/src/scripts/init-chart.ts b/fe_calckey/frontend/client/src/scripts/init-chart.ts new file mode 100644 index 0000000..32adf73 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/init-chart.ts @@ -0,0 +1,58 @@ +import { + Chart, + ArcElement, + LineElement, + BarElement, + PointElement, + BarController, + LineController, + DoughnutController, + CategoryScale, + LinearScale, + TimeScale, + Legend, + Title, + Tooltip, + SubTitle, + Filler, +} from "chart.js"; +import gradient from "chartjs-plugin-gradient"; +import zoomPlugin from "chartjs-plugin-zoom"; +import { MatrixController, MatrixElement } from "chartjs-chart-matrix"; +import { defaultStore } from "@/store"; +import "chartjs-adapter-date-fns"; + +export function initChart() { + Chart.register( + ArcElement, + LineElement, + BarElement, + PointElement, + BarController, + LineController, + DoughnutController, + CategoryScale, + LinearScale, + TimeScale, + Legend, + Title, + Tooltip, + SubTitle, + Filler, + MatrixController, + MatrixElement, + zoomPlugin, + gradient, + ); + + // フォントカラー + Chart.defaults.color = getComputedStyle( + document.documentElement, + ).getPropertyValue("--fg"); + + Chart.defaults.borderColor = defaultStore.state.darkMode + ? "rgba(255, 255, 255, 0.1)" + : "rgba(0, 0, 0, 0.1)"; + + Chart.defaults.animation = false; +} diff --git a/fe_calckey/frontend/client/src/scripts/initialize-sw.ts b/fe_calckey/frontend/client/src/scripts/initialize-sw.ts new file mode 100644 index 0000000..737f865 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/initialize-sw.ts @@ -0,0 +1,13 @@ +import { lang } from "@/config"; + +export async function initializeSw() { + if (!("serviceWorker" in navigator)) return; + + navigator.serviceWorker.register("/sw.js", { scope: "/", type: "classic" }); + navigator.serviceWorker.ready.then((registration) => { + registration.active?.postMessage({ + msg: "initialize", + lang, + }); + }); +} diff --git a/fe_calckey/frontend/client/src/scripts/intl-const.ts b/fe_calckey/frontend/client/src/scripts/intl-const.ts new file mode 100644 index 0000000..ac73723 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/intl-const.ts @@ -0,0 +1,12 @@ +import { lang } from "@/config"; + +export const versatileLang = (lang ?? "ja-JP").replace("ja-KS", "ja-JP"); +export const dateTimeFormat = new Intl.DateTimeFormat(versatileLang, { + year: "numeric", + month: "numeric", + day: "numeric", + hour: "numeric", + minute: "numeric", + second: "numeric", +}); +export const numberFormat = new Intl.NumberFormat(versatileLang); diff --git a/fe_calckey/frontend/client/src/scripts/is-device-darkmode.ts b/fe_calckey/frontend/client/src/scripts/is-device-darkmode.ts new file mode 100644 index 0000000..0f38515 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/is-device-darkmode.ts @@ -0,0 +1,3 @@ +export function isDeviceDarkmode() { + return window.matchMedia("(prefers-color-scheme: dark)").matches; +} diff --git a/fe_calckey/frontend/client/src/scripts/katex-macro.ts b/fe_calckey/frontend/client/src/scripts/katex-macro.ts new file mode 100644 index 0000000..f91e657 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/katex-macro.ts @@ -0,0 +1,319 @@ +type KaTeXMacro = { + args: number; + rule: (string | number)[]; +}; + +function parseSingleKaTeXMacro(src: string): [string, KaTeXMacro] { + const invalid: [string, KaTeXMacro] = ["", { args: 0, rule: [] }]; + + const skipSpaces = (pos: number): number => { + while (src[pos] === " ") ++pos; + return pos; + }; + + if (!src.startsWith("\\newcommand") || src.slice(-1) !== "}") return invalid; + + // current index we are checking (= "\\newcommand".length) + let currentPos = 11; + currentPos = skipSpaces(currentPos); + + // parse {\name}, (\name), or [\name] + let bracket: string; + if (src[currentPos] === "{") bracket = "{}"; + else if (src[currentPos] === "(") bracket = "()"; + else if (src[currentPos] === "[") bracket = "[]"; + else return invalid; + + ++currentPos; + currentPos = skipSpaces(currentPos); + + if (src[currentPos] !== "\\") return invalid; + + const closeNameBracketPos: number = src.indexOf(bracket[1], currentPos); + if (closeNameBracketPos === -1) return invalid; + + const name: string = src.slice(currentPos + 1, closeNameBracketPos).trim(); + if (!/^[a-zA-Z]+$/.test(name)) return invalid; + + currentPos = skipSpaces(closeNameBracketPos + 1); + + let macro: KaTeXMacro = { args: 0, rule: [] }; + + // parse [number of arguments] (optional) + if (src[currentPos] === "[") { + const closeArgsBracketPos: number = src.indexOf("]", currentPos); + macro.args = Number(src.slice(currentPos + 1, closeArgsBracketPos).trim()); + currentPos = closeArgsBracketPos + 1; + + if (Number.isNaN(macro.args) || macro.args < 0) return invalid; + } else if (src[currentPos] === "{") { + macro.args = 0; + } else { + return invalid; + } + + currentPos = skipSpaces(currentPos); + + // parse {rule} + if (src[currentPos] !== "{") return invalid; + + ++currentPos; + currentPos = skipSpaces(currentPos); + + while (currentPos < src.length - 1) { + let numbersignPos = -1; + let isEscaped = false; + + for (let i = currentPos; i < src.length - 1; ++i) { + if (src[i] !== "\\" && src[i] !== "#") { + isEscaped = false; + continue; + } + if (src[i] === "\\") { + isEscaped = !isEscaped; + continue; + } + if (!isEscaped && src[i] === "#") { + numbersignPos = i; + break; + } + } + if (numbersignPos === -1) { + macro.rule.push(src.slice(currentPos, -1)); + break; + } + + const argIndexEndPos = + src.slice(numbersignPos + 1).search(/[^\d]/) + numbersignPos; + const argIndex: number = Number( + src.slice(numbersignPos + 1, argIndexEndPos + 1), + ); + + if (Number.isNaN(argIndex) || argIndex < 1 || macro.args < argIndex) + return invalid; + + if (currentPos !== numbersignPos) + macro.rule.push(src.slice(currentPos, numbersignPos)); + macro.rule.push(argIndex); + + currentPos = argIndexEndPos + 1; + } + + if (macro.args === 0) return [name, macro]; + else return [name + bracket[0], macro]; +} + +export function parseKaTeXMacros(src: string): string { + let result: { [name: string]: KaTeXMacro } = {}; + + for (const s of src.split("\n")) { + const [name, macro]: [string, KaTeXMacro] = parseSingleKaTeXMacro(s.trim()); + if (name !== "") result[name] = macro; + } + + return JSON.stringify(result); +} + +// returns [expanded text, whether something is expanded, how many times we can expand more] +// the boolean value is used for multi-pass expansions (macros can expand to other macros) +function expandKaTeXMacroOnce( + src: string, + macros: { [name: string]: KaTeXMacro }, + maxNumberOfExpansions: number, +): [string, boolean, number] { + const bracketKinds = 3; + const openBracketId: { [bracket: string]: number } = { + "(": 0, + "{": 1, + "[": 2, + }; + const closeBracketId: { [bracket: string]: number } = { + ")": 0, + "}": 1, + "]": 2, + }; + const openBracketFromId = ["(", "{", "["]; + const closeBracketFromId = [")", "}", "]"]; + + // mappings from open brackets to their corresponding close brackets + type BracketMapping = { [openBracketPos: number]: number }; + + const bracketMapping = ((): BracketMapping => { + let result: BracketMapping = {}; + const n = src.length; + + let depths = new Array(bracketKinds).fill(0); // current bracket depth for "()", "{}", and "[]" + let buffer = Array.from(Array(bracketKinds), () => + Array(n), + ); + + let isEscaped = false; + + for (let i = 0; i < n; ++i) { + if ( + !isEscaped && + src[i] === "\\" && + i + 1 < n && + ["{", "}", "\\"].includes(src[i + 1]) + ) { + isEscaped = true; + continue; + } + if ( + isEscaped || + (src[i] !== "\\" && + !openBracketFromId.includes(src[i]) && + !closeBracketFromId.includes(src[i])) + ) { + isEscaped = false; + continue; + } + isEscaped = false; + + if (openBracketFromId.includes(src[i])) { + const id: number = openBracketId[src[i]]; + buffer[id][depths[id]] = i; + ++depths[id]; + } else if (closeBracketFromId.includes(src[i])) { + const id: number = closeBracketId[src[i]]; + if (depths[id] > 0) { + --depths[id]; + result[buffer[id][depths[id]]] = i; + } + } + } + + return result; + })(); + + function expandSingleKaTeXMacro( + expandedArgs: string[], + macroName: string, + ): string { + let result = ""; + for (const block of macros[macroName].rule) { + if (typeof block === "string") result += block; + else result += expandedArgs[block - 1]; + } + return result; + } + + // only expand src.slice(beginPos, endPos) + function expandKaTeXMacroImpl( + beginPos: number, + endPos: number, + ): [string, boolean] { + if (endPos <= beginPos) return ["", false]; + + const raw: string = src.slice(beginPos, endPos); + const fallback: string = raw; // returned for invalid inputs or too many expansions + + if (maxNumberOfExpansions <= 0) return [fallback, false]; + --maxNumberOfExpansions; + + // search for a custom macro + let checkedPos = beginPos - 1; + let macroName = ""; + let macroBackslashPos = 0; + + // for macros w/o args: unused + // w/ args: the first open bracket ("(", "{", or "[") after cmd name + let macroArgBeginPos = 0; + + // for macros w/o args: the end of cmd name + // w/ args: the closing bracket of the last arg + let macroArgEndPos = 0; + + while (checkedPos < endPos) { + checkedPos = src.indexOf("\\", checkedPos + 1); + + // there is no macro to expand + if (checkedPos === -1) return [raw, false]; + + // is it a custom macro? + let nonAlphaPos = + src.slice(checkedPos + 1).search(/[^A-Za-z]/) + checkedPos + 1; + + if (nonAlphaPos === checkedPos) nonAlphaPos = endPos; + + let macroNameCandidate = src.slice(checkedPos + 1, nonAlphaPos); + if (macros.hasOwnProperty(macroNameCandidate)) { + // this is a custom macro without args + macroBackslashPos = checkedPos; + macroArgEndPos = nonAlphaPos - 1; + macroName = macroNameCandidate; + break; + } + + let nextOpenBracketPos = endPos; + for (let i = 0; i < bracketKinds; ++i) { + const pos = src.indexOf(openBracketFromId[i], checkedPos + 1); + if (pos !== -1 && pos < nextOpenBracketPos) nextOpenBracketPos = pos; + } + + if (nextOpenBracketPos === endPos) continue; // there is no open bracket + + macroNameCandidate += src[nextOpenBracketPos]; + + if (macros.hasOwnProperty(macroNameCandidate)) { + macroBackslashPos = checkedPos; + macroArgBeginPos = nextOpenBracketPos; + macroArgEndPos = nextOpenBracketPos; // to search the first arg from here + macroName = macroNameCandidate; + break; + } + } + + if (!macros.hasOwnProperty(macroName)) return [fallback, false]; + + const numArgs: number = macros[macroName].args; + const openBracket: string = macroName.slice(-1); + + let expandedArgs = new Array(numArgs); + + for (let i = 0; i < numArgs; ++i) { + // find the first open bracket after what we've searched + const nextOpenBracketPos = src.indexOf(openBracket, macroArgEndPos); + if (nextOpenBracketPos === -1) return [fallback, false]; // not enough arguments are provided + if (!bracketMapping[nextOpenBracketPos]) return [fallback, false]; // found open bracket doesn't correspond to any close bracket + + macroArgEndPos = bracketMapping[nextOpenBracketPos]; + expandedArgs[i] = expandKaTeXMacroImpl( + nextOpenBracketPos + 1, + macroArgEndPos, + )[0]; + } + + return [ + src.slice(beginPos, macroBackslashPos) + + expandSingleKaTeXMacro(expandedArgs, macroName) + + expandKaTeXMacroImpl(macroArgEndPos + 1, endPos)[0], + true, + ]; + } + + const [expandedText, expandedFlag]: [string, boolean] = expandKaTeXMacroImpl( + 0, + src.length, + ); + return [expandedText, expandedFlag, maxNumberOfExpansions]; +} + +export function expandKaTeXMacro( + src: string, + macrosAsJSONString: string, + maxNumberOfExpansions: number, +): string { + const macros = JSON.parse(macrosAsJSONString); + + let expandMore = true; + + while (expandMore && 0 < maxNumberOfExpansions) + [src, expandMore, maxNumberOfExpansions] = expandKaTeXMacroOnce( + src, + macros, + maxNumberOfExpansions, + ); + + return src; +} diff --git a/fe_calckey/frontend/client/src/scripts/keycode.ts b/fe_calckey/frontend/client/src/scripts/keycode.ts new file mode 100644 index 0000000..1cbaa7a --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/keycode.ts @@ -0,0 +1,35 @@ +export default (input: string): string[] => { + if ( + Object.keys(aliases).some((a) => a.toLowerCase() === input.toLowerCase()) + ) { + const codes = aliases[input]; + return Array.isArray(codes) ? codes : [codes]; + } else { + return [input]; + } +}; + +export const aliases = { + esc: "Escape", + enter: ["Enter", "NumpadEnter"], + up: "ArrowUp", + down: "ArrowDown", + left: "ArrowLeft", + right: "ArrowRight", + plus: ["NumpadAdd", "Semicolon"], +}; + +/*! + * Programatically add the following + */ + +// lower case chars +for (let i = 97; i < 123; i++) { + const char = String.fromCharCode(i); + aliases[char] = `Key${char.toUpperCase()}`; +} + +// numbers +for (let i = 0; i < 10; i++) { + aliases[i] = [`Numpad${i}`, `Digit${i}`]; +} diff --git a/fe_calckey/frontend/client/src/scripts/langmap.ts b/fe_calckey/frontend/client/src/scripts/langmap.ts new file mode 100644 index 0000000..0831aec --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/langmap.ts @@ -0,0 +1,666 @@ +// TODO: sharedに置いてバックエンドのと統合したい +export const langmap = { + ach: { + nativeName: "Lwo", + }, + ady: { + nativeName: "Адыгэбзэ", + }, + af: { + nativeName: "Afrikaans", + }, + "af-NA": { + nativeName: "Afrikaans (Namibia)", + }, + "af-ZA": { + nativeName: "Afrikaans (South Africa)", + }, + ak: { + nativeName: "Tɕɥi", + }, + ar: { + nativeName: "العربية", + }, + "ar-AR": { + nativeName: "العربية", + }, + "ar-MA": { + nativeName: "العربية", + }, + "ar-SA": { + nativeName: "العربية (السعودية)", + }, + "ay-BO": { + nativeName: "Aymar aru", + }, + az: { + nativeName: "Azərbaycan dili", + }, + "az-AZ": { + nativeName: "Azərbaycan dili", + }, + "be-BY": { + nativeName: "Беларуская", + }, + bg: { + nativeName: "Български", + }, + "bg-BG": { + nativeName: "Български", + }, + bn: { + nativeName: "বাংলা", + }, + "bn-IN": { + nativeName: "বাংলা (ভারত)", + }, + "bn-BD": { + nativeName: "বাংলা(বাংলাদেশ)", + }, + br: { + nativeName: "Brezhoneg", + }, + "bs-BA": { + nativeName: "Bosanski", + }, + ca: { + nativeName: "Català", + }, + "ca-ES": { + nativeName: "Català", + }, + cak: { + nativeName: "Maya Kaqchikel", + }, + "ck-US": { + nativeName: "ᏣᎳᎩ (tsalagi)", + }, + cs: { + nativeName: "Čeština", + }, + "cs-CZ": { + nativeName: "Čeština", + }, + cy: { + nativeName: "Cymraeg", + }, + "cy-GB": { + nativeName: "Cymraeg", + }, + da: { + nativeName: "Dansk", + }, + "da-DK": { + nativeName: "Dansk", + }, + de: { + nativeName: "Deutsch", + }, + "de-AT": { + nativeName: "Deutsch (Österreich)", + }, + "de-DE": { + nativeName: "Deutsch (Deutschland)", + }, + "de-CH": { + nativeName: "Deutsch (Schweiz)", + }, + dsb: { + nativeName: "Dolnoserbšćina", + }, + el: { + nativeName: "Ελληνικά", + }, + "el-GR": { + nativeName: "Ελληνικά", + }, + en: { + nativeName: "English", + }, + "en-GB": { + nativeName: "English (UK)", + }, + "en-AU": { + nativeName: "English (Australia)", + }, + "en-CA": { + nativeName: "English (Canada)", + }, + "en-IE": { + nativeName: "English (Ireland)", + }, + "en-IN": { + nativeName: "English (India)", + }, + "en-PI": { + nativeName: "English (Pirate)", + }, + "en-SG": { + nativeName: "English (Singapore)", + }, + "en-UD": { + nativeName: "English (Upside Down)", + }, + "en-US": { + nativeName: "English (US)", + }, + "en-ZA": { + nativeName: "English (South Africa)", + }, + "en@pirate": { + nativeName: "English (Pirate)", + }, + eo: { + nativeName: "Esperanto", + }, + "eo-EO": { + nativeName: "Esperanto", + }, + es: { + nativeName: "Español", + }, + "es-AR": { + nativeName: "Español (Argentine)", + }, + "es-419": { + nativeName: "Español (Latinoamérica)", + }, + "es-CL": { + nativeName: "Español (Chile)", + }, + "es-CO": { + nativeName: "Español (Colombia)", + }, + "es-EC": { + nativeName: "Español (Ecuador)", + }, + "es-ES": { + nativeName: "Español (España)", + }, + "es-LA": { + nativeName: "Español (Latinoamérica)", + }, + "es-NI": { + nativeName: "Español (Nicaragua)", + }, + "es-MX": { + nativeName: "Español (México)", + }, + "es-US": { + nativeName: "Español (Estados Unidos)", + }, + "es-VE": { + nativeName: "Español (Venezuela)", + }, + et: { + nativeName: "eesti keel", + }, + "et-EE": { + nativeName: "Eesti (Estonia)", + }, + eu: { + nativeName: "Euskara", + }, + "eu-ES": { + nativeName: "Euskara", + }, + fa: { + nativeName: "فارسی", + }, + "fa-IR": { + nativeName: "فارسی", + }, + "fb-LT": { + nativeName: "Leet Speak", + }, + ff: { + nativeName: "Fulah", + }, + fi: { + nativeName: "Suomi", + }, + "fi-FI": { + nativeName: "Suomi", + }, + fo: { + nativeName: "Føroyskt", + }, + "fo-FO": { + nativeName: "Føroyskt (Færeyjar)", + }, + fr: { + nativeName: "Français", + }, + "fr-CA": { + nativeName: "Français (Canada)", + }, + "fr-FR": { + nativeName: "Français (France)", + }, + "fr-BE": { + nativeName: "Français (Belgique)", + }, + "fr-CH": { + nativeName: "Français (Suisse)", + }, + "fy-NL": { + nativeName: "Frysk", + }, + ga: { + nativeName: "Gaeilge", + }, + "ga-IE": { + nativeName: "Gaeilge", + }, + gd: { + nativeName: "Gàidhlig", + }, + gl: { + nativeName: "Galego", + }, + "gl-ES": { + nativeName: "Galego", + }, + "gn-PY": { + nativeName: "Avañe'ẽ", + }, + "gu-IN": { + nativeName: "ગુજરાતી", + }, + gv: { + nativeName: "Gaelg", + }, + "gx-GR": { + nativeName: "Ἑλληνική ἀρχαία", + }, + he: { + nativeName: "עברית‏", + }, + "he-IL": { + nativeName: "עברית‏", + }, + hi: { + nativeName: "हिन्दी", + }, + "hi-IN": { + nativeName: "हिन्दी", + }, + hr: { + nativeName: "Hrvatski", + }, + "hr-HR": { + nativeName: "Hrvatski", + }, + hsb: { + nativeName: "Hornjoserbšćina", + }, + ht: { + nativeName: "Kreyòl", + }, + hu: { + nativeName: "Magyar", + }, + "hu-HU": { + nativeName: "Magyar", + }, + hy: { + nativeName: "Հայերեն", + }, + "hy-AM": { + nativeName: "Հայերեն (Հայաստան)", + }, + id: { + nativeName: "Bahasa Indonesia", + }, + "id-ID": { + nativeName: "Bahasa Indonesia", + }, + is: { + nativeName: "Íslenska", + }, + "is-IS": { + nativeName: "Íslenska (Iceland)", + }, + it: { + nativeName: "Italiano", + }, + "it-IT": { + nativeName: "Italiano", + }, + ja: { + nativeName: "日本語", + }, + "ja-JP": { + nativeName: "日本語 (日本)", + }, + "jv-ID": { + nativeName: "Basa Jawa", + }, + "ka-GE": { + nativeName: "ქართული", + }, + "kk-KZ": { + nativeName: "Қазақша", + }, + km: { + nativeName: "ភាសាខ្មែរ", + }, + kl: { + nativeName: "kalaallisut", + }, + "km-KH": { + nativeName: "ភាសាខ្មែរ", + }, + kab: { + nativeName: "Taqbaylit", + }, + kn: { + nativeName: "ಕನ್ನಡ", + }, + "kn-IN": { + nativeName: "ಕನ್ನಡ (India)", + }, + ko: { + nativeName: "한국어", + }, + "ko-KR": { + nativeName: "한국어 (한국)", + }, + "ku-TR": { + nativeName: "Kurdî", + }, + kw: { + nativeName: "Kernewek", + }, + la: { + nativeName: "Latin", + }, + "la-VA": { + nativeName: "Latin", + }, + lb: { + nativeName: "Lëtzebuergesch", + }, + "li-NL": { + nativeName: "Lèmbörgs", + }, + lt: { + nativeName: "Lietuvių", + }, + "lt-LT": { + nativeName: "Lietuvių", + }, + lv: { + nativeName: "Latviešu", + }, + "lv-LV": { + nativeName: "Latviešu", + }, + mai: { + nativeName: "मैथिली, মৈথিলী", + }, + "mg-MG": { + nativeName: "Malagasy", + }, + mk: { + nativeName: "Македонски", + }, + "mk-MK": { + nativeName: "Македонски (Македонски)", + }, + ml: { + nativeName: "മലയാളം", + }, + "ml-IN": { + nativeName: "മലയാളം", + }, + "mn-MN": { + nativeName: "Монгол", + }, + mr: { + nativeName: "मराठी", + }, + "mr-IN": { + nativeName: "मराठी", + }, + ms: { + nativeName: "Bahasa Melayu", + }, + "ms-MY": { + nativeName: "Bahasa Melayu", + }, + mt: { + nativeName: "Malti", + }, + "mt-MT": { + nativeName: "Malti", + }, + my: { + nativeName: "ဗမာစကာ", + }, + no: { + nativeName: "Norsk", + }, + nb: { + nativeName: "Norsk (bokmål)", + }, + "nb-NO": { + nativeName: "Norsk (bokmål)", + }, + ne: { + nativeName: "नेपाली", + }, + "ne-NP": { + nativeName: "नेपाली", + }, + nl: { + nativeName: "Nederlands", + }, + "nl-BE": { + nativeName: "Nederlands (België)", + }, + "nl-NL": { + nativeName: "Nederlands (Nederland)", + }, + "nn-NO": { + nativeName: "Norsk (nynorsk)", + }, + oc: { + nativeName: "Occitan", + }, + "or-IN": { + nativeName: "ଓଡ଼ିଆ", + }, + pa: { + nativeName: "ਪੰਜਾਬੀ", + }, + "pa-IN": { + nativeName: "ਪੰਜਾਬੀ (ਭਾਰਤ ਨੂੰ)", + }, + pl: { + nativeName: "Polski", + }, + "pl-PL": { + nativeName: "Polski", + }, + "ps-AF": { + nativeName: "پښتو", + }, + pt: { + nativeName: "Português", + }, + "pt-BR": { + nativeName: "Português (Brasil)", + }, + "pt-PT": { + nativeName: "Português (Portugal)", + }, + "qu-PE": { + nativeName: "Qhichwa", + }, + "rm-CH": { + nativeName: "Rumantsch", + }, + ro: { + nativeName: "Română", + }, + "ro-RO": { + nativeName: "Română", + }, + ru: { + nativeName: "Русский", + }, + "ru-RU": { + nativeName: "Русский", + }, + "sa-IN": { + nativeName: "संस्कृतम्", + }, + "se-NO": { + nativeName: "Davvisámegiella", + }, + sh: { + nativeName: "српскохрватски", + }, + "si-LK": { + nativeName: "සිංහල", + }, + sk: { + nativeName: "Slovenčina", + }, + "sk-SK": { + nativeName: "Slovenčina (Slovakia)", + }, + sl: { + nativeName: "Slovenščina", + }, + "sl-SI": { + nativeName: "Slovenščina", + }, + "so-SO": { + nativeName: "Soomaaliga", + }, + sq: { + nativeName: "Shqip", + }, + "sq-AL": { + nativeName: "Shqip", + }, + sr: { + nativeName: "Српски", + }, + "sr-RS": { + nativeName: "Српски (Serbia)", + }, + su: { + nativeName: "Basa Sunda", + }, + sv: { + nativeName: "Svenska", + }, + "sv-SE": { + nativeName: "Svenska", + }, + sw: { + nativeName: "Kiswahili", + }, + "sw-KE": { + nativeName: "Kiswahili", + }, + ta: { + nativeName: "தமிழ்", + }, + "ta-IN": { + nativeName: "தமிழ்", + }, + te: { + nativeName: "తెలుగు", + }, + "te-IN": { + nativeName: "తెలుగు", + }, + tg: { + nativeName: "забо́ни тоҷикӣ́", + }, + "tg-TJ": { + nativeName: "тоҷикӣ", + }, + th: { + nativeName: "ภาษาไทย", + }, + "th-TH": { + nativeName: "ภาษาไทย (ประเทศไทย)", + }, + fil: { + nativeName: "Filipino", + }, + tlh: { + nativeName: "tlhIngan-Hol", + }, + tr: { + nativeName: "Türkçe", + }, + "tr-TR": { + nativeName: "Türkçe", + }, + "tt-RU": { + nativeName: "татарча", + }, + uk: { + nativeName: "Українська", + }, + "uk-UA": { + nativeName: "Українська", + }, + ur: { + nativeName: "اردو", + }, + "ur-PK": { + nativeName: "اردو", + }, + uz: { + nativeName: "O'zbek", + }, + "uz-UZ": { + nativeName: "O'zbek", + }, + vi: { + nativeName: "Tiếng Việt", + }, + "vi-VN": { + nativeName: "Tiếng Việt", + }, + "xh-ZA": { + nativeName: "isiXhosa", + }, + yi: { + nativeName: "ייִדיש", + }, + "yi-DE": { + nativeName: "ייִדיש (German)", + }, + zh: { + nativeName: "中文", + }, + "zh-Hans": { + nativeName: "中文简体", + }, + "zh-Hant": { + nativeName: "中文繁體", + }, + "zh-CN": { + nativeName: "中文(中国大陆)", + }, + "zh-HK": { + nativeName: "中文(香港)", + }, + "zh-SG": { + nativeName: "中文(新加坡)", + }, + "zh-TW": { + nativeName: "中文(台灣)", + }, + "zu-ZA": { + nativeName: "isiZulu", + }, +}; diff --git a/fe_calckey/frontend/client/src/scripts/login-id.ts b/fe_calckey/frontend/client/src/scripts/login-id.ts new file mode 100644 index 0000000..0fe3457 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/login-id.ts @@ -0,0 +1,11 @@ +export function getUrlWithLoginId(url: string, loginId: string) { + const u = new URL(url, origin); + u.searchParams.append("loginId", loginId); + return u.toString(); +} + +export function getUrlWithoutLoginId(url: string) { + const u = new URL(url); + u.searchParams.delete("loginId"); + return u.toString(); +} diff --git a/fe_calckey/frontend/client/src/scripts/lookup-file.ts b/fe_calckey/frontend/client/src/scripts/lookup-file.ts new file mode 100644 index 0000000..a151e09 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/lookup-file.ts @@ -0,0 +1,27 @@ +import { i18n } from "@/i18n"; +import * as os from "@/os"; + +export async function lookupFile() { + const { canceled, result: q } = await os.inputText({ + title: i18n.ts.fileIdOrUrl, + }); + if (canceled) return; + + os.api( + "admin/drive/show-file", + q.startsWith("http://") || q.startsWith("https://") + ? { url: q.trim() } + : { fileId: q.trim() }, + ) + .then((file) => { + os.pageWindow(`/admin/file/${file.id}`); + }) + .catch((err) => { + if (err.code === "NO_SUCH_FILE") { + os.alert({ + type: "error", + text: i18n.ts.notFound, + }); + } + }); +} diff --git a/fe_calckey/frontend/client/src/scripts/lookup-instance.ts b/fe_calckey/frontend/client/src/scripts/lookup-instance.ts new file mode 100644 index 0000000..18f87b6 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/lookup-instance.ts @@ -0,0 +1,25 @@ +import { i18n } from "@/i18n"; +import * as os from "@/os"; + +export async function lookupInstance() { + const { canceled, result: q } = await os.inputText({ + title: i18n.ts.instance, + }); + if (canceled) return; + + os.api( + "federation/show-instance", + q.startsWith("http://") || q.startsWith("https://") + ? { host: q.replace("https://", "") } + : { host: q }, + ) + .then((instance) => { + os.pageWindow(`/instance-info/${instance.host}`); + }) + .catch(() => { + os.alert({ + type: "error", + text: i18n.ts.notFound, + }); + }); +} diff --git a/fe_calckey/frontend/client/src/scripts/lookup-user.ts b/fe_calckey/frontend/client/src/scripts/lookup-user.ts new file mode 100644 index 0000000..6c5494b --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/lookup-user.ts @@ -0,0 +1,36 @@ +import * as Acct from "calckey-js/built/acct"; +import { i18n } from "@/i18n"; +import * as os from "@/os"; + +export async function lookupUser() { + const { canceled, result } = await os.inputText({ + title: i18n.ts.usernameOrUserId, + }); + if (canceled) return; + + const show = (user) => { + os.pageWindow(`/user-info/${user.id}`); + }; + + const usernamePromise = os.api("users/show", Acct.parse(result)); + const idPromise = os.api("users/show", { userId: result }); + let _notFound = false; + const notFound = () => { + if (_notFound) { + os.alert({ + type: "error", + text: i18n.ts.noSuchUser, + }); + } else { + _notFound = true; + } + }; + usernamePromise.then(show).catch((err) => { + if (err.code === "NO_SUCH_USER") { + notFound(); + } + }); + idPromise.then(show).catch((err) => { + notFound(); + }); +} diff --git a/fe_calckey/frontend/client/src/scripts/media-proxy.ts b/fe_calckey/frontend/client/src/scripts/media-proxy.ts new file mode 100644 index 0000000..6fafe2c --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/media-proxy.ts @@ -0,0 +1,18 @@ +import { query } from "@/scripts/url"; +import { url } from "@/config"; + +export function getProxiedImageUrl(imageUrl: string, type?: "preview"): string { + return `${url}/proxy/image.webp?${query({ + url: imageUrl, + fallback: "1", + ...(type ? { [type]: "1" } : {}), + })}`; +} + +export function getProxiedImageUrlNullable( + imageUrl: string | null | undefined, + type?: "preview", +): string | null { + if (imageUrl == null) return null; + return getProxiedImageUrl(imageUrl, type); +} diff --git a/fe_calckey/frontend/client/src/scripts/mfm-tags.ts b/fe_calckey/frontend/client/src/scripts/mfm-tags.ts new file mode 100644 index 0000000..2fadcd8 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/mfm-tags.ts @@ -0,0 +1,24 @@ +export const MFM_TAGS = [ + "tada", + "jelly", + "twitch", + "shake", + "spin", + "jump", + "bounce", + "flip", + "x2", + "x3", + "x4", + "scale", + "position", + "crop", + "fg", + "bg", + "font", + "blur", + "rainbow", + "sparkle", + "rotate", + "fade", +]; diff --git a/fe_calckey/frontend/client/src/scripts/page-metadata.ts b/fe_calckey/frontend/client/src/scripts/page-metadata.ts new file mode 100644 index 0000000..edc8c76 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/page-metadata.ts @@ -0,0 +1,58 @@ +import * as misskey from "calckey-js"; +import { + ComputedRef, + inject, + isRef, + onActivated, + onMounted, + provide, + ref, + Ref, +} from "vue"; + +export const setPageMetadata = Symbol("setPageMetadata"); +export const pageMetadataProvider = Symbol("pageMetadataProvider"); + +export type PageMetadata = { + title: string; + subtitle?: string; + icon?: string | null; + avatar?: misskey.entities.User | null; + userName?: misskey.entities.User | null; + bg?: string; +}; + +export function definePageMetadata( + metadata: + | PageMetadata + | null + | Ref + | ComputedRef, +): void { + const _metadata = isRef(metadata) ? metadata : ref(metadata); + + provide(pageMetadataProvider, _metadata); + + const set = inject(setPageMetadata) as any; + if (set) { + set(_metadata); + + onMounted(() => { + set(_metadata); + }); + + onActivated(() => { + set(_metadata); + }); + } +} + +export function provideMetadataReceiver( + callback: (info: ComputedRef) => void, +): void { + provide(setPageMetadata, callback); +} + +export function injectPageMetadata(): PageMetadata | undefined { + return inject(pageMetadataProvider); +} diff --git a/fe_calckey/frontend/client/src/scripts/physics.ts b/fe_calckey/frontend/client/src/scripts/physics.ts new file mode 100644 index 0000000..cfb8133 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/physics.ts @@ -0,0 +1,163 @@ +import * as Matter from "matter-js"; + +export function physics(container: HTMLElement) { + const containerWidth = container.offsetWidth; + const containerHeight = container.offsetHeight; + const containerCenterX = containerWidth / 2; + + // サイズ固定化(要らないかも?) + container.style.position = "relative"; + container.style.boxSizing = "border-box"; + container.style.width = `${containerWidth}px`; + container.style.height = `${containerHeight}px`; + + // create engine + const engine = Matter.Engine.create({ + constraintIterations: 4, + positionIterations: 8, + velocityIterations: 8, + }); + + const world = engine.world; + + // create renderer + const render = Matter.Render.create({ + engine: engine, + //element: document.getElementById('debug'), + options: { + width: containerWidth, + height: containerHeight, + background: "transparent", // transparent to hide + wireframeBackground: "transparent", // transparent to hide + }, + }); + + // Disable to hide debug + Matter.Render.run(render); + + // create runner + const runner = Matter.Runner.create(); + Matter.Runner.run(runner, engine); + + const groundThickness = 1024; + const ground = Matter.Bodies.rectangle( + containerCenterX, + containerHeight + groundThickness / 2, + containerWidth, + groundThickness, + { + isStatic: true, + restitution: 0.1, + friction: 2, + }, + ); + + //const wallRight = Matter.Bodies.rectangle(window.innerWidth+50, window.innerHeight/2, 100, window.innerHeight, wallopts); + //const wallLeft = Matter.Bodies.rectangle(-50, window.innerHeight/2, 100, window.innerHeight, wallopts); + + Matter.World.add(world, [ + ground, + //wallRight, + //wallLeft, + ]); + + const objEls = Array.from(container.children); + const objs = []; + for (const objEl of objEls) { + const left = objEl.dataset.physicsX + ? parseInt(objEl.dataset.physicsX) + : objEl.offsetLeft; + const top = objEl.dataset.physicsY + ? parseInt(objEl.dataset.physicsY) + : objEl.offsetTop; + + let obj; + if (objEl.classList.contains("_physics_circle_")) { + obj = Matter.Bodies.circle( + left + objEl.offsetWidth / 2, + top + objEl.offsetHeight / 2, + Math.max(objEl.offsetWidth, objEl.offsetHeight) / 2, + { + restitution: 0.5, + }, + ); + } else { + const style = window.getComputedStyle(objEl); + obj = Matter.Bodies.rectangle( + left + objEl.offsetWidth / 2, + top + objEl.offsetHeight / 2, + objEl.offsetWidth, + objEl.offsetHeight, + { + chamfer: { radius: parseInt(style.borderRadius || "0", 10) }, + restitution: 0.5, + }, + ); + } + objEl.id = obj.id; + objs.push(obj); + } + + Matter.World.add(engine.world, objs); + + // Add mouse control + + const mouse = Matter.Mouse.create(container); + const mouseConstraint = Matter.MouseConstraint.create(engine, { + mouse: mouse, + constraint: { + stiffness: 0.1, + render: { + visible: false, + }, + }, + }); + + Matter.World.add(engine.world, mouseConstraint); + + // keep the mouse in sync with rendering + render.mouse = mouse; + + for (const objEl of objEls) { + objEl.style.position = "absolute"; + objEl.style.top = 0; + objEl.style.left = 0; + objEl.style.margin = 0; + } + + window.requestAnimationFrame(update); + + let stop = false; + + function update() { + for (const objEl of objEls) { + const obj = objs.find((obj) => obj.id.toString() === objEl.id.toString()); + if (obj == null) continue; + + const x = obj.position.x - objEl.offsetWidth / 2; + const y = obj.position.y - objEl.offsetHeight / 2; + const angle = obj.angle; + objEl.style.transform = `translate(${x}px, ${y}px) rotate(${angle}rad)`; + } + + if (!stop) { + window.requestAnimationFrame(update); + } + } + + // 奈落に落ちたオブジェクトは消す + const intervalId = window.setInterval(() => { + for (const obj of objs) { + if (obj.position.y > containerHeight + 1024) + Matter.World.remove(world, obj); + } + }, 1000 * 10); + + return { + stop: () => { + stop = true; + Matter.Runner.stop(runner); + window.clearInterval(intervalId); + }, + }; +} diff --git a/fe_calckey/frontend/client/src/scripts/please-login.ts b/fe_calckey/frontend/client/src/scripts/please-login.ts new file mode 100644 index 0000000..9b660dd --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/please-login.ts @@ -0,0 +1,26 @@ +import { defineAsyncComponent } from "vue"; +import { $i } from "@/account"; +import { i18n } from "@/i18n"; +import { popup } from "@/os"; + +export function pleaseLogin(path?: string) { + if ($i) return; + + popup( + defineAsyncComponent(() => import("@/components/MkSigninDialog.vue")), + { + autoSet: true, + message: i18n.ts.signinRequired, + }, + { + cancelled: () => { + if (path) { + window.location.href = path; + } + }, + }, + "closed", + ); + + if (!path) throw new Error("Sign-in required."); +} diff --git a/fe_calckey/frontend/client/src/scripts/popout.ts b/fe_calckey/frontend/client/src/scripts/popout.ts new file mode 100644 index 0000000..d27428d --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/popout.ts @@ -0,0 +1,32 @@ +import * as config from "@/config"; +import { appendQuery } from "./url"; + +export function popout(path: string, w?: HTMLElement) { + let url = + path.startsWith("http://") || path.startsWith("https://") + ? path + : config.url + path; + url = appendQuery(url, "zen"); + if (w) { + const position = w.getBoundingClientRect(); + const width = parseInt(getComputedStyle(w, "").width, 10); + const height = parseInt(getComputedStyle(w, "").height, 10); + const x = window.screenX + position.left; + const y = window.screenY + position.top; + window.open( + url, + url, + `width=${width}, height=${height}, top=${y}, left=${x}`, + ); + } else { + const width = 400; + const height = 500; + const x = window.top.outerHeight / 2 + window.top.screenY - height / 2; + const y = window.top.outerWidth / 2 + window.top.screenX - width / 2; + window.open( + url, + url, + `width=${width}, height=${height}, top=${x}, left=${y}`, + ); + } +} diff --git a/fe_calckey/frontend/client/src/scripts/popup-position.ts b/fe_calckey/frontend/client/src/scripts/popup-position.ts new file mode 100644 index 0000000..874d127 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/popup-position.ts @@ -0,0 +1,174 @@ +import { Ref } from "vue"; + +export function calcPopupPosition( + el: HTMLElement, + props: { + anchorElement: HTMLElement | null; + innerMargin: number; + direction: "top" | "bottom" | "left" | "right"; + align: "top" | "bottom" | "left" | "right" | "center"; + alignOffset?: number; + x?: number; + y?: number; + }, +): { top: number; left: number; transformOrigin: string } { + const contentWidth = el.offsetWidth; + const contentHeight = el.offsetHeight; + + let rect: DOMRect; + + if (props.anchorElement) { + rect = props.anchorElement.getBoundingClientRect(); + } + + const calcPosWhenTop = () => { + let left: number; + let top: number; + + if (props.anchorElement) { + left = + rect.left + window.pageXOffset + props.anchorElement.offsetWidth / 2; + top = rect.top + window.pageYOffset - contentHeight - props.innerMargin; + } else { + left = props.x; + top = props.y - contentHeight - props.innerMargin; + } + + left -= el.offsetWidth / 2; + + if (left + contentWidth - window.pageXOffset > window.innerWidth) { + left = window.innerWidth - contentWidth + window.pageXOffset - 1; + } + + return [left, top]; + }; + + const calcPosWhenBottom = () => { + let left: number; + let top: number; + + if (props.anchorElement) { + left = + rect.left + window.pageXOffset + props.anchorElement.offsetWidth / 2; + top = + rect.top + + window.pageYOffset + + props.anchorElement.offsetHeight + + props.innerMargin; + } else { + left = props.x; + top = props.y + props.innerMargin; + } + + left -= el.offsetWidth / 2; + + if (left + contentWidth - window.pageXOffset > window.innerWidth) { + left = window.innerWidth - contentWidth + window.pageXOffset - 1; + } + + return [left, top]; + }; + + const calcPosWhenLeft = () => { + let left: number; + let top: number; + + if (props.anchorElement) { + left = rect.left + window.pageXOffset - contentWidth - props.innerMargin; + top = + rect.top + window.pageYOffset + props.anchorElement.offsetHeight / 2; + } else { + left = props.x - contentWidth - props.innerMargin; + top = props.y; + } + + top -= el.offsetHeight / 2; + + if (top + contentHeight - window.pageYOffset > window.innerHeight) { + top = window.innerHeight - contentHeight + window.pageYOffset - 1; + } + + return [left, top]; + }; + + const calcPosWhenRight = () => { + let left: number; + let top: number; + + if (props.anchorElement) { + left = + rect.left + + props.anchorElement.offsetWidth + + window.pageXOffset + + props.innerMargin; + + if (props.align === "top") { + top = rect.top + window.pageYOffset; + if (props.alignOffset != null) top += props.alignOffset; + } else if (props.align === "bottom") { + // TODO + } else { + // center + top = + rect.top + window.pageYOffset + props.anchorElement.offsetHeight / 2; + top -= el.offsetHeight / 2; + } + } else { + left = props.x + props.innerMargin; + top = props.y; + top -= el.offsetHeight / 2; + } + + if (top + contentHeight - window.pageYOffset > window.innerHeight) { + top = window.innerHeight - contentHeight + window.pageYOffset - 1; + } + + return [left, top]; + }; + + const calc = (): { + left: number; + top: number; + transformOrigin: string; + } => { + switch (props.direction) { + case "top": { + const [left, top] = calcPosWhenTop(); + + // ツールチップを上に向かって表示するスペースがなければ下に向かって出す + if (top - window.pageYOffset < 0) { + const [left, top] = calcPosWhenBottom(); + return { left, top, transformOrigin: "center top" }; + } + + return { left, top, transformOrigin: "center bottom" }; + } + + case "bottom": { + const [left, top] = calcPosWhenBottom(); + // TODO: ツールチップを下に向かって表示するスペースがなければ上に向かって出す + return { left, top, transformOrigin: "center top" }; + } + + case "left": { + const [left, top] = calcPosWhenLeft(); + + // ツールチップを左に向かって表示するスペースがなければ右に向かって出す + if (left - window.pageXOffset < 0) { + const [left, top] = calcPosWhenRight(); + return { left, top, transformOrigin: "left center" }; + } + + return { left, top, transformOrigin: "right center" }; + } + + case "right": { + const [left, top] = calcPosWhenRight(); + // TODO: ツールチップを右に向かって表示するスペースがなければ左に向かって出す + return { left, top, transformOrigin: "left center" }; + } + } + }; + + return calc(); +} diff --git a/fe_calckey/frontend/client/src/scripts/preprocess.ts b/fe_calckey/frontend/client/src/scripts/preprocess.ts new file mode 100644 index 0000000..438a44d --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/preprocess.ts @@ -0,0 +1,27 @@ +import * as mfm from "mfm-js"; +import { defaultStore } from "@/store"; +import { expandKaTeXMacro } from "@/scripts/katex-macro"; + +export function preprocess(text: string): string { + if (defaultStore.state.enableCustomKaTeXMacro) { + const parsedKaTeXMacro = + localStorage.getItem("customKaTeXMacroParsed") ?? "{}"; + const maxNumberOfExpansions = 200; // to prevent infinite expansion loops + + let nodes = mfm.parse(text); + + for (let node of nodes) { + if (node["type"] === "mathInline" || node["type"] === "mathBlock") { + node["props"]["formula"] = expandKaTeXMacro( + node["props"]["formula"], + parsedKaTeXMacro, + maxNumberOfExpansions, + ); + } + } + + text = mfm.toString(nodes); + } + + return text; +} diff --git a/fe_calckey/frontend/client/src/scripts/reaction-picker.ts b/fe_calckey/frontend/client/src/scripts/reaction-picker.ts new file mode 100644 index 0000000..8baa502 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/reaction-picker.ts @@ -0,0 +1,51 @@ +import { defineAsyncComponent, Ref, ref } from "vue"; +import { popup } from "@/os"; + +class ReactionPicker { + private src: Ref = ref(null); + private manualShowing = ref(false); + private onChosen?: (reaction: string) => void; + private onClosed?: () => void; + + constructor() { + // nop + } + + public async init() { + await popup( + defineAsyncComponent( + () => import("@/components/MkEmojiPickerDialog.vue"), + ), + { + src: this.src, + asReactionPicker: true, + manualShowing: this.manualShowing, + }, + { + done: (reaction) => { + this.onChosen!(reaction); + }, + close: () => { + this.manualShowing.value = false; + }, + closed: () => { + this.src.value = null; + this.onClosed!(); + }, + }, + ); + } + + public show( + src: HTMLElement, + onChosen: ReactionPicker["onChosen"], + onClosed: ReactionPicker["onClosed"], + ) { + this.src.value = src; + this.manualShowing.value = true; + this.onChosen = onChosen; + this.onClosed = onClosed; + } +} + +export const reactionPicker = new ReactionPicker(); diff --git a/fe_calckey/frontend/client/src/scripts/reduced-motion.ts b/fe_calckey/frontend/client/src/scripts/reduced-motion.ts new file mode 100644 index 0000000..e73dc3c --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/reduced-motion.ts @@ -0,0 +1,3 @@ +export function reducedMotion(): boolean { + return window.matchMedia("(prefers-reduced-motion: reduce)").matches; +} diff --git a/fe_calckey/frontend/client/src/scripts/safe-uri-decode.ts b/fe_calckey/frontend/client/src/scripts/safe-uri-decode.ts new file mode 100644 index 0000000..301b56d --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/safe-uri-decode.ts @@ -0,0 +1,7 @@ +export function safeURIDecode(str: string): string { + try { + return decodeURIComponent(str); + } catch { + return str; + } +} diff --git a/fe_calckey/frontend/client/src/scripts/scroll.ts b/fe_calckey/frontend/client/src/scripts/scroll.ts new file mode 100644 index 0000000..0ac4cd7 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/scroll.ts @@ -0,0 +1,100 @@ +type ScrollBehavior = "auto" | "smooth" | "instant"; + +export function getScrollContainer(el: HTMLElement | null): HTMLElement | null { + if (el == null || el.tagName === "HTML") return null; + const overflow = window.getComputedStyle(el).getPropertyValue("overflow-y"); + if (overflow === "scroll" || overflow === "auto") { + return el; + } else { + return getScrollContainer(el.parentElement); + } +} + +export function getScrollPosition(el: Element | null): number { + const container = getScrollContainer(el); + return container == null ? window.scrollY : container.scrollTop; +} + +export function isTopVisible(el: Element | null): boolean { + const scrollTop = getScrollPosition(el); + const topPosition = el.offsetTop; // TODO: container内でのelの相対位置を取得できればより正確になる + + return scrollTop <= topPosition; +} + +export function isBottomVisible( + el: HTMLElement, + tolerance = 1, + container = getScrollContainer(el), +) { + if (container) + return ( + el.scrollHeight <= + container.clientHeight + Math.abs(container.scrollTop) + tolerance + ); + return el.scrollHeight <= window.innerHeight + window.scrollY + tolerance; +} + +export function onScrollTop(el: Element, cb) { + const container = getScrollContainer(el) || window; + const onScroll = (ev) => { + if (!document.body.contains(el)) return; + if (isTopVisible(el)) { + cb(); + container.removeEventListener("scroll", onScroll); + } + }; + container.addEventListener("scroll", onScroll, { passive: true }); +} + +export function onScrollBottom(el: Element, cb) { + const container = getScrollContainer(el) || window; + const onScroll = (ev) => { + if (!document.body.contains(el)) return; + const pos = getScrollPosition(el); + if (pos + el.clientHeight > el.scrollHeight - 1) { + cb(); + container.removeEventListener("scroll", onScroll); + } + }; + container.addEventListener("scroll", onScroll, { passive: true }); +} + +export function scroll( + el: Element, + options: { + top?: number; + left?: number; + behavior?: ScrollBehavior; + }, +) { + const container = getScrollContainer(el); + if (container == null) { + window.scroll(options); + } else { + container.scroll(options); + } +} + +export function scrollToTop( + el: Element, + options: { behavior?: ScrollBehavior } = {}, +) { + scroll(el, { top: 0, ...options }); +} + +export function scrollToBottom( + el: Element, + options: { behavior?: ScrollBehavior } = {}, +) { + scroll(el, { top: 99999, ...options }); // TODO: ちゃんと計算する +} + +export function isBottom(el: Element, asobi = 0) { + const container = getScrollContainer(el); + const current = container + ? el.scrollTop + el.offsetHeight + : window.scrollY + window.innerHeight; + const max = container ? el.scrollHeight : document.body.offsetHeight; + return current >= max - asobi; +} diff --git a/fe_calckey/frontend/client/src/scripts/search.ts b/fe_calckey/frontend/client/src/scripts/search.ts new file mode 100644 index 0000000..34318ab --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/search.ts @@ -0,0 +1,65 @@ +import * as os from "@/os"; +import { i18n } from "@/i18n"; +import { mainRouter } from "@/router"; +import { instance } from "@/instance"; + +export async function search() { + const { canceled, result: query } = await os.inputText({ + type: instance.features.searchFilters ? "search" : "text", + title: i18n.ts.search, + placeholder: i18n.ts.searchPlaceholder, + }); + if (canceled || query == null || query === "") return; + + const q = query.trim(); + + if (q.startsWith("@") && !q.includes(" ")) { + mainRouter.push(`/${q}`); + return; + } + + if (q.startsWith("#")) { + mainRouter.push(`/tags/${encodeURIComponent(q.substr(1))}`); + return; + } + + // like 2018/03/12 + if (/^[0-9]{4}\/[0-9]{2}\/[0-9]{2}/.test(q.replace(/-/g, "/"))) { + const date = new Date(q.replace(/-/g, "/")); + + // 日付しか指定されてない場合、例えば 2018/03/12 ならユーザーは + // 2018/03/12 のコンテンツを「含む」結果になることを期待するはずなので + // 23時間59分進める(そのままだと 2018/03/12 00:00:00 「まで」の + // 結果になってしまい、2018/03/12 のコンテンツは含まれない) + if (q.replace(/-/g, "/").match(/^[0-9]{4}\/[0-9]{2}\/[0-9]{2}$/)) { + date.setHours(23, 59, 59, 999); + } + + // TODO + //v.$root.$emit('warp', date); + os.alert({ + type: "waiting", + }); + return; + } + + if (q.startsWith("https://")) { + const promise = os.api("ap/show", { + uri: q, + }); + + os.promiseDialog(promise, null, null, i18n.ts.fetchingAsApObject); + + const res = await promise; + + if (res.type === "User") { + mainRouter.push(`/@${res.object.username}@${res.object.host}`); + } else if (res.type === "Note") { + mainRouter.push(`/notes/${res.object.id}`); + } + + return; + } + + mainRouter.push(`/search?q=${encodeURIComponent(q)}`); +} diff --git a/fe_calckey/frontend/client/src/scripts/select-file.ts b/fe_calckey/frontend/client/src/scripts/select-file.ts new file mode 100644 index 0000000..d249b2d --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/select-file.ts @@ -0,0 +1,133 @@ +import { ref } from "vue"; +import { DriveFile } from "calckey-js/built/entities"; +import * as os from "@/os"; +import { stream } from "@/stream"; +import { i18n } from "@/i18n"; +import { defaultStore } from "@/store"; +import { uploadFile } from "@/scripts/upload"; + +function select( + src: any, + label: string | null, + multiple: boolean, +): Promise { + return new Promise((res, rej) => { + const keepOriginal = ref(defaultStore.state.keepOriginalUploading); + + const chooseFileFromPc = () => { + const input = document.createElement("input"); + input.type = "file"; + input.multiple = multiple; + input.onchange = () => { + const promises = Array.from(input.files).map((file) => + uploadFile( + file, + defaultStore.state.uploadFolder, + undefined, + keepOriginal.value, + ), + ); + + Promise.all(promises) + .then((driveFiles) => { + res(multiple ? driveFiles : driveFiles[0]); + }) + .catch((err) => { + // アップロードのエラーは uploadFile 内でハンドリングされているためアラートダイアログを出したりはしてはいけない + }); + + // 一応廃棄 + (window as any).__misskey_input_ref__ = null; + }; + + // https://qiita.com/fukasawah/items/b9dc732d95d99551013d + // iOS Safari で正常に動かす為のおまじない + (window as any).__misskey_input_ref__ = input; + + input.click(); + }; + + const chooseFileFromDrive = () => { + os.selectDriveFile(multiple).then((files) => { + res(files); + }); + }; + + const chooseFileFromUrl = () => { + os.inputText({ + title: i18n.ts.uploadFromUrl, + type: "url", + placeholder: i18n.ts.uploadFromUrlDescription, + }).then(({ canceled, result: url }) => { + if (canceled) return; + + const marker = Math.random().toString(); // TODO: UUIDとか使う + + const connection = stream.useChannel("main"); + connection.on("urlUploadFinished", (urlResponse) => { + if (urlResponse.marker === marker) { + res(multiple ? [urlResponse.file] : urlResponse.file); + connection.dispose(); + } + }); + + os.api("drive/files/upload-from-url", { + url: url, + folderId: defaultStore.state.uploadFolder, + marker, + }); + + os.alert({ + title: i18n.ts.uploadFromUrlRequested, + text: i18n.ts.uploadFromUrlMayTakeTime, + }); + }); + }; + + os.popupMenu( + [ + label + ? { + text: label, + type: "label", + } + : undefined, + { + type: "switch", + text: i18n.ts.keepOriginalUploading, + ref: keepOriginal, + }, + { + text: i18n.ts.upload, + icon: "ph-upload-simple ph-bold ph-lg", + action: chooseFileFromPc, + }, + { + text: i18n.ts.fromDrive, + icon: "ph-cloud ph-bold ph-lg", + action: chooseFileFromDrive, + }, + { + text: i18n.ts.fromUrl, + icon: "ph-link-simple ph-bold ph-lg", + action: chooseFileFromUrl, + }, + ], + src, + ); + }); +} + +export function selectFile( + src: any, + label: string | null = null, +): Promise { + return select(src, label, false) as Promise; +} + +export function selectFiles( + src: any, + label: string | null = null, +): Promise { + return select(src, label, true) as Promise; +} diff --git a/fe_calckey/frontend/client/src/scripts/share-available.ts b/fe_calckey/frontend/client/src/scripts/share-available.ts new file mode 100644 index 0000000..8056d6d --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/share-available.ts @@ -0,0 +1,6 @@ +export function shareAvailable(): boolean { + if (navigator.share) { + return true; + } + return false; +} diff --git a/fe_calckey/frontend/client/src/scripts/shuffle.ts b/fe_calckey/frontend/client/src/scripts/shuffle.ts new file mode 100644 index 0000000..f174152 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/shuffle.ts @@ -0,0 +1,22 @@ +/** + * 配列をシャッフル (破壊的) + */ +export function shuffle(array: T): T { + let currentIndex = array.length; + let randomIndex; + + // While there remain elements to shuffle. + while (currentIndex !== 0) { + // Pick a remaining element. + randomIndex = Math.floor(Math.random() * currentIndex); + currentIndex--; + + // And swap it with the current element. + [array[currentIndex], array[randomIndex]] = [ + array[randomIndex], + array[currentIndex], + ]; + } + + return array; +} diff --git a/fe_calckey/frontend/client/src/scripts/sound.ts b/fe_calckey/frontend/client/src/scripts/sound.ts new file mode 100644 index 0000000..84388b8 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/sound.ts @@ -0,0 +1,38 @@ +import { ColdDeviceStorage } from "@/store"; + +const cache = new Map(); + +export function getAudio(file: string, useCache = true): HTMLAudioElement { + let audio: HTMLAudioElement; + if (useCache && cache.has(file)) { + audio = cache.get(file); + } else { + audio = new Audio(`/static-assets/sounds/${file}.mp3`); + if (useCache) cache.set(file, audio); + } + return audio; +} + +export function setVolume( + audio: HTMLAudioElement, + volume: number, +): HTMLAudioElement { + const masterVolume = ColdDeviceStorage.get("sound_masterVolume"); + audio.volume = masterVolume - (1 - volume) * masterVolume; + return audio; +} + +export function play(type: string) { + const sound = ColdDeviceStorage.get(`sound_${type}` as any); + if (sound.type == null) return; + playFile(sound.type, sound.volume); +} + +export function playFile(file: string, volume: number) { + const masterVolume = ColdDeviceStorage.get("sound_masterVolume"); + if (masterVolume === 0 || volume === 0 || file.toLowerCase().includes("none")) + return; + + const audio = setVolume(getAudio(file), volume); + audio.play(); +} diff --git a/fe_calckey/frontend/client/src/scripts/theme-editor.ts b/fe_calckey/frontend/client/src/scripts/theme-editor.ts new file mode 100644 index 0000000..4828410 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/theme-editor.ts @@ -0,0 +1,100 @@ +import { v4 as uuid } from "uuid"; + +import { themeProps, Theme } from "./theme"; + +export type Default = null; +export type Color = string; +export type FuncName = "alpha" | "darken" | "lighten"; +export type Func = { type: "func"; name: FuncName; arg: number; value: string }; +export type RefProp = { type: "refProp"; key: string }; +export type RefConst = { type: "refConst"; key: string }; +export type Css = { type: "css"; value: string }; + +export type ThemeValue = Color | Func | RefProp | RefConst | Css | Default; + +export type ThemeViewModel = [string, ThemeValue][]; + +export const fromThemeString = (str?: string): ThemeValue => { + if (!str) return null; + if (str.startsWith(":")) { + const parts = str.slice(1).split("<"); + const name = parts[0] as FuncName; + const arg = parseFloat(parts[1]); + const value = parts[2].startsWith("@") ? parts[2].slice(1) : ""; + return { type: "func", name, arg, value }; + } else if (str.startsWith("@")) { + return { + type: "refProp", + key: str.slice(1), + }; + } else if (str.startsWith("$")) { + return { + type: "refConst", + key: str.slice(1), + }; + } else if (str.startsWith('"')) { + return { + type: "css", + value: str.substr(1).trim(), + }; + } else { + return str; + } +}; + +export const toThemeString = ( + value: Color | Func | RefProp | RefConst | Css, +) => { + if (typeof value === "string") return value; + switch (value.type) { + case "func": + return `:${value.name}<${value.arg}<@${value.value}`; + case "refProp": + return `@${value.key}`; + case "refConst": + return `$${value.key}`; + case "css": + return `" ${value.value}`; + } +}; + +export const convertToMisskeyTheme = ( + vm: ThemeViewModel, + name: string, + desc: string, + author: string, + base: "dark" | "light", +): Theme => { + const props = {} as { [key: string]: string }; + for (const [key, value] of vm) { + if (value === null) continue; + props[key] = toThemeString(value); + } + + return { + id: uuid(), + name, + desc, + author, + props, + base, + }; +}; + +export const convertToViewModel = (theme: Theme): ThemeViewModel => { + const vm: ThemeViewModel = []; + // プロパティの登録 + vm.push( + ...themeProps.map( + (key) => [key, fromThemeString(theme.props[key])] as [string, ThemeValue], + ), + ); + + // 定数の登録 + const consts = Object.keys(theme.props) + .filter((k) => k.startsWith("$")) + .map((k) => [k, fromThemeString(theme.props[k])] as [string, ThemeValue]); + + vm.push(...consts); + return vm; +}; diff --git a/fe_calckey/frontend/client/src/scripts/theme.ts b/fe_calckey/frontend/client/src/scripts/theme.ts new file mode 100644 index 0000000..383deb3 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/theme.ts @@ -0,0 +1,172 @@ +import { ref } from "vue"; +import tinycolor from "tinycolor2"; +import { globalEvents } from "@/events"; + +export type Theme = { + id: string; + name: string; + author: string; + desc?: string; + base?: "dark" | "light"; + props: Record; +}; + +import lightTheme from "@/themes/_light.json5"; +import darkTheme from "@/themes/_dark.json5"; +import { deepClone } from "./clone"; + +export const themeProps = Object.keys(lightTheme.props).filter( + (key) => !key.startsWith("X"), +); + +export const getBuiltinThemes = () => + Promise.all( + [ + "l-rosepinedawn", + "l-light", + "l-nord", + "l-gruvbox", + "l-coffee", + "l-apricot", + "l-rainy", + "l-vivid", + "l-cherry", + "l-sushi", + "l-u0", + + "d-rosepine", + "d-rosepinemoon", + "d-dark", + "d-nord", + "d-gruvbox", + "d-catppuccin-frappe", + "d-catppuccin-mocha", + "d-persimmon", + "d-astro", + "d-future", + "d-botanical", + "d-green-lime", + "d-green-orange", + "d-cherry", + "d-ice", + "d-u0", + ].map((name) => + import(`../themes/${name}.json5`).then( + ({ default: _default }): Theme => _default, + ), + ), + ); + +export const getBuiltinThemesRef = () => { + const builtinThemes = ref([]); + getBuiltinThemes().then((themes) => (builtinThemes.value = themes)); + return builtinThemes; +}; + +let timeout = null; + +export function applyTheme(theme: Theme, persist = true) { + if (timeout) window.clearTimeout(timeout); + + document.documentElement.classList.add("_themeChanging_"); + + timeout = window.setTimeout(() => { + document.documentElement.classList.remove("_themeChanging_"); + }, 1000); + + const colorSchema = theme.base === "dark" ? "dark" : "light"; + + // Deep copy + const _theme = deepClone(theme); + + if (_theme.base) { + const base = [lightTheme, darkTheme].find((x) => x.id === _theme.base); + if (base) _theme.props = Object.assign({}, base.props, _theme.props); + } + + const props = compile(_theme); + + for (const tag of document.head.children) { + if (tag.tagName === "META" && tag.getAttribute("name") === "theme-color") { + tag.setAttribute("content", props["htmlThemeColor"]); + break; + } + } + + for (const [k, v] of Object.entries(props)) { + document.documentElement.style.setProperty(`--${k}`, v.toString()); + } + + document.documentElement.style.setProperty("color-schema", colorSchema); + + if (persist) { + localStorage.setItem("theme", JSON.stringify(props)); + localStorage.setItem("colorSchema", colorSchema); + } + + // Site-wide notification that the theme has changed + globalEvents.emit("themeChanged"); +} + +function compile(theme: Theme): Record { + function getColor(val: string): tinycolor.Instance { + // ref (prop) + if (val[0] === "@") { + return getColor(theme.props[val.substr(1)]); + } + + // ref (const) + else if (val[0] === "$") { + return getColor(theme.props[val]); + } + + // func + else if (val[0] === ":") { + const parts = val.split("<"); + const func = parts.shift().substr(1); + const arg = parseFloat(parts.shift()); + const color = getColor(parts.join("<")); + + switch (func) { + case "darken": + return color.darken(arg); + case "lighten": + return color.lighten(arg); + case "alpha": + return color.setAlpha(arg); + case "hue": + return color.spin(arg); + case "saturate": + return color.saturate(arg); + } + } + + // other case + return tinycolor(val); + } + + const props = {}; + + for (const [k, v] of Object.entries(theme.props)) { + if (k.startsWith("$")) continue; // ignore const + + props[k] = v.startsWith('"') + ? v.replace(/^"\s*/, "") + : genValue(getColor(v)); + } + + return props; +} + +function genValue(c: tinycolor.Instance): string { + return c.toRgbString(); +} + +export function validateTheme(theme: Record): boolean { + if (theme.id == null || typeof theme.id !== "string") return false; + if (theme.name == null || typeof theme.name !== "string") return false; + if (theme.base == null || !["light", "dark"].includes(theme.base)) + return false; + if (theme.props == null || typeof theme.props !== "object") return false; + return true; +} diff --git a/fe_calckey/frontend/client/src/scripts/time.ts b/fe_calckey/frontend/client/src/scripts/time.ts new file mode 100644 index 0000000..ddaa493 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/time.ts @@ -0,0 +1,54 @@ +const dateTimeIntervals = { + day: 86400000, + hour: 3600000, + ms: 1, +}; + +export function dateUTC(time: number[]): Date { + const d = + time.length === 2 + ? Date.UTC(time[0], time[1]) + : time.length === 3 + ? Date.UTC(time[0], time[1], time[2]) + : time.length === 4 + ? Date.UTC(time[0], time[1], time[2], time[3]) + : time.length === 5 + ? Date.UTC(time[0], time[1], time[2], time[3], time[4]) + : time.length === 6 + ? Date.UTC(time[0], time[1], time[2], time[3], time[4], time[5]) + : time.length === 7 + ? Date.UTC(time[0], time[1], time[2], time[3], time[4], time[5], time[6]) + : null; + + if (!d) throw "wrong number of arguments"; + + return new Date(d); +} + +export function isTimeSame(a: Date, b: Date): boolean { + return a.getTime() === b.getTime(); +} + +export function isTimeBefore(a: Date, b: Date): boolean { + return a.getTime() - b.getTime() < 0; +} + +export function isTimeAfter(a: Date, b: Date): boolean { + return a.getTime() - b.getTime() > 0; +} + +export function addTime( + x: Date, + value: number, + span: keyof typeof dateTimeIntervals = "ms", +): Date { + return new Date(x.getTime() + value * dateTimeIntervals[span]); +} + +export function subtractTime( + x: Date, + value: number, + span: keyof typeof dateTimeIntervals = "ms", +): Date { + return new Date(x.getTime() - value * dateTimeIntervals[span]); +} diff --git a/fe_calckey/frontend/client/src/scripts/timezones.ts b/fe_calckey/frontend/client/src/scripts/timezones.ts new file mode 100644 index 0000000..cdabd11 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/timezones.ts @@ -0,0 +1,62 @@ +export const timezones = [ + { + name: "UTC", + abbrev: "UTC", + offset: 0, + }, + { + name: "Europe/Berlin", + abbrev: "CET", + offset: 60, + }, + { + name: "Asia/Tokyo", + abbrev: "JST", + offset: 540, + }, + { + name: "Asia/Seoul", + abbrev: "KST", + offset: 540, + }, + { + name: "Asia/Shanghai", + abbrev: "CST", + offset: 480, + }, + { + name: "Australia/Sydney", + abbrev: "AEST", + offset: 600, + }, + { + name: "Australia/Darwin", + abbrev: "ACST", + offset: 570, + }, + { + name: "Australia/Perth", + abbrev: "AWST", + offset: 480, + }, + { + name: "America/New_York", + abbrev: "EST", + offset: -300, + }, + { + name: "America/Mexico_City", + abbrev: "CST", + offset: -360, + }, + { + name: "America/Phoenix", + abbrev: "MST", + offset: -420, + }, + { + name: "America/Los_Angeles", + abbrev: "PST", + offset: -480, + }, +]; diff --git a/fe_calckey/frontend/client/src/scripts/touch.ts b/fe_calckey/frontend/client/src/scripts/touch.ts new file mode 100644 index 0000000..9150e42 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/touch.ts @@ -0,0 +1,32 @@ +const isTouchSupported = + "maxTouchPoints" in navigator && navigator.maxTouchPoints > 0; + +export let isTouchUsing = false; + +export let isScreenTouching = false; + +if (isTouchSupported) { + window.addEventListener( + "touchstart", + () => { + // maxTouchPointsなどでの判定だけだと、「タッチ機能付きディスプレイを使っているがマウスでしか操作しない」場合にも + // タッチで使っていると判定されてしまうため、実際に一度でもタッチされたらtrueにする + isTouchUsing = true; + + isScreenTouching = true; + }, + { passive: true }, + ); + + window.addEventListener( + "touchend", + () => { + // 子要素のtouchstartイベントでstopPropagation()が呼ばれると親要素に伝搬されずタッチされたと判定されないため、 + // touchendイベントでもtouchstartイベントと同様にtrueにする + isTouchUsing = true; + + isScreenTouching = false; + }, + { passive: true }, + ); +} diff --git a/fe_calckey/frontend/client/src/scripts/twemoji-base.ts b/fe_calckey/frontend/client/src/scripts/twemoji-base.ts new file mode 100644 index 0000000..0e45a52 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/twemoji-base.ts @@ -0,0 +1,12 @@ +export const twemojiSvgBase = "/twemoji"; + +export function char2fileName(char: string): string { + let codes = Array.from(char).map((x) => x.codePointAt(0)?.toString(16)); + if (!codes.includes("200d")) codes = codes.filter((x) => x !== "fe0f"); + codes = codes.filter((x) => x?.length); + return codes.join("-"); +} + +export function char2filePath(char: string): string { + return `${twemojiSvgBase}/${char2fileName(char)}.svg`; +} diff --git a/fe_calckey/frontend/client/src/scripts/unison-reload.ts b/fe_calckey/frontend/client/src/scripts/unison-reload.ts new file mode 100644 index 0000000..4ba35c5 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/unison-reload.ts @@ -0,0 +1,15 @@ +// SafariがBroadcastChannel未実装なのでライブラリを使う +import { BroadcastChannel } from "broadcast-channel"; + +export const reloadChannel = new BroadcastChannel("reload"); + +// BroadcastChannelを用いて、クライアントが一斉にreloadするようにします。 +export function unisonReload(path?: string) { + if (path !== undefined) { + reloadChannel.postMessage(path); + location.href = path; + } else { + reloadChannel.postMessage(null); + location.reload(); + } +} diff --git a/fe_calckey/frontend/client/src/scripts/upload.ts b/fe_calckey/frontend/client/src/scripts/upload.ts new file mode 100644 index 0000000..fa0cb5b --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/upload.ts @@ -0,0 +1,158 @@ +import { reactive, ref } from "vue"; +import * as Misskey from "calckey-js"; +import { readAndCompressImage } from "browser-image-resizer"; +import { defaultStore } from "@/store"; +import { apiUrl } from "@/config"; +import { $i } from "@/account"; +import { alert } from "@/os"; +import { i18n } from "@/i18n"; + +type Uploading = { + id: string; + name: string; + progressMax: number | undefined; + progressValue: number | undefined; + img: string; +}; +export const uploads = ref([]); + +const compressTypeMap = { + "image/jpeg": { quality: 0.85, mimeType: "image/jpeg" }, + "image/webp": { quality: 0.85, mimeType: "image/png" }, + "image/svg+xml": { quality: 1, mimeType: "image/png" }, +} as const; + +const mimeTypeMap = { + "image/webp": "webp", + "image/jpeg": "jpg", + "image/png": "png", + "image/avif": "avif", +} as const; + +export function uploadFile( + file: File, + folder?: any, + name?: string, + keepOriginal: boolean = defaultStore.state.keepOriginalUploading, +): Promise { + if (folder && typeof folder === "object") folder = folder.id; + + return new Promise((resolve, reject) => { + const id = Math.random().toString(); + + const reader = new FileReader(); + reader.onload = async (ev) => { + const ctx = reactive({ + id: id, + name: name || file.name || "untitled", + progressMax: undefined, + progressValue: undefined, + img: window.URL.createObjectURL(file), + }); + + uploads.value.push(ctx); + + let resizedImage: any; + if (!keepOriginal && file.type in compressTypeMap) { + const imgConfig = compressTypeMap[file.type]; + + const config = { + maxWidth: 2048, + maxHeight: 2048, + debug: true, + ...imgConfig, + }; + + try { + resizedImage = await readAndCompressImage(file, config); + ctx.name = + file.type !== imgConfig.mimeType + ? `${ctx.name}.${ + mimeTypeMap[compressTypeMap[file.type].mimeType] + }` + : ctx.name; + } catch (err) { + console.error("Failed to resize image", err); + } + } + + const formData = new FormData(); + formData.append("force", "true"); + formData.append("file", resizedImage || file); + formData.append("name", ctx.name); + if (folder) formData.append("folderId", folder); + + const xhr = new XMLHttpRequest(); + xhr.open("POST", `${apiUrl}/drive/files/create`, true); + xhr.setRequestHeader("Authorization", `Bearer ${$i.token}`); + xhr.onload = (ev) => { + if ( + xhr.status !== 200 || + ev.target == null || + ev.target.response == null + ) { + // TODO: 消すのではなくて(ネットワーク的なエラーなら)再送できるようにしたい + uploads.value = uploads.value.filter((x) => x.id !== id); + + if (xhr.status === 413) { + alert({ + type: "error", + title: i18n.ts.failedToUpload, + text: i18n.ts.cannotUploadBecauseExceedsFileSizeLimit, + }); + } else if (ev.target?.response) { + const res = JSON.parse(ev.target.response); + if (res.error?.id === "bec5bd69-fba3-43c9-b4fb-2894b66ad5d2") { + alert({ + type: "error", + title: i18n.ts.failedToUpload, + text: i18n.ts.cannotUploadBecauseInappropriate, + }); + } else if ( + res.error?.id === "d08dbc37-a6a9-463a-8c47-96c32ab5f064" + ) { + alert({ + type: "error", + title: i18n.ts.failedToUpload, + text: i18n.ts.cannotUploadBecauseNoFreeSpace, + }); + } else { + alert({ + type: "error", + title: i18n.ts.failedToUpload, + text: `${res.error?.message}\n${res.error?.code}\n${res.error?.id}`, + }); + } + } else { + alert({ + type: "error", + title: "Failed to upload", + text: `${JSON.stringify(ev.target?.response)}, ${JSON.stringify( + xhr.response, + )}`, + }); + } + + reject(); + return; + } + + const driveFile = JSON.parse(ev.target.response); + + resolve(driveFile); + + uploads.value = uploads.value.filter((x) => x.id !== id); + }; + + xhr.upload.onprogress = (ev) => { + if (ev.lengthComputable) { + ctx.progressMax = ev.total; + ctx.progressValue = ev.loaded; + } + }; + + xhr.send(formData); + }; + reader.readAsArrayBuffer(file); + }); +} diff --git a/fe_calckey/frontend/client/src/scripts/url.ts b/fe_calckey/frontend/client/src/scripts/url.ts new file mode 100644 index 0000000..21af465 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/url.ts @@ -0,0 +1,15 @@ +export function query(obj: Record): string { + const params = Object.entries(obj) + .filter(([, v]) => (Array.isArray(v) ? v.length : v !== undefined)) + .reduce((a, [k, v]) => ((a[k] = v), a), {} as Record); + + return Object.entries(params) + .map((p) => `${p[0]}=${encodeURIComponent(p[1])}`) + .join("&"); +} + +export function appendQuery(url: string, query: string): string { + return `${url}${ + /\?/.test(url) ? (url.endsWith("?") ? "" : "&") : "?" + }${query}`; +} diff --git a/fe_calckey/frontend/client/src/scripts/use-chart-tooltip.ts b/fe_calckey/frontend/client/src/scripts/use-chart-tooltip.ts new file mode 100644 index 0000000..13ed0e5 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/use-chart-tooltip.ts @@ -0,0 +1,64 @@ +import { onUnmounted, onDeactivated, ref } from "vue"; +import * as os from "@/os"; +import MkChartTooltip from "@/components/MkChartTooltip.vue"; + +export function useChartTooltip( + opts: { position: "top" | "middle" } = { position: "top" }, +) { + const tooltipShowing = ref(false); + const tooltipX = ref(0); + const tooltipY = ref(0); + const tooltipTitle = ref(null); + const tooltipSeries = ref(null); + let disposeTooltipComponent; + + os.popup( + MkChartTooltip, + { + showing: tooltipShowing, + x: tooltipX, + y: tooltipY, + title: tooltipTitle, + series: tooltipSeries, + }, + {}, + ).then(({ dispose }) => { + disposeTooltipComponent = dispose; + }); + + onUnmounted(() => { + if (disposeTooltipComponent) disposeTooltipComponent(); + }); + + onDeactivated(() => { + tooltipShowing.value = false; + }); + + function handler(context) { + if (context.tooltip.opacity === 0) { + tooltipShowing.value = false; + return; + } + + tooltipTitle.value = context.tooltip.title[0]; + tooltipSeries.value = context.tooltip.body.map((b, i) => ({ + backgroundColor: context.tooltip.labelColors[i].backgroundColor, + borderColor: context.tooltip.labelColors[i].borderColor, + text: b.lines[0], + })); + + const rect = context.chart.canvas.getBoundingClientRect(); + + tooltipShowing.value = true; + tooltipX.value = rect.left + window.pageXOffset + context.tooltip.caretX; + if (opts.position === "top") { + tooltipY.value = rect.top + window.pageYOffset; + } else if (opts.position === "middle") { + tooltipY.value = rect.top + window.pageYOffset + context.tooltip.caretY; + } + } + + return { + handler, + }; +} diff --git a/fe_calckey/frontend/client/src/scripts/use-interval.ts b/fe_calckey/frontend/client/src/scripts/use-interval.ts new file mode 100644 index 0000000..286c7ff --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/use-interval.ts @@ -0,0 +1,28 @@ +import { onMounted, onUnmounted } from "vue"; + +export function useInterval( + fn: () => void, + interval: number, + options: { + immediate: boolean; + afterMounted: boolean; + }, +): void { + if (Number.isNaN(interval)) return; + + let intervalId: number | null = null; + + if (options.afterMounted) { + onMounted(() => { + if (options.immediate) fn(); + intervalId = window.setInterval(fn, interval); + }); + } else { + if (options.immediate) fn(); + intervalId = window.setInterval(fn, interval); + } + + onUnmounted(() => { + if (intervalId) window.clearInterval(intervalId); + }); +} diff --git a/fe_calckey/frontend/client/src/scripts/use-leave-guard.ts b/fe_calckey/frontend/client/src/scripts/use-leave-guard.ts new file mode 100644 index 0000000..2a7d677 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/use-leave-guard.ts @@ -0,0 +1,46 @@ +import { inject, onUnmounted, Ref } from "vue"; +import { i18n } from "@/i18n"; +import * as os from "@/os"; + +export function useLeaveGuard(enabled: Ref) { + /* TODO + const setLeaveGuard = inject('setLeaveGuard'); + + if (setLeaveGuard) { + setLeaveGuard(async () => { + if (!enabled.value) return false; + + const { canceled } = await os.confirm({ + type: 'warning', + text: i18n.ts.leaveConfirm, + }); + + return canceled; + }); + } else { + onBeforeRouteLeave(async (to, from) => { + if (!enabled.value) return true; + + const { canceled } = await os.confirm({ + type: 'warning', + text: i18n.ts.leaveConfirm, + }); + + return !canceled; + }); + } + */ + /* + function onBeforeLeave(ev: BeforeUnloadEvent) { + if (enabled.value) { + ev.preventDefault(); + ev.returnValue = ''; + } + } + + window.addEventListener('beforeunload', onBeforeLeave); + onUnmounted(() => { + window.removeEventListener('beforeunload', onBeforeLeave); + }); + */ +} diff --git a/fe_calckey/frontend/client/src/scripts/use-note-capture.ts b/fe_calckey/frontend/client/src/scripts/use-note-capture.ts new file mode 100644 index 0000000..5d0ca55 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/use-note-capture.ts @@ -0,0 +1,132 @@ +import { onUnmounted, Ref } from "vue"; +import * as misskey from "calckey-js"; +import { stream } from "@/stream"; +import { $i } from "@/account"; +import * as os from "@/os"; + +export function useNoteCapture(props: { + rootEl: Ref; + note: Ref; + isDeletedRef: Ref; +}) { + const note = props.note; + const connection = $i ? stream : null; + + async function onStreamNoteUpdated(noteData): Promise { + const { type, id, body } = noteData; + + if (id !== note.value.id) return; + + switch (type) { + case "reacted": { + const reaction = body.reaction; + + if (body.emoji) { + const emojis = note.value.emojis || []; + if (!emojis.includes(body.emoji)) { + note.value.emojis = [...emojis, body.emoji]; + } + } + + // TODO: reactionsプロパティがない場合ってあったっけ? なければ || {} は消せる + const currentCount = note.value.reactions?.[reaction] || 0; + + note.value.reactions[reaction] = currentCount + 1; + + if ($i && body.userId === $i.id) { + note.value.myReaction = reaction; + } + break; + } + + case "unreacted": { + const reaction = body.reaction; + + // TODO: reactionsプロパティがない場合ってあったっけ? なければ || {} は消せる + const currentCount = note.value.reactions?.[reaction] || 0; + + note.value.reactions[reaction] = Math.max(0, currentCount - 1); + + if ($i && body.userId === $i.id) { + note.value.myReaction = undefined; + } + break; + } + + case "pollVoted": { + const choice = body.choice; + + if (note.value.poll) { + const choices = [...note.value.poll.choices]; + choices[choice] = { + ...choices[choice], + votes: choices[choice].votes + 1, + ...($i && body.userId === $i.id + ? { + isVoted: true, + } + : {}), + }; + note.value.poll.choices = choices; + } + + break; + } + + case "deleted": { + props.isDeletedRef.value = true; + break; + } + + case "updated": { + const editedNote = await os.api("notes/show", { + noteId: id, + }); + + const keys = new Set(); + Object.keys(editedNote) + .concat(Object.keys(note.value)) + .forEach((key) => keys.add(key)); + keys.forEach((key) => { + note.value[key] = editedNote[key]; + }); + break; + } + } + } + + function capture(withHandler = false): void { + if (connection) { + // TODO: このノートがストリーミング経由で流れてきた場合のみ sr する + connection.send(document.body.contains(props.rootEl.value) ? "sr" : "s", { + id: note.value.id, + }); + if (withHandler) connection.on("noteUpdated", onStreamNoteUpdated); + } + } + + function decapture(withHandler = false): void { + if (connection) { + connection.send("un", { + id: note.value.id, + }); + if (withHandler) connection.off("noteUpdated", onStreamNoteUpdated); + } + } + + function onStreamConnected() { + capture(false); + } + + capture(true); + if (connection) { + connection.on("_connected_", onStreamConnected); + } + + onUnmounted(() => { + decapture(true); + if (connection) { + connection.off("_connected_", onStreamConnected); + } + }); +} diff --git a/fe_calckey/frontend/client/src/scripts/use-tooltip.ts b/fe_calckey/frontend/client/src/scripts/use-tooltip.ts new file mode 100644 index 0000000..a5e5ed7 --- /dev/null +++ b/fe_calckey/frontend/client/src/scripts/use-tooltip.ts @@ -0,0 +1,91 @@ +import { Ref, ref, watch, onUnmounted } from "vue"; + +export function useTooltip( + elRef: Ref, + onShow: (showing: Ref) => void, + delay = 300, +): void { + let isHovering = false; + + // iOS(Androidも?)では、要素をタップした直後に(おせっかいで)mouseoverイベントを発火させたりするため、それを無視するためのフラグ + // 無視しないと、画面に触れてないのにツールチップが出たりし、ユーザビリティが損なわれる + // TODO: 一度でもタップすると二度とマウスでツールチップ出せなくなるのをどうにかする 定期的にfalseに戻すとか...? + let shouldIgnoreMouseover = false; + + let timeoutId: number; + + let changeShowingState: (() => void) | null; + + const open = () => { + close(); + if (!isHovering) return; + if (elRef.value == null) return; + const el = elRef.value instanceof Element ? elRef.value : elRef.value.$el; + if (!document.body.contains(el)) return; // openしようとしたときに既に元要素がDOMから消えている場合があるため + + const showing = ref(true); + onShow(showing); + changeShowingState = () => { + showing.value = false; + }; + }; + + const close = () => { + if (changeShowingState != null) { + changeShowingState(); + changeShowingState = null; + } + }; + + const onMouseover = () => { + if (isHovering) return; + if (shouldIgnoreMouseover) return; + isHovering = true; + timeoutId = window.setTimeout(open, delay); + }; + + const onMouseleave = () => { + if (!isHovering) return; + isHovering = false; + window.clearTimeout(timeoutId); + close(); + }; + + const onTouchstart = () => { + shouldIgnoreMouseover = true; + if (isHovering) return; + isHovering = true; + timeoutId = window.setTimeout(open, delay); + }; + + const onTouchend = () => { + if (!isHovering) return; + isHovering = false; + window.clearTimeout(timeoutId); + close(); + }; + + const stop = watch( + elRef, + () => { + if (elRef.value) { + stop(); + const el = + elRef.value instanceof Element ? elRef.value : elRef.value.$el; + el.addEventListener("mouseover", onMouseover, { passive: true }); + el.addEventListener("mouseleave", onMouseleave, { passive: true }); + el.addEventListener("touchstart", onTouchstart, { passive: true }); + el.addEventListener("touchend", onTouchend, { passive: true }); + el.addEventListener("click", close, { passive: true }); + } + }, + { + immediate: true, + flush: "post", + }, + ); + + onUnmounted(() => { + close(); + }); +} diff --git a/fe_calckey/frontend/client/src/store.ts b/fe_calckey/frontend/client/src/store.ts new file mode 100644 index 0000000..20369bd --- /dev/null +++ b/fe_calckey/frontend/client/src/store.ts @@ -0,0 +1,454 @@ +import { markRaw, ref } from "vue"; +import { Storage } from "./pizzax"; +import { Theme } from "./scripts/theme"; + +export const postFormActions = []; +export const userActions = []; +export const noteActions = []; +export const noteViewInterruptors = []; +export const notePostInterruptors = []; + +const menuOptions = [ + "notifications", + "followRequests", + "explore", + "favorites", + "channels", + "search", +]; + +// TODO: それぞれいちいちwhereとかdefaultというキーを付けなきゃいけないの冗長なのでなんとかする(ただ型定義が面倒になりそう) +// あと、現行の定義の仕方なら「whereが何であるかに関わらずキー名の重複不可」という制約を付けられるメリットもあるからそのメリットを引き継ぐ方法も考えないといけない +export const defaultStore = markRaw( + new Storage("base", { + tutorial: { + where: "account", + default: 0, + }, + tlHomeHintClosed: { + where: "device", + default: false, + }, + tlLocalHintClosed: { + where: "device", + default: false, + }, + tlRecommendedHintClosed: { + where: "device", + default: false, + }, + tlSocialHintClosed: { + where: "device", + default: false, + }, + tlGlobalHintClosed: { + where: "device", + default: false, + }, + keepCw: { + where: "account", + default: true, + }, + showFullAcct: { + where: "account", + default: false, + }, + rememberNoteVisibility: { + where: "account", + default: false, + }, + defaultNoteVisibility: { + where: "account", + default: "public", + }, + defaultNoteLocalOnly: { + where: "account", + default: false, + }, + uploadFolder: { + where: "account", + default: null as string | null, + }, + pastedFileName: { + where: "account", + default: "yyyy-MM-dd HH-mm-ss [{{number}}]", + }, + keepOriginalUploading: { + where: "account", + default: false, + }, + memo: { + where: "account", + default: null, + }, + reactions: { + where: "account", + default: [ + "⭐", + "❤️", + "😆", + "🤔", + "😮", + "🎉", + "💢", + "😥", + "😇", + "🥴", + "🍮", + ], + }, + mutedWords: { + where: "account", + default: [], + }, + mutedAds: { + where: "account", + default: [] as string[], + }, + showAds: { + where: "account", + default: true, + }, + menu: { + where: "deviceAccount", + default: menuOptions, + }, + visibility: { + where: "deviceAccount", + default: "public" as "public" | "home" | "followers" | "specified", + }, + localOnly: { + where: "deviceAccount", + default: false, + }, + statusbars: { + where: "deviceAccount", + default: [] as { + name: string; + id: string; + type: string; + size: "verySmall" | "small" | "medium" | "large" | "veryLarge"; + black: boolean; + props: Record; + }[], + }, + widgets: { + where: "deviceAccount", + default: [] as { + name: string; + id: string; + place: string | null; + data: Record; + }[], + }, + tl: { + where: "deviceAccount", + default: { + src: "home" as "home" | "local" | "social" | "global", + arg: null, + }, + }, + + overridedDeviceKind: { + where: "device", + default: null as null | "smartphone" | "tablet" | "desktop", + }, + serverDisconnectedBehavior: { + where: "device", + default: "nothing" as "nothing" | "quiet" | "reload" | "dialog", + }, + seperateRenoteQuote: { + where: "device", + default: true, + }, + expandOnNoteClick: { + where: "device", + default: true, + }, + nsfw: { + where: "device", + default: "respect" as "respect" | "force" | "ignore", + }, + animation: { + where: "device", + default: true, + }, + advancedMfm: { + where: "device", + default: true, + }, + animatedMfm: { + where: "device", + default: true, + }, + animatedMfmWarnShown: { + where: "device", + default: false, + }, + loadRawImages: { + where: "device", + default: false, + }, + imageNewTab: { + where: "device", + default: false, + }, + disableShowingAnimatedImages: { + where: "device", + default: false, + }, + disablePagesScript: { + where: "device", + default: false, + }, + useOsNativeEmojis: { + where: "device", + default: false, + }, + disableDrawer: { + where: "device", + default: false, + }, + useBlurEffectForModal: { + where: "device", + default: true, + }, + useBlurEffect: { + where: "device", + default: true, + }, + showFixedPostForm: { + where: "device", + default: false, + }, + enableInfiniteScroll: { + where: "device", + default: true, + }, + useReactionPickerForContextMenu: { + where: "device", + default: false, + }, + showGapBetweenNotesInTimeline: { + where: "device", + default: true, + }, + darkMode: { + where: "device", + default: false, + }, + instanceTicker: { + where: "device", + default: "remote" as "none" | "remote" | "always", + }, + reactionPickerSkinTone: { + where: "account", + default: 1, + }, + reactionPickerSize: { + where: "device", + default: 3, + }, + reactionPickerWidth: { + where: "device", + default: 3, + }, + reactionPickerHeight: { + where: "device", + default: 3, + }, + reactionPickerUseDrawerForMobile: { + where: "device", + default: true, + }, + recentlyUsedEmojis: { + where: "device", + default: [] as string[], + }, + recentlyUsedUsers: { + where: "device", + default: [] as string[], + }, + defaultSideView: { + where: "device", + default: false, + }, + menuDisplay: { + where: "device", + default: "sideFull" as "sideFull" | "sideIcon" | "top", + }, + reportError: { + where: "device", + default: false, + }, + squareAvatars: { + where: "device", + default: true, + }, + postFormWithHashtags: { + where: "device", + default: false, + }, + postFormHashtags: { + where: "device", + default: "", + }, + themeInitial: { + where: "device", + default: true, + }, + numberOfPageCache: { + where: "device", + default: 5, + }, + enterSendsMessage: { + where: "device", + default: true, + }, + showUpdates: { + where: "device", + default: true, + }, + swipeOnDesktop: { + where: "device", + default: false, + }, + showAdminUpdates: { + where: "account", + default: true, + }, + woozyMode: { + where: "device", + default: false, + }, + enableCustomKaTeXMacro: { + where: "device", + default: false, + }, + enableEmojiReactions: { + where: "account", + default: true, + }, + showEmojisInReactionNotifications: { + where: "account", + default: true, + }, + showTimelineReplies: { + where: "device", + default: true, + }, + }), +); + +// TODO: 他のタブと永続化されたstateを同期 + +const PREFIX = "miux:"; + +type Plugin = { + id: string; + name: string; + active: boolean; + configData: Record; + token: string; + ast: any[]; +}; + +/** + * 常にメモリにロードしておく必要がないような設定情報を保管するストレージ(非リアクティブ) + */ +import lightTheme from "@/themes/l-rosepinedawn.json5"; +import darkTheme from "@/themes/d-rosepine.json5"; + +export class ColdDeviceStorage { + public static default = { + lightTheme, + darkTheme, + syncDeviceDarkMode: true, + plugins: [] as Plugin[], + mediaVolume: 0.5, + sound_masterVolume: 0.3, + sound_note: { type: "none", volume: 0 }, + sound_noteMy: { type: "syuilo/up", volume: 1 }, + sound_notification: { type: "syuilo/pope2", volume: 1 }, + sound_chat: { type: "syuilo/pope1", volume: 1 }, + sound_chatBg: { type: "syuilo/waon", volume: 1 }, + sound_antenna: { type: "syuilo/triple", volume: 1 }, + sound_channel: { type: "syuilo/square-pico", volume: 1 }, + }; + + public static watchers = []; + + public static get( + key: T, + ): typeof ColdDeviceStorage.default[T] { + // TODO: indexedDBにする + // ただしその際はnullチェックではなくキー存在チェックにしないとダメ + // (indexedDBはnullを保存できるため、ユーザーが意図してnullを格納した可能性がある) + const value = localStorage.getItem(PREFIX + key); + if (value == null) { + return ColdDeviceStorage.default[key]; + } else { + return JSON.parse(value); + } + } + + public static set( + key: T, + value: typeof ColdDeviceStorage.default[T], + ): void { + // 呼び出し側のバグ等で undefined が来ることがある + // undefined を文字列として localStorage に入れると参照する際の JSON.parse でコケて不具合の元になるため無視 + if (value === undefined) { + console.error(`attempt to store undefined value for key '${key}'`); + return; + } + + localStorage.setItem(PREFIX + key, JSON.stringify(value)); + + for (const watcher of this.watchers) { + if (watcher.key === key) watcher.callback(value); + } + } + + public static watch(key, callback) { + this.watchers.push({ key, callback }); + } + + // TODO: VueのcustomRef使うと良い感じになるかも + public static ref(key: T) { + const v = ColdDeviceStorage.get(key); + const r = ref(v); + // TODO: このままではwatcherがリークするので開放する方法を考える + this.watch(key, (v) => { + r.value = v; + }); + return r; + } + + /** + * 特定のキーの、簡易的なgetter/setterを作ります + * 主にvue場で設定コントロールのmodelとして使う用 + */ + public static makeGetterSetter< + K extends keyof typeof ColdDeviceStorage.default, + >(key: K) { + // TODO: VueのcustomRef使うと良い感じになるかも + const valueRef = ColdDeviceStorage.ref(key); + return { + get: () => { + return valueRef.value; + }, + set: (value: unknown) => { + const val = value; + ColdDeviceStorage.set(key, val); + }, + }; + } +} + +// このファイルに書きたくないけどここに書かないと何故かVeturが認識しない +declare module "@vue/runtime-core" { + interface ComponentCustomProperties { + $store: typeof defaultStore; + } +} diff --git a/fe_calckey/frontend/client/src/stream.ts b/fe_calckey/frontend/client/src/stream.ts new file mode 100644 index 0000000..70e8602 --- /dev/null +++ b/fe_calckey/frontend/client/src/stream.ts @@ -0,0 +1,24 @@ +import * as Misskey from "calckey-js"; +import { markRaw } from "vue"; +import { $i } from "@/account"; +import { url } from "@/config"; + +export const stream = markRaw( + new Misskey.Stream( + url, + $i + ? { + token: $i.token, + } + : null, + ), +); + +window.setTimeout(heartbeat, 1000 * 60); + +function heartbeat(): void { + if (stream != null && document.visibilityState === "visible") { + stream.send("ping"); + } + window.setTimeout(heartbeat, 1000 * 60); +} diff --git a/fe_calckey/frontend/client/src/style.scss b/fe_calckey/frontend/client/src/style.scss new file mode 100644 index 0000000..3297592 --- /dev/null +++ b/fe_calckey/frontend/client/src/style.scss @@ -0,0 +1,858 @@ +@charset "utf-8"; + +:root { + --radius: 12px; + --marginFull: 16px; + --marginHalf: 10px; + --avatarSize: 48px; + + --margin: var(--marginFull); + + @media (max-width: 500px) { + --margin: var(--marginHalf); + } + + // https://larsenwork.com/easing-gradients/ + --gradient: hsl(0, 0%, 0%) 0%, + hsla(0, 0%, 0%, 0.987) 8.1%, + hsla(0, 0%, 0%, 0.951) 15.5%, + hsla(0, 0%, 0%, 0.896) 22.5%, + hsla(0, 0%, 0%, 0.825) 29%, + hsla(0, 0%, 0%, 0.741) 35.3%, + hsla(0, 0%, 0%, 0.648) 41.2%, + hsla(0, 0%, 0%, 0.55) 47.1%, + hsla(0, 0%, 0%, 0.45) 52.9%, + hsla(0, 0%, 0%, 0.352) 58.8%, + hsla(0, 0%, 0%, 0.259) 64.7%, + hsla(0, 0%, 0%, 0.175) 71%, + hsla(0, 0%, 0%, 0.104) 77.5%, + hsla(0, 0%, 0%, 0.049) 84.5%, + hsla(0, 0%, 0%, 0.013) 91.9%, + hsla(0, 0%, 0%, 0) 100%; + + //--ad: rgb(255 169 0 / 10%); +} + +::selection { + color: #fff; + background-color: var(--accent); +} + +html { + touch-action: manipulation; + background-attachment: fixed; + background-size: cover; + background-position: center; + color: var(--fg); + accent-color: var(--accent); + overflow: auto; + overflow-wrap: break-word; + font-family: "BIZ UDGothic", Roboto, HelveticaNeue, Arial, sans-serif; + font-size: 14px; + line-height: 1.6; + text-size-adjust: 100%; + tab-size: 2; + scroll-padding: 60px; + overflow-x: clip; + + &.useSystemFont { + font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; + } +} +body::-webkit-scrollbar { + width: 12px; + height: 12px; +} +body::-webkit-scrollbar-thumb { + border-radius: 100px; + background-clip: content-box; + border: 3px solid transparent; +} +::-webkit-scrollbar { + width: 6px; + height: 6px; +} +::-webkit-scrollbar-track { + background: inherit; +} +::-webkit-scrollbar-thumb { + background: var(--scrollbarHandle); + min-height: 80px; + + &:hover { + background: var(--scrollbarHandleHover); + background-clip: content-box; + } + + &:active { + background: var(--accent); + background-clip: content-box; + } +} + +.hide-scrollbar { + scrollbar-width: none; + &::-webkit-scrollbar { + display: none; + } +} + +html._themeChanging_ { + &, *, ::before, ::after { + transition: background 1s ease, border 1s ease !important; + } +} + +html, body { + margin: 0; + padding: 0; +} + +.swiper { + margin-inline: -24px !important; + padding-inline: 24px !important; + mask: linear-gradient(to right, transparent, black 24px calc(100% - 24px), transparent); + -webkit-mask: linear-gradient(to right, transparent, black 24px calc(100% - 24px), transparent); +} +.swiper-slide { + min-height: 100vh; +} + +a { + text-decoration: none; + cursor: pointer; + color: inherit; + -webkit-tap-highlight-color: transparent; +} + +// i { +// transform: translateY(0.1em); +// } + +textarea, input { + -webkit-tap-highlight-color: transparent; +} + +optgroup, option { + background: var(--panel); + color: var(--fg); +} + +hr { + margin: var(--margin) 0 var(--margin) 0; + border: none; + height: 1px; + background: var(--divider); +} + +.fa-pulse { + animation: spin 1s infinite; +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +._noSelect { + user-select: none; + -webkit-user-select: none; + -webkit-touch-callout: none; +} + +._ghost { + &, * { + @extend ._noSelect; + pointer-events: none; + } +} + +._modalBg { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: var(--modalBg); + -webkit-backdrop-filter: var(--modalBgFilter); + backdrop-filter: var(--modalBgFilter); +} + +._shadow { + box-shadow: 0px 4px 32px var(--shadow) !important; +} + +.swiper { + overflow: clip !important; +} + +._button { + appearance: none; + display: inline-block; + padding: 0; + margin: 0; // for Safari + background: none; + border: none; + cursor: pointer; + color: inherit; + touch-action: manipulation; + -webkit-tap-highlight-color: transparent; + font-size: 1em; + font-family: inherit; + line-height: inherit; + + &, * { + @extend ._noSelect; + } + + * { + pointer-events: none; + } + + &:disabled { + opacity: 0.5; + cursor: default; + } + + > i:only-child { + display: block; + margin: auto; + } +} + +._buttonIcon { + @extend ._button; + display: flex; + align-items: center; + justify-content: center; + width: calc(var(--height) - (var(--margin) * 2)); + height: calc(var(--height) - (var(--margin) * 2)); + box-sizing: border-box; + position: relative; + border-radius: 5px; + outline: none; + + &::before { + content: ""; + position: absolute; + width: 2.7em; + height: 2.7em; + border-radius: inherit; + transition: background 0.2s; + } + + &:hover:before, &:focus::before, &.highlighted::before { + background: var(--buttonBg); + } + &:focus-visible::before { + outline: auto; + } + &.highlighted { + color: var(--accent); + } +} + +._buttonPrimary { + @extend ._button; + color: var(--fgOnAccent); + background: var(--accent); + + &:not(:disabled):hover { + background: var(--X8); + } + + &:not(:disabled):active { + background: var(--X9); + } +} + +._buttonGradate { + @extend ._buttonPrimary; + color: var(--fgOnAccent); + background: linear-gradient(90deg, var(--buttonGradateA), var(--buttonGradateB)); + + &:not(:disabled):hover { + background: linear-gradient(90deg, var(--X8), var(--X8)); + } + + &:not(:disabled):active { + background: linear-gradient(90deg, var(--X8), var(--X8)); + } +} + +._help { + color: var(--accent); + cursor: help +} + +._textButton { + @extend ._button; + color: var(--accent); + + &:not(:disabled):hover { + text-decoration: underline; + } +} + +._panel { + background: var(--panel); + border-radius: var(--radius); + overflow: clip; +} + +._margin { + margin: var(--margin) 0; +} + +._gaps_m { + display: flex; + flex-direction: column; + gap: 1.5em; +} + +._gaps_s { + display: flex; + flex-direction: column; + gap: 0.75em; +} + +._gaps { + display: flex; + flex-direction: column; + gap: var(--margin); +} + +._inputs { + display: flex; + margin: 32px 0; + + &:first-child { + margin-top: 8px; + } + + &:last-child { + margin-bottom: 8px; + } + + > * { + flex: 1; + margin: 0 !important; + + &:not(:first-child) { + margin-left: 8px !important; + } + + &:not(:last-child) { + margin-right: 8px !important; + } + } +} + +._panel { + background: var(--panel); + border-radius: var(--radius); + overflow: clip; +} + +._block { + background: var(--panel); + border-radius: var(--radius); + overflow: visible; + + & + ._block { + margin-top: var(--margin); + } +} + +._gap { + margin: var(--margin) 0; + &:first-child { + margin-top: 0; + } +} + +// TODO: 廃止 +._card { + @extend ._panel; + + // TODO: _cardTitle に + > ._title { + margin: 0; + padding: 22px 32px; + font-size: 1em; + border-bottom: solid 1px var(--panelHeaderDivider); + font-weight: bold; + background: var(--panelHeaderBg); + color: var(--panelHeaderFg); + + @media (max-width: 500px) { + padding: 16px; + font-size: 1em; + } + } + + // TODO: _cardContent に + > ._content { + padding: 32px; + + @media (max-width: 500px) { + padding: 16px; + } + + &._noPad { + padding: 0 !important; + } + + & + ._content { + border-top: solid 0.5px var(--divider); + } + } + + // TODO: _cardFooter に + > ._footer { + border-top: solid 0.5px var(--divider); + padding: 24px 32px; + + @media (max-width: 500px) { + padding: 16px; + } + } +} + +._borderButton { + @extend ._button; + display: block; + width: 100%; + padding: 10px; + box-sizing: border-box; + text-align: center; + border: solid 0.5px var(--divider); + border-radius: var(--radius); + + &:active { + border-color: var(--accent); + } +} + +._popup { + background: var(--popup); + border-radius: var(--radius); + contain: content; +} + +// TODO: 廃止 +._monolithic_ { + ._section:not(:empty) { + box-sizing: border-box; + padding: var(--root-margin, 32px); + + @media (max-width: 500px) { + --root-margin: 10px; + } + + & + ._section:not(:empty) { + border-top: solid 0.5px var(--divider); + } + } +} + +._narrow_ ._card { + > ._title { + padding: 16px; + font-size: 1em; + } + + > ._content { + padding: 16px; + } + + > ._footer { + padding: 16px; + } +} + +._acrylic { + background: var(--acrylicPanel); + -webkit-backdrop-filter: var(--blur, blur(15px)); + backdrop-filter: var(--blur, blur(15px)); + + @supports not (backdrop-filter: var(--blur, blur(15px))) { + &:after { + content: ""; + position: absolute; + top: 0; + right: 0; + left: 0; + bottom: 0; + z-index: -1; + background: var(--bg); + opacity: .75; + } + } +} + +._formBlock { + margin: 1.5em 0; +} + +._formRoot { + > ._formBlock:first-child { + margin-top: 0; + } + + > ._formBlock:last-child { + margin-bottom: 0; + } +} + +._formLinksGrid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); + grid-gap: 12px; + > button { + width: 100% !important; + } +} + +._flexList { + display: flex; + flex-wrap: wrap; + gap: .2em; + width: min-content; + min-width: 100%; + &._center { + justify-content: center; + } +} + +._formLinks { + > *:not(:last-child) { + margin-bottom: 8px; + } +} + +._beta { + margin-left: 0.7em; + font-size: 65%; + padding: 2px 3px; + color: var(--accent); + border: solid 1px var(--accent); + border-radius: 4px; + vertical-align: top; +} + +._table { + > ._row { + display: flex; + + &:not(:last-child) { + margin-bottom: 16px; + + @media (max-width: 500px) { + margin-bottom: 8px; + } + } + + > ._cell { + flex: 1; + + > ._label { + font-size: 80%; + opacity: 0.7; + + > ._icon { + margin-right: 4px; + display: none; + } + } + } + } +} + +._fullinfo { + padding: 64px 32px; + text-align: center; + + > img { + vertical-align: bottom; + height: 128px; + margin-bottom: 16px; + border-radius: 16px; + } +} + +._keyValue { + display: flex; + + > * { + flex: 1; + } +} + +._link { + position: relative; + color: var(--link); + + &:after { + content: ''; + position: absolute; + bottom: 0; + left: 0; + width: 0%; + border-bottom: 2px solid var(--link); + transition: 0.3s ease-in-out; + } + + &:hover:after { + width: 100%; + } +} + +._caption { + font-size: 0.8em; + opacity: 0.7; +} + +._monospace { + font-family: Fira code, Fira Mono, Consolas, Menlo, Courier, monospace !important; +} + +._code { + @extend ._monospace; + background: #26233a; + color: #e0def4; + font-size: 14px; + line-height: 1.5; + padding: 5px; +} + +.prism-editor__container { + height: 100%; +} + +.prism-editor__textarea:focus { + outline: none; +} + +:not(.noGap):not(._block) > { + .note-container, .cmuxhskf > section, ._gap > ._block, ._panel, .noGap, .profile, .card { + &:not(.caution) + { + box-shadow: 0 4px 25px rgba(0,0,0,0.04); + border-radius: var(--radius); + overflow: clip; + } + } +} +.widgets ._panel { + box-shadow: none !important; +} + +._zoom { + transition-duration: 0.5s, 0.5s; + transition-property: opacity, transform; + transition-timing-function: cubic-bezier(0,.5,.5,1); +} + +.zoom-enter-active, .zoom-leave-active { + transition: opacity 0.5s, transform 0.5s !important; +} +.zoom-enter-from, .zoom-leave-to { + opacity: 0; + transform: scale(0.9); +} + +@keyframes blink { + 0% { opacity: 1; } + 70% { opacity: 0; } + 100% { opacity: 1; } +} + +@keyframes tada { + from { + transform: scale3d(1, 1, 1); + } + + 10%, + 20% { + transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); + } + + 30%, + 50%, + 70%, + 90% { + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + } + + 40%, + 60%, + 80% { + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + } + + to { + transform: scale3d(1, 1, 1); + } +} + +@media(prefers-reduced-motion) { + @keyframes tada { + from { + transform: scale3d(1, 1, 1); + } + + 50% { + transform: scale3d(1.1, 1.1, 1.1); + } + + to { + transform: scale3d(1, 1, 1); + } + } +} + +._anime_bounce { + will-change: transform; + animation: bounce ease 0.7s; + animation-iteration-count: 1; + transform-origin: 50% 50%; +} +._anime_bounce_ready { + will-change: transform; + transform: scaleX(0.90) scaleY(0.90) ; +} +._anime_bounce_standBy { + transition: transform 0.1s ease; +} + +@keyframes bounce{ + 0% { + transform: scaleX(0.90) scaleY(0.90) ; + } + 19% { + transform: scaleX(1.10) scaleY(1.10) ; + } + 48% { + transform: scaleX(0.95) scaleY(0.95) ; + } + 100% { + transform: scaleX(1.00) scaleY(1.00) ; + } +} + +.ph-xxs { + font-size: 0.5em; +} + +.ph-xs { + font-size: 0.75em; +} + +.ph-sm { + font-size: 0.875em; +} + +.ph-lg { + font-size: 1.3333em; + line-height: 0.75em; + vertical-align: -0.0667em; + justify-content: center; +} + +.ph-xl { + font-size: 1.5em; + line-height: 0.6666em; + vertical-align: -0.075em; +} + +.ph-1x { + font-size: 1em; +} + +.ph-2x { + font-size: 2em; +} + +.ph-3x { + font-size: 3em; +} + +.ph-4x { + font-size: 4em; +} + +.ph-5x { + font-size: 5em; +} + +.ph-6x { + font-size: 6em; +} + +.ph-7x { + font-size: 7em; +} + +.ph-8x { + font-size: 8em; +} + +.ph-9x { + font-size: 9em; +} + +.ph-10x { + font-size: 10em; +} + +.ph-fw { + text-align: center; + width: 1.25em; + display: inline-flex; +} + +._blur_text { + filter: blur(6px); + transition: filter 0.3s; + + &:hover { + filter: blur(0px); + } +} + +._otp_input { + width: 30px; + height: 30px; + padding: 5px; + margin: 1rem 7px auto; + font-size: 20px; + border-radius: 4px; + border: 2px solid var(--accent); + background-color: var(--accentedBg); + color: var(--fg); + text-align: center; +} +._otp_input.error { + border-color: var(--error) !important; +} +._otp_input::-webkit-inner-spin-button, +._otp_input::-webkit-outer-spin-button { + -webkit-appearance: none; + margin: 0; +} + +@media(prefers-reduced-motion: no-preference) { + @keyframes scaleIn { + from { + transform: scale(0); + opacity: 0; + } + } + @keyframes scaleInSmall { + from { + transform: scale(.8); + opacity: 0; + } + } +} diff --git a/fe_calckey/frontend/client/src/theme-store.ts b/fe_calckey/frontend/client/src/theme-store.ts new file mode 100644 index 0000000..a2a5ff5 --- /dev/null +++ b/fe_calckey/frontend/client/src/theme-store.ts @@ -0,0 +1,45 @@ +import { api } from "@/os"; +import { $i } from "@/account"; +import { Theme } from "./scripts/theme"; + +const lsCacheKey = $i ? `themes:${$i.id}` : ""; + +export function getThemes(): Theme[] { + return JSON.parse(localStorage.getItem(lsCacheKey) || "[]"); +} + +export async function fetchThemes(): Promise { + if ($i == null) return; + + try { + const themes = await api("i/registry/get", { + scope: ["client"], + key: "themes", + }); + localStorage.setItem(lsCacheKey, JSON.stringify(themes)); + } catch (err) { + if (err.code === "NO_SUCH_KEY") return; + throw err; + } +} + +export async function addTheme(theme: Theme): Promise { + await fetchThemes(); + const themes = getThemes().concat(theme); + await api("i/registry/set", { + scope: ["client"], + key: "themes", + value: themes, + }); + localStorage.setItem(lsCacheKey, JSON.stringify(themes)); +} + +export async function removeTheme(theme: Theme): Promise { + const themes = getThemes().filter((t) => t.id !== theme.id); + await api("i/registry/set", { + scope: ["client"], + key: "themes", + value: themes, + }); + localStorage.setItem(lsCacheKey, JSON.stringify(themes)); +} diff --git a/fe_calckey/frontend/client/src/themes/_dark.json5 b/fe_calckey/frontend/client/src/themes/_dark.json5 new file mode 100644 index 0000000..b26171c --- /dev/null +++ b/fe_calckey/frontend/client/src/themes/_dark.json5 @@ -0,0 +1,100 @@ +// Basic Dark theme +// It just provides the default colors, if +// no colors are specified, this isn't ever +// gonna be used directly +{ + id: 'dark', + + name: 'Dark', + author: 'Calckey Contributors', + desc: 'Default dark theme', + kind: 'dark', + + props: { + accent: '#86b300', + accentDarken: ':darken<10<@accent', + accentLighten: ':lighten<10<@accent', + accentedBg: ':alpha<0.15<@accent', + focus: ':alpha<0.3<@accent', + bg: '#000', + acrylicBg: ':alpha<0.5<@bg', + fg: '#dadada', + fgTransparentWeak: ':alpha<0.75<@fg', + fgTransparent: ':alpha<0.5<@fg', + fgHighlighted: ':lighten<3<@fg', + fgOnAccent: '#fff', + divider: 'rgba(255, 255, 255, 0.1)', + indicator: '@accent', + panel: ':lighten<3<@bg', + panelHighlight: ':lighten<3<@panel', + panelHeaderBg: ':lighten<3<@panel', + panelHeaderFg: '@fg', + panelHeaderDivider: 'rgba(0, 0, 0, 0)', + panelBorder: '" solid 1px var(--divider)', + acrylicPanel: ':alpha<0.5<@panel', + windowHeader: ':alpha<0.85<@panel', + popup: ':lighten<3<@panel', + shadow: 'rgba(0, 0, 0, 0.3)', + header: ':alpha<0.7<@panel', + navBg: '@panel', + navFg: '@fg', + navHoverFg: ':lighten<17<@fg', + navActive: '@accent', + navIndicator: '@indicator', + link: '#44a4c1', + hashtag: '#ff9156', + mention: '@accent', + mentionMe: '@mention', + renote: '#229e82', + modalBg: 'rgba(0, 0, 0, 0.5)', + scrollbarHandle: 'rgba(255, 255, 255, 0.2)', + scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)', + dateLabelFg: '@fg', + infoBg: '#253142', + infoFg: '#fff', + infoWarnBg: '#42321c', + infoWarnFg: '#ffbd3e', + switchBg: 'rgba(255, 255, 255, 0.15)', + cwBg: '#687390', + cwFg: '#393f4f', + cwHoverBg: '#707b97', + buttonBg: 'rgba(255, 255, 255, 0.05)', + buttonHoverBg: 'rgba(255, 255, 255, 0.1)', + buttonGradateA: '@accent', + buttonGradateB: ':hue<20<@accent', + swutchOffBg: 'rgba(255, 255, 255, 0.1)', + swutchOffFg: '@fg', + swutchOnBg: '@accentedBg', + swutchOnFg: '@accent', + inputBorder: 'rgba(255, 255, 255, 0.1)', + inputBorderHover: 'rgba(255, 255, 255, 0.2)', + listItemHoverBg: 'rgba(255, 255, 255, 0.03)', + driveFolderBg: ':alpha<0.3<@accent', + wallpaperOverlay: 'rgba(0, 0, 0, 0.5)', + badge: '#31b1ce', + messageBg: '@bg', + success: '#86b300', + error: '#ec4137', + warn: '#ecb637', + codeString: '#ffb675', + codeNumber: '#cfff9e', + codeBoolean: '#c59eff', + htmlThemeColor: '@bg', + X2: ':darken<2<@panel', + X3: 'rgba(255, 255, 255, 0.05)', + X4: 'rgba(255, 255, 255, 0.1)', + X5: 'rgba(255, 255, 255, 0.05)', + X6: 'rgba(255, 255, 255, 0.15)', + X7: 'rgba(255, 255, 255, 0.05)', + X8: ':lighten<5<@accent', + X9: ':darken<5<@accent', + X10: ':alpha<0.4<@accent', + X11: 'rgba(0, 0, 0, 0.3)', + X12: 'rgba(255, 255, 255, 0.1)', + X13: 'rgba(255, 255, 255, 0.15)', + X14: ':alpha<0.5<@navBg', + X15: ':alpha<0<@panel', + X16: ':alpha<0.7<@panel', + X17: ':alpha<0.8<@bg', + }, +} diff --git a/fe_calckey/frontend/client/src/themes/_light.json5 b/fe_calckey/frontend/client/src/themes/_light.json5 new file mode 100644 index 0000000..431d9af --- /dev/null +++ b/fe_calckey/frontend/client/src/themes/_light.json5 @@ -0,0 +1,100 @@ +// Basic Dark theme +// It just provides the default colors, if +// no colors are specified, this isn't ever +// gonna be used directly +{ + id: 'light', + + name: 'Light', + author: 'Calckey Contributors', + desc: 'Default light theme', + kind: 'light', + + props: { + accent: '#86b300', + accentDarken: ':darken<10<@accent', + accentLighten: ':lighten<10<@accent', + accentedBg: ':alpha<0.15<@accent', + focus: ':alpha<0.3<@accent', + bg: '#fff', + acrylicBg: ':alpha<0.5<@bg', + fg: '#5f5f5f', + fgTransparentWeak: ':alpha<0.75<@fg', + fgTransparent: ':alpha<0.5<@fg', + fgHighlighted: ':darken<3<@fg', + fgOnAccent: '#fff', + divider: 'rgba(0, 0, 0, 0.1)', + indicator: '@accent', + panel: ':lighten<3<@bg', + panelHighlight: ':darken<3<@panel', + panelHeaderBg: ':lighten<3<@panel', + panelHeaderFg: '@fg', + panelHeaderDivider: 'rgba(0, 0, 0, 0)', + panelBorder: '" solid 1px var(--divider)', + acrylicPanel: ':alpha<0.5<@panel', + windowHeader: ':alpha<0.85<@panel', + popup: ':lighten<3<@panel', + shadow: 'rgba(0, 0, 0, 0.1)', + header: ':alpha<0.7<@panel', + navBg: '@panel', + navFg: '@fg', + navHoverFg: ':darken<17<@fg', + navActive: '@accent', + navIndicator: '@indicator', + link: '#44a4c1', + hashtag: '#ff9156', + mention: '@accent', + mentionMe: '@mention', + renote: '#229e82', + modalBg: 'rgba(0, 0, 0, 0.3)', + scrollbarHandle: 'rgba(0, 0, 0, 0.2)', + scrollbarHandleHover: 'rgba(0, 0, 0, 0.4)', + dateLabelFg: '@fg', + infoBg: '#e5f5ff', + infoFg: '#72818a', + infoWarnBg: '#fff0db', + infoWarnFg: '#8f6e31', + switchBg: 'rgba(0, 0, 0, 0.15)', + cwBg: '#b1b9c1', + cwFg: '#fff', + cwHoverBg: '#bbc4ce', + buttonBg: 'rgba(0, 0, 0, 0.05)', + buttonHoverBg: 'rgba(0, 0, 0, 0.1)', + buttonGradateA: '@accent', + buttonGradateB: ':hue<20<@accent', + swutchOffBg: 'rgba(0, 0, 0, 0.1)', + swutchOffFg: '@panel', + swutchOnBg: '@accent', + swutchOnFg: '@fgOnAccent', + inputBorder: 'rgba(0, 0, 0, 0.1)', + inputBorderHover: 'rgba(0, 0, 0, 0.2)', + listItemHoverBg: 'rgba(0, 0, 0, 0.03)', + driveFolderBg: ':alpha<0.3<@accent', + wallpaperOverlay: 'rgba(255, 255, 255, 0.5)', + badge: '#31b1ce', + messageBg: '@bg', + success: '#86b300', + error: '#ec4137', + warn: '#ecb637', + codeString: '#b98710', + codeNumber: '#0fbbbb', + codeBoolean: '#62b70c', + htmlThemeColor: '@bg', + X2: ':darken<2<@panel', + X3: 'rgba(0, 0, 0, 0.05)', + X4: 'rgba(0, 0, 0, 0.1)', + X5: 'rgba(0, 0, 0, 0.05)', + X6: 'rgba(0, 0, 0, 0.25)', + X7: 'rgba(0, 0, 0, 0.05)', + X8: ':lighten<5<@accent', + X9: ':darken<5<@accent', + X10: ':alpha<0.4<@accent', + X11: 'rgba(0, 0, 0, 0.1)', + X12: 'rgba(0, 0, 0, 0.1)', + X13: 'rgba(0, 0, 0, 0.15)', + X14: ':alpha<0.5<@navBg', + X15: ':alpha<0<@panel', + X16: ':alpha<0.7<@panel', + X17: ':alpha<0.8<@bg', + }, +} diff --git a/fe_calckey/frontend/client/src/themes/d-astro.json5 b/fe_calckey/frontend/client/src/themes/d-astro.json5 new file mode 100644 index 0000000..c6a927e --- /dev/null +++ b/fe_calckey/frontend/client/src/themes/d-astro.json5 @@ -0,0 +1,78 @@ +{ + id: '080a01c5-377d-4fbb-88cc-6bb5d04977ea', + base: 'dark', + name: 'Mi Astro Dark', + author: 'syuilo', + props: { + bg: '#232125', + fg: '#efdab9', + cwBg: '#687390', + cwFg: '#393f4f', + link: '#78b0a0', + warn: '#ecb637', + badge: '#31b1ce', + error: '#ec4137', + focus: ':alpha<0.3<@accent', + navBg: '@panel', + navFg: '@fg', + panel: '#2a272b', + accent: '#81c08b', + header: ':alpha<0.7<@bg', + infoBg: '#253142', + infoFg: '#fff', + renote: '#659CC8', + shadow: 'rgba(0, 0, 0, 0.3)', + divider: 'rgba(255, 255, 255, 0.1)', + hashtag: '#ff9156', + mention: '#ffd152', + modalBg: 'rgba(0, 0, 0, 0.5)', + success: '#86b300', + buttonBg: 'rgba(255, 255, 255, 0.05)', + acrylicBg: ':alpha<0.5<@bg', + cwHoverBg: '#707b97', + indicator: '@accent', + mentionMe: '#fb5d38', + messageBg: '@bg', + navActive: '@accent', + infoWarnBg: '#42321c', + infoWarnFg: '#ffbd3e', + navHoverFg: ':lighten<17<@fg', + dateLabelFg: '@fg', + inputBorder: 'rgba(255, 255, 255, 0.1)', + inputBorderHover: 'rgba(255, 255, 255, 0.2)', + panelBorder: '" solid 1px var(--divider)', + accentDarken: ':darken<10<@accent', + acrylicPanel: ':alpha<0.5<@panel', + navIndicator: '@accent', + accentLighten: ':lighten<10<@accent', + buttonHoverBg: 'rgba(255, 255, 255, 0.1)', + buttonGradateA: '@accent', + buttonGradateB: ':hue<-20<@accent', + driveFolderBg: ':alpha<0.3<@accent', + fgHighlighted: ':lighten<3<@fg', + panelHeaderBg: ':lighten<3<@panel', + panelHeaderFg: '@fg', + htmlThemeColor: '@bg', + panelHighlight: ':lighten<3<@panel', + listItemHoverBg: 'rgba(255, 255, 255, 0.03)', + scrollbarHandle: 'rgba(255, 255, 255, 0.2)', + wallpaperOverlay: 'rgba(0, 0, 0, 0.5)', + panelHeaderDivider: 'rgba(0, 0, 0, 0)', + scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)', + X2: ':darken<2<@panel', + X3: 'rgba(255, 255, 255, 0.05)', + X4: 'rgba(255, 255, 255, 0.1)', + X5: 'rgba(255, 255, 255, 0.05)', + X6: 'rgba(255, 255, 255, 0.15)', + X7: 'rgba(255, 255, 255, 0.05)', + X8: ':lighten<5<@accent', + X9: ':darken<5<@accent', + X10: ':alpha<0.4<@accent', + X11: 'rgba(0, 0, 0, 0.3)', + X12: 'rgba(255, 255, 255, 0.1)', + X13: 'rgba(255, 255, 255, 0.15)', + X14: ':alpha<0.5<@navBg', + X15: ':alpha<0<@panel', + X16: ':alpha<0.7<@panel', + }, +} diff --git a/fe_calckey/frontend/client/src/themes/d-botanical.json5 b/fe_calckey/frontend/client/src/themes/d-botanical.json5 new file mode 100644 index 0000000..c03b95e --- /dev/null +++ b/fe_calckey/frontend/client/src/themes/d-botanical.json5 @@ -0,0 +1,26 @@ +{ + id: '504debaf-4912-6a4c-5059-1db08a76b737', + + name: 'Mi Botanical Dark', + author: 'syuilo', + + base: 'dark', + + props: { + accent: 'rgb(148, 179, 0)', + bg: 'rgb(37, 38, 36)', + fg: 'rgb(216, 212, 199)', + fgHighlighted: '#fff', + divider: 'rgba(255, 255, 255, 0.14)', + panel: 'rgb(47, 47, 44)', + panelHeaderBg: '@panel', + panelHeaderDivider: '@divider', + header: ':alpha<0.7<@panel', + navBg: '#363636', + renote: '@accent', + mention: 'rgb(212, 153, 76)', + mentionMe: 'rgb(212, 210, 76)', + hashtag: '#5bcbb0', + link: '@accent', + }, +} diff --git a/fe_calckey/frontend/client/src/themes/d-catppuccin-frappe.json5 b/fe_calckey/frontend/client/src/themes/d-catppuccin-frappe.json5 new file mode 100644 index 0000000..891fe18 --- /dev/null +++ b/fe_calckey/frontend/client/src/themes/d-catppuccin-frappe.json5 @@ -0,0 +1,94 @@ +{ + id: 'ffcd3328-5c57-4ca3-9dac-4580cbf7742f', + base: 'dark', + name: 'Catppuccin frappe', + props: { + X2: ':darken<2<@panel', + X3: 'rgba(255, 255, 255, 0.05)', + X4: 'rgba(255, 255, 255, 0.1)', + X5: 'rgba(255, 255, 255, 0.05)', + X6: 'rgba(255, 255, 255, 0.15)', + X7: 'rgba(255, 255, 255, 0.05)', + X8: ':lighten<5<@accent', + X9: ':darken<5<@accent', + bg: '#232634', + fg: '#c6d0f5', + X10: ':alpha<0.4<@accent', + X11: 'rgba(0, 0, 0, 0.3)', + X12: 'rgba(255, 255, 255, 0.1)', + X13: 'rgba(255, 255, 255, 0.15)', + X14: ':alpha<0.5<@navBg', + X15: ':alpha<0<@panel', + X16: ':alpha<0.7<@panel', + X17: ':alpha<0.8<@bg', + cwBg: '#51576d', + cwFg: '#b5bfe2', + link: '#8caaee', + warn: '#ef9f76', + badge: '#8caaee', + error: '#e78284', + focus: ':alpha<0.3<@accent', + navBg: '@panel', + navFg: '@fg', + panel: ':lighten<3<@bg', + popup: ':lighten<3<@panel', + accent: '#eebebe', + header: ':alpha<0.7<@panel', + infoBg: '#414559', + infoFg: '#a5adce', + renote: '#8caaee', + shadow: 'rgba(0, 0, 0, 0.3)', + divider: 'rgba(255, 255, 255, 0.1)', + hashtag: '#85c1dc', + mention: '@accent', + modalBg: 'rgba(0, 0, 0, 0.5)', + success: '#a6d189', + buttonBg: 'rgba(255, 255, 255, 0.05)', + switchBg: 'rgba(255, 255, 255, 0.15)', + acrylicBg: ':alpha<0.5<@bg', + cwHoverBg: '#626880', + indicator: '@accent', + mentionMe: '@mention', + messageBg: '@bg', + navActive: '@accent', + accentedBg: ':alpha<0.15<@accent', + codeNumber: '#a6d189', + codeString: '#ef9f76', + fgOnAccent: '#303446', + infoWarnBg: '#414559', + infoWarnFg: '#b5bfe2', + navHoverFg: ':lighten<17<@fg', + swutchOnBg: '@accentedBg', + swutchOnFg: '@accent', + codeBoolean: '@accent', + dateLabelFg: '@fg', + deckDivider: '#737994', + inputBorder: 'rgba(255, 255, 255, 0.1)', + panelBorder: 'solid 1px var(--divider)', + swutchOffBg: 'rgba(255, 255, 255, 0.1)', + swutchOffFg: '@fg', + accentDarken: ':darken<10<@accent', + acrylicPanel: ':alpha<0.5<@panel', + navIndicator: '@indicator', + windowHeader: ':alpha<0.85<@panel', + accentLighten: ':lighten<10<@accent', + buttonHoverBg: 'rgba(255, 255, 255, 0.1)', + driveFolderBg: ':alpha<0.3<@accent', + fgHighlighted: ':lighten<3<@fg', + fgTransparent: ':alpha<0.5<@fg', + panelHeaderBg: ':lighten<3<@panel', + panelHeaderFg: '@fg', + buttonGradateA: '@accent', + buttonGradateB: ':hue<20<@accent', + htmlThemeColor: '@bg', + panelHighlight: ':lighten<3<@panel', + listItemHoverBg: 'rgba(255, 255, 255, 0.03)', + scrollbarHandle: 'rgba(255, 255, 255, 0.2)', + inputBorderHover: 'rgba(255, 255, 255, 0.2)', + wallpaperOverlay: 'rgba(0, 0, 0, 0.5)', + fgTransparentWeak: ':alpha<0.75<@fg', + panelHeaderDivider: 'rgba(0, 0, 0, 0)', + scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)', + }, + author: 'somebody ¯_(ツ)_/¯', +} diff --git a/fe_calckey/frontend/client/src/themes/d-catppuccin-mocha.json5 b/fe_calckey/frontend/client/src/themes/d-catppuccin-mocha.json5 new file mode 100644 index 0000000..94e1381 --- /dev/null +++ b/fe_calckey/frontend/client/src/themes/d-catppuccin-mocha.json5 @@ -0,0 +1,94 @@ +{ + id: 'd413f41f-a489-48be-9e20-3532ffbb4363', + base: 'dark', + name: 'Catppuccin mocha', + props: { + X2: ':darken<2<@panel', + X3: 'rgba(255, 255, 255, 0.05)', + X4: 'rgba(255, 255, 255, 0.1)', + X5: 'rgba(255, 255, 255, 0.05)', + X6: 'rgba(255, 255, 255, 0.15)', + X7: 'rgba(255, 255, 255, 0.05)', + X8: ':lighten<5<@accent', + X9: ':darken<5<@accent', + bg: '#11111b', + fg: '#cdd6f4', + X10: ':alpha<0.4<@accent', + X11: 'rgba(0, 0, 0, 0.3)', + X12: 'rgba(255, 255, 255, 0.1)', + X13: 'rgba(255, 255, 255, 0.15)', + X14: ':alpha<0.5<@navBg', + X15: ':alpha<0<@panel', + X16: ':alpha<0.7<@panel', + X17: ':alpha<0.8<@bg', + cwBg: '#45475a', + cwFg: '#bac2de', + link: '#89b4fa', + warn: '#fab387', + badge: '#89b4fa', + error: '#f38ba8', + focus: ':alpha<0.3<@accent', + navBg: '@panel', + navFg: '@fg', + panel: ':lighten<3<@bg', + popup: ':lighten<3<@panel', + accent: '#f2cdcd', + header: ':alpha<0.7<@panel', + infoBg: '#313244', + infoFg: '#a6adc8', + renote: '#89b4fa', + shadow: 'rgba(0, 0, 0, 0.3)', + divider: 'rgba(255, 255, 255, 0.1)', + hashtag: '#74c7ec', + mention: '@accent', + modalBg: 'rgba(0, 0, 0, 0.5)', + success: '#a6e3a1', + buttonBg: 'rgba(255, 255, 255, 0.05)', + switchBg: 'rgba(255, 255, 255, 0.15)', + acrylicBg: ':alpha<0.5<@bg', + cwHoverBg: '#585b70', + indicator: '@accent', + mentionMe: '@mention', + messageBg: '@bg', + navActive: '@accent', + accentedBg: ':alpha<0.15<@accent', + codeNumber: '#a6e3a1', + codeString: '#fab387', + fgOnAccent: '#1e1e2e', + infoWarnBg: '#313244', + infoWarnFg: '#bac2de', + navHoverFg: ':lighten<17<@fg', + swutchOnBg: '@accentedBg', + swutchOnFg: '@accent', + codeBoolean: '@accent', + dateLabelFg: '@fg', + deckDivider: '#6c7086', + inputBorder: 'rgba(255, 255, 255, 0.1)', + panelBorder: 'solid 1px var(--divider)', + swutchOffBg: 'rgba(255, 255, 255, 0.1)', + swutchOffFg: '@fg', + accentDarken: ':darken<10<@accent', + acrylicPanel: ':alpha<0.5<@panel', + navIndicator: '@indicator', + windowHeader: ':alpha<0.85<@panel', + accentLighten: ':lighten<10<@accent', + buttonHoverBg: 'rgba(255, 255, 255, 0.1)', + driveFolderBg: ':alpha<0.3<@accent', + fgHighlighted: ':lighten<3<@fg', + fgTransparent: ':alpha<0.5<@fg', + panelHeaderBg: ':lighten<3<@panel', + panelHeaderFg: '@fg', + buttonGradateA: '@accent', + buttonGradateB: ':hue<20<@accent', + htmlThemeColor: '@bg', + panelHighlight: ':lighten<3<@panel', + listItemHoverBg: 'rgba(255, 255, 255, 0.03)', + scrollbarHandle: 'rgba(255, 255, 255, 0.2)', + inputBorderHover: 'rgba(255, 255, 255, 0.2)', + wallpaperOverlay: 'rgba(0, 0, 0, 0.5)', + fgTransparentWeak: ':alpha<0.75<@fg', + panelHeaderDivider: 'rgba(0, 0, 0, 0)', + scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)', + }, + author: 'somebody ¯_(ツ)_/¯', +} diff --git a/fe_calckey/frontend/client/src/themes/d-cherry.json5 b/fe_calckey/frontend/client/src/themes/d-cherry.json5 new file mode 100644 index 0000000..a7e1ad1 --- /dev/null +++ b/fe_calckey/frontend/client/src/themes/d-cherry.json5 @@ -0,0 +1,20 @@ +{ + id: '679b3b87-a4e9-4789-8696-b56c15cc33b0', + + name: 'Mi Cherry Dark', + author: 'syuilo', + + base: 'dark', + + props: { + accent: 'rgb(255, 89, 117)', + bg: 'rgb(28, 28, 37)', + fg: 'rgb(236, 239, 244)', + panel: 'rgb(35, 35, 47)', + renote: '@accent', + link: '@accent', + mention: '@accent', + hashtag: '@accent', + divider: 'rgb(63, 63, 80)', + }, +} diff --git a/fe_calckey/frontend/client/src/themes/d-dark.json5 b/fe_calckey/frontend/client/src/themes/d-dark.json5 new file mode 100644 index 0000000..d24ce4d --- /dev/null +++ b/fe_calckey/frontend/client/src/themes/d-dark.json5 @@ -0,0 +1,26 @@ +{ + id: '8050783a-7f63-445a-b270-36d0f6ba1677', + + name: 'Mi Dark', + author: 'syuilo', + desc: 'Default light theme', + + base: 'dark', + + props: { + bg: '#232323', + fg: 'rgb(199, 209, 216)', + fgHighlighted: '#fff', + divider: 'rgba(255, 255, 255, 0.14)', + panel: '#2d2d2d', + panelHeaderBg: '@panel', + panelHeaderDivider: '@divider', + header: ':alpha<0.7<@panel', + navBg: '#363636', + renote: '@accent', + mention: '#da6d35', + mentionMe: '#d44c4c', + hashtag: '#4cb8d4', + link: '@accent', + }, +} diff --git a/fe_calckey/frontend/client/src/themes/d-future.json5 b/fe_calckey/frontend/client/src/themes/d-future.json5 new file mode 100644 index 0000000..b6fa1ab --- /dev/null +++ b/fe_calckey/frontend/client/src/themes/d-future.json5 @@ -0,0 +1,27 @@ +{ + id: '32a637ef-b47a-4775-bb7b-bacbb823f865', + + name: 'Mi Future Dark', + author: 'syuilo', + + base: 'dark', + + props: { + accent: '#63e2b7', + bg: '#101014', + fg: '#D5D5D6', + fgHighlighted: '#fff', + fgOnAccent: '#000', + divider: 'rgba(255, 255, 255, 0.1)', + panel: '#18181c', + panelHeaderBg: '@panel', + panelHeaderDivider: '@divider', + renote: '@accent', + mention: '#f2c97d', + mentionMe: '@accent', + hashtag: '#70c0e8', + link: '#e88080', + buttonGradateA: '@accent', + buttonGradateB: ':saturate<30<:hue<30<@accent', + }, +} diff --git a/fe_calckey/frontend/client/src/themes/d-green-lime.json5 b/fe_calckey/frontend/client/src/themes/d-green-lime.json5 new file mode 100644 index 0000000..a6983b9 --- /dev/null +++ b/fe_calckey/frontend/client/src/themes/d-green-lime.json5 @@ -0,0 +1,24 @@ +{ + id: '02816013-8107-440f-877e-865083ffe194', + + name: 'Mi Green+Lime Dark', + author: 'syuilo', + + base: 'dark', + + props: { + accent: '#b4e900', + bg: '#0C1210', + fg: '#dee7e4', + fgHighlighted: '#fff', + fgOnAccent: '#192320', + divider: '#e7fffb24', + panel: '#192320', + panelHeaderBg: '@panel', + panelHeaderDivider: '@divider', + popup: '#293330', + renote: '@accent', + mentionMe: '#ffaa00', + link: '#24d7ce', + }, +} diff --git a/fe_calckey/frontend/client/src/themes/d-green-orange.json5 b/fe_calckey/frontend/client/src/themes/d-green-orange.json5 new file mode 100644 index 0000000..62adc39 --- /dev/null +++ b/fe_calckey/frontend/client/src/themes/d-green-orange.json5 @@ -0,0 +1,24 @@ +{ + id: 'dc489603-27b5-424a-9b25-1ff6aec9824a', + + name: 'Mi Green+Orange Dark', + author: 'syuilo', + + base: 'dark', + + props: { + accent: '#e97f00', + bg: '#0C1210', + fg: '#dee7e4', + fgHighlighted: '#fff', + fgOnAccent: '#192320', + divider: '#e7fffb24', + panel: '#192320', + panelHeaderBg: '@panel', + panelHeaderDivider: '@divider', + popup: '#293330', + renote: '@accent', + mentionMe: '#b4e900', + link: '#24d7ce', + }, +} diff --git a/fe_calckey/frontend/client/src/themes/d-gruvbox.json5 b/fe_calckey/frontend/client/src/themes/d-gruvbox.json5 new file mode 100644 index 0000000..5f4ad60 --- /dev/null +++ b/fe_calckey/frontend/client/src/themes/d-gruvbox.json5 @@ -0,0 +1,30 @@ +{ + id: '256a2e52-440f-4a00-8a76-c93501354dfb', + base: 'dark', + desc: 'Misskey gruvbox-dark-medium theme. Inspired by https://github.com/morhetz/gruvbox', + name: 'Gruvbox Dark Medium', + props: { + bg: '#282828', + fg: '#ebdbb2', + link: '#b16286', + warn: '#d65d0e', + badge: '#458588', + error: '#fb4934', + navBg: '#32302f', + panel: '#32302f', + accent: '#98971a', + header: ':alpha<0.7<@panel', + renote: '@accent', + divider: '#7c6f64', + hashtag: '#458588', + mention: '#98971a', + success: '#98971a', + mentionMe: '#fb4934', + fgHighlighted: '#fbf1c7', + panelHeaderBg: '@panel', + buttonGradateA: '#98971a', + buttonGradateB: '#98971a', + panelHeaderDivider: '@divider', + }, + author: '@razzlom@quietplace.xyz', +} diff --git a/fe_calckey/frontend/client/src/themes/d-ice.json5 b/fe_calckey/frontend/client/src/themes/d-ice.json5 new file mode 100644 index 0000000..179b060 --- /dev/null +++ b/fe_calckey/frontend/client/src/themes/d-ice.json5 @@ -0,0 +1,13 @@ +{ + id: '66e7e5a9-cd43-42cd-837d-12f47841fa34', + + name: 'Mi Ice Dark', + author: 'syuilo', + + base: 'dark', + + props: { + accent: '#47BFE8', + bg: '#212526', + }, +} diff --git a/fe_calckey/frontend/client/src/themes/d-nord.json5 b/fe_calckey/frontend/client/src/themes/d-nord.json5 new file mode 100644 index 0000000..7e8b4f4 --- /dev/null +++ b/fe_calckey/frontend/client/src/themes/d-nord.json5 @@ -0,0 +1,94 @@ +{ + id: 'dddbc0c6-af2c-46f8-b8f3-05964adcde0b', + base: 'dark', + desc: 'Nord: an arctic, north-bluish color palette', + name: 'Nord Dark', + props: { + X2: ':darken<2<@panel', + X3: 'rgba(255, 255, 255, 0.05)', + X4: 'rgba(255, 255, 255, 0.1)', + X5: 'rgba(255, 255, 255, 0.05)', + X6: 'rgba(255, 255, 255, 0.15)', + X7: 'rgba(255, 255, 255, 0.05)', + X8: ':lighten<5<@accent', + X9: ':darken<5<@accent', + bg: '#2e3440', + fg: '#eceff4', + X10: ':alpha<0.4<@accent', + X11: 'rgba(0, 0, 0, 0.3)', + X12: 'rgba(255, 255, 255, 0.1)', + X13: 'rgba(255, 255, 255, 0.15)', + X14: ':alpha<0.5<@navBg', + X15: ':alpha<0<@panel', + X16: ':alpha<0.7<@panel', + X17: ':alpha<0.8<@bg', + cwBg: '#4c566a', + cwFg: '#393f4f', + link: '#b48ead', + warn: '#d08770', + badge: '#d08770', + error: '#bf616a', + focus: ':alpha<0.3<@accent', + navBg: '@panel', + navFg: '@fg', + panel: ':lighten<3<@bg', + popup: ':lighten<3<@panel', + accent: '#81a1c1', + header: ':alpha<0.7<@panel', + infoBg: '#4c566a', + infoFg: '#d08770', + renote: '#ebcb8b', + shadow: 'rgba(0, 0, 0, 0.3)', + divider: 'rgba(255, 255, 255, 0.1)', + hashtag: '#a3be8c', + mention: '@accent', + modalBg: 'rgba(0, 0, 0, 0.5)', + success: '#a3be8c', + buttonBg: 'rgba(255, 255, 255, 0.05)', + switchBg: 'rgba(255, 255, 255, 0.15)', + acrylicBg: ':alpha<0.5<@bg', + cwHoverBg: '#707b97', + indicator: '@accent', + mentionMe: '@mention', + messageBg: '@bg', + navActive: '@accent', + accentedBg: ':alpha<0.15<@accent', + codeNumber: '#a3be8c', + codeString: '#b48ead', + fgOnAccent: '#eceff4', + infoWarnBg: '#4c566a', + infoWarnFg: '#bf616a', + navHoverFg: ':lighten<17<@fg', + swutchOnBg: '@accentedBg', + swutchOnFg: '@accent', + codeBoolean: '#ebcb8b', + dateLabelFg: '@fg', + inputBorder: 'rgba(255, 255, 255, 0.1)', + panelBorder: '" solid 1px var(--divider)', + swutchOffBg: 'rgba(255, 255, 255, 0.1)', + swutchOffFg: '@fg', + accentDarken: '#5e81ac', + acrylicPanel: ':alpha<0.5<@panel', + navIndicator: '@indicator', + windowHeader: ':alpha<0.85<@panel', + accentLighten: '#88c0d0', + buttonHoverBg: 'rgba(255, 255, 255, 0.1)', + driveFolderBg: ':alpha<0.3<@accent', + fgHighlighted: ':lighten<3<@fg', + fgTransparent: ':alpha<0.5<@fg', + panelHeaderBg: ':lighten<3<@panel', + panelHeaderFg: '@fg', + buttonGradateA: '@accent', + buttonGradateB: '#8fbcbb', + htmlThemeColor: '@bg', + panelHighlight: ':lighten<3<@panel', + listItemHoverBg: 'rgba(255, 255, 255, 0.03)', + scrollbarHandle: 'rgba(255, 255, 255, 0.2)', + inputBorderHover: 'rgba(255, 255, 255, 0.2)', + wallpaperOverlay: 'rgba(0, 0, 0, 0.5)', + fgTransparentWeak: ':alpha<0.75<@fg', + panelHeaderDivider: 'rgba(0, 0, 0, 0)', + scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)', + }, + author: '@thatonecalculator@stop.voring.me', +} diff --git a/fe_calckey/frontend/client/src/themes/d-persimmon.json5 b/fe_calckey/frontend/client/src/themes/d-persimmon.json5 new file mode 100644 index 0000000..e36265f --- /dev/null +++ b/fe_calckey/frontend/client/src/themes/d-persimmon.json5 @@ -0,0 +1,25 @@ +{ + id: 'c503d768-7c70-4db2-a4e6-08264304bc8d', + + name: 'Mi Persimmon Dark', + author: 'syuilo', + + base: 'dark', + + props: { + accent: 'rgb(206, 102, 65)', + bg: 'rgb(31, 33, 31)', + fg: '#cdd8c7', + fgHighlighted: '#fff', + divider: 'rgba(255, 255, 255, 0.14)', + panel: 'rgb(41, 43, 41)', + infoFg: '@fg', + infoBg: '#333c3b', + navBg: '#141714', + renote: '@accent', + mention: '@accent', + mentionMe: '#de6161', + hashtag: '#68bad0', + link: '#a1c758', + }, +} diff --git a/fe_calckey/frontend/client/src/themes/d-rosepine.json5 b/fe_calckey/frontend/client/src/themes/d-rosepine.json5 new file mode 100644 index 0000000..c948c29 --- /dev/null +++ b/fe_calckey/frontend/client/src/themes/d-rosepine.json5 @@ -0,0 +1,86 @@ +{ + id: '3cdfd635-4d5e-4d06-9ba3-20f123f0999b', + base: 'dark', + desc: 'Soho vibes for Misskey', + name: 'Rosé Pine', + props: { + X2: ':darken<2<@panel', + X3: 'rgba(255, 255, 255, 0.05)', + X4: 'rgba(255, 255, 255, 0.1)', + X5: 'rgba(255, 255, 255, 0.05)', + X6: 'rgba(255, 255, 255, 0.15)', + X7: 'rgba(255, 255, 255, 0.05)', + X8: ':lighten<5<@accent', + X9: ':darken<5<@accent', + bg: '#191724', + fg: '#e0def4', + X10: ':alpha<0.4<@accent', + X11: 'rgba(0, 0, 0, 0.3)', + X12: 'rgba(255, 255, 255, 0.1)', + X13: 'rgba(255, 255, 255, 0.15)', + X14: ':alpha<0.5<@navBg', + X15: ':alpha<0<@panel', + X16: ':alpha<0.7<@panel', + X17: ':alpha<0.8<@bg', + cwBg: '#1f1d2e', + cwFg: '#f6c177', + link: '#9ccfd8', + warn: '#f6c177', + badge: '#ebbcba', + error: '#eb6f92', + focus: ':alpha<0.3<@accent', + navBg: '@panel', + navFg: '@fg', + panel: ':lighten<3<@bg', + popup: ':lighten<3<@panel', + accent: '#c4a7e7', + header: ':alpha<0.7<@panel', + infoBg: '#253142', + infoFg: '#fff', + renote: '#31748f', + shadow: 'rgba(0, 0, 0, 0.3)', + divider: 'rgba(255, 255, 255, 0.1)', + hashtag: '#ebbcba', + mention: '@accent', + modalBg: 'rgba(0, 0, 0, 0.5)', + success: '#ebbcba', + buttonBg: 'rgba(255, 255, 255, 0.05)', + switchBg: 'rgba(255, 255, 255, 0.15)', + acrylicBg: ':alpha<0.5<@bg', + cwHoverBg: '#26233a', + indicator: '@accent', + mentionMe: '@mention', + messageBg: '@bg', + navActive: '@accent', + accentedBg: ':alpha<0.15<@accent', + fgOnAccent: '#26233a', + infoWarnBg: '#26233a', + infoWarnFg: '#f6c177', + navHoverFg: ':lighten<17<@fg', + dateLabelFg: '@fg', + inputBorder: 'rgba(255, 255, 255, 0.1)', + panelBorder: '" solid 1px var(--divider)', + accentDarken: ':darken<10<@accent', + acrylicPanel: ':alpha<0.5<@panel', + navIndicator: '@indicator', + accentLighten: ':lighten<10<@accent', + buttonHoverBg: 'rgba(255, 255, 255, 0.1)', + driveFolderBg: ':alpha<0.3<@accent', + fgHighlighted: ':lighten<3<@fg', + fgTransparent: ':alpha<0.5<@fg', + panelHeaderBg: ':lighten<3<@panel', + panelHeaderFg: '@fg', + buttonGradateA: '@accent', + buttonGradateB: '#ebbcba', + htmlThemeColor: '@bg', + panelHighlight: ':lighten<3<@panel', + listItemHoverBg: 'rgba(255, 255, 255, 0.03)', + scrollbarHandle: 'rgba(255, 255, 255, 0.2)', + inputBorderHover: 'rgba(255, 255, 255, 0.2)', + wallpaperOverlay: 'rgba(0, 0, 0, 0.5)', + fgTransparentWeak: ':alpha<0.75<@fg', + panelHeaderDivider: 'rgba(0, 0, 0, 0)', + scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)', + }, + author: '@thatonecalculator@stop.voring.me', +} diff --git a/fe_calckey/frontend/client/src/themes/d-rosepinemoon.json5 b/fe_calckey/frontend/client/src/themes/d-rosepinemoon.json5 new file mode 100644 index 0000000..97c368a --- /dev/null +++ b/fe_calckey/frontend/client/src/themes/d-rosepinemoon.json5 @@ -0,0 +1,86 @@ +{ + id: 'c57b0d7b-80ed-4a84-95d8-bfdefbe91ed7', + base: 'dark', + desc: 'Soho vibes for Misskey, moon edition', + name: 'Rosé Pine Moon', + props: { + X2: ':darken<2<@panel', + X3: 'rgba(255, 255, 255, 0.05)', + X4: 'rgba(255, 255, 255, 0.1)', + X5: 'rgba(255, 255, 255, 0.05)', + X6: 'rgba(255, 255, 255, 0.15)', + X7: 'rgba(255, 255, 255, 0.05)', + X8: ':lighten<5<@accent', + X9: ':darken<5<@accent', + bg: '#232136', + fg: '#e0def4', + X10: ':alpha<0.4<@accent', + X11: 'rgba(0, 0, 0, 0.3)', + X12: 'rgba(255, 255, 255, 0.1)', + X13: 'rgba(255, 255, 255, 0.15)', + X14: ':alpha<0.5<@navBg', + X15: ':alpha<0<@panel', + X16: ':alpha<0.7<@panel', + X17: ':alpha<0.8<@bg', + cwBg: '#393552', + cwFg: '#f6c177', + link: '#3e8fb0', + warn: '#f6c177', + badge: '#ea9a97', + error: '#eb6f92', + focus: ':alpha<0.3<@accent', + navBg: '@panel', + navFg: '@fg', + panel: ':lighten<3<@bg', + popup: ':lighten<3<@panel', + accent: '#c4a7e7', + header: ':alpha<0.7<@panel', + infoBg: '#253142', + infoFg: '#fff', + renote: '#229e82', + shadow: 'rgba(0, 0, 0, 0.3)', + divider: 'rgba(255, 255, 255, 0.1)', + hashtag: '#ea9a97', + mention: '@accent', + modalBg: 'rgba(0, 0, 0, 0.5)', + success: '#ebbcba', + buttonBg: 'rgba(255, 255, 255, 0.05)', + switchBg: 'rgba(255, 255, 255, 0.15)', + acrylicBg: ':alpha<0.5<@bg', + cwHoverBg: '#393552', + indicator: '@accent', + mentionMe: '@mention', + messageBg: '@bg', + navActive: '@accent', + accentedBg: ':alpha<0.15<@accent', + fgOnAccent: '#393552', + infoWarnBg: '#393552', + infoWarnFg: '#f6c177', + navHoverFg: ':lighten<17<@fg', + dateLabelFg: '@fg', + inputBorder: 'rgba(255, 255, 255, 0.1)', + panelBorder: '" solid 1px var(--divider)', + accentDarken: ':darken<10<@accent', + acrylicPanel: ':alpha<0.5<@panel', + navIndicator: '@indicator', + accentLighten: ':lighten<10<@accent', + buttonHoverBg: 'rgba(255, 255, 255, 0.1)', + driveFolderBg: ':alpha<0.3<@accent', + fgHighlighted: ':lighten<3<@fg', + fgTransparent: ':alpha<0.5<@fg', + panelHeaderBg: ':lighten<3<@panel', + panelHeaderFg: '@fg', + buttonGradateA: '@accent', + buttonGradateB: '#ea9a97', + htmlThemeColor: '@bg', + panelHighlight: ':lighten<3<@panel', + listItemHoverBg: 'rgba(255, 255, 255, 0.03)', + scrollbarHandle: 'rgba(255, 255, 255, 0.2)', + inputBorderHover: 'rgba(255, 255, 255, 0.2)', + wallpaperOverlay: 'rgba(0, 0, 0, 0.5)', + fgTransparentWeak: ':alpha<0.75<@fg', + panelHeaderDivider: 'rgba(0, 0, 0, 0)', + scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)', + }, + author: '@thatonecalculator@stop.voring.me', +} diff --git a/fe_calckey/frontend/client/src/themes/d-u0.json5 b/fe_calckey/frontend/client/src/themes/d-u0.json5 new file mode 100644 index 0000000..67c9235 --- /dev/null +++ b/fe_calckey/frontend/client/src/themes/d-u0.json5 @@ -0,0 +1,87 @@ +{ + id: '7a5bc13b-df8f-4d44-8e94-4452f0c634bb', + base: 'dark', + name: 'Mi U0 Dark', + props: { + X2: ':darken<2<@panel', + X3: 'rgba(255, 255, 255, 0.05)', + X4: 'rgba(255, 255, 255, 0.1)', + X5: 'rgba(255, 255, 255, 0.05)', + X6: 'rgba(255, 255, 255, 0.15)', + X7: 'rgba(255, 255, 255, 0.05)', + X8: ':lighten<5<@accent', + X9: ':darken<5<@accent', + bg: '#172426', + fg: '#dadada', + X10: ':alpha<0.4<@accent', + X11: 'rgba(0, 0, 0, 0.3)', + X12: 'rgba(255, 255, 255, 0.1)', + X13: 'rgba(255, 255, 255, 0.15)', + X14: ':alpha<0.5<@navBg', + X15: ':alpha<0<@panel', + X16: ':alpha<0.7<@panel', + X17: ':alpha<0.8<@bg', + cwBg: '#687390', + cwFg: '#393f4f', + link: '@accent', + warn: '#ecb637', + badge: '#31b1ce', + error: '#ec4137', + focus: ':alpha<0.3<@accent', + navBg: '@panel', + navFg: '@fg', + panel: ':lighten<3<@bg', + popup: ':lighten<3<@panel', + accent: '#00a497', + header: ':alpha<0.7<@panel', + infoBg: '#253142', + infoFg: '#fff', + renote: '@accent', + shadow: 'rgba(0, 0, 0, 0.3)', + divider: 'rgba(255, 255, 255, 0.1)', + hashtag: '#e6b422', + mention: '@accent', + modalBg: 'rgba(0, 0, 0, 0.5)', + success: '#86b300', + buttonBg: 'rgba(255, 255, 255, 0.05)', + switchBg: 'rgba(255, 255, 255, 0.15)', + acrylicBg: ':alpha<0.5<@bg', + cwHoverBg: '#707b97', + indicator: '@accent', + mentionMe: '@mention', + messageBg: '@bg', + navActive: '@accent', + accentedBg: ':alpha<0.15<@accent', + codeNumber: '#cfff9e', + codeString: '#ffb675', + fgOnAccent: '#fff', + infoWarnBg: '#42321c', + infoWarnFg: '#ffbd3e', + navHoverFg: ':lighten<17<@fg', + codeBoolean: '#c59eff', + dateLabelFg: '@fg', + inputBorder: 'rgba(255, 255, 255, 0.1)', + panelBorder: '" solid 1px var(--divider)', + accentDarken: ':darken<10<@accent', + acrylicPanel: ':alpha<0.5<@panel', + navIndicator: '@indicator', + accentLighten: ':lighten<10<@accent', + buttonHoverBg: 'rgba(255, 255, 255, 0.1)', + driveFolderBg: ':alpha<0.3<@accent', + fgHighlighted: ':lighten<3<@fg', + fgTransparent: ':alpha<0.5<@fg', + panelHeaderBg: ':lighten<3<@panel', + panelHeaderFg: '@fg', + buttonGradateA: '@accent', + buttonGradateB: ':hue<20<@accent', + htmlThemeColor: '@bg', + panelHighlight: ':lighten<3<@panel', + listItemHoverBg: 'rgba(255, 255, 255, 0.03)', + scrollbarHandle: 'rgba(255, 255, 255, 0.2)', + inputBorderHover: 'rgba(255, 255, 255, 0.2)', + wallpaperOverlay: 'rgba(0, 0, 0, 0.5)', + fgTransparentWeak: ':alpha<0.75<@fg', + panelHeaderDivider: 'rgba(0, 0, 0, 0)', + scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)', + }, +} diff --git a/fe_calckey/frontend/client/src/themes/l-apricot.json5 b/fe_calckey/frontend/client/src/themes/l-apricot.json5 new file mode 100644 index 0000000..1ed5525 --- /dev/null +++ b/fe_calckey/frontend/client/src/themes/l-apricot.json5 @@ -0,0 +1,22 @@ +{ + id: '0ff48d43-aab3-46e7-ab12-8492110d2e2b', + + name: 'Mi Apricot Light', + author: 'syuilo', + + base: 'light', + + props: { + accent: 'rgb(234, 154, 82)', + bg: '#e6e5e2', + fg: 'rgb(149, 143, 139)', + panel: '#EEECE8', + renote: '@accent', + link: '@accent', + mention: '@accent', + hashtag: '@accent', + inputBorder: 'rgba(0, 0, 0, 0.1)', + inputBorderHover: 'rgba(0, 0, 0, 0.2)', + infoBg: 'rgb(226, 235, 241)', + }, +} diff --git a/fe_calckey/frontend/client/src/themes/l-catppuccin-latte.json5 b/fe_calckey/frontend/client/src/themes/l-catppuccin-latte.json5 new file mode 100644 index 0000000..085e66d --- /dev/null +++ b/fe_calckey/frontend/client/src/themes/l-catppuccin-latte.json5 @@ -0,0 +1,94 @@ +{ + id: "169661d2-5a17-4dfc-b71b-9938cbbbed3e", + base: "light", + name: "Catppuccin Latte", + props: { + X2: ":darken<2<@panel", + X3: "rgba(255, 255, 255, 0.05)", + X4: "rgba(255, 255, 255, 0.1)", + X5: "rgba(255, 255, 255, 0.05)", + X6: "rgba(255, 255, 255, 0.15)", + X7: "rgba(255, 255, 255, 0.05)", + X8: ":lighten<5<@accent", + X9: ":darken<5<@accent", + bg: "#dce0e8", + fg: "#4c4f69", + X10: ":alpha<0.4<@accent", + X11: "rgba(0, 0, 0, 0.3)", + X12: "rgba(255, 255, 255, 0.1)", + X13: "rgba(255, 255, 255, 0.15)", + X14: ":alpha<0.5<@navBg", + X15: ":alpha<0<@panel", + X16: ":alpha<0.7<@panel", + X17: ":alpha<0.8<@bg", + cwBg: "#bcc0cc", + cwFg: "#5c5f77", + link: "#1e66f5", + warn: "#fe640b", + badge: "#1e66f5", + error: "#d20f39", + focus: ":alpha<0.3<@accent", + navBg: "@panel", + navFg: "@fg", + panel: ":lighten<3<@bg", + popup: ":lighten<3<@panel", + accent: "#8839ef", + header: ":alpha<0.7<@panel", + infoBg: "#ccd0da", + infoFg: "#6c6f85", + renote: "#1e66f5", + shadow: "rgba(0, 0, 0, 0.3)", + divider: "rgba(255, 255, 255, 0.1)", + hashtag: "#209fb5", + mention: "@accent", + modalBg: "rgba(0, 0, 0, 0.5)", + success: "#40a02b", + buttonBg: "rgba(255, 255, 255, 0.05)", + switchBg: "rgba(255, 255, 255, 0.15)", + acrylicBg: ":alpha<0.5<@bg", + cwHoverBg: "#acb0be", + indicator: "@accent", + mentionMe: "@mention", + messageBg: "@bg", + navActive: "@accent", + accentedBg: ":alpha<0.15<@accent", + codeNumber: "#40a02b", + codeString: "#fe640b", + fgOnAccent: "#eff1f5", + infoWarnBg: "#ccd0da", + infoWarnFg: "#5c5f77", + navHoverFg: ":lighten<17<@fg", + swutchOnBg: "@accentedBg", + swutchOnFg: "@accent", + codeBoolean: "@accent", + dateLabelFg: "@fg", + deckDivider: "#9ca0b0", + inputBorder: "rgba(255, 255, 255, 0.1)", + panelBorder: "solid 1px var(--divider)", + swutchOffBg: "rgba(255, 255, 255, 0.1)", + swutchOffFg: "@fg", + accentDarken: ":darken<10<@accent", + acrylicPanel: ":alpha<0.5<@panel", + navIndicator: "@indicator", + windowHeader: ":alpha<0.85<@panel", + accentLighten: ":lighten<10<@accent", + buttonHoverBg: "rgba(255, 255, 255, 0.1)", + driveFolderBg: ":alpha<0.3<@accent", + fgHighlighted: ":lighten<3<@fg", + fgTransparent: ":alpha<0.5<@fg", + panelHeaderBg: ":lighten<3<@panel", + panelHeaderFg: "@fg", + buttonGradateA: "@accent", + buttonGradateB: ":hue<20<@accent", + htmlThemeColor: "@bg", + panelHighlight: ":lighten<3<@panel", + listItemHoverBg: "rgba(255, 255, 255, 0.03)", + scrollbarHandle: "rgba(255, 255, 255, 0.2)", + inputBorderHover: "rgba(255, 255, 255, 0.2)", + wallpaperOverlay: "rgba(0, 0, 0, 0.5)", + fgTransparentWeak: ":alpha<0.75<@fg", + panelHeaderDivider: "rgba(0, 0, 0, 0)", + scrollbarHandleHover: "rgba(255, 255, 255, 0.4)", + }, + author: "somebody ¯_(ツ)_/¯", +} diff --git a/fe_calckey/frontend/client/src/themes/l-cherry.json5 b/fe_calckey/frontend/client/src/themes/l-cherry.json5 new file mode 100644 index 0000000..5ad2402 --- /dev/null +++ b/fe_calckey/frontend/client/src/themes/l-cherry.json5 @@ -0,0 +1,21 @@ +{ + id: 'ac168876-f737-4074-a3fc-a370c732ef48', + + name: 'Mi Cherry Light', + author: 'syuilo', + + base: 'light', + + props: { + accent: 'rgb(219, 96, 114)', + bg: 'rgb(254, 248, 249)', + fg: 'rgb(152, 13, 26)', + panel: 'rgb(255, 255, 255)', + renote: '@accent', + link: 'rgb(156, 187, 5)', + mention: '@accent', + hashtag: '@accent', + divider: 'rgba(134, 51, 51, 0.1)', + inputBorderHover: 'rgb(238, 221, 222)', + }, +} diff --git a/fe_calckey/frontend/client/src/themes/l-coffee.json5 b/fe_calckey/frontend/client/src/themes/l-coffee.json5 new file mode 100644 index 0000000..fbcd4fa --- /dev/null +++ b/fe_calckey/frontend/client/src/themes/l-coffee.json5 @@ -0,0 +1,21 @@ +{ + id: '6ed80faa-74f0-42c2-98e4-a64d9e138eab', + + name: 'Mi Coffee Light', + author: 'syuilo', + + base: 'light', + + props: { + accent: '#9f8989', + bg: '#f5f3f3', + fg: '#7f6666', + panel: '#fff', + divider: 'rgba(87, 68, 68, 0.1)', + renote: 'rgb(160, 172, 125)', + link: 'rgb(137, 151, 159)', + mention: '@accent', + mentionMe: 'rgb(170, 149, 98)', + hashtag: '@accent', + }, +} diff --git a/fe_calckey/frontend/client/src/themes/l-gruvbox.json5 b/fe_calckey/frontend/client/src/themes/l-gruvbox.json5 new file mode 100644 index 0000000..3e93aae --- /dev/null +++ b/fe_calckey/frontend/client/src/themes/l-gruvbox.json5 @@ -0,0 +1,30 @@ +{ + id: '9be7b20e-58b4-4bd2-8b1d-49d41a676685', + base: 'light', + desc: 'Misskey gruvbox-light-medium theme. Inspired by https://github.com/morhetz/gruvbox', + name: 'Gruvbox Light Medium', + props: { + bg: '#fbf1c7', + fg: '#3c3836', + link: '#b16286', + warn: '#d65d0e', + badge: '#458588', + error: '#fb4934', + navBg: '#f9f5c7', + panel: '#f9f5c7', + accent: '#98971a', + header: ':alpha<0.7<@panel', + renote: '@accent', + divider: '#7c6f64', + hashtag: '#458588', + mention: '#98971a', + success: '#98971a', + mentionMe: '#9d0006', + fgHighlighted: '#fbf1c7', + panelHeaderBg: '@panel', + buttonGradateA: '#98971a', + buttonGradateB: '#98971a', + panelHeaderDivider: '@divider', + }, + author: '@razzlom@quietplace.xyz', +} diff --git a/fe_calckey/frontend/client/src/themes/l-light.json5 b/fe_calckey/frontend/client/src/themes/l-light.json5 new file mode 100644 index 0000000..248355c --- /dev/null +++ b/fe_calckey/frontend/client/src/themes/l-light.json5 @@ -0,0 +1,20 @@ +{ + id: '4eea646f-7afa-4645-83e9-83af0333cd37', + + name: 'Mi Light', + author: 'syuilo', + desc: 'Default light theme', + + base: 'light', + + props: { + bg: '#f9f9f9', + fg: '#676767', + divider: '#e8e8e8', + header: ':alpha<0.7<@panel', + navBg: '#fff', + panel: '#fff', + panelHeaderDivider: '@divider', + mentionMe: 'rgb(0, 179, 70)', + }, +} diff --git a/fe_calckey/frontend/client/src/themes/l-nord.json5 b/fe_calckey/frontend/client/src/themes/l-nord.json5 new file mode 100644 index 0000000..e359f31 --- /dev/null +++ b/fe_calckey/frontend/client/src/themes/l-nord.json5 @@ -0,0 +1,94 @@ +{ + id: 'a4b1932e-740c-4ca4-b5d7-06e3322dced4', + base: 'light', + desc: 'Nord: an arctic, north-bluish color palette', + name: 'Nord Light', + props: { + X2: ':darken<2<@panel', + X3: 'rgba(255, 255, 255, 0.05)', + X4: 'rgba(255, 255, 255, 0.1)', + X5: 'rgba(255, 255, 255, 0.05)', + X6: 'rgba(255, 255, 255, 0.15)', + X7: 'rgba(255, 255, 255, 0.05)', + X8: ':lighten<5<@accent', + X9: ':darken<5<@accent', + bg: '#d8dee9', + fg: '#3b4252', + X10: ':alpha<0.4<@accent', + X11: 'rgba(0, 0, 0, 0.3)', + X12: 'rgba(255, 255, 255, 0.1)', + X13: 'rgba(255, 255, 255, 0.15)', + X14: ':alpha<0.5<@navBg', + X15: ':alpha<0<@panel', + X16: ':alpha<0.7<@panel', + X17: ':alpha<0.8<@bg', + cwBg: '#687390', + cwFg: '#393f4f', + link: '#44a4c1', + warn: '#ecb637', + badge: '#31b1ce', + error: '#ec4137', + focus: ':alpha<0.3<@accent', + navBg: '@panel', + navFg: '@fg', + panel: ':lighten<3<@bg', + popup: ':lighten<3<@panel', + accent: '#81a1c1', + header: ':alpha<0.7<@panel', + infoBg: '#253142', + infoFg: '#fff', + renote: '#229e82', + shadow: 'rgba(0, 0, 0, 0.3)', + divider: 'rgba(255, 255, 255, 0.1)', + hashtag: '#ff9156', + mention: '@accent', + modalBg: 'rgba(0, 0, 0, 0.5)', + success: '#86b300', + buttonBg: 'rgba(255, 255, 255, 0.05)', + switchBg: 'rgba(255, 255, 255, 0.15)', + acrylicBg: ':alpha<0.5<@bg', + cwHoverBg: '#707b97', + indicator: '@accent', + mentionMe: '@mention', + messageBg: '@bg', + navActive: '@accent', + accentedBg: ':alpha<0.15<@accent', + codeNumber: '#cfff9e', + codeString: '#ffb675', + fgOnAccent: '#fff', + infoWarnBg: '#42321c', + infoWarnFg: '#ffbd3e', + navHoverFg: ':lighten<17<@fg', + swutchOnBg: '@accentedBg', + swutchOnFg: '@accent', + codeBoolean: '#c59eff', + dateLabelFg: '@fg', + inputBorder: 'rgba(255, 255, 255, 0.1)', + panelBorder: '" solid 1px var(--divider)', + swutchOffBg: 'rgba(255, 255, 255, 0.1)', + swutchOffFg: '@fg', + accentDarken: ':darken<10<@accent', + acrylicPanel: ':alpha<0.5<@panel', + navIndicator: '@indicator', + windowHeader: ':alpha<0.85<@panel', + accentLighten: ':lighten<10<@accent', + buttonHoverBg: 'rgba(255, 255, 255, 0.1)', + driveFolderBg: ':alpha<0.3<@accent', + fgHighlighted: ':lighten<3<@fg', + fgTransparent: ':alpha<0.5<@fg', + panelHeaderBg: ':lighten<3<@panel', + panelHeaderFg: '@fg', + buttonGradateA: '@accent', + buttonGradateB: ':hue<20<@accent', + htmlThemeColor: '@bg', + panelHighlight: ':lighten<3<@panel', + listItemHoverBg: 'rgba(255, 255, 255, 0.03)', + scrollbarHandle: 'rgba(255, 255, 255, 0.2)', + inputBorderHover: 'rgba(255, 255, 255, 0.2)', + wallpaperOverlay: 'rgba(0, 0, 0, 0.5)', + fgTransparentWeak: ':alpha<0.75<@fg', + panelHeaderDivider: 'rgba(0, 0, 0, 0)', + scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)', + }, + author: '@thatonecalculator@stop.voring.me', +} diff --git a/fe_calckey/frontend/client/src/themes/l-rainy.json5 b/fe_calckey/frontend/client/src/themes/l-rainy.json5 new file mode 100644 index 0000000..283dd74 --- /dev/null +++ b/fe_calckey/frontend/client/src/themes/l-rainy.json5 @@ -0,0 +1,21 @@ +{ + id: 'a58a0abb-ff8c-476a-8dec-0ad7837e7e96', + + name: 'Mi Rainy Light', + author: 'syuilo', + + base: 'light', + + props: { + accent: '#5db0da', + bg: 'rgb(246 248 249)', + fg: '#636b71', + panel: '#fff', + divider: 'rgb(230 233 234)', + panelHeaderDivider: '@divider', + renote: '@accent', + link: '@accent', + mention: '@accent', + hashtag: '@accent', + }, +} diff --git a/fe_calckey/frontend/client/src/themes/l-rosepinedawn.json5 b/fe_calckey/frontend/client/src/themes/l-rosepinedawn.json5 new file mode 100644 index 0000000..d19eb59 --- /dev/null +++ b/fe_calckey/frontend/client/src/themes/l-rosepinedawn.json5 @@ -0,0 +1,89 @@ +{ + id: '919c91ac-c6fa-43dc-a423-3cc84fd67d7c', + base: 'light', + name: ' Rosé Pine Dawn', + description: 'Soho vibes for Misskey, dawn edition', + props: { + accent: '#286983', + accentDarken: ':darken<10<@accent', + accentLighten: ':lighten<10<@accent', + accentedBg: ':alpha<0.15<@accent', + focus: ':alpha<0.3<@accent', + bg: '#faf4ed', + acrylicBg: ':alpha<0.5<@bg', + fg: '#575279', + fgTransparentWeak: ':alpha<0.75<@fg', + fgTransparent: ':alpha<0.5<@fg', + fgHighlighted: ':darken<3<@fg', + fgOnAccent: '#fffaf3', + divider: 'rgba(0, 0, 0, 0.1)', + indicator: '@accent', + panel: ':lighten<3<@bg', + panelHighlight: ':darken<3<@panel', + panelHeaderBg: ':lighten<3<@panel', + panelHeaderFg: '@fg', + panelHeaderDivider: 'rgba(0, 0, 0, 0)', + panelBorder: '" solid 1px var(--divider)', + acrylicPanel: ':alpha<0.5<@panel', + popup: ':lighten<3<@panel', + shadow: 'rgba(0, 0, 0, 0.1)', + header: ':alpha<0.7<@panel', + navBg: '@panel', + navFg: '@fg', + navHoverFg: ':darken<17<@fg', + navActive: '@accent', + navIndicator: '@indicator', + link: '#56949f', + hashtag: '#ea9d34', + mention: '@accent', + mentionMe: '@mention', + renote: '#56949f', + modalBg: 'rgba(0, 0, 0, 0.3)', + scrollbarHandle: 'rgba(0, 0, 0, 0.2)', + scrollbarHandleHover: 'rgba(0, 0, 0, 0.4)', + dateLabelFg: '@fg', + infoBg: '#f2e9e1', + infoFg: '#ea9d34', + infoWarnBg: '#f2e9e1', + infoWarnFg: '#b4637a', + switchBg: 'rgba(0, 0, 0, 0.15)', + cwBg: '#b4637a', + cwFg: '#faf4ed', + cwHoverBg: '#d7827e', + buttonBg: 'rgba(0, 0, 0, 0.05)', + buttonHoverBg: 'rgba(0, 0, 0, 0.1)', + buttonGradateA: '#d7827e', + buttonGradateB: ':hue<20<#d7827e', + inputBorder: 'rgba(0, 0, 0, 0.1)', + inputBorderHover: 'rgba(0, 0, 0, 0.2)', + listItemHoverBg: 'rgba(0, 0, 0, 0.03)', + driveFolderBg: ':alpha<0.3<@accent', + wallpaperOverlay: 'rgba(255, 255, 255, 0.5)', + badge: '#31b1ce', + messageBg: '@bg', + success: '#907aa9', + error: '#b4637a', + warn: '#ea9d34', + codeString: '#b98710', + codeNumber: '#0fbbbb', + codeBoolean: '#62b70c', + htmlThemeColor: '@bg', + X2: ':darken<2<@panel', + X3: 'rgba(0, 0, 0, 0.05)', + X4: 'rgba(0, 0, 0, 0.1)', + X5: 'rgba(0, 0, 0, 0.05)', + X6: 'rgba(0, 0, 0, 0.25)', + X7: 'rgba(0, 0, 0, 0.05)', + X8: ':lighten<5<@accent', + X9: ':darken<5<@accent', + X10: ':alpha<0.4<@accent', + X11: 'rgba(0, 0, 0, 0.1)', + X12: 'rgba(0, 0, 0, 0.1)', + X13: 'rgba(0, 0, 0, 0.15)', + X14: ':alpha<0.5<@navBg', + X15: ':alpha<0<@panel', + X16: ':alpha<0.7<@panel', + X17: ':alpha<0.8<@bg', + }, + author: '@thatonecalculator@stop.voring.me', +} diff --git a/fe_calckey/frontend/client/src/themes/l-sushi.json5 b/fe_calckey/frontend/client/src/themes/l-sushi.json5 new file mode 100644 index 0000000..5846927 --- /dev/null +++ b/fe_calckey/frontend/client/src/themes/l-sushi.json5 @@ -0,0 +1,18 @@ +{ + id: '213273e5-7d20-d5f0-6e36-1b6a4f67115c', + + name: 'Mi Sushi Light', + author: 'syuilo', + + base: 'light', + + props: { + accent: '#e36749', + bg: '#f0eee9', + fg: '#5f5f5f', + renote: '@accent', + link: '@accent', + mention: '@accent', + hashtag: '#229e82', + }, +} diff --git a/fe_calckey/frontend/client/src/themes/l-u0.json5 b/fe_calckey/frontend/client/src/themes/l-u0.json5 new file mode 100644 index 0000000..03b114b --- /dev/null +++ b/fe_calckey/frontend/client/src/themes/l-u0.json5 @@ -0,0 +1,87 @@ +{ + id: 'e2c940b5-6e9a-4c03-b738-261c720c426d', + base: 'light', + name: 'Mi U0 Light', + props: { + X2: ':darken<2<@panel', + X3: 'rgba(255, 255, 255, 0.05)', + X4: 'rgba(255, 255, 255, 0.1)', + X5: 'rgba(255, 255, 255, 0.05)', + X6: 'rgba(255, 255, 255, 0.15)', + X7: 'rgba(255, 255, 255, 0.05)', + X8: ':lighten<5<@accent', + X9: ':darken<5<@accent', + bg: '#e7e7eb', + fg: '#5f5f5f', + X10: ':alpha<0.4<@accent', + X11: 'rgba(0, 0, 0, 0.3)', + X12: 'rgba(255, 255, 255, 0.1)', + X13: 'rgba(255, 255, 255, 0.15)', + X14: ':alpha<0.5<@navBg', + X15: ':alpha<0<@panel', + X16: ':alpha<0.7<@panel', + X17: ':alpha<0.8<@bg', + cwBg: '#687390', + cwFg: '#393f4f', + link: '@accent', + warn: '#ecb637', + badge: '#31b1ce', + error: '#ec4137', + focus: ':alpha<0.3<@accent', + navBg: '@panel', + navFg: '@fg', + panel: ':lighten<3<@bg', + popup: ':lighten<3<@panel', + accent: '#478384', + header: ':alpha<0.7<@panel', + infoBg: '#253142', + infoFg: '#fff', + renote: '@accent', + shadow: 'rgba(0, 0, 0, 0.3)', + divider: '#4646461a', + hashtag: '#1f3134', + mention: '@accent', + modalBg: 'rgba(0, 0, 0, 0.5)', + success: '#86b300', + buttonBg: '#0000000d', + switchBg: 'rgba(255, 255, 255, 0.15)', + acrylicBg: ':alpha<0.5<@bg', + cwHoverBg: '#707b97', + indicator: '@accent', + mentionMe: '@mention', + messageBg: '@bg', + navActive: '@accent', + accentedBg: ':alpha<0.15<@accent', + codeNumber: '#cfff9e', + codeString: '#ffb675', + fgOnAccent: '#fff', + infoWarnBg: '#42321c', + infoWarnFg: '#ffbd3e', + navHoverFg: ':lighten<17<@fg', + codeBoolean: '#c59eff', + dateLabelFg: '@fg', + inputBorder: 'rgba(255, 255, 255, 0.1)', + panelBorder: '" solid 1px var(--divider)', + accentDarken: ':darken<10<@accent', + acrylicPanel: ':alpha<0.5<@panel', + navIndicator: '@indicator', + accentLighten: ':lighten<10<@accent', + buttonHoverBg: '#0000001a', + driveFolderBg: ':alpha<0.3<@accent', + fgHighlighted: ':lighten<3<@fg', + fgTransparent: ':alpha<0.5<@fg', + panelHeaderBg: ':lighten<3<@panel', + panelHeaderFg: '@fg', + buttonGradateA: '@accent', + buttonGradateB: ':hue<20<@accent', + htmlThemeColor: '@bg', + panelHighlight: ':lighten<3<@panel', + listItemHoverBg: 'rgba(255, 255, 255, 0.03)', + scrollbarHandle: '#74747433', + inputBorderHover: 'rgba(255, 255, 255, 0.2)', + wallpaperOverlay: 'rgba(0, 0, 0, 0.5)', + fgTransparentWeak: ':alpha<0.75<@fg', + panelHeaderDivider: 'rgba(0, 0, 0, 0)', + scrollbarHandleHover: 'rgba(255, 255, 255, 0.4)', + }, +} diff --git a/fe_calckey/frontend/client/src/themes/l-vivid.json5 b/fe_calckey/frontend/client/src/themes/l-vivid.json5 new file mode 100644 index 0000000..b3c08f3 --- /dev/null +++ b/fe_calckey/frontend/client/src/themes/l-vivid.json5 @@ -0,0 +1,82 @@ +{ + id: '6128c2a9-5c54-43fe-a47d-17942356470b', + + name: 'Mi Vivid Light', + author: 'syuilo', + + base: 'light', + + props: { + bg: '#fafafa', + fg: '#444', + cwBg: '#b1b9c1', + cwFg: '#fff', + link: '#ff9400', + warn: '#ecb637', + badge: '#31b1ce', + error: '#ec4137', + focus: ':alpha<0.3<@accent', + navBg: '@panel', + navFg: '@fg', + panel: '#fff', + accent: '#008cff', + header: ':alpha<0.7<@panel', + infoBg: '#e5f5ff', + infoFg: '#72818a', + renote: '@accent', + shadow: 'rgba(0, 0, 0, 0.1)', + divider: 'rgba(0, 0, 0, 0.08)', + hashtag: '#92d400', + mention: '@accent', + modalBg: 'rgba(0, 0, 0, 0.3)', + success: '#86b300', + buttonBg: 'rgba(0, 0, 0, 0.05)', + acrylicBg: ':alpha<0.5<@bg', + cwHoverBg: '#bbc4ce', + indicator: '@accent', + mentionMe: '@mention', + messageBg: '@bg', + navActive: '@accent', + infoWarnBg: '#fff0db', + infoWarnFg: '#8f6e31', + navHoverFg: ':darken<17<@fg', + dateLabelFg: '@fg', + inputBorder: 'rgba(0, 0, 0, 0.1)', + inputBorderHover: 'rgba(0, 0, 0, 0.2)', + panelBorder: '" solid 1px var(--divider)', + accentDarken: ':darken<10<@accent', + acrylicPanel: ':alpha<0.5<@panel', + navIndicator: '@accent', + accentLighten: ':lighten<10<@accent', + buttonHoverBg: 'rgba(0, 0, 0, 0.1)', + driveFolderBg: ':alpha<0.3<@accent', + fgHighlighted: ':darken<3<@fg', + fgTransparent: ':alpha<0.5<@fg', + panelHeaderBg: ':lighten<3<@panel', + panelHeaderFg: '@fg', + htmlThemeColor: '@bg', + panelHighlight: ':darken<3<@panel', + listItemHoverBg: 'rgba(0, 0, 0, 0.03)', + scrollbarHandle: 'rgba(0, 0, 0, 0.2)', + wallpaperOverlay: 'rgba(255, 255, 255, 0.5)', + fgTransparentWeak: ':alpha<0.75<@fg', + panelHeaderDivider: '@divider', + scrollbarHandleHover: 'rgba(0, 0, 0, 0.4)', + X2: ':darken<2<@panel', + X3: 'rgba(0, 0, 0, 0.05)', + X4: 'rgba(0, 0, 0, 0.1)', + X5: 'rgba(0, 0, 0, 0.05)', + X6: 'rgba(0, 0, 0, 0.25)', + X7: 'rgba(0, 0, 0, 0.05)', + X8: ':lighten<5<@accent', + X9: ':darken<5<@accent', + X10: ':alpha<0.4<@accent', + X11: 'rgba(0, 0, 0, 0.1)', + X12: 'rgba(0, 0, 0, 0.1)', + X13: 'rgba(0, 0, 0, 0.15)', + X14: ':alpha<0.5<@navBg', + X15: ':alpha<0<@panel', + X16: ':alpha<0.7<@panel', + X17: ':alpha<0.8<@bg', + }, +} diff --git a/fe_calckey/frontend/client/src/types/menu.ts b/fe_calckey/frontend/client/src/types/menu.ts new file mode 100644 index 0000000..115eb48 --- /dev/null +++ b/fe_calckey/frontend/client/src/types/menu.ts @@ -0,0 +1,93 @@ +import * as Misskey from "calckey-js"; +import { Ref } from "vue"; + +export type MenuAction = (ev: MouseEvent) => void; + +export type MenuDivider = null; +export type MenuNull = undefined; +export type MenuLabel = { + type: "label"; + text: string; + textStyle?: string; +}; +export type MenuLink = { + type: "link"; + to: string; + text: string; + textStyle?: string; + icon?: string; + indicate?: boolean; + avatar?: Misskey.entities.User; +}; +export type MenuA = { + type: "a"; + href: string; + target?: string; + download?: string; + text: string; + textStyle?: string; + icon?: string; + indicate?: boolean; +}; +export type MenuUser = { + type: "user"; + user: Misskey.entities.User; + active?: boolean; + indicate?: boolean; + hidden?: boolean; + action: MenuAction; +}; +export type MenuSwitch = { + type: "switch"; + ref: Ref; + text: string; + textStyle?: string; + disabled?: boolean; +}; +export type MenuButton = { + type?: "button"; + text: string; + textStyle?: string; + icon?: string; + indicate?: boolean; + danger?: boolean; + accent?: boolean; + active?: boolean; + hidden?: boolean; + avatar?: Misskey.entities.User; + action: MenuAction; +}; +export type MenuParent = { + type: "parent"; + text: string; + textStyle?: string; + icon?: string; + children: OuterMenuItem[]; +}; + +export type MenuPending = { type: "pending" }; + +type OuterMenuItem = + | MenuDivider + | MenuNull + | MenuLabel + | MenuLink + | MenuA + | MenuUser + | MenuSwitch + | MenuButton + | MenuParent; +type OuterPromiseMenuItem = Promise< + MenuLabel | MenuLink | MenuA | MenuUser | MenuSwitch | MenuButton | MenuParent +>; +export type MenuItem = OuterMenuItem | OuterPromiseMenuItem; +export type InnerMenuItem = + | MenuDivider + | MenuPending + | MenuLabel + | MenuLink + | MenuA + | MenuUser + | MenuSwitch + | MenuButton + | MenuParent; diff --git a/fe_calckey/frontend/client/src/ui/_common_/common.vue b/fe_calckey/frontend/client/src/ui/_common_/common.vue new file mode 100644 index 0000000..c47b0f8 --- /dev/null +++ b/fe_calckey/frontend/client/src/ui/_common_/common.vue @@ -0,0 +1,128 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/ui/_common_/navbar-for-mobile.vue b/fe_calckey/frontend/client/src/ui/_common_/navbar-for-mobile.vue new file mode 100644 index 0000000..39abb7c --- /dev/null +++ b/fe_calckey/frontend/client/src/ui/_common_/navbar-for-mobile.vue @@ -0,0 +1,382 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/ui/_common_/navbar.vue b/fe_calckey/frontend/client/src/ui/_common_/navbar.vue new file mode 100644 index 0000000..7905c33 --- /dev/null +++ b/fe_calckey/frontend/client/src/ui/_common_/navbar.vue @@ -0,0 +1,647 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/ui/_common_/statusbar-federation.vue b/fe_calckey/frontend/client/src/ui/_common_/statusbar-federation.vue new file mode 100644 index 0000000..2bb06bc --- /dev/null +++ b/fe_calckey/frontend/client/src/ui/_common_/statusbar-federation.vue @@ -0,0 +1,132 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/ui/_common_/statusbar-rss.vue b/fe_calckey/frontend/client/src/ui/_common_/statusbar-rss.vue new file mode 100644 index 0000000..606f3f1 --- /dev/null +++ b/fe_calckey/frontend/client/src/ui/_common_/statusbar-rss.vue @@ -0,0 +1,105 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/ui/_common_/statusbar-user-list.vue b/fe_calckey/frontend/client/src/ui/_common_/statusbar-user-list.vue new file mode 100644 index 0000000..f32b7f8 --- /dev/null +++ b/fe_calckey/frontend/client/src/ui/_common_/statusbar-user-list.vue @@ -0,0 +1,128 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/ui/_common_/statusbars.vue b/fe_calckey/frontend/client/src/ui/_common_/statusbars.vue new file mode 100644 index 0000000..bef6131 --- /dev/null +++ b/fe_calckey/frontend/client/src/ui/_common_/statusbars.vue @@ -0,0 +1,127 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/ui/_common_/stream-indicator.vue b/fe_calckey/frontend/client/src/ui/_common_/stream-indicator.vue new file mode 100644 index 0000000..a3d0629 --- /dev/null +++ b/fe_calckey/frontend/client/src/ui/_common_/stream-indicator.vue @@ -0,0 +1,70 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/ui/_common_/sw-inject.ts b/fe_calckey/frontend/client/src/ui/_common_/sw-inject.ts new file mode 100644 index 0000000..5108774 --- /dev/null +++ b/fe_calckey/frontend/client/src/ui/_common_/sw-inject.ts @@ -0,0 +1,35 @@ +import { inject } from "vue"; +import { post } from "@/os"; +import { $i, login } from "@/account"; +import { defaultStore } from "@/store"; +import { getAccountFromId } from "@/scripts/get-account-from-id"; +import { mainRouter } from "@/router"; + +export function swInject() { + navigator.serviceWorker.addEventListener("message", (ev) => { + if (_DEV_) { + console.log("sw msg", ev.data); + } + + if (ev.data.type !== "order") return; + + if (ev.data.loginId !== $i?.id) { + return getAccountFromId(ev.data.loginId).then((account) => { + if (!account) return; + return login(account.token, ev.data.url); + }); + } + + switch (ev.data.order) { + case "post": + return post(ev.data.options); + case "push": + if (mainRouter.currentRoute.value.path === ev.data.url) { + return window.scroll({ top: 0, behavior: "smooth" }); + } + return mainRouter.push(ev.data.url); + default: + return; + } + }); +} diff --git a/fe_calckey/frontend/client/src/ui/_common_/upload.vue b/fe_calckey/frontend/client/src/ui/_common_/upload.vue new file mode 100644 index 0000000..0fde3aa --- /dev/null +++ b/fe_calckey/frontend/client/src/ui/_common_/upload.vue @@ -0,0 +1,168 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/ui/deck.vue b/fe_calckey/frontend/client/src/ui/deck.vue new file mode 100644 index 0000000..270a92a --- /dev/null +++ b/fe_calckey/frontend/client/src/ui/deck.vue @@ -0,0 +1,598 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/ui/deck/antenna-column.vue b/fe_calckey/frontend/client/src/ui/deck/antenna-column.vue new file mode 100644 index 0000000..958a807 --- /dev/null +++ b/fe_calckey/frontend/client/src/ui/deck/antenna-column.vue @@ -0,0 +1,85 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/ui/deck/channel-column.vue b/fe_calckey/frontend/client/src/ui/deck/channel-column.vue new file mode 100644 index 0000000..b6f1433 --- /dev/null +++ b/fe_calckey/frontend/client/src/ui/deck/channel-column.vue @@ -0,0 +1,73 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/ui/deck/column-core.vue b/fe_calckey/frontend/client/src/ui/deck/column-core.vue new file mode 100644 index 0000000..23a7683 --- /dev/null +++ b/fe_calckey/frontend/client/src/ui/deck/column-core.vue @@ -0,0 +1,81 @@ + + + diff --git a/fe_calckey/frontend/client/src/ui/deck/column.vue b/fe_calckey/frontend/client/src/ui/deck/column.vue new file mode 100644 index 0000000..dcf94b3 --- /dev/null +++ b/fe_calckey/frontend/client/src/ui/deck/column.vue @@ -0,0 +1,472 @@ + + + + + + + diff --git a/fe_calckey/frontend/client/src/ui/deck/deck-store.ts b/fe_calckey/frontend/client/src/ui/deck/deck-store.ts new file mode 100644 index 0000000..a6db02a --- /dev/null +++ b/fe_calckey/frontend/client/src/ui/deck/deck-store.ts @@ -0,0 +1,334 @@ +import { throttle } from "throttle-debounce"; +import { markRaw } from "vue"; +import { notificationTypes } from "calckey-js"; +import { Storage } from "../../pizzax"; +import { i18n } from "@/i18n"; +import { api } from "@/os"; +import { deepClone } from "@/scripts/clone"; + +type ColumnWidget = { + name: string; + id: string; + data: Record; +}; + +export type Column = { + id: string; + type: + | "main" + | "widgets" + | "notifications" + | "tl" + | "antenna" + | "list" + | "mentions" + | "direct"; + name: string | null; + width: number; + widgets?: ColumnWidget[]; + active?: boolean; + flexible?: boolean; + antennaId?: string; + listId?: string; + includingTypes?: typeof notificationTypes[number][]; + tl?: "home" | "local" | "social" | "global"; +}; + +export const deckStore = markRaw( + new Storage("deck", { + profile: { + where: "deviceAccount", + default: "default", + }, + columns: { + where: "deviceAccount", + default: [] as Column[], + }, + layout: { + where: "deviceAccount", + default: [] as Column["id"][][], + }, + columnAlign: { + where: "deviceAccount", + default: "left" as "left" | "right" | "center", + }, + alwaysShowMainColumn: { + where: "deviceAccount", + default: true, + }, + navWindow: { + where: "deviceAccount", + default: true, + }, + }), +); + +export const loadDeck = async () => { + let deck; + + try { + deck = await api("i/registry/get", { + scope: ["client", "deck", "profiles"], + key: deckStore.state.profile, + }); + } catch (err) { + if (err.code === "NO_SUCH_KEY") { + // 後方互換性のため + if (deckStore.state.profile === "default") { + saveDeck(); + return; + } + + deckStore.set("columns", []); + deckStore.set("layout", []); + return; + } + throw err; + } + + deckStore.set("columns", deck.columns); + deckStore.set("layout", deck.layout); +}; + +// TODO: deckがloadされていない状態でsaveすると意図せず上書きが発生するので対策する +export const saveDeck = throttle(1000, () => { + api("i/registry/set", { + scope: ["client", "deck", "profiles"], + key: deckStore.state.profile, + value: { + columns: deckStore.reactiveState.columns.value, + layout: deckStore.reactiveState.layout.value, + }, + }); +}); + +export async function getProfiles(): Promise { + return await api("i/registry/keys", { + scope: ["client", "deck", "profiles"], + }); +} + +export async function deleteProfile(key: string): Promise { + return await api("i/registry/remove", { + scope: ["client", "deck", "profiles"], + key: key, + }); +} + +export async function renameProfile(oldKey: string, newKey: string) { + if (oldKey === newKey) return; + + await api("i/registry/set", { + scope: ["client", "deck", "profiles"], + key: newKey, + value: { columns: deckStore.state.columns, layout: deckStore.state.layout }, + }); + deckStore.set("profile", newKey); + saveDeck(); + + deleteProfile(oldKey); +} + +export function addColumn(column: Column) { + if (column.name === undefined) column.name = null; + deckStore.push("columns", column); + deckStore.push("layout", [column.id]); + saveDeck(); +} + +export function removeColumn(id: Column["id"]) { + deckStore.set( + "columns", + deckStore.state.columns.filter((c) => c.id !== id), + ); + deckStore.set( + "layout", + deckStore.state.layout + .map((ids) => ids.filter((_id) => _id !== id)) + .filter((ids) => ids.length > 0), + ); + saveDeck(); +} + +export function swapColumn(a: Column["id"], b: Column["id"]) { + const aX = deckStore.state.layout.findIndex((ids) => ids.indexOf(a) !== -1); + const aY = deckStore.state.layout[aX].findIndex((id) => id === a); + const bX = deckStore.state.layout.findIndex((ids) => ids.indexOf(b) !== -1); + const bY = deckStore.state.layout[bX].findIndex((id) => id === b); + const layout = deepClone(deckStore.state.layout); + layout[aX][aY] = b; + layout[bX][bY] = a; + deckStore.set("layout", layout); + saveDeck(); +} + +export function swapLeftColumn(id: Column["id"]) { + const layout = deepClone(deckStore.state.layout); + deckStore.state.layout.some((ids, i) => { + if (ids.includes(id)) { + const left = deckStore.state.layout[i - 1]; + if (left) { + layout[i - 1] = deckStore.state.layout[i]; + layout[i] = left; + deckStore.set("layout", layout); + } + return true; + } + }); + saveDeck(); +} + +export function swapRightColumn(id: Column["id"]) { + const layout = deepClone(deckStore.state.layout); + deckStore.state.layout.some((ids, i) => { + if (ids.includes(id)) { + const right = deckStore.state.layout[i + 1]; + if (right) { + layout[i + 1] = deckStore.state.layout[i]; + layout[i] = right; + deckStore.set("layout", layout); + } + return true; + } + }); + saveDeck(); +} + +export function swapUpColumn(id: Column["id"]) { + const layout = deepClone(deckStore.state.layout); + const idsIndex = deckStore.state.layout.findIndex((ids) => ids.includes(id)); + const ids = deepClone(deckStore.state.layout[idsIndex]); + ids.some((x, i) => { + if (x === id) { + const up = ids[i - 1]; + if (up) { + ids[i - 1] = id; + ids[i] = up; + + layout[idsIndex] = ids; + deckStore.set("layout", layout); + } + return true; + } + }); + saveDeck(); +} + +export function swapDownColumn(id: Column["id"]) { + const layout = deepClone(deckStore.state.layout); + const idsIndex = deckStore.state.layout.findIndex((ids) => ids.includes(id)); + const ids = deepClone(deckStore.state.layout[idsIndex]); + ids.some((x, i) => { + if (x === id) { + const down = ids[i + 1]; + if (down) { + ids[i + 1] = id; + ids[i] = down; + + layout[idsIndex] = ids; + deckStore.set("layout", layout); + } + return true; + } + }); + saveDeck(); +} + +export function stackLeftColumn(id: Column["id"]) { + let layout = deepClone(deckStore.state.layout); + const i = deckStore.state.layout.findIndex((ids) => ids.includes(id)); + layout = layout.map((ids) => ids.filter((_id) => _id !== id)); + layout[i - 1].push(id); + layout = layout.filter((ids) => ids.length > 0); + deckStore.set("layout", layout); + saveDeck(); +} + +export function popRightColumn(id: Column["id"]) { + let layout = deepClone(deckStore.state.layout); + const i = deckStore.state.layout.findIndex((ids) => ids.includes(id)); + const affected = layout[i]; + layout = layout.map((ids) => ids.filter((_id) => _id !== id)); + layout.splice(i + 1, 0, [id]); + layout = layout.filter((ids) => ids.length > 0); + deckStore.set("layout", layout); + + const columns = deepClone(deckStore.state.columns); + for (const column of columns) { + if (affected.includes(column.id)) { + column.active = true; + } + } + deckStore.set("columns", columns); + + saveDeck(); +} + +export function addColumnWidget(id: Column["id"], widget: ColumnWidget) { + const columns = deepClone(deckStore.state.columns); + const columnIndex = deckStore.state.columns.findIndex((c) => c.id === id); + const column = deepClone(deckStore.state.columns[columnIndex]); + if (column == null) return; + if (column.widgets == null) column.widgets = []; + column.widgets.unshift(widget); + columns[columnIndex] = column; + deckStore.set("columns", columns); + saveDeck(); +} + +export function removeColumnWidget(id: Column["id"], widget: ColumnWidget) { + const columns = deepClone(deckStore.state.columns); + const columnIndex = deckStore.state.columns.findIndex((c) => c.id === id); + const column = deepClone(deckStore.state.columns[columnIndex]); + if (column == null) return; + column.widgets = column.widgets.filter((w) => w.id !== widget.id); + columns[columnIndex] = column; + deckStore.set("columns", columns); + saveDeck(); +} + +export function setColumnWidgets(id: Column["id"], widgets: ColumnWidget[]) { + const columns = deepClone(deckStore.state.columns); + const columnIndex = deckStore.state.columns.findIndex((c) => c.id === id); + const column = deepClone(deckStore.state.columns[columnIndex]); + if (column == null) return; + column.widgets = widgets; + columns[columnIndex] = column; + deckStore.set("columns", columns); + saveDeck(); +} + +export function updateColumnWidget( + id: Column["id"], + widgetId: string, + widgetData: any, +) { + const columns = deepClone(deckStore.state.columns); + const columnIndex = deckStore.state.columns.findIndex((c) => c.id === id); + const column = deepClone(deckStore.state.columns[columnIndex]); + if (column == null) return; + column.widgets = column.widgets.map((w) => + w.id === widgetId + ? { + ...w, + data: widgetData, + } + : w, + ); + columns[columnIndex] = column; + deckStore.set("columns", columns); + saveDeck(); +} + +export function updateColumn(id: Column["id"], column: Partial) { + const columns = deepClone(deckStore.state.columns); + const columnIndex = deckStore.state.columns.findIndex((c) => c.id === id); + const currentColumn = deepClone(deckStore.state.columns[columnIndex]); + if (currentColumn == null) return; + for (const [k, v] of Object.entries(column)) { + currentColumn[k] = v; + } + columns[columnIndex] = currentColumn; + deckStore.set("columns", columns); + saveDeck(); +} diff --git a/fe_calckey/frontend/client/src/ui/deck/direct-column.vue b/fe_calckey/frontend/client/src/ui/deck/direct-column.vue new file mode 100644 index 0000000..67ebca1 --- /dev/null +++ b/fe_calckey/frontend/client/src/ui/deck/direct-column.vue @@ -0,0 +1,41 @@ + + + diff --git a/fe_calckey/frontend/client/src/ui/deck/list-column.vue b/fe_calckey/frontend/client/src/ui/deck/list-column.vue new file mode 100644 index 0000000..82bf58f --- /dev/null +++ b/fe_calckey/frontend/client/src/ui/deck/list-column.vue @@ -0,0 +1,73 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/ui/deck/main-column.vue b/fe_calckey/frontend/client/src/ui/deck/main-column.vue new file mode 100644 index 0000000..357395a --- /dev/null +++ b/fe_calckey/frontend/client/src/ui/deck/main-column.vue @@ -0,0 +1,92 @@ + + + diff --git a/fe_calckey/frontend/client/src/ui/deck/mentions-column.vue b/fe_calckey/frontend/client/src/ui/deck/mentions-column.vue new file mode 100644 index 0000000..83eff72 --- /dev/null +++ b/fe_calckey/frontend/client/src/ui/deck/mentions-column.vue @@ -0,0 +1,35 @@ + + + diff --git a/fe_calckey/frontend/client/src/ui/deck/notifications-column.vue b/fe_calckey/frontend/client/src/ui/deck/notifications-column.vue new file mode 100644 index 0000000..d003f08 --- /dev/null +++ b/fe_calckey/frontend/client/src/ui/deck/notifications-column.vue @@ -0,0 +1,62 @@ + + + diff --git a/fe_calckey/frontend/client/src/ui/deck/tl-column.vue b/fe_calckey/frontend/client/src/ui/deck/tl-column.vue new file mode 100644 index 0000000..7e801dc --- /dev/null +++ b/fe_calckey/frontend/client/src/ui/deck/tl-column.vue @@ -0,0 +1,164 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/ui/deck/widgets-column.vue b/fe_calckey/frontend/client/src/ui/deck/widgets-column.vue new file mode 100644 index 0000000..8bfd40c --- /dev/null +++ b/fe_calckey/frontend/client/src/ui/deck/widgets-column.vue @@ -0,0 +1,99 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/ui/universal.vue b/fe_calckey/frontend/client/src/ui/universal.vue new file mode 100644 index 0000000..0a7f4e6 --- /dev/null +++ b/fe_calckey/frontend/client/src/ui/universal.vue @@ -0,0 +1,742 @@ + + + + + + + diff --git a/fe_calckey/frontend/client/src/ui/universal.widgets.vue b/fe_calckey/frontend/client/src/ui/universal.widgets.vue new file mode 100644 index 0000000..d931e1b --- /dev/null +++ b/fe_calckey/frontend/client/src/ui/universal.widgets.vue @@ -0,0 +1,105 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/ui/visitor.vue b/fe_calckey/frontend/client/src/ui/visitor.vue new file mode 100644 index 0000000..a008134 --- /dev/null +++ b/fe_calckey/frontend/client/src/ui/visitor.vue @@ -0,0 +1,20 @@ + + + diff --git a/fe_calckey/frontend/client/src/ui/visitor/a.vue b/fe_calckey/frontend/client/src/ui/visitor/a.vue new file mode 100644 index 0000000..159c0e1 --- /dev/null +++ b/fe_calckey/frontend/client/src/ui/visitor/a.vue @@ -0,0 +1,302 @@ + + + + + + + diff --git a/fe_calckey/frontend/client/src/ui/visitor/b.vue b/fe_calckey/frontend/client/src/ui/visitor/b.vue new file mode 100644 index 0000000..335e9bf --- /dev/null +++ b/fe_calckey/frontend/client/src/ui/visitor/b.vue @@ -0,0 +1,294 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/ui/visitor/header.vue b/fe_calckey/frontend/client/src/ui/visitor/header.vue new file mode 100644 index 0000000..dbeeb3d --- /dev/null +++ b/fe_calckey/frontend/client/src/ui/visitor/header.vue @@ -0,0 +1,310 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/ui/visitor/kanban.vue b/fe_calckey/frontend/client/src/ui/visitor/kanban.vue new file mode 100644 index 0000000..1e25d08 --- /dev/null +++ b/fe_calckey/frontend/client/src/ui/visitor/kanban.vue @@ -0,0 +1,313 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/ui/zen.vue b/fe_calckey/frontend/client/src/ui/zen.vue new file mode 100644 index 0000000..cb2354a --- /dev/null +++ b/fe_calckey/frontend/client/src/ui/zen.vue @@ -0,0 +1,39 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/widgets/activity.calendar.vue b/fe_calckey/frontend/client/src/widgets/activity.calendar.vue new file mode 100644 index 0000000..4a6d3cf --- /dev/null +++ b/fe_calckey/frontend/client/src/widgets/activity.calendar.vue @@ -0,0 +1,102 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/widgets/activity.chart.vue b/fe_calckey/frontend/client/src/widgets/activity.chart.vue new file mode 100644 index 0000000..d854ec7 --- /dev/null +++ b/fe_calckey/frontend/client/src/widgets/activity.chart.vue @@ -0,0 +1,118 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/widgets/activity.vue b/fe_calckey/frontend/client/src/widgets/activity.vue new file mode 100644 index 0000000..66826f5 --- /dev/null +++ b/fe_calckey/frontend/client/src/widgets/activity.vue @@ -0,0 +1,125 @@ + + + diff --git a/fe_calckey/frontend/client/src/widgets/aiscript.vue b/fe_calckey/frontend/client/src/widgets/aiscript.vue new file mode 100644 index 0000000..78a30a1 --- /dev/null +++ b/fe_calckey/frontend/client/src/widgets/aiscript.vue @@ -0,0 +1,206 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/widgets/button.vue b/fe_calckey/frontend/client/src/widgets/button.vue new file mode 100644 index 0000000..9e524f2 --- /dev/null +++ b/fe_calckey/frontend/client/src/widgets/button.vue @@ -0,0 +1,113 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/widgets/calendar.vue b/fe_calckey/frontend/client/src/widgets/calendar.vue new file mode 100644 index 0000000..655308d --- /dev/null +++ b/fe_calckey/frontend/client/src/widgets/calendar.vue @@ -0,0 +1,235 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/widgets/clock.vue b/fe_calckey/frontend/client/src/widgets/clock.vue new file mode 100644 index 0000000..60b90a4 --- /dev/null +++ b/fe_calckey/frontend/client/src/widgets/clock.vue @@ -0,0 +1,300 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/widgets/digital-clock.vue b/fe_calckey/frontend/client/src/widgets/digital-clock.vue new file mode 100644 index 0000000..d0b6b4f --- /dev/null +++ b/fe_calckey/frontend/client/src/widgets/digital-clock.vue @@ -0,0 +1,130 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/widgets/federation.vue b/fe_calckey/frontend/client/src/widgets/federation.vue new file mode 100644 index 0000000..51c0e0d --- /dev/null +++ b/fe_calckey/frontend/client/src/widgets/federation.vue @@ -0,0 +1,199 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/widgets/index.ts b/fe_calckey/frontend/client/src/widgets/index.ts new file mode 100644 index 0000000..4c48811 --- /dev/null +++ b/fe_calckey/frontend/client/src/widgets/index.ts @@ -0,0 +1,122 @@ +import { App, defineAsyncComponent } from "vue"; + +export default function (app: App) { + app.component( + "MkwMemo", + defineAsyncComponent(() => import("./memo.vue")), + ); + app.component( + "MkwNotifications", + defineAsyncComponent(() => import("./notifications.vue")), + ); + app.component( + "MkwTimeline", + defineAsyncComponent(() => import("./timeline.vue")), + ); + app.component( + "MkwCalendar", + defineAsyncComponent(() => import("./calendar.vue")), + ); + app.component( + "MkwRss", + defineAsyncComponent(() => import("./rss.vue")), + ); + app.component( + "MkwRssTicker", + defineAsyncComponent(() => import("./rss-ticker.vue")), + ); + app.component( + "MkwTrends", + defineAsyncComponent(() => import("./trends.vue")), + ); + app.component( + "MkwClock", + defineAsyncComponent(() => import("./clock.vue")), + ); + app.component( + "MkwActivity", + defineAsyncComponent(() => import("./activity.vue")), + ); + app.component( + "MkwPhotos", + defineAsyncComponent(() => import("./photos.vue")), + ); + app.component( + "MkwDigitalClock", + defineAsyncComponent(() => import("./digital-clock.vue")), + ); + app.component( + "MkwUnixClock", + defineAsyncComponent(() => import("./unix-clock.vue")), + ); + app.component( + "MkwFederation", + defineAsyncComponent(() => import("./federation.vue")), + ); + app.component( + "MkwPostForm", + defineAsyncComponent(() => import("./post-form.vue")), + ); + app.component( + "MkwSlideshow", + defineAsyncComponent(() => import("./slideshow.vue")), + ); + app.component( + "MkwServerMetric", + defineAsyncComponent(() => import("./server-metric/index.vue")), + ); + app.component( + "MkwOnlineUsers", + defineAsyncComponent(() => import("./online-users.vue")), + ); + app.component( + "MkwJobQueue", + defineAsyncComponent(() => import("./job-queue.vue")), + ); + app.component( + "MkwInstanceCloud", + defineAsyncComponent(() => import("./instance-cloud.vue")), + ); + app.component( + "MkwButton", + defineAsyncComponent(() => import("./button.vue")), + ); + app.component( + "MkwAiscript", + defineAsyncComponent(() => import("./aiscript.vue")), + ); + app.component( + "MkwUserList", + defineAsyncComponent(() => import("./user-list.vue")), + ); + app.component( + "MkwServerInfo", + defineAsyncComponent(() => import("./server-info.vue")), + ); +} + +export const widgets = [ + "memo", + "notifications", + "timeline", + "calendar", + "userList", + "rss", + "rssTicker", + "trends", + "clock", + "activity", + "photos", + "digitalClock", + "unixClock", + "federation", + "instanceCloud", + "postForm", + "slideshow", + "serverMetric", + "serverInfo", + "onlineUsers", + "jobQueue", + "button", + "aiscript", +]; diff --git a/fe_calckey/frontend/client/src/widgets/instance-cloud.vue b/fe_calckey/frontend/client/src/widgets/instance-cloud.vue new file mode 100644 index 0000000..b9d4a08 --- /dev/null +++ b/fe_calckey/frontend/client/src/widgets/instance-cloud.vue @@ -0,0 +1,100 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/widgets/job-queue.vue b/fe_calckey/frontend/client/src/widgets/job-queue.vue new file mode 100644 index 0000000..1757bd6 --- /dev/null +++ b/fe_calckey/frontend/client/src/widgets/job-queue.vue @@ -0,0 +1,289 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/widgets/memo.vue b/fe_calckey/frontend/client/src/widgets/memo.vue new file mode 100644 index 0000000..06f2e1b --- /dev/null +++ b/fe_calckey/frontend/client/src/widgets/memo.vue @@ -0,0 +1,134 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/widgets/notifications.vue b/fe_calckey/frontend/client/src/widgets/notifications.vue new file mode 100644 index 0000000..48fb927 --- /dev/null +++ b/fe_calckey/frontend/client/src/widgets/notifications.vue @@ -0,0 +1,99 @@ + + + diff --git a/fe_calckey/frontend/client/src/widgets/online-users.vue b/fe_calckey/frontend/client/src/widgets/online-users.vue new file mode 100644 index 0000000..5ec197b --- /dev/null +++ b/fe_calckey/frontend/client/src/widgets/online-users.vue @@ -0,0 +1,98 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/widgets/photos.vue b/fe_calckey/frontend/client/src/widgets/photos.vue new file mode 100644 index 0000000..f8f7942 --- /dev/null +++ b/fe_calckey/frontend/client/src/widgets/photos.vue @@ -0,0 +1,142 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/widgets/post-form.vue b/fe_calckey/frontend/client/src/widgets/post-form.vue new file mode 100644 index 0000000..4ece4a5 --- /dev/null +++ b/fe_calckey/frontend/client/src/widgets/post-form.vue @@ -0,0 +1,46 @@ + + + diff --git a/fe_calckey/frontend/client/src/widgets/rss-ticker.vue b/fe_calckey/frontend/client/src/widgets/rss-ticker.vue new file mode 100644 index 0000000..0126f21 --- /dev/null +++ b/fe_calckey/frontend/client/src/widgets/rss-ticker.vue @@ -0,0 +1,178 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/widgets/rss.vue b/fe_calckey/frontend/client/src/widgets/rss.vue new file mode 100644 index 0000000..370ec20 --- /dev/null +++ b/fe_calckey/frontend/client/src/widgets/rss.vue @@ -0,0 +1,114 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/widgets/server-info.vue b/fe_calckey/frontend/client/src/widgets/server-info.vue new file mode 100644 index 0000000..a608c26 --- /dev/null +++ b/fe_calckey/frontend/client/src/widgets/server-info.vue @@ -0,0 +1,111 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/widgets/server-metric/cpu-mem.vue b/fe_calckey/frontend/client/src/widgets/server-metric/cpu-mem.vue new file mode 100644 index 0000000..ec2101b --- /dev/null +++ b/fe_calckey/frontend/client/src/widgets/server-metric/cpu-mem.vue @@ -0,0 +1,193 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/widgets/server-metric/cpu.vue b/fe_calckey/frontend/client/src/widgets/server-metric/cpu.vue new file mode 100644 index 0000000..563fe3b --- /dev/null +++ b/fe_calckey/frontend/client/src/widgets/server-metric/cpu.vue @@ -0,0 +1,65 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/widgets/server-metric/disk.vue b/fe_calckey/frontend/client/src/widgets/server-metric/disk.vue new file mode 100644 index 0000000..67ea398 --- /dev/null +++ b/fe_calckey/frontend/client/src/widgets/server-metric/disk.vue @@ -0,0 +1,57 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/widgets/server-metric/index.vue b/fe_calckey/frontend/client/src/widgets/server-metric/index.vue new file mode 100644 index 0000000..cf84212 --- /dev/null +++ b/fe_calckey/frontend/client/src/widgets/server-metric/index.vue @@ -0,0 +1,135 @@ + + + diff --git a/fe_calckey/frontend/client/src/widgets/server-metric/meilisearch.vue b/fe_calckey/frontend/client/src/widgets/server-metric/meilisearch.vue new file mode 100644 index 0000000..f7c7bd5 --- /dev/null +++ b/fe_calckey/frontend/client/src/widgets/server-metric/meilisearch.vue @@ -0,0 +1,85 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/widgets/server-metric/mem.vue b/fe_calckey/frontend/client/src/widgets/server-metric/mem.vue new file mode 100644 index 0000000..80cad4a --- /dev/null +++ b/fe_calckey/frontend/client/src/widgets/server-metric/mem.vue @@ -0,0 +1,73 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/widgets/server-metric/net.vue b/fe_calckey/frontend/client/src/widgets/server-metric/net.vue new file mode 100644 index 0000000..9885d7a --- /dev/null +++ b/fe_calckey/frontend/client/src/widgets/server-metric/net.vue @@ -0,0 +1,153 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/widgets/server-metric/pie.vue b/fe_calckey/frontend/client/src/widgets/server-metric/pie.vue new file mode 100644 index 0000000..317fdcf --- /dev/null +++ b/fe_calckey/frontend/client/src/widgets/server-metric/pie.vue @@ -0,0 +1,64 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/widgets/slideshow.vue b/fe_calckey/frontend/client/src/widgets/slideshow.vue new file mode 100644 index 0000000..fa0c1c9 --- /dev/null +++ b/fe_calckey/frontend/client/src/widgets/slideshow.vue @@ -0,0 +1,177 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/widgets/timeline.vue b/fe_calckey/frontend/client/src/widgets/timeline.vue new file mode 100644 index 0000000..6ae74b8 --- /dev/null +++ b/fe_calckey/frontend/client/src/widgets/timeline.vue @@ -0,0 +1,203 @@ + + + diff --git a/fe_calckey/frontend/client/src/widgets/trends.vue b/fe_calckey/frontend/client/src/widgets/trends.vue new file mode 100644 index 0000000..6bf5c0b --- /dev/null +++ b/fe_calckey/frontend/client/src/widgets/trends.vue @@ -0,0 +1,146 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/widgets/unix-clock.vue b/fe_calckey/frontend/client/src/widgets/unix-clock.vue new file mode 100644 index 0000000..190bcd0 --- /dev/null +++ b/fe_calckey/frontend/client/src/widgets/unix-clock.vue @@ -0,0 +1,135 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/widgets/user-list.vue b/fe_calckey/frontend/client/src/widgets/user-list.vue new file mode 100644 index 0000000..515c58c --- /dev/null +++ b/fe_calckey/frontend/client/src/widgets/user-list.vue @@ -0,0 +1,116 @@ + + + + + diff --git a/fe_calckey/frontend/client/src/widgets/widget.ts b/fe_calckey/frontend/client/src/widgets/widget.ts new file mode 100644 index 0000000..1afc296 --- /dev/null +++ b/fe_calckey/frontend/client/src/widgets/widget.ts @@ -0,0 +1,81 @@ +import { reactive, watch } from "vue"; +import { throttle } from "throttle-debounce"; +import { Form, GetFormResultType } from "@/scripts/form"; +import * as os from "@/os"; +import { deepClone } from "@/scripts/clone"; + +export type Widget

> = { + id: string; + data: Partial

; +}; + +export type WidgetComponentProps

> = { + widget?: Widget

; +}; + +export type WidgetComponentEmits

> = { + (ev: "updateProps", props: P); +}; + +export type WidgetComponentExpose = { + name: string; + id: string | null; + configure: () => void; +}; + +export const useWidgetPropsManager = < + F extends Form & Record, +>( + name: string, + propsDef: F, + props: Readonly>>, + emit: WidgetComponentEmits>, +): { + widgetProps: GetFormResultType; + save: () => void; + configure: () => void; +} => { + const widgetProps = reactive( + props.widget ? deepClone(props.widget.data) : {}, + ); + + const mergeProps = () => { + for (const prop of Object.keys(propsDef)) { + if (typeof widgetProps[prop] === "undefined") { + widgetProps[prop] = propsDef[prop].default; + } + } + }; + watch( + widgetProps, + () => { + mergeProps(); + }, + { deep: true, immediate: true }, + ); + + const save = throttle(3000, () => { + emit("updateProps", widgetProps); + }); + + const configure = async () => { + const form = deepClone(propsDef); + for (const item of Object.keys(form)) { + form[item].default = widgetProps[item]; + } + const { canceled, result } = await os.form(name, form); + if (canceled) return; + + for (const key of Object.keys(result)) { + widgetProps[key] = result[key]; + } + + save(); + }; + + return { + widgetProps, + save, + configure, + }; +}; diff --git a/fe_calckey/frontend/client/tsconfig.json b/fe_calckey/frontend/client/tsconfig.json new file mode 100644 index 0000000..2d292db --- /dev/null +++ b/fe_calckey/frontend/client/tsconfig.json @@ -0,0 +1,46 @@ +{ + "compilerOptions": { + "allowJs": true, + "noEmitOnError": false, + "noImplicitAny": false, + "noImplicitReturns": true, + "noUnusedParameters": false, + "noUnusedLocals": true, + "noFallthroughCasesInSwitch": true, + "declaration": false, + "sourceMap": false, + "target": "es2017", + "module": "esnext", + "moduleResolution": "node", + "removeComments": false, + "noLib": false, + "strict": true, + "strictNullChecks": true, + "experimentalDecorators": true, + "resolveJsonModule": true, + "allowSyntheticDefaultImports": true, + "isolatedModules": true, + "useDefineForClassFields": true, + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"], + }, + "typeRoots": [ + "node_modules/@types", + "@types", + ], + "types": [ + "vite/client", + ], + "lib": [ + "esnext", + "dom" + ], + "jsx": "preserve" + }, + "compileOnSave": false, + "include": [ + "./**/*.ts", + "./**/*.vue" + ] +} diff --git a/fe_calckey/frontend/client/vite.config.ts b/fe_calckey/frontend/client/vite.config.ts new file mode 100644 index 0000000..7b68699 --- /dev/null +++ b/fe_calckey/frontend/client/vite.config.ts @@ -0,0 +1,98 @@ +import * as fs from "fs"; +import pluginVue from "@vitejs/plugin-vue"; +import { defineConfig } from "vite"; + +import locales from "../locales"; +import meta from "../package.json"; +import pluginJson5 from "./vite.json5"; +import viteCompression from "vite-plugin-compression"; + +const extensions = [ + ".ts", + ".tsx", + ".js", + ".jsx", + ".mjs", + ".json", + ".json5", + ".svg", + ".sass", + ".scss", + ".css", + ".vue", +]; + +export default defineConfig(({ command, mode }) => { + fs.mkdirSync(__dirname + "/../built", { recursive: true }); + fs.writeFileSync( + __dirname + "/../built/meta.json", + JSON.stringify({ version: meta.version }), + "utf-8", + ); + + return { + base: "/assets/", + + plugins: [ + pluginVue({ + reactivityTransform: true, + }), + pluginJson5(), + viteCompression({ + algorithm: "brotliCompress", + }), + ], + + resolve: { + extensions, + alias: { + "@/": __dirname + "/src/", + "/client-assets/": __dirname + "/assets/", + "/static-assets/": __dirname + "/../assets/", + }, + }, + + define: { + _VERSION_: JSON.stringify(meta.version), + _LANGS_: JSON.stringify( + Object.entries(locales).map(([k, v]) => [k, v._lang_]), + ), + _ENV_: JSON.stringify(process.env.NODE_ENV), + _DEV_: process.env.NODE_ENV !== "production", + _PERF_PREFIX_: JSON.stringify("Misskey:"), + _DATA_TRANSFER_DRIVE_FILE_: JSON.stringify("mk_drive_file"), + _DATA_TRANSFER_DRIVE_FOLDER_: JSON.stringify("mk_drive_folder"), + _DATA_TRANSFER_DECK_COLUMN_: JSON.stringify("mk_deck_column"), + __VUE_OPTIONS_API__: true, + __VUE_PROD_DEVTOOLS__: false, + }, + + build: { + target: ["chrome87", "firefox78", "safari14", "es2017"], + manifest: "manifest.json", + rollupOptions: { + input: { + app: "./src/init.ts", + }, + output: { + manualChunks: { + vue: ["vue"], + }, + }, + }, + cssCodeSplit: true, + assetsInlineLimit: 0, + outDir: __dirname + "/../built/_client_dist_", + assetsDir: ".", + emptyOutDir: false, + sourcemap: process.env.NODE_ENV === "development", + reportCompressedSize: false, + commonjsOptions: { + include: [/calckey-js/, /node_modules/], + }, + }, + optimizeDeps: { + auto: true, + }, + }; +}); diff --git a/fe_calckey/frontend/client/vite.json5.ts b/fe_calckey/frontend/client/vite.json5.ts new file mode 100644 index 0000000..8653c66 --- /dev/null +++ b/fe_calckey/frontend/client/vite.json5.ts @@ -0,0 +1,49 @@ +// Original: https://github.com/rollup/plugins/tree/8835dd2aed92f408d7dc72d7cc25a9728e16face/packages/json + +import JSON5 from "json5"; +import { Plugin } from "rollup"; +import { createFilter, dataToEsm } from "@rollup/pluginutils"; +import { RollupJsonOptions } from "@rollup/plugin-json"; + +interface Json5SyntaxError extends SyntaxError { + lineNumber: number; + columnNumber: number; +} + +export default function json5(options: RollupJsonOptions = {}): Plugin { + const filter = createFilter(options.include, options.exclude); + const indent = "indent" in options ? options.indent : "\t"; + + return { + name: "json5", + + transform(json, id) { + if (id.slice(-6) !== ".json5" || !filter(id)) return null; + + try { + const parsed = JSON5.parse(json); + return { + code: dataToEsm(parsed, { + preferConst: options.preferConst, + compact: options.compact, + namedExports: options.namedExports, + indent, + }), + map: { mappings: "" }, + }; + } catch (err) { + if (!(err instanceof SyntaxError)) { + throw err; + } + const message = "Could not parse JSON5 file"; + const { lineNumber, columnNumber } = err as Json5SyntaxError; + this.warn({ + message, + id, + loc: { line: lineNumber, column: columnNumber }, + }); + return null; + } + }, + }; +} diff --git a/fe_calckey/frontend/custom/assets/badges/error.png b/fe_calckey/frontend/custom/assets/badges/error.png new file mode 100644 index 0000000..e90912b Binary files /dev/null and b/fe_calckey/frontend/custom/assets/badges/error.png differ diff --git a/fe_calckey/frontend/custom/assets/badges/info.png b/fe_calckey/frontend/custom/assets/badges/info.png new file mode 100644 index 0000000..ac70544 Binary files /dev/null and b/fe_calckey/frontend/custom/assets/badges/info.png differ diff --git a/fe_calckey/frontend/custom/assets/badges/not-found.png b/fe_calckey/frontend/custom/assets/badges/not-found.png new file mode 100644 index 0000000..73d611e Binary files /dev/null and b/fe_calckey/frontend/custom/assets/badges/not-found.png differ diff --git a/fe_calckey/frontend/custom/assets/instance.css b/fe_calckey/frontend/custom/assets/instance.css new file mode 100644 index 0000000..9a70e66 --- /dev/null +++ b/fe_calckey/frontend/custom/assets/instance.css @@ -0,0 +1,7 @@ +/* +* !!! WARNING !!! +* Editing this file may cause your instance to break for EVERYONE. +* Please know what you're doing and test it out with regular user custom CSS. +* With that said, GLHF! +* This may eventuallly be replaced with a function in the admin panel. + */ diff --git a/fe_calckey/frontend/custom/locales/.gitkeep b/fe_calckey/frontend/custom/locales/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/fe_calckey/frontend/gulpfile.js b/fe_calckey/frontend/gulpfile.js new file mode 100644 index 0000000..318a85f --- /dev/null +++ b/fe_calckey/frontend/gulpfile.js @@ -0,0 +1,95 @@ +/** + * Gulp tasks + */ + +const fs = require("fs"); +const gulp = require("gulp"); +const replace = require("gulp-replace"); +const terser = require("gulp-terser"); +const cssnano = require("gulp-cssnano"); + +const locales = require("./locales"); +const meta = require("./package.json"); +const rename = require("gulp-rename"); + +gulp.task("copy:client:fonts", () => + gulp + .src("./packages/client/node_modules/three/examples/fonts/**/*") + .pipe(gulp.dest("./built/_client_dist_/fonts/")), +); + +gulp.task("copy:client:locales", (cb) => { + fs.mkdirSync("./built/_client_dist_/locales", { recursive: true }); + + const v = { _version_: meta.version }; + + for (const [lang, locale] of Object.entries(locales)) { + fs.writeFileSync( + `./built/_client_dist_/locales/${lang}.${meta.version}.json`, + JSON.stringify({ ...locale, ...v }), + "utf-8", + ); + } + + cb(); +}); + +gulp.task("build:client:boot_script", () => { + return gulp + .src([ + "./assets-be/boot.template.js", + ]) + .pipe(replace("LANGS", JSON.stringify(Object.keys(locales)))) + .pipe( + terser({ + toplevel: true, + }), + ) + .pipe(rename('boot.js')) + .pipe(gulp.dest("./assets-be/template")); +}); + +gulp.task("build:client:boot_style", () => { + return gulp + .src([ + "./assets-be/style.template.css", + ]) + .pipe( + cssnano({ + zindex: false, + }), + ) + .pipe(rename('style.css')) + .pipe(gulp.dest("./assets-be/template")); +}); + +gulp.task("build:client:copy_twemoji", () => { + return gulp + .src([ + "node_modules/@discordapp/twemoji/dist/svg/*.svg" + ]) + .pipe(gulp.dest("./assets-be/twemoji")); + +}); + + +gulp.task( + "build", + gulp.parallel( + "copy:client:locales", + "copy:client:fonts", + "build:client:boot_script", + "build:client:boot_style", + "build:client:copy_twemoji" + ), +); + +gulp.task("default", gulp.task("build")); + +gulp.task("watch", () => { + gulp.watch( + ["./packages/*/src/**/*"], + { ignoreInitial: false }, + gulp.task("build"), + ); +}); diff --git a/fe_calckey/frontend/locales/README.md b/fe_calckey/frontend/locales/README.md new file mode 100644 index 0000000..a31df4f --- /dev/null +++ b/fe_calckey/frontend/locales/README.md @@ -0,0 +1,6 @@ +# **DO NOT edit locale files** except `ja-JP.yml`. + +When you add text to the ja-JP file (of misskey-dev/misskey), it will automatically be applied to other language files. +Translations added in ja-JP file should contain the original Japanese strings. + +Please see [Contribution guide](../CONTRIBUTING.md) for more information. diff --git a/fe_calckey/frontend/locales/ar-SA.yml b/fe_calckey/frontend/locales/ar-SA.yml new file mode 100644 index 0000000..7e97a99 --- /dev/null +++ b/fe_calckey/frontend/locales/ar-SA.yml @@ -0,0 +1,1537 @@ +--- +_lang_: "العربية" +headlineMisskey: "شبكة مرتبطة بالملاحظات" +introMisskey: "اهلا بك! ميسكي هو منصة تدوين مصغر لا مركزية ومفتوحة المصدر.\nيمكنك مشاركة \"ملاحظات\" عن ما يجري حولك، وإخبار الجميع عن نفسك 📡\nتسمح لك \"الانفعالات\" بتعبير عن شعورك حول ملاحظات الآخرين 👍\nاكتشف عالمًا جديدًا 🚀" +monthAndDay: "{day}/{month}" +search: "البحث" +notifications: "الإشعارات" +username: "اسم المستخدم" +password: "الكلمة السرية" +forgotPassword: "نسيتَ كلمة السر" +fetchingAsApObject: "جارٍ جلبه مِن الفديفرس" +ok: " حسناً" +gotIt: "فهِمت" +cancel: " إلغاء" +enterUsername: "أدخِل إسم مسخدم" +renotedBy: "أعاد نشرها {user}" +noNotes: "لم يُعثر على أية ملاحظات" +noNotifications: "ليس هناك أية اشعارات" +instance: "مثيل الخادم" +settings: "الاعدادات" +basicSettings: "الاعدادات الأساسية" +otherSettings: "إعدادات أخرى" +openInWindow: "افتح في نافذة جديدة" +profile: "الملف التعريفي" +timeline: "الخيط الزمني" +noAccountDescription: "لم يكتب هذا المستخدم سيرته بعد." +login: "لِج" +loggingIn: "جارٍ تسجيل الدخول" +logout: "الخروج" +signup: "أنشئ حسابًا" +uploading: "يرفع..." +save: "حفظ" +users: "المستخدمون" +addUser: "اضافة مستخدم" +favorite: "أضفها للمفضلة" +favorites: "المفضلات" +unfavorite: "إزالة من المفضلة" +favorited: "أُضيف إلى المفضلة." +alreadyFavorited: "تمت إضافته بالفعل إلى المفضلة." +cantFavorite: "تعذرت الإضافة إلى المفضلة." +pin: "دبّسها على الصفحة الشخصية" +unpin: "ألغ تدبيسها من ملفك الشخصي" +copyContent: "انسخ المحتوى" +copyLink: "انسخ الرابط" +delete: "حذف" +deleteAndEdit: "إزالة وإعادة الصياغة" +deleteAndEditConfirm: "أمتأكد من حذف الملاحظة؟ ستفقد كل مشاركاتها، والتفاعلات، والردود عليها." +addToList: "أضفه إلى قائمة" +sendMessage: "أرسل رسالة" +copyUsername: "انسخ اسم المستخدم" +searchUser: "ابحث عن مستخدمين" +reply: "رد" +loadMore: "عرض المزيد" +showMore: "عرض المزيد" +showLess: "اغلق" +youGotNewFollower: "يتابعك" +receiveFollowRequest: "تلقيت طلب متابعة" +followRequestAccepted: "قُبل طلب المتابعة" +mention: "أشر الى" +mentions: "الإشارات" +directNotes: "الملاحظات المباشرة" +importAndExport: "إستورد / صدر" +import: "استيراد" +export: "تصدير" +files: "الملفات" +download: "تنزيل" +driveFileDeleteConfirm: "أمتأكد من حذف ملف {name}؟ كل الملاحظات المُرفق بها هذا الملف ستحذف." +unfollowConfirm: "أمتأكد من إلغاء متابعة {name}؟" +exportRequested: "قد تستغرق عملية التصدير بعض الوقت. بمجرد الانتهاء سيضاف الملف الناتج إلى قرص التخزين." +importRequested: "يستغرق الاستيراد بعض الوقت" +lists: "القوائم" +noLists: "ليس لديك أية قائمة" +note: "ملاحظة" +notes: "الملاحظات" +following: "المتابَعون" +followers: "المتابِعون" +followsYou: "يتابعك" +createList: "إنشاء قائمة" +manageLists: "إدارة القوائم" +error: "خطأ" +somethingHappened: "حدث خطأ" +retry: "حاول مجددًا" +pageLoadError: "فشل تحميل الصفحة" +pageLoadErrorDescription: "عادة ما يكون السبب خطأ في الشبكة أو التخزين المؤقت للمتصفح. امسح التخزين المؤقت ثم أعد المحاولة لاحقًا." +serverIsDead: "الخادم لا يستجيب، حاول بعد قليل" +youShouldUpgradeClient: "حدّث الصفحة لعرضها." +enterListName: "اسم القائمة" +privacy: "الخصوصية" +makeFollowManuallyApprove: "قبول طلبات الإشتراك يدويا" +defaultNoteVisibility: "مدى الرؤية الافتراضي" +follow: "تابِع" +followRequest: "طلب اشتراك" +followRequests: "طلبات الإشتراك" +unfollow: "إلغاء الاشتراك" +followRequestPending: "طلبات الإشتراك المعلّقة" +enterEmoji: "أدخل إيموجي" +renote: "أعد النشر" +unrenote: "إلغاء مشاركة الملاحظة" +renoted: "أُعيد نشره" +cantRenote: "لا يمكن إعادة نشر الملاحظة" +cantReRenote: "لا يمكنك إعادة نشر ملاحظة معاد نشرها" +quote: "اقتبس" +pinnedNote: "ملاحظة مدبسة" +pinned: "دبّسها على الصفحة الشخصية" +you: "أنت" +clickToShow: "اضغط للعرض" +sensitive: "محتوى حساس" +add: "إضافة" +reaction: "التفاعلات" +reactionSetting: "التفاعلات المراد عرضها في منتقي التفاعلات." +reactionSettingDescription2: "اسحب لترتيب ، انقر للحذف ، استخدم \"+\" للإضافة." +rememberNoteVisibility: "تذكر إعدادت مدى رؤية الملاحظات" +attachCancel: "أزل المرفق" +markAsSensitive: "علّمه كمحتوى حساس" +unmarkAsSensitive: "ألغ تعيينه كمحتوى حساس" +enterFileName: "ادخل اسم الملف" +mute: "اكتم" +unmute: "إلغاء الكتم" +block: "احجب" +unblock: "إلغاء الحجب" +suspend: "علِق" +unsuspend: "ألغ التعليق" +blockConfirm: "أمتأكد من حجب هذا الحساب؟" +unblockConfirm: "أمتأكد من إلغاء حجب هذا الحساب؟" +suspendConfirm: "أمتأكد من تعليق الحساب؟" +unsuspendConfirm: "أمتأكد من إلغاء تعليق؟" +selectList: "اختر قائمة" +selectAntenna: "اختر هوائيًا" +selectWidget: "اختر ودجة" +editWidgets: "عدّل الودجات" +editWidgetsExit: "تم" +customEmojis: "إيموجي مخصص" +emoji: "إيموجي" +emojis: "إيموجي" +emojiName: "اسم الإيموجي" +emojiUrl: "رابط الإيموجي" +addEmoji: "إضافة إيموجي" +settingGuide: "الإعدادات المستحسنة" +cacheRemoteFiles: "خزن مؤقتا الملفات البعيدة" +flagAsBot: "علّمه كحساب آلي" +flagAsBotDescription: "فعّل هذا الخيار إذا كان هذا الحساب يُدار عبر برمجية. إذا فُعل فسيكون بمثابة علامة للمطورين الآخرين لتجنب سلاسل لا متناهية من التفاعل بين حسابات الآلية وضبط أنظمة ميسكي للتعامل مع هذا الحساب كآلي." +flagAsCat: "علّم هذا الحساب كحساب قط" +flagAsCatDescription: "فعّل هذا الخيار لوضع علامة على الحساب لتوضيح أنه حساب قط." +flagShowTimelineReplies: "أظهر التعليقات في الخيط الزمني" +flagShowTimelineRepliesDescription: "يظهر الردود في الخيط الزمني" +autoAcceptFollowed: "اقبل طلبات المتابعة تلقائيا من الحسابات المتابَعة" +addAccount: "أضف حساباً" +loginFailed: "فشل الولوج" +showOnRemote: "رؤيته على مثيل الخادم البُعدي" +general: "الرئيسية" +wallpaper: "الخلفية" +setWallpaper: "عيّن خلفية" +removeWallpaper: "أزل الخلفية" +searchWith: "البحث: {q}" +youHaveNoLists: "لا تمتلك أية قائمة" +followConfirm: "أتريد متابعة {name}؟" +proxyAccount: "حساب وكيل البروكسي" +proxyAccountDescription: "يتصرف حساب الوكيل كمتابع بعيد لمستخدمين تحت ظروف معينة. على سبيل المثال ، عندما يضيف مستخدم مستخدمًا بعيدًا إلى قائمة فإن ملاحظاته لن تُرسل إلى المثيل ما لم يُتابعه مستخدم محلي. وبالتالي فإن حساب الوكيل سوف يتابع هذا المستخدم لكي تُرسل ملاحظاته." +host: "المضيف" +selectUser: "حدّد مستخدمًا" +recipient: "المرسَل إليه·ها" +annotation: "التعليقات" +federation: "الفديرالية" +instances: "مثيل الخادم" +registeredAt: "مسجل منذ" +latestRequestSentAt: "آخر طلب أرسِل في" +latestRequestReceivedAt: "آخر طلب تُلقي في" +latestStatus: "الحالات الأخيرة" +storageUsage: "مساحة التخزين المستخدمة" +charts: "المنحنيات البيانية" +perHour: "في الساعة" +perDay: "في اليوم" +stopActivityDelivery: "وقف إرسال النشاط" +blockThisInstance: "احجب مثيل الخادم هذا" +operations: "الإجراءات" +software: "البرمجية" +version: "الإصدار" +metadata: "البيانات الوصفية" +monitor: "شاشة التحكم" +jobQueue: "قائمة الانتظار" +cpuAndMemory: "وحدة المعالجة المركزية والذاكرة" +network: "الشبكة" +disk: "قرص التخزين" +instanceInfo: "معلومات مثيل الخادم" +statistics: "الإحصائيات" +clearQueue: "تفريغ قائمة الإنتظار" +clearQueueConfirmTitle: "أتريد مسح الطابور؟" +clearCachedFiles: "امسح التخزين المؤقت" +clearCachedFilesConfirm: "أتريد حذف التخزين المؤقت للملفات البعيدة؟" +blockedInstances: "المثلاء المحجوبون" +blockedInstancesDescription: "قائمة بالمثلاء التي تريد حظرها بحيث كل نطاق في سطر لوحده. بعد إدراجهم لن يتمكنوا من التفاعل مع هذا المثيل." +muteAndBlock: "المكتومون والمحجوبون" +mutedUsers: "الحسابات المكتومة" +blockedUsers: "الحسابات المحجوبة" +noUsers: "ليس هناك مستخدمون" +editProfile: "تعديل الملف التعريفي" +noteDeleteConfirm: "هل تريد حذف هذه الملاحظة؟" +pinLimitExceeded: "لا يمكنك تدبيس الملاحظات بعد الآن." +intro: "لقد انتهت عملية تنصيب Calckey. الرجاء إنشاء حساب إداري." +done: "تمّ" +processing: "المعالجة جارية" +preview: "معاينة" +default: "افتراضي" +noCustomEmojis: "ليس هناك إيموجي" +noJobs: "لا توجد مهام" +federating: "الفديرالية جارية" +blocked: "محجوب" +suspended: "مُعلّق" +all: "الكل" +notResponding: "لا يستجيب" +instanceFollowing: "المثلاء المتابَعون" +instanceFollowers: "المثلاء المتابِعون" +instanceUsers: "مستخدمو المثيل" +changePassword: "تغيير الكلمة السرية" +security: "الأمان" +retypedNotMatch: "المدخلات لا تتطابق" +currentPassword: "كلمة المرور الحالية" +newPassword: "كلمة المرور الجديدة" +newPasswordRetype: "كرّر كلمة المرور الجديدة:" +attachFile: "أرفق ملفات" +more: "المزيد!" +featured: "المتداولة" +usernameOrUserId: "اسم المستخدم أو معرّفه" +noSuchUser: "لم يُعثَر على المستخدم" +lookup: "البحث" +announcements: "الإعلانات" +imageUrl: "رابط الصورة" +remove: "حذف" +removed: "حُذف بنجاح" +removeAreYouSure: "متأكد من أنك تريد حذف {x}؟" +deleteAreYouSure: "متأكد من أنك تريد حذف {x}؟" +resetAreYouSure: "هل تريد إعادة التعيين؟" +saved: "حُفظ" +messaging: "المحادثة" +upload: "ارفع" +keepOriginalUploading: "ابق الصورة الأصلية" +keepOriginalUploadingDescription: "يحفظ الصور المرفوعة على حالتها الأصلية، وان عطّل ستولد نسخة مخصصة من الصورة." +fromDrive: "من المخزن" +fromUrl: "عبر رابط" +uploadFromUrl: "ارفع عبر رابط" +uploadFromUrlDescription: "رابط الملف المراد رفعه" +uploadFromUrlRequested: "الرفع مطلوب" +uploadFromUrlMayTakeTime: "سيستغرق بعض الوقت لاتمام الرفع " +explore: "استكشاف" +messageRead: "مقروءة" +noMoreHistory: "لا يوجد المزيد من التاريخ" +startMessaging: "ابدأ محادثة" +nUsersRead: "قرأه {n}" +agreeTo: "اوافق على {0}" +tos: "شروط الخدمة" +start: "البداية" +home: "الرئيسي" +remoteUserCaution: "هذه المعلومات قد لا تكون مكتملة بما أن المستخدم من مثيل بعيد." +activity: "النشاط" +images: "الصور" +birthday: "تاريخ الميلاد" +yearsOld: "{age} سنة" +registeredDate: "انضم في" +location: "الموقع الجغرافي" +theme: "المظهر" +themeForLightMode: "الحلة في الوضع الفاتح" +themeForDarkMode: "الحلة في الوضع الداكن" +light: "فاتح" +dark: "داكن" +lightThemes: "الحلة الفاتحة" +darkThemes: "الحلة الداكنة" +syncDeviceDarkMode: "مطابقة الوضع المضلمومع اعدادات الجهاز" +drive: "قرص التخرين" +fileName: "اسم الملف" +selectFile: "اختر ملفًا" +selectFiles: "اختر ملفات" +selectFolder: "اختر مجلدًا" +selectFolders: "اختر مجلدات" +renameFile: "إعادة تسمية الملف" +folderName: "اسم المجلد" +createFolder: "أنشئ مجلدًا" +renameFolder: "إعادة تسمية المجلد" +deleteFolder: "احذف هذا المجلد" +addFile: "إضافة ملف" +emptyDrive: "قرص التخزين فارغ" +emptyFolder: "هذا المجلد فارغ" +unableToDelete: "لا يمكن حذفه" +inputNewFileName: "ادخل الإسم الجديد للملف" +inputNewDescription: "أدخل تعليقًا توضيحيًا" +inputNewFolderName: "ادخل الإسم الجديد للمجلد" +circularReferenceFolder: "المجلد المستهدف ينتمي للمجلد الذي تريد حذفه" +hasChildFilesOrFolders: "الان الملف غير فارغ. لا يمكن حذفه" +copyUrl: "انسخ الرابط" +rename: "إعادة التسمية" +avatar: "الصورة الرمزية" +banner: "الصورة الرأسية" +nsfw: "محتوى حساس" +whenServerDisconnected: "عند فقدان الاتصال بالخادم" +disconnectedFromServer: "قُطِع الإتصال بالخادم" +reload: "انعش" +doNothing: "تجاهل" +reloadConfirm: "هل ترغب في تحديث الجدول الزمني؟" +watch: "راقب" +unwatch: "إلغاء المراقبة" +accept: "السماح" +reject: "رفض" +normal: "عادي" +instanceName: "اسم مثيل الخادم" +instanceDescription: "وصف مثيل الخادم" +maintainerName: "المدير" +maintainerEmail: "عنوان بريد المدير الإلكتروني" +tosUrl: "رابط صفحة شروط الخدمة" +thisYear: "هذا العام" +thisMonth: "هذا الشهر" +today: "اليوم" +dayX: "{day}" +monthX: "{month}" +yearX: "{year}" +pages: "الصفحات" +integration: "التكامل" +connectService: "اتصل" +disconnectService: "اقطع الاتصال" +enableLocalTimeline: "تفعيل الخيط المحلي" +enableGlobalTimeline: "تفعيل الخيط الزمني الشامل" +disablingTimelinesInfo: "سيتمكن المديرون والمشرفون من الوصول إلى كل الخيوط الزمنية حتى وإن لم تفعّل." +registration: "إنشاء حساب" +enableRegistration: "تفعيل إنشاء الحسابات الجديدة" +invite: "دعوة" +driveCapacityPerLocalAccount: "حصة التخزين لكل مستخدم محلي" +driveCapacityPerRemoteAccount: "حصة التخزين لكل مستخدم بعيد" +inMb: "بالميغابايت" +iconUrl: "رابط الأيقونة" +bannerUrl: "رابط صورة اللافتة" +backgroundImageUrl: "رابط صورة الخلفية" +basicInfo: "المعلومات الأساسية " +pinnedUsers: "المستخدمون المدبسون" +pinnedUsersDescription: "قائمة المستخدمين المدبسين في لسان \"استكشف\" ، اجعل كل اسم مستخدم في سطر لوحده." +pinnedPages: "الصفحات المدبسة" +pinnedPagesDescription: "أدخل مسار الصفحات التي تريد تدبيسها في أعلى هذا الموقع، اجعل كل مسار في سطر لوحده." +pinnedClipId: "معرّف المشبك المدبس" +pinnedNotes: "ملاحظة مدبسة" +hcaptcha: "hCaptcha" +enableHcaptcha: "فعّل hCaptcha" +hcaptchaSiteKey: "مفتاح الموقع" +hcaptchaSecretKey: "المفتاح السري" +recaptcha: "reCAPTCHA" +enableRecaptcha: "تمكين reCAPTCHA" +recaptchaSiteKey: "مفتاح الموقع" +recaptchaSecretKey: "المفتاح السري" +avoidMultiCaptchaConfirm: "يمكن أن يتسبب استخدام عدة خدمات لكلمات التحقق في حدوث تداخل. هل ترغب في إلغاء تنشيط الخدمات الأخرى؟ يمكنك ترك هذه الخدمات نشطة بالضغط على \"ألغ\"." +antennas: "الهوائيات" +manageAntennas: "إدارة الهوائيات" +name: "الإسم" +antennaSource: "مصدر الهوائي" +antennaKeywords: "الكلمات المفتاحية للإستقبال" +antennaExcludeKeywords: "الكلمات المفتاحية المستثناة" +antennaKeywordsDescription: "افصل بينهم بمسافة لاستخدام معامل \"و\" أو بسطر لاستخدام معامل \"أو\"" +notifyAntenna: "نبهني بصول ملاحظات جديدة" +withFileAntenna: "ملاحظات تحوي ملفات فقط" +antennaUsersDescription: "اكتب اسم مستخدم لكل سطر" +caseSensitive: "حساسية حالة الأحرف" +withReplies: "بالردود" +connectedTo: "الحسابات التالية متصلة" +notesAndReplies: "الملاحظات والردود" +withFiles: "ذات مرفقات" +silence: "اكتم" +silenceConfirm: "أمتأكد من كتم هذا المستخدم؟" +unsilence: "إلغاء الكتم" +unsilenceConfirm: "أمتأكد من إلغاء كتم هذا المستخدم؟" +popularUsers: "المستخدمون الرائدون" +recentlyUpdatedUsers: "أصحاب النشاطات الأخيرة" +recentlyRegisteredUsers: "المستخدمون المنضمون حديثًا" +recentlyDiscoveredUsers: "المستخدمون المكتشفون حديثًا" +exploreUsersCount: "يوجد {count} مستخدم(ا)" +exploreFediverse: "استكشف الفديفرس" +popularTags: "الوسوم الرائجة" +userList: "القوائم" +about: "عن" +aboutMisskey: "عن Calckey" +administrator: "المدير" +token: "الرمز المميز" +twoStepAuthentication: "الإستيثاق بعاملَيْن" +moderator: "مشرِف" +nUsersMentioned: "{n} مستخدمين أُشير إليهم" +securityKey: "مفتاح الأمان" +securityKeyName: "اسم المفتاح" +registerSecurityKey: "سجل مفتاح أمان" +lastUsed: "آخر استخدام" +unregister: "إلغاء التسجيل" +passwordLessLogin: "لِج مِن دون كلمة سرية" +resetPassword: "أعد تعيين كلمتك السرية" +newPasswordIs: "كلمتك السرية الجديدة هي {password}" +reduceUiAnimation: "قلص تأثيرات الواجهة" +share: "شارِك" +notFound: "غير موجود" +notFoundDescription: "تعذر العثور على صفحة يقود إليها هذا الرابط." +uploadFolder: "المجلد الافتراضي للرفع" +cacheClear: "مسح ذاكرة التخزين المؤقت" +markAsReadAllNotifications: "وضع جميع الإشعارات كأنها مقروءة" +markAsReadAllUnreadNotes: "علّم جميع الملاحظات كمقروءة" +markAsReadAllTalkMessages: "علّم جميع الرسائل كمقروءة" +help: "المساعدة" +inputMessageHere: "اكتب رسالتك هنا" +close: "اغلق" +group: "الفريق" +groups: "الفِرَق" +createGroup: "انشئ فريقًا" +ownedGroups: "فِرقي" +joinedGroups: "الفِرق المُنضم إليها" +invites: "دعوة" +groupName: "اسم الفريق" +members: "الأعضاء" +transfer: "نقل" +messagingWithUser: "تحدث مع مستخدم" +messagingWithGroup: "محادثة جماعية" +title: "العنوان" +text: "النص" +enable: "تشغيل" +next: "التالية" +retype: "أعد الكتابة" +noteOf: "ملاحظات {user}" +inviteToGroup: "دعوة إلى فريق" +quoteAttached: "اِقتُبسَ" +quoteQuestion: "أتريد تضمينها كاقتباس" +noMessagesYet: "ليس هناك رسائل بعد" +newMessageExists: "لقد تلقيت رسالة جديدة" +onlyOneFileCanBeAttached: "يمكنك إرفاق ملف واحد بالرسالة" +signinRequired: "رجاءً لِج" +invitations: "دعوة" +invitationCode: "رمز الدعوة" +checking: "التحقق جارٍ" +available: "متوفر" +unavailable: "غير متوفر" +usernameInvalidFormat: "يمكنك استخدام A-z، a-z، 0-9، _" +tooShort: "قصير جدًا" +tooLong: "طويل جدًا" +weakPassword: "الكلمة السرية ضعيفة" +normalPassword: "الكلمة السرية جيدة" +strongPassword: "الكلمة السرية قوية" +passwordMatched: "التطابق صحيح!" +passwordNotMatched: "غير متطابقتان" +signinWith: "الولوج عبر {x}" +signinFailed: "فشل الولوج، خطأ في اسم المستخدم أو كلمة المرور." +tapSecurityKey: "أنقر مفتاح الأمان" +or: "أو" +language: "اللغة" +uiLanguage: "لغة واجهة المستخدم" +groupInvited: "دُعيت إلى فريقٍ" +aboutX: "عن {x}" +useOsNativeEmojis: "استخدم الإيموجي الخاصة بنظام التشغيل" +youHaveNoGroups: "لا تمتلك أية فِرَق" +joinOrCreateGroup: "احصل على دعوة لفريق أو أنشئ واحدًا." +noHistory: "السجل فارغ" +signinHistory: "تاريخ تسجيل الدخول" +doing: "انتظر لحظة" +category: "الفئات" +tags: "الوسوم" +docSource: "مصدر هذا المستند" +createAccount: "أنشئ حسابًا" +existingAccount: "الحسابات الموجودة" +regenerate: "أعِد التوليد" +fontSize: "حجم الخط" +noFollowRequests: "ليس لديك طلبات متابعة معلقة" +openImageInNewTab: "إفتح الصورة بصفحة جديدة" +dashboard: "لوحة التحكم" +local: "المحلي" +remote: "بُعدي" +total: "المجموع" +weekOverWeekChanges: "أسبوعيا" +dayOverDayChanges: "يوميا" +appearance: "المظهر" +clientSettings: "إعدادات العميل" +accountSettings: "إعدادات الحساب" +promotion: "ترقية" +promote: "روِّج" +numberOfDays: "عدد الأيام" +hideThisNote: "إخفاء هذه الملاحظة" +showFeaturedNotesInTimeline: "أظهر الملاحظات الشائعة في الخيط الزمني" +objectStorageBaseUrl: "الرابط الأساسي" +objectStoragePrefix: "البادئة" +objectStoragePrefixDesc: "ستُحفظ الملفات في مجلدات تحوي اسماءها هذه البادئة." +objectStorageEndpoint: "نقطة النهاية" +objectStorageRegion: "المنطقة" +objectStorageUseSSL: "استخدم SSL" +objectStorageUseSSLDesc: "عطل هذا الخيار إذا لم ترد استخدام API عبر HTTPS" +objectStorageUseProxy: "اتصل عبر وكيل" +objectStorageUseProxyDesc: "عطل هذا الخيار إذا لم ترد استخدام API عبر وكيل" +serverLogs: "سجلات الخادم" +deleteAll: "حذف الكل" +showFixedPostForm: "أظهر نموذج الكتابة في أعلى الصفحة" +newNoteRecived: "هناك ملاحظات جديدة" +sounds: "الرنات" +listen: "استمع" +none: "لا شيء" +showInPage: "اعرض في الصفحة" +popout: "منبثقة" +volume: "مستوى الصوت" +masterVolume: "حجم الصوت الرئيس" +details: "التفاصيل" +chooseEmoji: "اختر إيموجي" +unableToProcess: "يتعذر إكمال العملية" +recentUsed: "المستخدمة مؤخرا" +install: "ثبّت" +uninstall: "إلغاء التثبيت" +installedApps: "التطبيقات المُخوّلة" +nothing: "لا يوجد شيء هنا" +installedDate: "تاريخ التثبيت" +lastUsedDate: "آخر استخدام" +state: "الحالة" +sort: "ترتيب حسب" +ascendingOrder: "تصاعدي" +descendingOrder: "تنازلي" +output: "الخارجة" +disablePagesScript: "عطّل AiScript في الصفحات" +updateRemoteUser: "تحديث المعلومات عن المستخدم البعيد" +deleteAllFiles: "حذف كافة الملفات" +deleteAllFilesConfirm: "أتريد حذف كل الملفات؟" +removeAllFollowing: "ألغ متابعة كل المتابَعين" +removeAllFollowingDescription: "تنفيذه سيلغي متابعة المستخدمين المتواجدين على {host}. يمكنك استخدامه إذا فُقد الخادم." +userSuspended: "عُلق هذا المستخدم." +userSilenced: "كُتم هذا المستخدم." +yourAccountSuspendedTitle: "هذا الحساب معلق" +yourAccountSuspendedDescription: "عُلق الحساب بسبب انتهاك شروط خدمة المثيل و ما شابه. إذا أردت معرفة التفصيل تواصل مع مدير المثيل. رجاءً لا تنشئ حساب جديد." +menu: "القائمة" +divider: "فاصل" +addItem: "إضافة عنصر" +relays: "المُرَحلات" +addRelay: "إضافة مُرحّل" +inboxUrl: "رابط صندوق الوارد" +addedRelays: "المرحلات المضافة" +serviceworkerInfo: "يجب أن يفعل لإرسال الإشعارات." +deletedNote: "ملاحظة محذوفة" +invisibleNote: "ملاحظة مخفية" +enableInfiniteScroll: "فعّل التمرير المتواصل" +visibility: "الظهور" +poll: "استطلاع رأي" +useCw: "إخفاء المحتوى" +enablePlayer: "افتح مشغل الفيديو" +disablePlayer: "أغلق مشغل الفيديو" +expandTweet: "وسّع التغريدة" +themeEditor: "مصمم القوالب" +description: "الوصف" +describeFile: "أضف تعليقًا توضيحيًا" +enterFileDescription: "أدخل تعليقًا توضيحيًا" +author: "الكاتب" +leaveConfirm: "لديك تغييرات غير محفوظة. أتريد المتابعة دون حفظها؟" +manage: "إدارة " +plugins: "الإضافات" +useFullReactionPicker: "استخدم الحجم الكامل لمنتقي التفاعلات" +width: "العرض" +height: "الإرتفاع" +large: "كبير" +medium: "متوسط" +small: "صغير" +generateAccessToken: "ولّد رمز الوصول" +permission: "أذونات" +enableAll: "تشغيل الكل" +disableAll: "تعطيل الكل" +tokenRequested: "منح حق الوصول إلى الحساب" +pluginTokenRequestedDescription: "ستتمكن الإضافة من استخدام هذه الأذونات." +notificationType: "أنواع الإشعارات" +edit: "التعديل" +emailServer: "خادم البريد الإلكتروني" +emailConfigInfo: "يستخدم لتأكيد عنوان بريدك الإلكتروني ولإعادة تعيين كلمة المرور إن نسيتها." +email: "البريد الإلكتروني " +emailAddress: "عنوان البريد الالكتروني" +smtpConfig: "إعدادات خادم SMTP" +smtpHost: "المضيف" +smtpPort: "المنفذ" +smtpUser: "اسم المستخدم" +smtpPass: "الكلمة السرية" +emptyToDisableSmtpAuth: "اترك اسم المستخدم وكلمة المرور فارغين لتعطيل التحقق من SMTP" +smtpSecureInfo: "عطل هذا الخيار عند استخدام STARTTLS" +wordMute: "حظر الكلمات" +regexpError: "خطأ في التعبير النمطي" +instanceMute: "المثلاء المكتومون" +userSaysSomething: "كتب {name} شيءً" +makeActive: "تفعيل" +display: "المظهر" +copy: "نسخ" +metrics: "المقاييس" +overview: "ملخص عام" +logs: "السِجلّات" +delayed: "متأخر" +database: "قاعدة البيانات" +channel: "القنوات" +create: "أنشئ" +notificationSetting: "إعدادات التنبيهات" +notificationSettingDesc: "اختر نوع التنبيهات المراد عرضها" +useGlobalSetting: "استخدم الإعدادات العامة" +useGlobalSettingDesc: "اذا فعّل ستطبق إعدادات إشعارات حسابك. إذا عطّل يمكن إجراء تكوينات مخصصة." +other: "منوعات" +regenerateLoginToken: "أعد توليد الرمز" +regenerateLoginTokenDescription: "ينشئ رمز استيثاق جديد في العادة هذا ليس ضروريًا ؛ عند إنشاء رمز جديد ستُخرج جميع الأجهزة." +setMultipleBySeparatingWithSpace: "يمكنك ادخال أكثر من مدخل واحد وذلك بفصلها بمسافات." +fileIdOrUrl: "معرف الملف أو رابط" +behavior: "السلوك" +sample: "مثال" +abuseReports: "البلاغات" +reportAbuse: "أبلغ" +reportAbuseOf: "أبلغ عن {name}" +fillAbuseReportDescription: "أكتب بالتفصيل سبب البلاغ، إذا كنت تبلغ عن ملاحظة أرفق رابط لها." +abuseReported: "أُرسل البلاغ، شكرًا لك" +reporter: "المُبلّغ" +reporteeOrigin: "أصل البلاغ" +reporterOrigin: "أصل المُبلّغ" +forwardReport: "وجّه البلاغ إلى المثيل البعيد" +forwardReportIsAnonymous: "في المثيل البعيد سيظهر المبلّغ كحساب مجهول." +send: "أرسل" +abuseMarkAsResolved: "علّم البلاغ كمحلول" +openInNewTab: "افتح في لسان جديد" +defaultNavigationBehaviour: "سلوك الملاحة الافتراضي" +editTheseSettingsMayBreakAccount: "تعديل هذه الإعدادات قد يسبب عطبًا لحسابك" +instanceTicker: "معلومات المثيل الأصلي للملاحظات" +waitingFor: "في انتظار {x}" +random: "عشوائي" +system: "النظام" +switchUi: "بدّل واجهة المستخدم" +desktop: "سطح المكتب" +clip: "مِشبك" +createNew: "أنشِئ جديد" +optional: "اختياري" +createNewClip: "أنشئ مِشبكَا جديدًا" +public: "علني" +i18nInfo: "يترجم متطوعون ميسكي إلى عدة لغات، يمكنك المساعدة عبر {link}" +manageAccessTokens: "إدارة رموز الوصول" +accountInfo: "معلومات الحساب" +notesCount: "عدد الملاحظات" +repliesCount: "عدد الردود المرسلة" +renotesCount: "عدد الملاحظات المعاد نشرها (المرسلة)" +repliedCount: "عدد الردود المتلقاة" +renotedCount: "عدد الملاحظات المعاد نشرها (المتلقاة)" +followingCount: "عدد الحسابات المتابَعة" +followersCount: "عدد المتابِعين" +sentReactionsCount: "عدد الانفعالات المرسلة" +receivedReactionsCount: "عدد الانفعالات المتلقاة" +pollVotesCount: "عدد الاستطلاعات المرسلة" +pollVotedCount: "عدد الاستطلاعات المتلقاة" +yes: "نعم" +no: "لا" +driveFilesCount: "عدد الملفات في قرص التخزين" +driveUsage: "المستغل من قرص التخزين" +noCrawle: "ارفض فهرسة زاحف الويب" +noCrawleDescription: "يطلب من محركات البحث ألّا يُفهرسوا ملفك الشخصي وملاحظات وصفحاتك وما شابه." +alwaysMarkSensitive: "علّم افتراضيًا جميع ملاحظاتي كذات محتوى حساس" +loadRawImages: "حمّل الصور الأصلية بدلًا من المصغرات" +disableShowingAnimatedImages: "لا تشغّل الصور المتحركة" +verificationEmailSent: "أُرسل بريد التحقق. أنقر على الرابط المضمن لإكمال التحقق." +notSet: "لم يعيّن" +emailVerified: "تُحقّق من بريدك الإلكتروني" +noteFavoritesCount: "عدد الملاحظات المفضلة" +pageLikesCount: "عدد الصفحات التي أعجبت بها" +pageLikedCount: "عدد صفحاتك المُعجب بها" +contact: "التواصل" +useSystemFont: "استخدم الخط الافتراضية للنظام" +clips: "مشابك" +experimentalFeatures: "ميّزات اختبارية" +developer: "المطور" +makeExplorable: "أظهر الحساب في صفحة \"استكشاف\"" +makeExplorableDescription: "بتعطيل هذا الخيار لن يظهر حسابك في صفحة \"استكشاف\"" +showGapBetweenNotesInTimeline: "أظهر فجوات بين المشاركات في الخيط الزمني" +wide: "عريض" +narrow: "رفيع" +reloadToApplySetting: "سيُطبق هذا الإعداد بعد إعادة تحميل الصفحة، أتريد إعادة تحميلها الآن؟" +needReloadToApply: "سيطبق هذا بعد إعادة التحميل." +showTitlebar: "اعرض شريط العنوان" +clearCache: "امسح التخزين المؤقت" +onlineUsersCount: "{n} مستخدم متصل" +nUsers: "{n} مستخدم" +nNotes: "{n} ملاحظة" +sendErrorReports: "أرسل تقارير الأخطاء" +sendErrorReportsDescription: "إذا فعّلته ستساعد في تحسين ميسكي وذلك عبر مشاركة معلومات تفصيلية عن الخطأ.\nومما تحتويه التقارير: نسخة نظام التشغيل ونوع المتصفح وسجل نشاطك إلخ." +myTheme: "سماتي" +backgroundColor: "لون الخلفية" +accentColor: "طابع لوني" +textColor: "لون النص" +saveAs: "احفظ كـ..." +advanced: "متقدم" +value: "القيمة" +createdAt: "أُنشئ في" +updatedAt: "حُدّث في" +saveConfirm: "أتريد خفظ التغييرات؟" +deleteConfirm: "أمتأكد من الحذف؟" +invalidValue: "قيمة غير صالحة." +registry: "السجل" +closeAccount: "اختر حسبًا" +currentVersion: "الإصدار الحالي" +latestVersion: "آخر نسخة مستقرة" +youAreRunningUpToDateClient: "أنت تستخدم أحدث نسخة من العميل." +newVersionOfClientAvailable: "تتوفر نسخة أحدث للعميل" +usageAmount: "الإستخدام" +capacity: "السعة" +inUse: "مستخدم" +editCode: "حرر الشفرة" +apply: "تطبيق" +receiveAnnouncementFromInstance: "استلم إشعارات من هذا المثيل" +emailNotification: "إشعارات البريد الكتروني" +inChannelSearch: "ابحث عن قناة" +useReactionPickerForContextMenu: "افتح منتقي التفاعلات عند النقر بالزر الأيمن" +typingUsers: "{users} يكتب(ون)" +jumpToSpecifiedDate: "انتقل إلى تاريخ محدد" +showingPastTimeline: "أنت تستعرض حاليًا خيطًا زمنيًا قديمًا" +clear: "عودة" +markAllAsRead: "علّم الكل كمقروء" +goBack: "رجوع" +unlikeConfirm: "أتريد إلغاء إعجابك؟" +fullView: "ملء الشاشة" +quitFullView: "اخرج من وضع ملء للشاشة" +addDescription: "أضف وصفًا" +userPagePinTip: "لعرض ملاحظة هنا اختر \"دبسها على الصفحة الشخصية\" من قائمة تلك الملاحظة." +notSpecifiedMentionWarning: "في الملاحظة ذكر لمستخدمين لن يستلموها." +info: "عن" +userInfo: "معلومات المستخدم" +unknown: "مجهول" +onlineStatus: "الحالة" +hideOnlineStatus: "اخف الحالة" +hideOnlineStatusDescription: "قد يؤدي جعل اخفاء حالتك إلى تعطيل أداء بعض الميزات ، مثل البحث." +online: "متصل" +active: "نشط" +offline: "غير متصل" +notRecommended: "غير مستحسن" +botProtection: "الحماية من الحسابات الآلية" +instanceBlocking: "المثيلات المحجوبة" +selectAccount: "اختر حسابًا" +switchAccount: "تغيير الحساب" +enabled: "مفعّل" +disabled: "معطّل" +quickAction: "الإجراءات السّريعة" +user: "المستخدمون" +administration: "إدارة " +accounts: "الحسابات" +switch: "بدّل" +noMaintainerInformationWarning: "لم تُضبط معلومات المدير" +noBotProtectionWarning: "لم تضبط الحماية من الحسابات الآلية" +configure: "اضبط" +postToGallery: "انشر في المعرض" +gallery: "المعرض" +recentPosts: "المشاركات الحديثة" +popularPosts: "المشاركات المتداولة" +shareWithNote: "شاركه في ملاحظة" +ads: "الإعلانات" +expiration: "ينتهي استطلاع الرأي في" +memo: "تذكير" +priority: "الأولوية" +high: "عالية" +middle: "متوسط" +low: "منخفضة" +emailNotConfiguredWarning: "لم تعيّن بريدًا إلكترونيًا" +ratio: "النسبة" +previewNoteText: "اعرض معاينة" +customCss: "CSS مخصصة" +customCssWarn: "استخدم هذه الإعداد فقط إن كان لك علم بماهيّته. إدخال قيمة غير مناسبة سيسسب ضررًا للعميل." +global: "الشامل" +squareAvatars: "اعرض شكل الصور الرمزية كمربعات" +sent: "أرسل" +received: "اُستلم" +searchResult: "نتائج البحث" +hashtags: "الوسوم" +troubleshooting: "استكشاف الأخطاء وإصلاحها" +useBlurEffect: "استخدم تأثير الطمس في الواجهة" +learnMore: "راجع المزيد" +misskeyUpdated: "حُدث ميسكي!" +whatIsNew: "اعرض التغييرات" +translate: "ترجم" +translatedFrom: "تُرجم من {x}" +accountDeletionInProgress: "حذف الحساب جارٍ" +usernameInfo: "الاسم الذي يميزك عن بافي مستخدمي هذا الخادم، يمكنك استخدام الحروف اللاتينية (a~z, A~Z) والأرقام (0~9) والشرطة السفلية (_). لا يمكنك تغييره بعد تسجيله." +keepCw: "أبقِ على تحذيرات المحتوى" +lastCommunication: "آخر تواصل" +resolved: "عولج" +unresolved: "لم يعالج" +breakFollow: "إلغاء الاشتراك" +itsOn: "مفعّل" +itsOff: "معطّل" +emailRequiredForSignup: "عنوان البريد الإلكتروني إلزامي للتسجيل" +unread: "غير مقروءة" +filter: "رشّح" +controlPanel: "لوحة التحكم" +manageAccounts: "إدارة الحسابات" +makeReactionsPublic: "اجعل سجل التفاعلات علنيًا" +makeReactionsPublicDescription: "هذا سيجعل قائمة تفاعلاتك مرئية للعلن." +classic: "تقليدي" +muteThread: "اكتم النقاش" +unmuteThread: "ارفع الكتم عن النقاش" +ffVisibility: "مرئية المتابِعين/المتابَعين" +ffVisibilityDescription: "يسمح لك بتحديد من يمكنهم رؤية متابِعيك ومتابَعيك." +deleteAccountConfirm: "سيحذف حسابك نهائيًا، أتريد المتابعة؟" +incorrectPassword: "كلمة السر خاطئة." +voteConfirm: "متيقِّن من تصويتك لـ {choice}؟" +hide: "إخفاء" +leaveGroup: "مغادرة الفريق" +leaveGroupConfirm: "متيقن من مغادرة \"{name}\"؟" +welcomeBackWithName: "مرحبًا بك مجددًا {name}" +clickToFinishEmailVerification: "انقر [{ok}] لاستيثاق بريدك الإلكتروني." +overridedDeviceKind: "نوع الجهاز" +smartphone: "هاتف ذكي" +tablet: "جهاز لوحي" +auto: "تلقائي" +themeColor: "لون السمة" +size: "الحجم" +numberOfColumn: "عدد الأعمدة" +searchByGoogle: "غوغل" +mutePeriod: "مدة الكتم" +indefinitely: "أبدًا" +tenMinutes: "10 دقائق" +oneHour: "ساعة" +oneDay: "يوم" +oneWeek: "أسبوع" +failedToFetchAccountInformation: "تعذر جلب معلومات الحساب" +file: "الملفات" +reverse: "اقلب" +colored: "ملوّن" +label: "التسمية" +localOnly: "المحلي فقط" +account: "الحسابات" +_emailUnavailable: + used: "هذا البريد الإلكتروني مستخدم" + format: "صيغة البريد الإلكتروني غير صالحة" + mx: "خادم البريد الإلكتروني غير صالح" + smtp: "خادم البريد الإلكتروتي لا يستجيب" +_ffVisibility: + public: "علني" + followers: "مرئية لمتابِعيك فقط" + private: "خاص" +_signup: + almostThere: "كدت تنتهي" + emailAddressInfo: "رجاءً أدخل بريدك الإلكتروني." + emailSent: "أرسلت رسالة تأكيد إلى بريدك الإلكتروني ({email})، أنقر على الرابط الموجود فيها لإكمال التسجيل." +_accountDelete: + accountDelete: "احذف الحساب" + mayTakeTime: "نظرًا لأن حذف الحساب يحتاج موارد كثيرة فقد يستغرق وقتًا طويلاً ليكتمل وذلك بناءً على كمية المحتوى الموجود في الحساب وعدد الملفات المرفوعة." + sendEmail: "عند إنتهاء الحذف سترسل رسالة إلى البريد الإلكتروني المرتبط بهذا الحساب." + requestAccountDelete: "أرسل طلبًا لحذف الحساب" + started: "بدأت عملية الحذف." + inProgress: "عملية الحذف جارية" +_ad: + back: "رجوع" + reduceFrequencyOfThisAd: "قلل عرض هذا الإعلان" +_forgotPassword: + enterEmail: "أدخل البريد الإلكتروني المرتبط بحسابك لكي يرسل إليك رابط لإعادة تعيين كلمة المرور." + ifNoEmail: "إذا لم تربط حسابك ببريد إلكتروني سيتوجب عليك التواصل مع مدير الموقع." + contactAdmin: "هذا المثيل لا يدعم استخدام البريد الإلكتروني، إن أردت إعادة تعيين كلمة المرور تواصل مع المدير." +_gallery: + my: "معرضي" + liked: "المشاركات المُعجب بها" + like: "أعجبني" + unlike: "أزل الإعجاب" +_email: + _follow: + title: "يتابعك" + _receiveFollowRequest: + title: "استلمت طلب متابعة" +_plugin: + install: "ثبّت إضافات" + installWarn: "رجاءً لا تثبت إضافات غير موثوقة." + manage: "إدارة الإضافات" +_registry: + scope: "الحيّز" + key: "مفتاح" + keys: "المفاتيح" + domain: "النّطاق" + createKey: "أنشئ مفتاحًا" +_aboutMisskey: + about: "ميسكي هو برمجية مفتوحة المصدر يطورها syuilo منذ 2014." + contributors: "المساهمون الرئيسيون" + allContributors: "كل المساهمين" + source: "الشفرة المصدرية" + translation: "ترجم ميسكي" + donate: "تبرع لميسكي" + morePatrons: "نحن نقدر الدعم الذي قدمه العديد من الأشخاص الذين لم نذكرهم. شكرًا لكم 🥰" + patrons: "الداعمون" +_nsfw: + respect: "اخف الوسائط ذات المحتوى الحساس" + ignore: "اعرض الوسائط ذات المحتوى الحساس" + force: "اخف كل الوسائط" +_mfm: + cheatSheet: "مرجع ملخص عن MFM" + intro: "MFM هي لغة ترميزية مخصصة يمكن استخدامها في عدّة أماكن في ميسكي. يمكنك مراجعة كل تعابيرها مع كيفية استخدامها هنا." + mention: "أشر الى" + mentionDescription: "يمكنك الإشارة لمستخدم معيّن من خلال كتابة @ متبوعة باسم مستخدم." + hashtag: "الوسوم" + hashtagDescription: "يمكنك تعيين وسم من خلال كتابة # متبوعة بالنص المطلوب." + url: "الرابط" + urlDescription: "يمكن عرض الروابط" + link: "رابط" + bold: "عريض" + boldDescription: "جعل الحروف أثخن لإبرازها." + small: "صغير" + smallDescription: "يعرض المحتوى صغيرًا ورفيعًا." + center: "وسط" + centerDescription: "يمركز المحتوى في الوَسَط." + quote: "اقتبس" + quoteDescription: "يعرض المحتوى كاقتباس" + emoji: "إيموجي مخصص" + emojiDescription: "إحاطة اسم الإيموجي بنقطتي تفسير سيستبدله بصورة الإيموجي." + search: "البحث" + searchDescription: "يعرض نصًا في صندوق البحث" + flip: "اقلب" + flipDescription: "يقلب المحتوى عموديًا أو أفقيًا" + jelly: "تأثير (هلام)" + jellyDescription: "يمنح المحتوى حركة هلامية." + tada: "تأثير (تادا)" + tadaDescription: "يمنح للمحتوى تأثير تادا" + jump: "تأثير (قفز)" + jumpDescription: "يمنح للمحتوى حركة قفز." + bounce: "تأثير (ارتداد)" + bounceDescription: "يمنح للمحتوى حركة ارتدادية" + shake: "تأثير (اهتزاز)" + shakeDescription: "يمنح المحتوى حركة اهتزازية." + spin: "تأثير (دوران)" + spinDescription: "يمنح المحتوى حركة دورانية." + x2: "كبير" + x2Description: "يُكبر المحتوى" + x3: "كبير جداً" + x3Description: "يُضخم المحتوى" + x4: "هائل" + x4Description: "يُضخم المحتوى أكثر مما سبق." + blur: "طمس" + blurDescription: "يطمس المحتوى، لكن بالتمرير فوقه سيظهر بوضوح." + font: "الخط" + fontDescription: "الخط المستخدم لعرض المحتوى." + rainbow: "قوس قزح" + rainbowDescription: "اجعل المحتوى يظهر بألوان الطيف" + rotate: "تدوير" + rotateDescription: "يُدير المحتوى بزاوية معيّنة." +_instanceTicker: + none: "لا تظهره بتاتًا" + remote: "أظهر للمستخدمين البِعاد" + always: "أظهره دائمًا" +_serverDisconnectedBehavior: + reload: "إعادة تحميل تلقائية" + dialog: "أظهر مربع حوار التحذيرات" +_channel: + create: "أنشئ قناة" + edit: "عدّل قناة" + setBanner: "عيّن اللافتة" + removeBanner: "أزل اللافتة" + featured: "المتداوَلة" + owned: "قنواتي" + following: "متابَع" + usersCount: "{n} منتسب" + notesCount: "{n} ملاحظة" +_menuDisplay: + sideFull: "جانبي" + top: "الأعلى" + hide: "إخفاء" +_wordMute: + muteWords: "الكلمات المحظورة" + muteWordsDescription: "افصل بينهم بمسافة لاستخدام معامل \"و\" أو بسطر لاستخدام معامل \"أو\"." + muteWordsDescription2: "احصر الكلمات المفتاحية بين بين شرطتين مائلتين لاستخدامها كتعابير نمطية" + softDescription: "اخف الملاحظات التي تستوف الشروط من الخيط الزمني." + hardDescription: "اخف الملاحظات التي تستوف الشروط من الخيط الزمني.بالإضافة إلى أن هذه الملاحظات ستبقى مخفية حتى وإن تغيرت الشروط." + soft: "لينة" + hard: "قاسية" + mutedNotes: "الملاحظات المكتومة" +_instanceMute: + instanceMuteDescription: "هذه سيحجب كل ملاحظات الخوادم المحجوبة ومشاركاتها والردود على تلك الملاحظات حتى وإن كانت من خادم غير محجوب." + instanceMuteDescription2: "مدخلة لكل سطر" + title: "يخفي ملاحظات الخوادم المسرودة." + heading: "قائمة الخوادم المحجوبة" +_theme: + explore: "استكشف قوالب المظهر" + install: "تنصيب قالب" + manage: "إدارة القوالب" + code: "شيفرة القالب" + description: "الوصف" + installed: "تم تنصيب {name}" + installedThemes: "السمات المثبتة" + builtinThemes: "السمات المدمجة" + alreadyInstalled: "هذه السمة مثبتة سلفًا" + invalid: "تنسيق السمة غير صالح" + make: "إنشاء قالب" + addConstant: "أضف ثابتًا" + constant: "ثابت" + defaultValue: "القيمة الافتراضية" + color: "اللون" + key: "مفتاح" + func: "دوال" + funcKind: "نوع الدالة" + argument: "معامل" + alpha: "الشفافية" + inputConstantName: "أدخل اسمًا للثابت" + deleteConstantConfirm: "أمتأكد من حذف الثابت {const}؟" + keys: + accent: "طابع لوني" + bg: "الخلفية" + fg: "النص" + indicator: "المؤشر" + panel: "اللوحة" + shadow: "الظل" + navBg: "خلفية الشريط الجانبي" + navFg: "نص الشريط الجانبي" + navHoverFg: "نص الشريط الجانبي (عند التمرير فوقه)" + link: "رابط" + hashtag: "وسم" + mention: "أشر الى" + renote: "أعد النشر" + divider: "فاصل" + scrollbarHandle: "مقبض شريط التمرير" + scrollbarHandleHover: "مقبض شريط التمرير (عند التمرير فوقه)" + infoWarnBg: "خلفية التحذير" + infoWarnFg: "نص التحذير" + toastBg: "خلفية الإشعارات" + toastFg: "نص الإشعارات" + buttonBg: "خلفية الأزرار" + buttonHoverBg: "خلفية الأزرار (عند التمرير فوقها)" + inputBorder: "حواف حقل الإدخال" + listItemHoverBg: "خلفية عناصر القائمة (عند التمرير فوقها)" + driveFolderBg: "خلفية مجلد قرص التخزين" + messageBg: "خلفية المحادثة" +_sfx: + note: "الملاحظات" + noteMy: "ملاحظتي" + notification: "الإشعارات" + chat: "المحادثة" + chatBg: "المحادثة (الخلفية)" + antenna: "الهوائيات" + channel: "إشعارات القنات" +_ago: + future: "المستقبَل" + justNow: "اللحظة" + secondsAgo: "منذ {n} ثوانٍ" + minutesAgo: "منذ {n} دقائق" + hoursAgo: "منذ {n} ساعة" + daysAgo: "منذ {n} أيام" + weeksAgo: "منذ {n} أسابيع" + monthsAgo: "منذ {n} أشهر" + yearsAgo: "منذ {n} سنوات" +_time: + second: "ثا" + minute: "د" + hour: "سا" + day: "ي" +_tutorial: + title: "How to use Calckey" + step1_1: "Welcome!" + step1_2: "Let's get you set up. You'll be up and running in no time!" + step2_1: "First, please fill out your profile." + step2_2: "Providing some information about who you are will make it easier for others to tell if they want to see your notes or follow you." + step3_1: "Now time to follow some people!" + step3_2: "Your home and social timelines are based off of who you follow, so try following a couple accounts to get started.\nClick the plus circle on the top right of a profile to follow them." + step4_1: "Let's get you out there." + step4_2: "For your first post, some people like to made a {introduction} post or a simple \"Hello world!\"" + step5_1: "Timelines, timelines everywhere!" + step5_2: "Your instance has {timelines} different timelines enabled." + step5_3: "The Home {icon} timeline is where you can see posts from your followers." + step5_4: "The Local {icon} timeline is where you can see posts from everyone else on this instance." + step5_5: "The Recommended {icon} timeline is where you can see posts from instances the admins recommend." + step5_6: "The Social {icon} timeline is where you can see posts from friends of your followers." + step5_7: "The Global {icon} timeline is where you can see posts from every other connected instance." + step6_1: "So, what is this place?" + step6_2: "Well, you didn't just join Calckey. You joined a portal to the Fediverse, an interconnected network of thousands of servers, called \"instances\"." + step6_3: "Each server works in different ways, and not all servers run Calckey. This one does though! It's a bit complicated, but you'll get the hang of it in no time." + step6_4: "Now go, explore, and have fun!" +_2fa: + alreadyRegistered: "سجلت سلفًا جهازًا للاستيثاق بعاملين." + registerTOTP: "سجّل جهازًا جديدًا" + registerSecurityKey: "تسجيل مفتاح أمان جديد" + step1: "أولًا ثبّت تطبيق استيثاق على جهازك (مثل {a} و{b})." + step2: "امسح رمز الاستجابة السريعة الموجد على الشاشة." + step3: "أدخل الرمز الموجود في تطبيقك لإكمال التثبيت." + step4: "من هذه اللحظة أثناء ولوجك سيُطلب منك الرمز." +_permissions: + "read:account": "اعرض معلومات حسابك" + "write:account": "تعديل معلومات حسابك" + "read:blocks": "اعرض قائمة المستخدمين المحجوبين" + "write:blocks": "عدّل قائمة المستخدمين المحجوبين" + "read:drive": "تصفح قرص التخزين" + "write:drive": "احذف أو عدّل محتويات قرص التخزين" + "read:favorites": "اعرض المفضلة" + "write:favorites": "عدّل المفضلة" + "read:following": "اعرض معلومات متابَعيك" + "write:following": "تابع أو ألغ متابعة حسابات" + "read:messaging": "اعرض المحادثات" + "write:messaging": "اكتب أو احذف رسائل محادثة" + "read:mutes": "اعرض قائمة المستخدمين المكتومين" + "write:mutes": "عدّل قائمة المستخدمين المكتومين" + "write:notes": "أنشئ أو احذف ملاحظات" + "read:notifications": "اظهر الإشعارات" + "write:notifications": "إدارة الإشعارات" + "read:reactions": "اعرض تفاعلاتك" + "write:reactions": "عدّل تفاعلاتك" + "write:votes": "صوّت" + "read:pages": "اعرض صفحاتك" + "write:pages": "عدّل أو احذف صفحاتك" + "read:page-likes": "يعرض ما أعجبك من ملاحظات في صفحات" + "read:user-groups": "اعرض فِرق المستخدمين" + "write:user-groups": "عدّل أو احذف فِرق المستخدمين" + "read:channels": "طالع قنواتك" + "write:channels": "عدّل القنوات" + "read:gallery": "اعرض المعرض" + "write:gallery": "عدّل المعرض" + "read:gallery-likes": "يعرض ما أعجبك من مشاركات المعرض" +_auth: + shareAccess: "أتريد التفويض لـ \"{name}\" بالوصول لحسابك؟" + shareAccessAsk: "هل تخول لهذا التطبيق الوصول لحسابك؟" + permissionAsk: "يطلب التطبيق الأذون التالية" + pleaseGoBack: "رجاءً عد للتطبيق" + callback: "العودة للتطبيق" + denied: "رُفض الوصول" +_antennaSources: + all: "كل الملاحظات" + homeTimeline: "ملاحظات المستخدمين المتابَعين" + users: "ملاحظات مستخدمين محددين" +_weekday: + sunday: "الأحد" + monday: "الإثنين" + tuesday: "الثلاثاء" + wednesday: "الأربعاء" + thursday: "الخميس" + friday: "الجمعة" + saturday: "السبت" +_widgets: + memo: "ملاحظة لاصقة" + notifications: "الإشعارات" + timeline: "الخيط الزمني" + calendar: "التقويم" + trends: "المتداوَلة" + clock: "الساعة" + rss: "تدفق RSS" + activity: "النشاط" + photos: "الصور" + digitalClock: "ساعة رقمية" + federation: "الفديرالية" + postForm: "أنشئ ملاحظة" + slideshow: "عرض الشرائح" + button: "زر" + onlineUsers: "المتّصلون" + jobQueue: "قائمة الانتظار" + serverMetric: "إحصائيات الخادم" +_cw: + hide: "إخفاء" + show: "عرض المزيد" + chars: "{count} أحرف" + files: "{count} ملفات" +_poll: + noOnlyOneChoice: "تحتاج إلى خيارَين على الأقل" + choiceN: "الخيار {n}" + noMore: "لا يمكنك إضافة خيارات أخرى" + canMultipleVote: "السماح بالإجابات المتعددة" + expiration: "ينتهي استطلاع الرأي في" + infinite: "أبدًا" + at: "تاريخ الإنتهاء" + after: "ينتهي بعد…" + deadlineDate: "تاريخ الانتهاء" + deadlineTime: "سا" + duration: "المدة" + votesCount: "{n} أصوات" + totalVotes: "المجموع {n} أصوات" + vote: "قم بالتصويت" + showResult: "اعرض النتائج" + voted: "تم التصويت" + closed: "انتهى" + remainingDays: "{d} أيام و {h} ساعات متبقية" + remainingHours: "{h} ساعات و {m} دقائق متبقية" + remainingMinutes: "{m} دقائق و {s} ثوانٍ متبقية" + remainingSeconds: "{s} ثوانٍ متبقية" +_visibility: + public: "علني" + publicDescription: "ستكون ملاحظتك مرئية لكل المستخدمين" + home: "الرئيسي" + homeDescription: "انشر في الخيط الزمني الرئيسي فقط" + followers: "المتابِعون" + followersDescription: "اجعلها مرئية لمتابِعيك فقط" + specified: "مباشرة" + specifiedDescription: "اجعلها مرئية لمستخدمين محددين" + localOnly: "المحلي فقط" + localOnlyDescription: "ليس مرئيًا للمستخدمين البِعاد" +_postForm: + replyPlaceholder: "رد على هذه الملاحظة…" + quotePlaceholder: "اقتبس هذه الملاحظة…" + channelPlaceholder: "انشر في قناة..." + _placeholders: + a: "ما الذي تنوي فعله؟" + b: "ماذا يحدث حولك ؟" + c: "ما الذي تفكر فيه؟" + d: "ما الذي تريد قوله؟" + e: "أكتب..." + f: "بانتظارك لتكتب..." +_profile: + name: "الإسم" + username: "اسم المستخدم" + description: "السيرة" + youCanIncludeHashtags: "يمكنك أيضًا إضافة وسوم إلى سيرتك التعريفية." + metadata: "معلومات إضافية" + metadataEdit: "عدّل المعلومات الإضافية" + metadataDescription: "يُمكنك عرض 4 حقول معلومات في ملفك الشخصي" + metadataLabel: "التسمية" + metadataContent: "المحتوى" + changeAvatar: "غيّر الصورة الرمزية" + changeBanner: "غيّر اللافتة" +_exportOrImport: + allNotes: "كل الملاحظات" + followingList: "المتابَعون" + muteList: "المستخدمون المكتومون" + blockingList: "المستخدمون المحجوبون" + userLists: "القوائم" + excludeMutingUsers: "استثن الحسابات المكتومة" + excludeInactiveUsers: "استثن المستخدمين الخاملين" +_charts: + federation: "الفديرالية" + apRequest: "الطلبات" + usersIncDec: "تباين عدد المستخدمين" + usersTotal: "مجموع عدد المستخدمين والمستخدمات" + activeUsers: "المستخدمون النشطون" + notesIncDec: "تباين عدد الملاحظات" + localNotesIncDec: "تباين عدد الملاحظات المحلية" + remoteNotesIncDec: "تباين عدد الملاحظات البعيدة" + notesTotal: "إجمالي الملاحظات" + filesIncDec: "تباين عدد الملفات" + filesTotal: "العدد الإجمالي للملفات" +_instanceCharts: + requests: "الطلبات" + users: "تباين عدد المستخدمين" + usersTotal: "تباين عدد المستخدمين" + notes: "تباين عدد الملاحظات" + notesTotal: "تباين عدد الملاحظات" + ff: "تباين عدد حسابات المتابَعة/المتابِعة" + ffTotal: "تباين عدد حسابات المتابَعة/المتابِعة" + files: "تباين عدد الملفات" + filesTotal: "تباين عدد الملفات" +_timelines: + home: "الرئيسي" + local: "المحلي" + social: "الاجتماعي" + global: "الشامل" +_pages: + newPage: "أنشئ صفحة جديدة" + editPage: "عدّل الصفحة" + readPage: "نُشّط عرض المصدر" + created: "نجح إنشاء الصفحة" + updated: "نجح تعديل الصفحة" + deleted: "نجح حذف الصفحة" + pageSetting: "إعدادات الصفحة" + nameAlreadyExists: "رابط الصفحة موجود مسبقًا" + invalidNameTitle: "رابط الصفحة ليس صالحًا" + invalidNameText: "تأكد أن عنوان الصفحة ليس فارغًا" + editThisPage: "عدّل هذه الصفحة" + viewSource: "اظهر المصدر" + viewPage: "اعرض صفحاتك" + like: "أعجبني" + unlike: "أزل الإعجاب" + my: "صفحاتي" + liked: "الصفحات المُعجب بها" + featured: "الأكثر شعبية" + contents: "المحتوى" + variables: "متغيّرات" + title: "العنوان" + url: "رابط الصفحة" + summary: "ملخص الصفحة" + alignCenter: "توسيط العناصر" + hideTitleWhenPinned: "اخف عنوان الصفحة عند تدبيسها في ملف الشخصي" + font: "الخط" + fontSerif: "Serif" + fontSansSerif: "Sans Serif" + eyeCatchingImageSet: "عيّن صورة مصغّرة" + eyeCatchingImageRemove: "احذف صورة مصغّرة" + chooseBlock: "إضافة كتلة" + selectType: "اختر النوع" + enterVariableName: "أدخل اسم المتغيّر" + variableNameIsAlreadyUsed: "هذا الاسم محجوز" + contentBlocks: "المحتوى" + inputBlocks: "مُدخل" + specialBlocks: "خاص" + blocks: + text: "نص" + textarea: "حقل نصي" + section: "قسم" + image: "الصور" + button: "زرّ" + _if: + variable: "متغيّر" + post: "أنشئ ملاحظة" + _post: + text: "المحتوى" + textInput: "مُدخل نصي" + _textInput: + name: "اسم المتغير" + text: "العنوان" + default: "القيمة الافتراضية" + textareaInput: "مدخل نصي متعدد الأسطر" + _textareaInput: + name: "اسم المتغير" + text: "العنوان" + default: "القيمة الافتراضية" + numberInput: "مُدخل رقمي" + _numberInput: + name: "اسم المتغير" + text: "العنوان" + default: "القيمة الافتراضية" + _canvas: + width: "العُرض" + height: "الإرتفاع" + note: "ملاحظة مضمّنة" + _note: + id: "معرّف الملاحظة" + idDescription: "كبديل يمكنك إدخال رابك الملاحظة هنا" + detailed: "عرض مفصّل" + switch: "بدّل" + _switch: + name: "اسم المتغير" + text: "العنوان" + default: "القيمة الافتراضية" + counter: "العداد" + _counter: + name: "اسم المتغير" + text: "العنوان" + inc: "زِد" + _button: + text: "العنوان" + colored: "ملوّن" + action: "الإجراء عند ضغط الزّر" + _action: + dialog: "أظهر مربع حوار" + _dialog: + content: "المحتوى" + resetRandom: "صفِّر البذرة" + pushEvent: "أرسل حدثًا" + _pushEvent: + event: "اسم الحدث" + message: "إظهار رسالة عند التفعيل" + variable: "أرسل المتغيّر" + no-variable: "لا شيء" + _callAiScript: + functionName: "اسم الدالة" + radioButton: "الخيار " + _radioButton: + name: "اسم المتغير" + title: "العنوان" + values: "قائمة الخيارات (كل خيار في سطر لوحده)" + default: "القيمة الافتراضية" + script: + categories: + logical: "عمليّة منطقيّة" + operation: "حساب" + comparison: "مقارنة" + random: "عشوائي" + value: "القيم" + fn: "دوال" + text: "إجراءات على النصوص" + convert: "تحويل" + list: "القوائم" + blocks: + text: "نص" + textList: "قائمة نصية" + _textList: + info: "اجعل كل مدخل في سطر لوحده" + strLen: "طول النص" + _strLen: + arg1: "نص" + strPick: "استخرج محرفًا" + _strPick: + arg1: "نص" + arg2: "موضع المحرف" + strReplace: "استبدال النّص" + _strReplace: + arg1: "نص" + arg2: "استُبدِل بـ" + arg3: "استُبدِل بـ" + strReverse: "اقلب النص" + _strReverse: + arg1: "نص" + _join: + arg1: "القوائم" + arg2: "فاصل" + add: "إضافة" + _add: + arg1: "أ" + arg2: "ب" + subtract: "اطرح" + _subtract: + arg1: "أ" + arg2: "ب" + multiply: "اضرب" + _multiply: + arg1: "أ" + arg2: "ب" + divide: "اقسم" + _divide: + arg1: "أ" + arg2: "ب" + mod: "الباقي" + _mod: + arg1: "أ" + arg2: "ب" + round: "تقريب عدد عشري" + _round: + arg1: "رقم" + eq: "أ و ب متساويان" + _eq: + arg1: "أ" + arg2: "ب" + notEq: "أ و ب مختلفان" + _notEq: + arg1: "أ" + arg2: "ب" + and: "أ و ب" + _and: + arg1: "أ" + arg2: "ب" + or: "أ أو ب" + _or: + arg1: "أ" + arg2: "ب" + lt: "أ أصغر من ب" + _lt: + arg1: "أ" + arg2: "ب" + gt: "أ أكبر من ب" + _gt: + arg1: "أ" + arg2: "ب" + ltEq: "أ أصغر من أو يساوي ب" + _ltEq: + arg1: "أ" + arg2: "ب" + gtEq: "أ أكبر من أو يساوي ب" + _gtEq: + arg1: "أ" + arg2: "ب" + if: "فرع" + random: "عشوائي" + rannum: "رقم عشوائي" + _rannum: + arg1: "أدنى قيمة" + arg2: "أقصى قيمة" + randomPick: "اختر عشوائيًا من القائمة" + _randomPick: + arg1: "القوائم" + dailyRandom: "عشوائي (يتغير مرة يوميًا لكل مستخدم)" + dailyRannum: "رقم عشوائي (يتغير مرة يوميًا لكل مستخدم)" + _dailyRannum: + arg1: "أدنى قيمة" + arg2: "أقصى قيمة" + dailyRandomPick: "اختيار عشوائي من قائمة (يتغير مرة يوميًا لكل مستخدم)" + _dailyRandomPick: + arg1: "القوائم" + seedRandom: "عشوائي (عبر بذرة)" + _seedRandom: + arg1: "البذرة" + seedRannum: "رقم عشوائي (عبر بذرة)" + _seedRannum: + arg1: "البذرة" + arg2: "أدنى قيمة" + arg3: "أقصى قيمة" + seedRandomPick: "اختيار عشوائي من القائمة (عبر بذرة)" + _seedRandomPick: + arg1: "البذرة" + arg2: "القوائم" + DRPWPM: "اختيار عشوائي من قائمة الاحتمالات (تتغير مرة يوميًا لكل مستخدم)" + _DRPWPM: + arg1: "قائمة نصية" + pick: "اختر من القائمة" + _pick: + arg1: "القوائم" + arg2: "الموضع" + listLen: "طول القائمة" + _listLen: + arg1: "القوائم" + number: "رقم" + stringToNumber: "حوّل نصًا إلى رقم" + _stringToNumber: + arg1: "نص" + numberToString: "حوّل رقمًا إلى نص" + _numberToString: + arg1: "رقم" + _splitStrByLine: + arg1: "نص" + ref: "متغيّر" + aiScriptVar: "متغيّر AiScript" + fn: "دالة" + _fn: + slots: "خانات" + arg1: "المُخرج" + for: "حلقة تكرار" + _for: + arg1: "عدد مرات التكرار" + arg2: "الإجراء" + typeError: "الخانة {slot} تقبل \"{expect}\" لكن القيمة المعطاة هي \"{actual}\"!" + thereIsEmptySlot: "الخانة {slot} فارغة!" + types: + string: "نص" + number: "رقم" + array: "القوائم" + stringArray: "قائمة نصية" + emptySlot: "خانة فارغة" + enviromentVariables: "متغيرات البيئة" + pageVariables: "متغيرات الصفحة" + argVariables: "خانة إدخال" +_relayStatus: + requesting: "مُعلّق" + accepted: "مقبول" + rejected: "مرفوض" +_notification: + fileUploaded: "نجح رفع الملف" + youGotMention: "{name} أشار إليك" + youGotReply: "ردّ عليك {name}" + youGotQuote: "اقتبس منك {name}" + youRenoted: "إعادت نشر من {name}" + youGotPoll: "شارك {name} في استطلاع الرأي" + youGotMessagingMessageFromUser: "لقد تلقيت رسالة مِن {name}" + youGotMessagingMessageFromGroup: "لقد أرسِلَت رسالة إلى الفريق {name}" + youWereFollowed: "يتابعك" + youReceivedFollowRequest: "تلقيتَ طلب متابعة" + yourFollowRequestAccepted: "قُبل طلب المتابعة" + youWereInvitedToGroup: "دُعيت إلى فريقٍ" + pollEnded: "ظهرت نتائج الاستطلاع" + _types: + all: "الكل" + follow: "متابِعون جدد" + mention: "الإشارات" + reply: "الردود" + renote: "أعد النشر" + quote: "الاقتباسات" + reaction: "التفاعلات" + pollVote: "مصوِت شارك في الاستطلاع" + receiveFollowRequest: "طلبات المتابعة المتلقاة" + followRequestAccepted: "طلبات المتابعة المقبولة" + groupInvited: "دعوات الفريق" + app: "إشعارات التطبيقات المرتبطة" + _actions: + followBack: "تابعك بالمثل" + reply: "رد" + renote: "أعد النشر" +_deck: + alwaysShowMainColumn: "أظهر العمود الرئيسي دائمًا" + columnAlign: "حاذِ الأعمدة" + addColumn: "أضف عمودًا" + swapLeft: "حرّك لليسار" + swapRight: "حرّك لليمين" + swapUp: "حرّك لأعلى" + swapDown: "حرّك لأسفل" + profile: "الملف الشخصي" + _columns: + main: "الرئيسي" + widgets: "الودجات" + notifications: "الإشعارات" + tl: "الخيط الزمني" + antenna: "الهوائيات" + list: "القوائم" + mentions: "الإشارات" + direct: "مباشرة" diff --git a/fe_calckey/frontend/locales/bn-BD.yml b/fe_calckey/frontend/locales/bn-BD.yml new file mode 100644 index 0000000..e3fbf8c --- /dev/null +++ b/fe_calckey/frontend/locales/bn-BD.yml @@ -0,0 +1,1661 @@ +--- +_lang_: "বাংলা" +headlineMisskey: "নোট ব্যাবহার করে সংযুক্ত নেটওয়ার্ক" +introMisskey: "স্বাগতম! মিসকি একটি ওপেন সোর্স, ডিসেন্ট্রালাইজড মাইক্রোব্লগিং পরিষেবা। \n\"নোট\" তৈরির মাধ্যমে যা ঘটছে তা সবার সাথে শেয়ার করুন 📡\n\"রিঅ্যাকশন\" গুলির মাধ্যমে যেকোনো নোট সম্পর্কে আপনার অনুভূতি ব্যাক্ত করতে পারেন 👍\nএকটি নতুন দুনিয়া ঘুরে দেখুন 🚀\n" +monthAndDay: "{day}/{month}" +search: "খুঁজুন" +notifications: "বিজ্ঞপ্তি" +username: "ব্যবহারকারীর নাম" +password: "পাসওয়ার্ড" +forgotPassword: "পাসওয়ার্ড ভুলে গেছেন" +fetchingAsApObject: "ফেডিভার্স থেকে খবর আনা হচ্ছে" +ok: "ঠিক" +gotIt: "বুঝেছি" +cancel: "বাতিল" +enterUsername: "ইউজারনেম লিখুন" +renotedBy: "{user} রিনোট করেছেন" +noNotes: "কোন নোট নেই" +noNotifications: "কোনো বিজ্ঞপ্তি নেই" +instance: "ইন্সট্যান্স" +settings: "সেটিংস" +basicSettings: "সাধারণ সেটিংস" +otherSettings: "অন্যান্য সেটিংস" +openInWindow: "নতুন উইন্ডোতে খুলা" +profile: "প্রোফাইল" +timeline: "টাইমলাইন" +noAccountDescription: "এই ব্যাবহারকারীর কোন বায়ো নেই" +login: "প্রবেশ করুন" +loggingIn: "প্রবেশ করা হচ্ছে..." +logout: "লগআউট" +signup: "নিবন্ধন করুন" +uploading: "আপলোড হচ্ছ …" +save: "সংরক্ষণ" +users: "ব্যবহারকারীগণ" +addUser: "ব্যবহারকারী যোগ করুন" +favorite: "পছন্দ" +favorites: "পছন্দগুলি" +unfavorite: "পছন্দ না" +favorited: "পছন্দ করা হয়েছে" +alreadyFavorited: "ইতিমধ্যে পছন্দ করা হয়েছে" +cantFavorite: "পছন্দ করা যায়নি" +pin: "পিন করা" +unpin: "পিন সরান" +copyContent: "বিষয়বস্তু কপি করুন" +copyLink: "লিঙ্ক কপি করুন" +delete: "মুছুন" +deleteAndEdit: "মুছুন এবং সম্পাদনা করুন" +deleteAndEditConfirm: "আপনি কি এই নোটটি মুছে এটি সম্পাদনা করার বিষয়ে নিশ্চিত? আপনি এটির সমস্ত রিঅ্যাকশন, রিনোট এবং জবাব হারাবেন।" +addToList: "লিস্ট এ যোগ করুন" +sendMessage: "একটি বার্তা পাঠান" +copyUsername: "ব্যবহারকারীর নাম কপি করুন" +searchUser: "ব্যবহারকারী খুঁজুন..." +reply: "জবাব" +loadMore: "আরও দেখুন" +showMore: "আরও দেখুন" +showLess: "বন্ধ" +youGotNewFollower: "আপনাকে অনুসরণ করছে" +receiveFollowRequest: "অনুসরণ করার জন্য অনুরোধ পাওয়া গেছে" +followRequestAccepted: "অনুসরণ করার অনুরোধ গৃহীত হয়েছে" +mention: "উল্লেখ" +mentions: "উল্লেখসমূহ" +directNotes: "ডাইরেক্ট নোটগুলি" +importAndExport: "আমদানি এবং রপ্তানি" +import: "আমদানি করুণ" +export: "রপ্তানি" +files: "ফাইলগুলি" +download: "ডাউনলোড" +driveFileDeleteConfirm: "আপনি কি নিশ্চিত যে আপনি \"{name}\" ডিলিট করতে চান? যে সকল নোটের সাথে এই ফাইলটি সংযুক্ত সেগুলোও ডিলিট করা হবে।" +unfollowConfirm: "{name} কে আনফলোও করার ব্যাপারে নিশ্চিত?" +exportRequested: "আপনার তথ্যসমূহ রপ্তানির জন্য অনুরোধ করেছেন। এতে কিছু সময় লাগতে পারে। রপ্তানি সম্পন্ন হলে তা আপনার ড্রাইভে সংরক্ষিত হবে।" +importRequested: "আপনার তথ্যসমূহ আমদানির জন্য অনুরোধ করেছেন। এতে কিছু সময় লাগতে পারে। " +lists: "লিস্ট" +noLists: "কোন লিস্ট নেই" +note: "নোট" +notes: "নোটগুলি" +following: "অনুসরণ করা হচ্ছে" +followers: "অনুসরণকারী" +followsYou: "আপনাকে অনুসরণ করে" +createList: "লিস্ট তৈরি করুন" +manageLists: "লিস্ট ব্যাবস্থাপনা" +error: "সমস্যা" +somethingHappened: "একটি ত্রুটি হয়েছে" +retry: "আবার চেষ্টা করুন" +pageLoadError: "পেজ লোড করা যায়নি" +pageLoadErrorDescription: "এটি সাধারনত নেটওয়ার্কের সমস্যার বা ব্রাউজার ক্যাশের কারণে ঘটে থাকে। ব্রাউজার এর ক্যাশ পরিষ্কার করুন এবং একটু পর আবার চেষ্টা করুন। " +serverIsDead: "এই সার্ভার বর্তমানে সাড়া দিচ্ছে না। একটু পরে আবার চেষ্টা করুন।" +youShouldUpgradeClient: "এই পেজ দেখার জন্য আপনার ব্রাউজার রিফ্রেশ করে ক্লায়েন্ট আপডেট করুন। " +enterListName: "লিস্টের নাম লিখুন" +privacy: "গোপনীয়তা" +makeFollowManuallyApprove: "অনুসরণ করার অনুরোধগুলি গৃহীত হওয়ার জন্য আপনার অনুমতি লাগবে" +defaultNoteVisibility: "ডিফল্ট দৃশ্যমান্যতা" +follow: "অনুসরণ" +followRequest: "অনুসরণ করার অনুরোধ" +followRequests: "অনুসরণ করার অনুরোধসমূহ" +unfollow: "অনুসরণ বাতিল" +followRequestPending: "অনুসরণ করার অনুরোধ বিচারাধীন" +enterEmoji: "ইমোজি প্রবেশ করান" +renote: "রিনোট" +unrenote: "রিনোট সরান " +renoted: "রিনোট করা হয়েছে" +cantRenote: "এই নোটটি রিনোট করা যাবে না।" +cantReRenote: "রিনোটকে রিনোট করা যাবে না।" +quote: "উদ্ধৃতি" +pinnedNote: "পিন করা নোট" +pinned: "পিন করা" +you: "আপনি" +clickToShow: "দেখার জন্য ক্লিক করুন" +sensitive: "সংবেদনশীল বিষয়বস্তু" +add: "যুক্ত করুন" +reaction: "প্রতিক্রিয়া" +reactionSetting: "রিঅ্যাকশন পিকারে যেসকল প্রতিক্রিয়া দেখানো হবে" +reactionSettingDescription2: "পুনরায় সাজাতে টেনে আনুন, মুছতে ক্লিক করুন, যোগ করতে + টিপুন।" +rememberNoteVisibility: "নোটের দৃশ্যমান্যতার সেটিংস মনে রাখুন" +attachCancel: "অ্যাটাচমেন্ট সরান " +markAsSensitive: "সংবেদনশীল হিসাবে চিহ্নিত করুন" +unmarkAsSensitive: "সংবেদনশীল চিহ্ন সরান" +enterFileName: "ফাইলের নাম লিখুন" +mute: "মিউট" +unmute: "আনমিউট" +block: "ব্লক" +unblock: "ব্লক সরান" +suspend: "স্থগিত করা" +unsuspend: "অস্থগিত করা" +blockConfirm: "ব্লক করতে চান?" +unblockConfirm: "ব্লক সরাতে চান?" +suspendConfirm: "স্থগিত করতে চান?" +unsuspendConfirm: "অস্থগিত করতে চান?" +selectList: "লিস্ট নির্বাচন করুন" +selectAntenna: "অ্যান্টেনা নির্বাচন করুন" +selectWidget: "উইজেট নির্বাচন করুন" +editWidgets: "উইজেট সম্পাদনা করুন" +editWidgetsExit: "সম্পাদনা শেষ করুন" +customEmojis: "স্বনির্ধারিত ইমোজিগুলি" +emoji: "ইমোজি" +emojis: "ইমোজিগুলি" +emojiName: "ইমোজির নাম" +emojiUrl: "ইমোজির URL" +addEmoji: "ইমোজি যুক্ত করুন" +settingGuide: "সুপারিশকৃত সেটিংস" +cacheRemoteFiles: "রিমোট ফাইলসমুহ ক্যাশ করুন" +cacheRemoteFilesDescription: "যখন এই অপশনটি বন্ধ থাকে তখন রিমোট ফাইল সমূহ সরাসরি রিমোট ইন্সট্যান্স থেকে লোড করা হয়। এই অপশনটি বন্ধ করলে স্টোরেজ এর ব্যাবহার কমবে তবে থাম্বনেইল তৈরি না করার কারণে নেটওয়ার্ক ব্যান্ডউইথ বেশী লাগবে। " +flagAsBot: "বট হিসাবে চিহ্নিত করুন" +flagAsBotDescription: "এই অ্যাকাউন্টটি যদি একটি প্রোগ্রাম দ্বারা পরিচালিত হয়, তাহলে এই অপশনটি চালু করুন। ইন্টারঅ্যাকশান চেইনিং রোধ করতে, মিস্কির সিস্টেম পরিচালনাকে বট-বান্ধব করতে এবং অন্যান্য ডেভেলপারদের সাহায্য করতে আপনার বট এ এই অপশনটি চালু করুন৷" +flagAsCat: "বিড়াল হিসাবে চিহ্নিত করুন" +flagAsCatDescription: "অ্যাকাউন্টটিকে বিড়াল হিসাবে চিহ্নিত করার জন্য অপশনটি চালু করুন।" +flagShowTimelineReplies: "টাইমলাইনে নোটগুলির রিপ্লাই দেখান" +flagShowTimelineRepliesDescription: "চালু করলে, টাইমলাইন ব্যবহারকারীর নোট ছাড়াও ব্যবহারকারীর অন্যান্য নোটের জবাবগুলো দেখায়।" +autoAcceptFollowed: "আপনি যেসব অ্যাকাউন্ট অনুসরণ করেন, স্বয়ংক্রিয়ভাবে তাদের অনুসরণের অনুরধ স্বীকার করুন" +addAccount: "অ্যাকাউন্ট যোগ করুন" +loginFailed: "প্রবেশ করা যায়নি" +showOnRemote: "রিমোট সার্ভারে দেখুন" +general: "সাধারণ" +wallpaper: "ওয়ালপেপার" +setWallpaper: "ওয়ালপেপার সেট করুন" +removeWallpaper: "ওয়ালপেপার সরান" +searchWith: "খুঁজুন: {q}" +youHaveNoLists: "আপনার কোন লিস্ট নেই" +followConfirm: "{name} কে ফলোও করার ব্যাপারে নিশ্চিত?" +proxyAccount: "প্রক্সি অ্যাকাউন্ট" +proxyAccountDescription: "একটি প্রক্সি অ্যাকাউন্ট এমন একটি অ্যাকাউন্ট যা নির্দিষ্ট শর্তে ব্যবহারকারীদের জন্য রিমোট অনুসরণকারী হিসাবে কাজ করে। উদাহরণস্বরূপ, যখন একজন ব্যবহারকারী একটি রিমোট ব্যবহারকারীকে তালিকাভুক্ত করে, তখন ক্রিয়াকলাপের দৃষ্টান্তে বিতরণ করা হবে না যদি না কেউ তালিকাভুক্ত ব্যবহারকারীকে অনুসরণ করে, তাই প্রক্সি অ্যাকাউন্ট দ্বারা তাকে অনুসরণ করা হবে।" +host: "হোস্ট" +selectUser: "ব্যবহারকারী নির্বাচন করুন" +recipient: "প্রতি" +annotation: "মন্তব্য" +federation: "ফেডিভার্স" +instances: "ইন্সট্যান্স" +registeredAt: "যোগ দিয়েছেন" +latestRequestSentAt: "শেষ রিকুয়েস্ট পাঠানো হয়েছে" +latestRequestReceivedAt: "শেষ রিকুয়েস্ট গৃহীত হয়েছে" +latestStatus: "সর্বশেষ অবস্থা" +storageUsage: "স্টোরেজের ব্যাবহার" +charts: "চার্ট" +perHour: "ঘন্টা প্রতি" +perDay: "দৈনিক" +stopActivityDelivery: "অ্যাক্টিভিটি পাঠানো বন্ধ করুন" +blockThisInstance: "ইন্সট্যান্স ব্লক করুন" +operations: "ক্রিয়াকলাপ" +software: "সফটওয়্যার" +version: "সংস্করণ" +metadata: "মেটাডাটা" +monitor: "মনিটর" +jobQueue: "জব কিউ" +cpuAndMemory: "সিপিউ এবং মেমরি" +network: "নেটওয়ার্ক" +disk: "ডিস্ক" +instanceInfo: "ইন্সট্যান্সের তথ্য" +statistics: "পরিসংখ্যান" +clearQueue: "কিউ পরিষ্কার করুন" +clearQueueConfirmTitle: "আপনি কি কিউ পরিষ্কার করার ব্যাপারে নিশ্চিত?" +clearQueueConfirmText: "বিতরণ না করা নোট আর বিতরণ করা হবে না। সাধারণত আপনার এটি করার দরকার নেই।" +clearCachedFiles: "ক্যাশ পরিষ্কার করুন" +clearCachedFilesConfirm: "আপনি কি ক্যাশ পরিষ্কার করার ব্যাপারে নিশ্চিত?" +blockedInstances: "ব্লককৃত ইন্সট্যান্সসমুহ" +blockedInstancesDescription: "আপনি যে ইন্সট্যান্সগুলি ব্লক করতে চান তার হোস্টনেমগুলি প্রত্যেকটি আলাদা লাইনে লিখুন। ব্লককৃত ইন্সট্যান্সগুলি এই ইন্সট্যান্সের সাথে যোগাযোগ করতে পারবেনা৷" +muteAndBlock: "মিউট এবং ব্লকগুলি" +mutedUsers: "নিঃশব্দকৃত ব্যবহারকারী" +blockedUsers: "যাদের ব্লক করা হয়েছে" +noUsers: "কোন ব্যাবহারকারী নেই" +editProfile: "প্রোফাইল সম্পাদনা করুন" +noteDeleteConfirm: "আপনি কি নোট ডিলিট করার ব্যাপারে নিশ্চিত?" +pinLimitExceeded: "আপনি আর কোন নোট পিন করতে পারবেন না" +intro: "Calckey এর ইন্সটলেশন সম্পন্ন হয়েছে!দয়া করে অ্যাডমিন ইউজার তৈরি করুন।" +done: "সম্পন্ন" +processing: "প্রক্রিয়াধীন" +preview: "পূর্বরূপ দেখুন" +default: "পূর্বনির্ধারিত" +noCustomEmojis: "কোন ইমোজি নাই" +noJobs: "কোন জব নাই" +federating: "ফেডারেট করা হচ্ছে" +blocked: "ব্লক করা হয়েছে" +suspended: "স্থগিত করা হয়েছে" +all: "সবগুলো" +subscribing: "সদস্যতা নেয়া হচ্ছে" +publishing: "প্রকাশ করা হচ্ছে" +notResponding: "সাড়া নেই" +instanceFollowing: "ইন্সট্যান্স অনুসরণ করা হচ্ছে" +instanceFollowers: "ইন্সট্যান্স অনুসরণকারী" +instanceUsers: "ইন্সট্যান্স ব্যাবহারকারী" +changePassword: "পাসওয়ার্ড পরিবর্তন করুন" +security: "নিরাপত্তা" +retypedNotMatch: "ইনপুট মেলে না।" +currentPassword: "বর্তমান পাসওয়ার্ড" +newPassword: "নতুন পাসওয়ার্ড" +newPasswordRetype: "নতুন পাসওয়ার্ড (পুনরায় লিখুন)" +attachFile: "ফাইল সংযুক্ত করুন" +more: "আরও!" +featured: "হাইলাইট" +usernameOrUserId: "ব্যাবহারকারীর নাম বা ব্যাবহারকারী ID" +noSuchUser: "কোন ব্যবহারকারী খুঁজে পাওয়া যায়নি" +lookup: "খুঁজে দেখো" +announcements: "ঘোষণা" +imageUrl: "চিত্রের URL" +remove: "মুছুন" +removed: "সরানো হয়েছে" +removeAreYouSure: "আপনি কি \"{x}\" সরানোর ব্যাপারে নিশ্চিত?" +deleteAreYouSure: "আপনি কি \"{x}\" সরানোর ব্যাপারে নিশ্চিত?" +resetAreYouSure: "রিসেট করার ব্যাপারে নিশ্চিত?" +saved: "সংরক্ষিত হয়েছে" +messaging: "চ্যাট" +upload: "আপলোড" +keepOriginalUploading: "আসল ছবি রাখুন" +keepOriginalUploadingDescription: "ছবিটি আপলোড করার সময় আসল সংস্করণটি রাখুন। অপশনটি বন্ধ থাকলে, আপলোডের সময় ওয়েব প্রকাশনার জন্য ছবি ব্রাউজারে তৈরি করা হবে।" +fromDrive: "ড্রাইভ হতে" +fromUrl: "URL হতে" +uploadFromUrl: "URL হতে আপলোড" +uploadFromUrlDescription: "যে ফাইলটি আপলোড করতে চান, সেটির URL" +uploadFromUrlRequested: "আপলোড অনুরোধ করা হয়েছে" +uploadFromUrlMayTakeTime: "URL হতে আপলোড হতে কিছু সময় লাগতে পারে।" +explore: "ঘুরে দেখুন" +messageRead: "পড়া" +noMoreHistory: "আর কোন ইতিহাস নেই" +startMessaging: "চ্যাট শুরু করুন" +nUsersRead: "{n} জন পড়েছেন" +agreeTo: "{0} এর প্রতি আমি সম্মত" +tos: "পরিষেবার শর্তাদি" +start: "শুরু করুন" +home: "মূল পাতা" +remoteUserCaution: "এই ব্যাবহারকারী রিমোট ইন্সট্যান্সের, নিম্নক্ত তথ্য অসম্পূর্ণ হতে পারে।" +activity: "কার্যকলাপ" +images: "ছবি" +birthday: "জন্মদিন" +yearsOld: "{age} বছর" +registeredDate: "যোগদানের তারিখ" +location: "অবস্থান" +theme: "থিম" +themeForLightMode: "লাইট মোডের থিম" +themeForDarkMode: "ডার্ক মোডের থিম" +light: "আলোকিত" +dark: "অন্ধকার" +lightThemes: "আলোকিত থিম" +darkThemes: "অন্ধকার থিম" +syncDeviceDarkMode: "ডিভাইসের সেটিং অনুযায়ী ডার্ক মোড সেট করুন" +drive: "ড্রাইভ" +fileName: "ফাইলের নাম" +selectFile: "ফাইল নির্বাচন করুন" +selectFiles: "ফাইল নির্বাচন করুন" +selectFolder: "ফোল্ডার নির্বাচন করুন" +selectFolders: "ফোল্ডার নির্বাচন করুন" +renameFile: "ফাইল পুনঃনামকরন" +folderName: "ফোল্ডারের নাম" +createFolder: "ফোল্ডার তৈরি করুন" +renameFolder: "ফোল্ডার পুনঃনামকরন" +deleteFolder: "ফোল্ডার মুছুন" +addFile: "ফাইল যোগ করুন" +emptyDrive: "আপনার ড্রাইভ খালি" +emptyFolder: "এই ফোল্ডার খালি" +unableToDelete: "মুছে ফেলা যায়নি" +inputNewFileName: "ফাইলের নতুন নাম লিখুন" +inputNewDescription: "নতুন ক্যাপশন লিখুন" +inputNewFolderName: "ফোল্ডারের নতুন নাম লিখুন" +circularReferenceFolder: "গন্তব্য ফোল্ডারটি আপনি যে ফোল্ডারটি সরাতে চান তার একটি সাবফোল্ডার।" +hasChildFilesOrFolders: "এই ফোল্ডারটি খালি না হওয়ায় ডিলিট করা যায়নি।" +copyUrl: "URL কপি করুন" +rename: "পুনঃনামকরণ" +avatar: "প্রোফাইল ছবি" +banner: "ব্যানার" +nsfw: "সংবেদনশীল বিষয়বস্তু" +whenServerDisconnected: "সার্ভারের সাথে সংযোগ বিচ্ছিন্ন হয়ে গেলে" +disconnectedFromServer: "সার্ভার থেকে সংযোগ বিচ্ছিন্ন হয়েছে" +reload: "আবার লোড করুন" +doNothing: "কিছু করবেন না" +reloadConfirm: "আপনি কি রিলোড করতে চান?" +watch: "বিজ্ঞপ্তি পান" +unwatch: "বিজ্ঞপ্তি পাওয়া বন্ধ করুন " +accept: "অনুমোদন" +reject: "প্রত্যাখ্যান" +normal: "স্বাভাবিক" +instanceName: "ইন্সট্যান্সের নাম" +instanceDescription: "ইন্সট্যান্সের বর্ণনা" +maintainerName: "মেইনটেইনার" +maintainerEmail: "মেইনটেইনারের ইমেইল" +tosUrl: "ব্যবহারের শর্তাবলীর URL" +thisYear: "বছর" +thisMonth: "মাস" +today: "আজ" +dayX: "{day}" +monthX: "{month}" +yearX: "{year}" +pages: "পৃষ্ঠা" +integration: "ইন্টিগ্রেশন" +connectService: "সংযুক্ত করুন" +disconnectService: "সংযোগ বিচ্ছিন্ন করুন" +enableLocalTimeline: "স্থানীয় টাইমলাইন চালু করুন" +enableGlobalTimeline: "গ্লোবাল টাইমলাইন চালু করুন" +disablingTimelinesInfo: "আপনি এই টাইমলাইনগুলি বন্ধ করলেও প্রশাসক এবং মডারেটররা এই টাইমলাইনগুলি ব্যাবহার করতে পারবে" +registration: "নিবন্ধন" +enableRegistration: "নতুন ব্যাবহারকারী নিবন্ধন চালু করুন" +invite: "আমন্ত্রণ" +driveCapacityPerLocalAccount: "প্রত্যেক স্থানীয় ব্যাবহারকারীর জন্য ড্রাইভের জায়গা" +driveCapacityPerRemoteAccount: "প্রত্যেক রিমোট ব্যাবহারকারীর জন্য ড্রাইভের জায়গা" +inMb: "মেগাবাইটে লিখুন" +iconUrl: "আইকনের URL (ফ্যাভিকন, ইত্যাদি)" +bannerUrl: "ব্যানার ছবির URL" +backgroundImageUrl: "পটভূমির চিত্রের URL" +basicInfo: "আপনার ব্যক্তিগত তথ্য" +pinnedUsers: "পিন করা ব্যাবহারকারীগণ" +pinnedUsersDescription: "আপনি যেসব ব্যবহারকারীদের \"ঘুরে দেখুন\" পৃষ্ঠায় পিন করতে চান তাদের বর্ণনা করুন, প্রত্যেকের বর্ণনা আলাদা লাইনে লিখুন" +pinnedPages: "পিন করা পৃষ্ঠাসুমহ" +pinnedPagesDescription: "আপনি যেসকল পৃষ্ঠাসমূহকে \"ঘুরে দেখুন\" পৃষ্ঠায় পিন করতে চান তাদের বর্ণনা করুন, প্রত্যেকের বর্ণনা আলাদা লাইনে লিখুন" +pinnedClipId: "পিনকৃত ক্লিপের ID" +pinnedNotes: "পিন করা নোট" +hcaptcha: "hCaptcha" +enableHcaptcha: "hCaptcha চালু করুন" +hcaptchaSiteKey: "সাইট কী" +hcaptchaSecretKey: "সিক্রেট কী" +recaptcha: "reCAPTCHA" +enableRecaptcha: "reCAPTCHA চালু করুন" +recaptchaSiteKey: "সাইট কী" +recaptchaSecretKey: "সিক্রেট কী" +avoidMultiCaptchaConfirm: "একাধিক Captcha ব্যবহার করলে তারা পরস্পরের কাজে বাধা দিতে পারে। আপনি কি অন্যান্য Captcha নিষ্ক্রিয় করতে চান? আপনি 'বাতিল' ক্লিক করার মাধ্যমে একাধিক Captcha চালু রাখতে পারেন।" +antennas: "অ্যান্টেনা" +manageAntennas: "অ্যান্টেনা ব্যবস্থাপনা" +name: "নাম" +antennaSource: "অ্যান্টেনার উৎস" +antennaKeywords: "যেসব কীওয়ার্ড দেখা হবে" +antennaExcludeKeywords: "যেসব কীওয়ার্ড দেখা হবে না" +antennaKeywordsDescription: "স্পেস দিয়ে আলাদা করলে AND শর্ত তৈরি হবে এবং আলাদা লাইনে লিখলে OR শর্ত তৈরি হবে।" +notifyAntenna: "নতুন নোট সম্পর্কে অবহিত করুন" +withFileAntenna: "শুধুমাত্র ফাইলযুক্ত নোট" +enableServiceworker: "ServiceWorker চালু করুন" +antennaUsersDescription: "প্রত্যেক লাইনে একজন ব্যবহারকারীর নাম লিখুন" +caseSensitive: "ছোট হাতের এবং বড় হাতের অক্ষর নির্দিষ্ট করুন" +withReplies: "জবাবসমুহ যুক্ত করুন" +connectedTo: "আপনি নিম্নলিখিত অ্যাকাউন্টের সাথে সংযুক্ত" +notesAndReplies: "নোটসমূহ এবং জবাবগুলি" +withFiles: "ফাইলগুলি যুক্ত করুন" +silence: "নীরব" +silenceConfirm: "আপনি কি এই ব্যাবহারকারীকের নীরব করতে চান?" +unsilence: "সরব" +unsilenceConfirm: "আপনি কি এই ব্যাবহারকারীকের সরব করতে চান?" +popularUsers: "জনপ্রিয় ব্যবহারকারীগন" +recentlyUpdatedUsers: "সম্প্রতি পোস্ট করা ব্যবহারকারীগন" +recentlyRegisteredUsers: "নতুন যোগ দেওয়া ব্যবহারকারীগন" +recentlyDiscoveredUsers: "নতুন খুঁজে পাওয়া ব্যবহারকারীগন" +exploreUsersCount: "{count} জন ব্যাবহারকারী" +exploreFediverse: "Fediverse ঘুরে দেখুন" +popularTags: "জনপ্রিয় ট্যাগগুলি" +userList: "লিস্ট" +about: "আপনার সম্পর্কে" +aboutMisskey: "Calckey সম্পর্কে" +administrator: "প্রশাসক" +token: "টোকেন" +twoStepAuthentication: "২-ধাপ প্রমাণীকরণ" +moderator: "মডারেটর" +nUsersMentioned: "{n} জনকে উল্লেখ করা হয়েছে" +securityKey: "সিকিউরিটি কী" +securityKeyName: "কী'র নাম" +registerSecurityKey: "সিকিউরিটি কী নিবন্ধন করুন" +lastUsed: "শেষ ব্যাবহার করা হয়েছে" +unregister: "নিবন্ধনমুক্ত হন" +passwordLessLogin: "পাসওয়ার্ড-বিহীন লগইন সেট আপ করুন" +resetPassword: "পাসওয়ার্ড রিসেট করুন" +newPasswordIs: "নতুন পাসওয়ার্ড হচ্ছে \"{password}\"" +reduceUiAnimation: "UI অ্যানিমেশন কমান" +share: "শেয়ার" +notFound: "পাওয়া যায়নি" +notFoundDescription: "এই URL-এর সাথে সম্পর্কিত কোনো পৃষ্ঠা নেই।" +uploadFolder: "আপলোডের জন্য ডিফল্ট ফোল্ডার" +cacheClear: "ক্যাশ পরিষ্কার করুন" +markAsReadAllNotifications: "সমস্ত বিজ্ঞপ্তিগুলি পঠিত হিসাবে চিহ্নিত করুন" +markAsReadAllUnreadNotes: "সমস্ত নোটগুলি পঠিত হিসাবে চিহ্নিত করুন" +markAsReadAllTalkMessages: "সমস্ত মেসেজ পঠিত হিসাবে চিহ্নিত করুন" +help: "সহায়তা" +inputMessageHere: "এখানে মেসেজ লিখুন" +close: "বন্ধ" +group: "গ্রুপ" +groups: "গ্রুপসমূহ" +createGroup: "গ্রুপ তৈরী করুন" +ownedGroups: "আপনার গ্রুপগুলি" +joinedGroups: "যেসব গ্রুপে আপনি আছেন" +invites: "আমন্ত্রণ" +groupName: "গ্রুপের নাম" +members: "সদস্যবৃন্দ" +transfer: "হস্তান্তর" +messagingWithUser: "প্রাইভেট চ্যাট" +messagingWithGroup: "গ্রুপ চ্যাট" +title: "শিরোনাম" +text: "পাঠ্য" +enable: "সক্রিয়" +next: "পরবর্তী" +retype: "পুনঃ প্রবেশ" +noteOf: "{user} এর নোট" +inviteToGroup: "গ্রুপে আমন্ত্রণ জানান" +quoteAttached: "উদ্ধৃত" +quoteQuestion: "উদ্ধৃতি হিসাবে সংযুক্ত করবেন?" +noMessagesYet: "কোন মেসেজ নেই" +newMessageExists: "নতুন মেসেজ পেয়েছেন" +onlyOneFileCanBeAttached: "আপনি মেসেজের সাথে সর্বোচ্চ একটি ফাইল যুক্ত করতে পারবেন" +signinRequired: "দয়া করে লগ ইন করুন" +invitations: "আমন্ত্রণ" +invitationCode: "ইনভাইট কোড" +checking: "পরীক্ষা করা হচ্ছে..." +available: "উপলব্ধ" +unavailable: "অনুপলব্ধ" +usernameInvalidFormat: "আপনি কেবলমাত্র a-z, A-Z, 0-9, _ ব্যবহার করতে পারেন" +tooShort: "খুব ছোট" +tooLong: "খুব বড়" +weakPassword: "দুর্বল পাসওয়ার্ড" +normalPassword: "সাধারণ পাসওয়ার্ড" +strongPassword: "শক্তিশালী পাসওয়ার্ড" +passwordMatched: "মিলেছে" +passwordNotMatched: "মিলেনি" +signinWith: "{x} এর সাহায্যে সাইন ইন করুন" +signinFailed: "লগ ইন করা যায়নি। আপনার ব্যবহারকারীর নাম এবং পাসওয়ার্ড চেক করুন." +tapSecurityKey: "সিকিউরিটি কী স্পর্শ করুন" +or: "অথবা" +language: "ভাষা" +uiLanguage: "UI এর ভাষা" +groupInvited: "আপনি একটি গ্রুপে আমন্ত্রিত হয়েছেন" +aboutX: "{x} সম্পর্কে" +useOsNativeEmojis: "অপারেটিং সিস্টেমের নেটিভ ইমোজি ব্যবহার করুন" +disableDrawer: "ড্রয়ার মেনু প্রদর্শন করবেন না" +youHaveNoGroups: "আপনার কোন গ্রুপ নেই " +joinOrCreateGroup: "একটি বিদ্যমান গ্রুপের আমন্ত্রণ পান বা একটি নতুন গ্রুপ তৈরি করুন৷" +noHistory: "কোনো ইতিহাস নেই" +signinHistory: "প্রবেশ করার ইতিহাস" +disableAnimatedMfm: "অ্যানিমেটেড MFM অক্ষম করুন" +doing: "প্রক্রিয়া করছে..." +category: "বিভাগ" +tags: "ট‍্যাগসমূহ" +docSource: "ডকুমেন্টের উৎস" +createAccount: "অ্যাকাউন্ট তৈরি করুন" +existingAccount: "বিদ্যমান অ্যাকাউন্ট" +regenerate: "আবারও তৈরি করুন" +fontSize: "ফন্টের আকার" +noFollowRequests: "আপনার কোন ফলোও রিকুয়েস্ট নেই" +openImageInNewTab: "ছবি নতুন ট্যাবে খুলুন" +dashboard: "ড্যাশবোর্ড" +local: "স্থানীয়" +remote: "রিমোট" +total: "মোট" +weekOverWeekChanges: "গত সপ্তাহে" +dayOverDayChanges: "গতকাল" +appearance: "অবয়ব" +clientSettings: "ক্লায়েন্ট সেটিংস" +accountSettings: "অ্যাকাউন্ট সেটিংস" +promotion: "প্রমোশন" +promote: "প্রচার করুন" +numberOfDays: "দিনের সংখ্যা" +hideThisNote: "নোটটি লুকান" +showFeaturedNotesInTimeline: "টাইমলাইনে সুপারিশকৃত নোটগুলি দেখান" +objectStorage: "অবজেক্ট স্টোরেজ" +useObjectStorage: "অবজেক্ট স্টোরেজ ব্যাবহার করুন" +objectStorageBaseUrl: "Base URL" +objectStorageBaseUrlDesc: "রেফারেন্স হিসাবে ব্যবহৃত URL। আপনি একটি CDN বা প্রক্সি ব্যবহার করলে URL, S3: 'https://.s3.amazonaws.com', GCS: 'https://storage.googleapis.com/'।" +objectStorageBucket: "Bucket" +objectStorageBucketDesc: "ব্যবহার করা পরিষেবার bucket এর নাম লিখুন। " +objectStoragePrefix: "Prefix" +objectStoragePrefixDesc: "ফাইলসমূহ এই prefix যুক্ত ফোল্ডারের অধীনে সংরক্ষণ করা হবে।" +objectStorageEndpoint: "এন্ডপয়েন্ট" +objectStorageEndpointDesc: "S3 এর জন্য ফাঁকা রাখুন, অন্যথায় প্রতিটি পরিষেবার এন্ডপয়েন্ট নির্দিষ্ট করুন। ''বা': ' হিসেবে লিখুন।" +objectStorageRegion: "Region" +objectStorageRegionDesc: "'xx-east-1'-এর মতো একটি region নির্দিষ্ট করুন। যদি আপনার পরিষেবাতে region এর ধারণা না থাকে, তাহলে এটি খালি বা 'us-east-1' হওয়া উচিত।" +objectStorageUseSSL: "SSL ব্যাবহার করুন" +objectStorageUseSSLDesc: "API কানেকশনগুলির জন্য যদি https ব্যাবহার না করেন, তাহলে এই অপশনটি বন্ধ করুন" +objectStorageUseProxy: "Proxy ব্যাবহার করুন" +objectStorageUseProxyDesc: "আপনি API সংযোগের জন্য proxy ব্যবহার না করলে, এটি বন্ধ করুন।" +objectStorageSetPublicRead: "আপলোডের উপর ''public-read' সেট করুন" +serverLogs: "সার্ভার লগ" +deleteAll: "সব মুছুন" +showFixedPostForm: "টাইমলাইনের শীর্ষে পোস্ট করার ফর্মটি দেখান" +newNoteRecived: "নতুন নোট আছে" +sounds: "শব্দ" +listen: "শুনুন" +none: "কিছুই না" +showInPage: "পেজে দেখান" +popout: "পপ-আউট" +volume: "আওয়াজের মাত্রা" +masterVolume: "মাস্টার আওয়াজের মাত্রা" +details: "আরও জানুন" +chooseEmoji: "ইমোজি নির্বাচন করুন" +unableToProcess: "কাজটি সম্পন্ন করা যায়নি" +recentUsed: "সম্প্রতি ব্যবহৃত" +install: "ইন্সটল" +uninstall: "আনইন্সটল" +installedApps: "ইন্সটল করা অ্যাপসমূহ" +nothing: "এখানে কিছুই নাই" +installedDate: "ইন্সটল করার তারিখ" +lastUsedDate: "সর্বশেষ ব্যাবহৃত" +state: "অবস্থা" +sort: "সাজান" +ascendingOrder: "ঊর্ধ্বক্রমে" +descendingOrder: "নিম্নক্রমে" +scratchpad: "স্ক্র্যাচপ্যাড" +scratchpadDescription: "স্ক্র্যাচপ্যাড AiScript-এর জন্য একটি পরীক্ষামূলক পরিবেশ প্রদান করে। আপনি মিস্কির সাথে ইন্টারঅ্যাক্ট করে এমন কোড লিখতে, চালাতে এবং তার ফলাফল দেখতে পারেন।" +output: "আউটপুট" +script: "স্ক্রিপ্ট" +disablePagesScript: "পেজগুলোতে AiScript অক্ষম করুন" +updateRemoteUser: "রিমোট ব্যবহারকারীর তথ্য আপডেট করুন" +deleteAllFiles: "সকল ফাইল ডিলিট করুন" +deleteAllFilesConfirm: "সকল ফাইল ডিলিট করতে চান?" +removeAllFollowing: "সকল অনুসরণ বাতিল করুন" +removeAllFollowingDescription: "{host} এর সকল ব্যাবহারকারীকে আর ফলোও করবেন না । যদি ইন্সত্যান্সটির কোন সমস্যা (যেমনঃ ইন্সত্যান্সটি আর নেই) হয়ে থাকে তবে এটি ব্যাবহার করুন । " +userSuspended: "এই ব্যাবহারকারির অ্যাকাউন্ট স্থগিত করা হয়েছে" +userSilenced: "এই ব্যাবহারকারিকে মিউট করা হয়েছে" +yourAccountSuspendedTitle: "এই অ্যাকাউন্টটি স্থগিত করা হয়েছে" +yourAccountSuspendedDescription: "সার্ভারের ব্যবহারের শর্তাবলী লঙ্ঘনের মতো কারণে এই অ্যাকাউন্টটি স্থগিত করা হয়েছে৷ বিস্তারিত জানার জন্য প্রশাসকের সাথে যোগাযোগ করুন । একটি নতুন অ্যাকাউন্ট তৈরি করবেন না দয়া করে ।" +menu: "মেনু" +divider: "খন্ডক" +addItem: "আইটেম যোগ করুন" +relays: "রিলেগুলি" +addRelay: "রিলে যোগ করুন" +inboxUrl: "inbox এর URL" +addedRelays: "যোগকৃত রিলেগুলি" +serviceworkerInfo: "পুশ বিজ্ঞপ্তির জন্য চালু করা লাগবে।" +deletedNote: "ডিলিট করা নোট" +invisibleNote: "অদৃশ্য নোট" +enableInfiniteScroll: "ইনফিনিট স্ক্রল চালু করুন" +visibility: "দৃশ্যমানতা" +poll: "জরিপ" +useCw: "কন্টেন্ট লুকান" +enablePlayer: "ভিডিও প্লেয়ার খুলুন" +disablePlayer: "ভিডিও প্লেয়ার বন্ধ করুন" +expandTweet: "টুইট বিস্তারিত করুন" +themeEditor: "থিম সম্পাদক" +description: "বর্ণনা" +describeFile: "ক্যাপশন যোগ করুন" +enterFileDescription: "ক্যাপশন যোগ করুন" +author: "লেখক" +leaveConfirm: "কিছু পরিবর্তন সেভ করা হয়নি। আপনি কি চলে যেতে চান?" +manage: "পরিচালনা" +plugins: "প্লাগইনসমূহ" +deck: "ডেক" +undeck: "ডেকমুক্ত করুন" +useBlurEffectForModal: "মোডালের জন্য ব্লার ইফেক্ট ব্যবহার করুন" +useFullReactionPicker: "সম্পূর্ণ বৈশিষ্ট্যযুক্ত রিঅ্যাকশন পিকার ব্যবহার করুন" +width: "প্রস্থ" +height: "উচ্চতা" +large: "বড়" +medium: "মাঝারি" +small: "ছোট" +generateAccessToken: "অ্যাক্সেস টোকেন তৈরি করুন" +permission: "অনুমতি" +enableAll: "সবগুলি সক্রিয় করুন" +disableAll: "সবগুলি নিষ্ক্রিয় করুন" +tokenRequested: "অ্যাকাউন্টে অ্যাক্সেস প্রদান করবেন" +pluginTokenRequestedDescription: "এই প্লাগইনটি এখানে দেওয়া অনুমুতিসমূহ ব্যাবহার করবে" +notificationType: "বিজ্ঞপ্তির ধরন" +edit: "সম্পাদনা" +emailServer: "ইমেইল সার্ভার" +enableEmail: "ইমেইল বিতরণ চালু করুন" +emailConfigInfo: "আপনার ইমেল ঠিকানা নিশ্চিত করতে এবং আপনার পাসওয়ার্ড পুনরায় সেট করতে ব্যবহৃত হয়" +email: "ইমেইল" +emailAddress: "ইমেইল ঠিকানা" +smtpConfig: "SMTP সার্ভার কনফিগারেশন" +smtpHost: "হোস্ট" +smtpPort: "পোর্ট" +smtpUser: "ব্যবহারকারীর নাম" +smtpPass: "পাসওয়ার্ড" +emptyToDisableSmtpAuth: "আপনি ব্যবহারকারীর নাম এবং পাসওয়ার্ড ফাঁকা রেখে SMTP প্রমাণীকরণ নিষ্ক্রিয় করতে পারেন।" +smtpSecure: "SMTP সংযোগের জন্য SSL/TLS ব্যবহার করুন" +smtpSecureInfo: "STARTTLS ব্যবহার করার সময় এটি বন্ধ করুন।" +testEmail: "ইমেল বিতরণ পরীক্ষা করুন" +wordMute: "বিশেষ কোন শব্দকে মিউট করুন" +regexpError: "রেগুলার এক্সপ্রেশন ত্রুটি" +regexpErrorDescription: "{tab} ওয়ার্ড মিউটের {line} লাইনে রেগুলার এক্সপ্রেশনে একটি ত্রুটি ছিল:" +instanceMute: "মিউট করা ইন্সত্যান্সগুলি" +userSaysSomething: "{name} কিছু বলেছে" +makeActive: "সক্রিয় করা" +display: "প্রদর্শন" +copy: "অনুলিপি" +metrics: "মেট্রিক্স" +overview: "সারাংশ" +logs: "লগ" +delayed: "দেরি করুন" +database: "ডেটাবেজ" +channel: "চ্যানেলগুলি" +create: "তৈরি করুন" +notificationSetting: "বিজ্ঞপ্তির সেটিংস" +notificationSettingDesc: "কি ধরনের বিজ্ঞপ্তি পাবেন তা নির্ধারণ করুন" +useGlobalSetting: "গ্লোবাল সেটিংস ব্যাবহার করুন" +useGlobalSettingDesc: "চালু করলে, আপনার অ্যাকাউন্টের বিজ্ঞপ্তি সেটিংস ব্যবহার করা হবে। বন্ধ করলে, এটি পৃথকভাবে সেট করা যেতে পারে।" +other: "অন্যান্য" +regenerateLoginToken: "লগইন টোকেন আবার বানান" +regenerateLoginTokenDescription: "লগ ইন করার জন্য ব্যবহৃত অভ্যন্তরীণ টোকেন পুনরায় তৈরি করে। সাধারণত আপনার এটি করার দরকার নেই। এটি করলে, আপনি সমস্ত ডিভাইসে লগ আউট হয়ে যাবেন৷" +setMultipleBySeparatingWithSpace: "আপনি একটি স্পেস দিয়ে আলাদা করে একাধিক এন্ট্রি দিতে পারেন।" +fileIdOrUrl: "ফাইল ID অথবা URL" +behavior: "আচরণ" +sample: "উদাহরণ" +abuseReports: "অভিযোগ" +reportAbuse: "অভিযোগ" +reportAbuseOf: "{name} এ অভিযোগ করুন" +fillAbuseReportDescription: "রিপোর্টের কারণ বর্ণনা করুন. একটি বিশেষ নোট এর জন্য রিপোর্টটি হয়ে থাকে তবে তার URL টি অন্তর্ভুক্ত করুন। " +abuseReported: "আপনার অভিযোগটি দাখিল করা হয়েছে। আপনাকে ধন্যবাদ।" +reporter: "অভিযোগকারী" +reporteeOrigin: "অভিযোগটির উৎস" +reporterOrigin: "অভিযোগকারীর উৎস" +forwardReport: "রিমোট ইন্সত্যান্সে অভিযোগটি পাঠান" +forwardReportIsAnonymous: "আপনার তথ্য রিমোট ইন্সত্যান্সে পাঠানো হবে না এবং একটি বেনামী সিস্টেম অ্যাকাউন্ট হিসাবে প্রদর্শিত হবে।" +send: "পাঠান" +abuseMarkAsResolved: "অভিযোগটিকে সমাধাকৃত হিসাবে চিহ্নিত করুন" +openInNewTab: "নতুন ট্যাবে খুলুন" +openInSideView: "সাইড ভিউতে খুলুন" +defaultNavigationBehaviour: "ডিফল্ট নেভিগেশন" +editTheseSettingsMayBreakAccount: "এসব সেটিংস সম্পাদনা করলে আপনার অ্যাকাউন্টের ক্ষতি হতে পারে। " +instanceTicker: "ইন্সত্যান্সে নোটের তথ্য" +waitingFor: "{x} এর জন্য অপেক্ষা করা হচ্ছে" +random: "র‍্যান্ডম" +system: "সিস্টেম" +switchUi: "UI পরিবর্তন করুন" +desktop: "ডেস্কটপ" +clip: "ক্লিপ" +createNew: "নতুন" +optional: "প্রয়োজনীয় নয়" +createNewClip: "নতুন ক্লিপ তৈরি করুন" +public: "সর্বজনীন" +i18nInfo: "Calckey স্বেচ্ছাসেবকদের দ্বারা বিভিন্ন ভাষায় অনুবাদ করা হচ্ছে। আপনি {link} এ গিয়ে অনুবাদে সহযোগিতা করতে পারেন।" +manageAccessTokens: "অ্যাক্সেস টোকেন পরিচালনা করুন" +accountInfo: "অ্যাকাউন্টের তথ্য" +notesCount: "নোটের সংখ্যা" +repliesCount: "জবাবের সংখ্যা" +renotesCount: "রিনোটের সংখ্যা" +repliedCount: "জবাব গ্রহন করা হয়েছে" +renotedCount: "রিনোট পেয়েছেন" +followingCount: "যাদেরকে অনুসরণ করেন, তাদের সংখ্যা" +followersCount: "অনুসরণকারীদের সংখ্যা" +sentReactionsCount: "রিঅ্যাকশন পাঠানো হয়েছে" +receivedReactionsCount: "রিঅ্যাকশন পেয়েছেন" +pollVotesCount: "পোল ভোট দিয়েছেন" +pollVotedCount: "পোল ভোট পেয়েছেন" +yes: "হ্যাঁ" +no: "না" +driveFilesCount: "ড্রাইভে ফাইল এর সংখ্যা" +driveUsage: "ড্রাইভ এর ব্যাবহার" +noCrawle: "ক্রলার ইন্ডেক্সিং বন্ধ করুন" +noCrawleDescription: "সার্চ ইঞ্জিনগুলিকে আপনার প্রোফাইল, নোট, পেজ ইত্যাদি ইনডেক্স করতে নিষেধ করুন। " +lockedAccountInfo: "এমনকি আপনি আপনার অনুসরণকারীদের বেছে বেছে অনুমোদন করলেও, যে কেউ আপনার নোটগুলি দেখতে পাবে, যতক্ষণ না আপনি আপনার নোটগুলিকে \"অনুসারীদের জন্য\" হিসাবে সেট না করেন৷" +alwaysMarkSensitive: "সর্বদা স্পর্শকাতর হিসাবে চিহ্নিত করুন" +loadRawImages: "সংযুক্ত ছবির থাম্বনেইলটি দেখানর পরিবর্তে আসল ছবি দেখান" +disableShowingAnimatedImages: "অ্যানিমেটেড চিত্র দেখানো বন্ধ করুন" +verificationEmailSent: "নিশ্চিতকরণ ইমেল পাঠানো হয়েছে। সেটআপ সম্পূর্ণ করতে ইমেল এর লিঙ্ক অনুসরণ করুন।" +notSet: "সেট করা হয়নি" +emailVerified: "ইমেইল নিশ্চিত করা হয়েছে" +noteFavoritesCount: "পছন্দ করা নোটের সংখ্যা" +pageLikesCount: "পেজ লাইক করেছেন" +pageLikedCount: "পেজ লাইক পেয়েছেন" +contact: "পরিচিতি সমূহ" +useSystemFont: "সিস্টেম ফন্ট ব্যাবহার করুন" +clips: "ক্লিপগুলি " +experimentalFeatures: "পরীক্ষামূলক বৈশিষ্ট্যগুলি" +developer: "ডেভেলপার" +makeExplorable: "অ্যাকাউন্ট \"ঘুরে দেখুন\" পৃষ্ঠায় দেখান" +makeExplorableDescription: "আপনি এটি বন্ধ করলে, আপনার অ্যাকাউন্ট \"ঘুরে দেখুন\" পৃষ্ঠায় প্রদর্শিত হবে না।" +showGapBetweenNotesInTimeline: "টাইমলাইন এবং নোটের মাঝে ফাকা জায়গা রাখুন" +duplicate: "প্রতিরূপ" +left: "বাম" +center: "মাঝখান" +wide: "চওড়া" +narrow: "সংকীর্ণ" +reloadToApplySetting: "পৃষ্ঠাটি রিলোড করার পর সেটিংসটি প্রয়োগ করা হবে। আপনি কি এখন রিলোড করতে চান?" +needReloadToApply: "পৃষ্ঠাটি রিলোড করার পর সেটিংসটি প্রয়োগ করা হবে।" +showTitlebar: "টাইটেল বার দেখান" +clearCache: "ক্যাশ পরিষ্কার করুন" +onlineUsersCount: "{n} জন ব্যাবহারকারী অনলাইন" +nUsers: "{n} জন ব্যাবহারকারী" +nNotes: "{n} টি নোট" +sendErrorReports: "ক্রুটি প্রতিবেদন পাঠান" +sendErrorReportsDescription: "চালু থাকলে, বিস্তারিত ত্রুটির তথ্য Calckey-এর সাথে শেয়ার করা হয়। যা সফ্টওয়্যারটির গুণমান উন্নত করতে সাহায্য করে। ত্রুটির তথ্যের মধ্যে রয়েছে OS সংস্করণ, ব্রাউজারের ধরন, কর্মের ইতিহাস ইত্যাদি।" +myTheme: "আমার থিম" +backgroundColor: "পটভূমির রং" +accentColor: "এক্সেন্টের রং" +textColor: "লেখার রং" +saveAs: "এইরূপে সংরক্ষণ করুন" +advanced: "উন্নত" +value: "মান" +createdAt: "তৈরি হয়েছে" +updatedAt: "শেষ হালনাগাদ হয়েছে" +saveConfirm: "পরিবর্তনগুলি সংরক্ষণ করতে চান?" +deleteConfirm: "আসলেই মুছে ফেলতে চান?" +invalidValue: "অগ্রহণযোগ্য মান" +registry: "রেজিস্ট্রি" +closeAccount: "অ্যাকাউন্ট বন্ধ করুন" +currentVersion: "বর্তমান সংস্করণ" +latestVersion: "সর্বশেষ সংস্করণ" +youAreRunningUpToDateClient: "আপনি সবচেয়ে নতুন ক্লায়েন্ট ব্যাবহার করছেন" +newVersionOfClientAvailable: "আপনার ক্লায়েন্টের একটি নতুন ভার্সন চলে এসেছে" +usageAmount: "ব্যাবহার" +capacity: "ধারণক্ষমতা" +inUse: "ব্যবহৃত" +editCode: "কোড সম্পাদনা করুন" +apply: "প্রয়োগ করুন" +receiveAnnouncementFromInstance: "এই ইন্সট্যান্স থেকে বিজ্ঞপ্তি পান" +emailNotification: "ইমেইল বিজ্ঞপ্তি" +publish: "প্রকাশ" +inChannelSearch: "চ্যানেলে খুঁজুন" +useReactionPickerForContextMenu: "রাইট ক্লিকের মাধ্যমে রিঅ্যাকশন পিকার খুলুন" +typingUsers: "{users} লেখছে" +jumpToSpecifiedDate: "একটি নির্দিষ্ট তারিখে যান" +showingPastTimeline: "অতীতের টাইমলাইন দেখানো হচ্ছে" +clear: "পরিষ্কার" +markAllAsRead: "সব পঠিত হিসেবে চিহ্নিত করুন" +goBack: "পিছনে" +unlikeConfirm: "আসলেই লাইক সরিয়ে নিবেন?" +fullView: "ফুল ভিউ" +quitFullView: "ফুল ভিউ বন্ধ করুন" +addDescription: "বর্ণনা যোগ করুন" +userPagePinTip: "আপনি প্রতিটি নোটের জন্য মেনু থেকে \"প্রোফাইলে পিন করুন\" নির্বাচন করে আপনার নোটগুলি এখানে প্রদর্শন করতে পারেন।" +notSpecifiedMentionWarning: "প্রাপক ছাড়াও এই নোটে অন্য ব্যাবহারকারীদের উল্লেখ্য করা হয়েছে" +info: "আপনার সম্পর্কে" +userInfo: "ব্যবহারকারীর তথ্য" +unknown: "অজানা" +onlineStatus: "অনলাইন স্ট্যাটাস" +hideOnlineStatus: "অনলাইন স্ট্যাটাস লুকান" +hideOnlineStatusDescription: "অনলাইন স্ট্যাটাস লুকিয়ে রাখলে সার্চের মতো কিছু ফাংশনের সুবিধা কমে যায়।" +online: "অনলাইন" +active: "অ্যাকটিভ" +offline: "অফলাইন" +notRecommended: "সুপারিশ করা হয় না" +botProtection: "বট প্রোটেকশন" +instanceBlocking: "ব্লক করা ইন্সট্যান্সগুলি" +selectAccount: "অ্যাকাউন্ট নির্বাচন" +switchAccount: "অ্যাকাউন্ট পাল্টান" +enabled: "চালু" +disabled: "বন্ধ" +quickAction: "কুইক অ্যাকশন" +user: "ব্যবহারকারীগণ" +administration: "পরিচালনা" +accounts: "অ্যাকাউন্টগুলি" +switch: "পাল্টান" +noMaintainerInformationWarning: "প্রশাসকের তথ্য সেট করা হয়নি।" +noBotProtectionWarning: "বট প্রোটেকশন সেট করা হয়নি।" +configure: "কনফিগার করুন" +postToGallery: "গ্যালারী পোস্ট তৈরি করুন" +gallery: "গ্যালারী" +recentPosts: "নতুন পোস্ট" +popularPosts: "জনপ্রিয় পোস্ট" +shareWithNote: "নোটের মাধ্যমে শেয়ার করুন" +ads: "বিজ্ঞাপন" +expiration: "নির্দিষ্ট সময়সীমা" +memo: "মেমো" +priority: "অগ্রাধিকার" +high: "উচ্চ" +middle: "মাঝারি" +low: "নিম্ন" +emailNotConfiguredWarning: "ইমেইল অ্যাড্রেস সেট করা হয়নি।" +ratio: "অনুপাত" +previewNoteText: "প্রিভিউ দেখান" +customCss: "কাস্টম CSS" +customCssWarn: "এই ব্যাপারে অভিজ্ঞতা না থাকলে এই সেটিংটি ব্যাবহার করবেন না। অনুপযুক্ত সেটিংস ক্লায়েন্টকে স্বাভাবিকভাবে ব্যবহার করতে বাধা দিতে পারে।" +global: "গ্লোবাল" +squareAvatars: "চারকোনা প্রোফাইল পিকচার দেখান " +sent: "পাঠান" +received: "প্রাপ্ত" +searchResult: "অনুসন্ধানের ফলাফল" +hashtags: "হ্যাশট্যাগ" +troubleshooting: "ট্রাবলশুটিং" +useBlurEffect: "UI তে ব্লার ইফেক্ট ব্যাবহার করুন" +learnMore: "আরও জানুন" +misskeyUpdated: "Calckey আপডেট করা হয়েছে!" +whatIsNew: "পরিবর্তনগুলি দেখান" +translate: "অনুবাদ" +translatedFrom: "{x} হতে অনুবাদ করা" +accountDeletionInProgress: "অ্যাকাউন্ট মুছে ফেলা হচ্ছে" +usernameInfo: "একটি নাম যা সার্ভারে আপনার অ্যাকাউন্টটিকে অনন্যভাবে সনাক্ত করে। আপনি বর্ণমালা (a ~ z, A ~ Z), সংখ্যা (0 ~ 9), এবং আন্ডারস্কোর (_) ব্যবহার করতে পারেন। ব্যবহারকারীর নাম পরে পরিবর্তন করা যাবে না।" +aiChanMode: "Ai মোড" +keepCw: "CW রাখুন" +pubSub: "Pub/Sub অ্যাকাউন্টগুলো" +lastCommunication: "শেষ যোগাযোগ" +resolved: "সমাধান হয়েছে" +unresolved: "সমাধান হয়নি" +breakFollow: "অনুসরণ করা বন্ধ" +itsOn: "চালু" +itsOff: "বন্ধ" +emailRequiredForSignup: "অ্যাকাউন্ট তৈরির জন্য ইমেইল এর দরকার পড়বে" +unread: "অপঠিত" +filter: "ফিল্টার" +controlPanel: "নিয়ন্ত্রন কেন্দ্র" +manageAccounts: "অ্যাকাউন্টগুলি পরিচালনা করুন" +makeReactionsPublic: "রিঅ্যাকশনের ইতিহাস উন্মুক্ত করুন" +makeReactionsPublicDescription: "আপনার পূর্ববর্তী রিঅ্যাকশনগুলির তালিকা যে কারও কাছে দৃশ্যমান হবে।" +classic: "ক্লাসিক" +muteThread: "থ্রেড মিউট করুন" +unmuteThread: "থ্রেড আনমিউট করুন" +ffVisibility: "অনুসরণ/অনুসরণকারীদের দৃশ্যমান্যতা" +ffVisibilityDescription: "আপনি কাকে অনুসরণ করেন এবং কে আপনাকে অনুসরণ করে, সেটা কারা দেখতে পাবে তা নির্ধারণ করে।" +continueThread: "আরো থ্রেড দেখুন" +deleteAccountConfirm: "আপনার অ্যাকাউন্ট মুছে ফেলা হবে। ঠিক আছে?" +incorrectPassword: "আপনার দেওয়া পাসওয়ার্ডটি ভুল।" +voteConfirm: "\"{choice}\" এ ভোট দিতে চান?" +hide: "লুকান" +leaveGroup: "গ্রুপ ছেড়ে চলে যান" +leaveGroupConfirm: "\"{name}\" গ্রুপ ছেড়ে চলে যেতে চান?" +useDrawerReactionPickerForMobile: "মোবাইলে রিঅ্যাকশন পিকারকে ড্রয়ারে প্রদর্শন করুন" +welcomeBackWithName: "আবার স্বাগতম, {name}" +clickToFinishEmailVerification: " [{ok}] ক্লিক করার মাধ্যমে আপনার ইমেল ঠিকানা নিশ্চিত করুন।" +overridedDeviceKind: "ডিভাইসের ধরন" +smartphone: "স্মার্টফোন" +tablet: "ট্যাবলেট" +auto: "স্বয়ংক্রিয়" +themeColor: "থিমের রং" +size: "আকার" +numberOfColumn: "কলামের সংখ্যা" +searchByGoogle: "গুগল" +instanceDefaultLightTheme: "ইন্সট্যান্সের ডিফল্ট লাইট থিম" +instanceDefaultDarkTheme: "ইন্সট্যান্সের ডিফল্ট ডার্ক থিম" +instanceDefaultThemeDescription: "অবজেক্ট ফরম্যাটে থিম কোড লিখুন" +mutePeriod: "মিউটের সময়কাল" +indefinitely: "অনির্দিষ্ট" +tenMinutes: "১০ মিনিট" +oneHour: "১ ঘণ্টা" +oneDay: "একদিন" +oneWeek: "এক সপ্তাহ" +reflectMayTakeTime: "এটির কাজ দেখা যেতে কিছুটা সময় লাগতে পারে।" +failedToFetchAccountInformation: "অ্যাকাউন্টের তথ্য উদ্ধার করা যায়নি" +rateLimitExceeded: "রেট লিমিট ছাড়িয়ে গেছে " +file: "ফাইলগুলি" +reverse: "উল্টান" +colored: "রঙ্গিন" +label: "লেবেল" +localOnly: "শুধুমাত্র লোকাল" +account: "অ্যাকাউন্টগুলি" +_emailUnavailable: + used: "এই ইমেইল ঠিকানাটি ইতোমধ্যে ব্যবহৃত হয়েছে" + format: "এই ইমেল ঠিকানাটি সঠিকভাবে লিখা হয়নি" + disposable: "অস্থায়ী ইমেইল ঠিকানা ব্যাবহার করা যাবে না" + mx: "ইমেইল ​​সার্ভারটি ঠিক নাই" + smtp: "ইমেইল সার্ভারটি সাড়া দিচ্ছে না" +_ffVisibility: + public: "প্রকাশ" + followers: "শুধুমাত্র অনুসরণকারীদের কাছে দৃশ্যমান" + private: "ব্যাক্তিগত" +_signup: + almostThere: "প্রায় শেষ" + emailAddressInfo: "আপনি যে ইমেল ঠিকানাটি ব্যবহার করবেন সেটি লিখুন। আপনার ইমেইল ঠিকানা প্রকাশ করা হবে না।" + emailSent: "আপনার দেওয়া ইমেল ঠিকানায় ({email}) একটি নিশ্চিতকরণ ইমেল পাঠানো হয়েছে। অ্যাকাউন্ট তৈরি সম্পূর্ণ করতে ইমেলের লিঙ্কটি অ্যাক্সেস করুন।" +_accountDelete: + accountDelete: "অ্যাকাউন্ট মুছে ফেলুন" + mayTakeTime: "একটি অ্যাকাউন্ট মুছে ফেলা একটি দীর্ঘ প্রক্রিয়া এবং আপনি যদি প্রচুর পরিমাণে সামগ্রী তৈরি করে থাকেন বা ফাইল আপলোড করেন তবে এটি সম্পূর্ণ হতে দীর্ঘ সময় নিতে পারে।" + sendEmail: "অ্যাকাউন্ট মুছে ফেলা সম্পূর্ণ হলে, নিবন্ধিত ইমেল ঠিকানায় একটি বিজ্ঞপ্তি পাঠানো হবে।" + requestAccountDelete: "অ্যাকাউন্ট মুছে ফেলার অনুরোধ করুন" + started: "মুছে ফেলার প্রক্রিয়া শুরু হয়েছে।" + inProgress: "মুছে ফেলার কাজ চলছে" +_ad: + back: "পিছনে" + reduceFrequencyOfThisAd: "এই বিজ্ঞাপনটি কম দেখান" +_forgotPassword: + enterEmail: "আপনি আপনার অ্যাকাউন্টের জন্য নিবন্ধিত ইমেল ঠিকানা লিখুন. সেই ঠিকানায় একটি পাসওয়ার্ড রিসেট লিঙ্ক পাঠানো হবে।" + ifNoEmail: "আপনি যদি নিবন্ধনের সময় ই-মেইল ঠিকানা না দিয়ে থাকেন, তাহলে অনুগ্রহ করে প্রশাসকের সাথে যোগাযোগ করুন।" + contactAdmin: "এই ইন্সট্যান্সটি ইমেইল ব্যাবহার করে না, তাই আপনার পাসওয়ার্ড পুনরায় সেট করতে প্রশাসকের সাথে যোগাযোগ করুন৷" +_gallery: + my: "আমার গ্যালারী" + liked: "পছন্দ করা পোস্ট" + like: "পছন্দ করা" + unlike: "পছন্দ সরান" +_email: + _follow: + title: "আপনাকে অনুসরণ করছে" + _receiveFollowRequest: + title: "অনুসরণ করার অনুরোধ পেয়েছেন" +_plugin: + install: "প্লাগইন ইন্সটল করুন" + installWarn: "অবিশ্বস্ত প্লাগইন ইনস্টল করবেন না।" + manage: "প্লাগইন ম্যানেজ করুন" +_registry: + scope: "স্কোপ" + key: "কী" + keys: "কী - সমূহ" + domain: "ডোমেন" + createKey: "কী বানান" +_aboutMisskey: + about: "Misskey, একটি ওপেন সোর্স সফ্টওয়্যার যা 2014 সাল থেকে syuilo তৈরি করছেন।" + contributors: "প্রধান কন্ট্রিবিউটারগণ" + allContributors: "সকল কন্ট্রিবিউটারগণ" + source: "সোর্স কোড" + translation: "Calckey অনুবাদ করুন" + donate: "Calckey তে দান করুন" + morePatrons: "আরও অনেকে আমাদের সাহায্য করছেন। তাদের সবাইকে ধন্যবাদ 🥰" + patrons: "সমর্থনকারী" +_nsfw: + respect: "স্পর্শকাতর মিডিয়া লুকান" + ignore: "স্পর্শকাতর মিডিয়া লুকাবেন না" + force: "সকল মিডিয়া লুকান" +_mfm: + cheatSheet: "MFM চিটশিট" + intro: "MFM একটি মার্কআপ ভাষা যা Calckey-এর মধ্যে বিভিন্ন জায়গায় ব্যবহার করা যেতে পারে। এখানে আপনি MFM-এর সিনট্যাক্সগুলির একটি তালিকা দেখতে পারবেন।" + dummy: "মিসকি ফেডিভার্সের বিশ্বকে প্রসারিত করে" + mention: "উল্লেখ" + mentionDescription: "@ চিহ্ন + ব্যবহারকারীর নাম একটি নির্দিষ্ট ব্যবহারকারীকে নির্দেশ করতে ব্যবহার করা যায়।" + hashtag: "হ্যাশট্যাগ" + hashtagDescription: "আপনি একটি # চিহ্ন + ট্যাগ সহ একটি হ্যাশট্যাগ নির্দেশ করতে পারেন।" + url: "URL" + urlDescription: "URL দেখানো সম্ভব।" + link: "লিংক" + linkDescription: "আপনি পাঠ্যের একটি নির্দিষ্ট অংশকে URL হিসাবে দেখাতে পারেন৷" + bold: "গাঢ়" + boldDescription: "অক্ষরগুলিকে মোটাকরে প্রদর্শন করা হবে।" + small: "ছোট" + smallDescription: "লেখা ছোট এবং পাতলা করে দেখানো হবে।" + center: "সেন্টার" + centerDescription: "লেখা মাঝ বরাবর দেখানো হবে" + inlineCode: "কোড (ইনলাইন)" + inlineCodeDescription: " প্রোগ্রামের কোডের জন্য ইনলাইন সিনট্যাক্স হাইলাইটিং করা হবে" + blockCode: "কোড (ব্লক)" + blockCodeDescription: "মাল্টি-লাইন প্রোগ্রামের কোডের জন্য সিনট্যাক্স হাইলাইট করে।" + inlineMath: "গাণিতিক সূত্র (ইনলাইন)" + inlineMathDescription: "গাণিতিক সূত্র প্রদর্শন করুন (KaTeX) ইনলাইন।" + blockMath: "গাণিতিক সূত্র (ব্লক)" + blockMathDescription: "একটি ব্লকে একাধিক লাইনের গাণিতিক সূত্র প্রদর্শন করুন (KaTeX)।" + quote: "উদ্ধৃতি" + quoteDescription: "বিষয়বস্তুকে একটি উদ্ধৃতি হিসাবে দেখানো হবে।" + emoji: "স্বনির্ধারিত ইমোজিগুলি" + emojiDescription: "আপনি একটি কাস্টম ইমোজির নাম কোলনে আবদ্ধ করে কাস্টম ইমোজিটি দেখাতে পারেন৷" + search: "খুঁজুন" + searchDescription: "পূর্ব-টাইপ করা পাঠ্য সহ একটি অনুসন্ধান বাক্স প্রদর্শন করে।" + flip: "উল্টান" + flipDescription: "বিষয়বস্তু উপরে/নীচে বা বাম/ডানে উল্টান।" + jelly: "অ্যানিমেশন (জেলি)" + jellyDescription: "জেলির মত অ্যানিমেশন দেখায়।" + tada: "অ্যানিমেশন (টাডা)" + tadaDescription: "\"টাডা!\" এর মত অ্যানিমেশন দেখায়।" + jump: "অ্যানিমেশন (লাফ)" + jumpDescription: "বিষয়বস্তুতে লাফ মারার মত অ্যানিমেশন দেখায়।" + bounce: "অ্যানিমেশন (তিড়িং বিড়িং)" + bounceDescription: "তিড়িং বিড়িং করার মত অ্যানিমেশন দেখায়।" + shake: "অ্যানিমেশন (ঝাঁকি)" + shakeDescription: "ঝাঁকির মত অ্যানিমেশন দেখায়।" + twitch: "অ্যানিমেশন (মোচড়ানো)" + twitchDescription: "মোচড়ানোর মত অ্যানিমেশন দেখায়।" + spin: "অ্যানিমেশন (ঘুরা)" + spinDescription: "ঘুরার মত অ্যানিমেশন দেখায়।" + x2: "বড়" + x2Description: "বিষয়বস্তু বড় করে দেখায়।" + x3: "অনেক বড়" + x3Description: "বিষয়বস্তু আরও বড় করে দেখায়।" + x4: "অস্বাভাবিক বড়" + x4Description: "বিষয়বস্তুকে আগের থেকেও আরও বড় করে দেখায়।" + blur: "ব্লার" + blurDescription: "বিষয়বস্তুকে ব্লার করতে পারেন। আপনি এর উপর মাউস কার্সার রাখলে, এটি পরিষ্কারভাবে দেখতে পাবেন।" + font: "ফন্ট" + fontDescription: "বিষয়বস্তুকে কোন ফন্টে দেখানো হবে তা নির্ধারণ করে।" + rainbow: "রেইনবো" + rainbowDescription: "বিষয়বস্তুকে রংধনুর রং গুলিতে প্রদর্শন করে।" + sparkle: "চিক চিক" + sparkleDescription: "বিষয়বস্তুকে একটি চিকচিকে কণা প্রভাব দেয়।" + rotate: "ঘুরান" + rotateDescription: "বিষয়বস্তুকে একটি নির্দিষ্ট কোনে ঘুরায়।" +_instanceTicker: + none: "দেখাবেন না" + remote: "রিমোট ব্যাবহারকারীদের জন্য দেখান" + always: "সর্বদা দেখান" +_serverDisconnectedBehavior: + reload: "স্বয়ংক্রিয়ভাবে রিলোড" + dialog: "সতর্কতা ডায়ালগ দেখান" + quiet: "অগচরী সতর্কতা দেখান" +_channel: + create: "চ্যানেল বানান" + edit: "চ্যানেল সম্পাদনা করুন" + setBanner: "ব্যানার সেট করুন" + removeBanner: "ব্যানার সরান" + featured: "বর্তমানে জনপ্রিয়" + owned: "নিজের" + following: "অনুসরণ করা হচ্ছে" + usersCount: "{n} জন অংশগ্রহণকারী" + notesCount: "{n} টি নোট" +_menuDisplay: + sideFull: "পাশে" + sideIcon: "পাশে (আইকন)" + top: "শীর্ষে" + hide: "লুকান" +_wordMute: + muteWords: "নিঃশব্দ করা শব্দগুলি" + muteWordsDescription: "স্পেস দিয়ে আলাদা করলে AND শর্ত তৈরি হবে এবং আলাদা লাইনে লিখলে OR শর্ত তৈরি হবে।" + muteWordsDescription2: "রেগুলার এক্সপ্রেশন ব্যবহার করতে স্ল্যাশ দিয়ে কীওয়ার্ডকে ঘিরে রাখুন।" + softDescription: "টাইমলাইন থেকে নির্দিষ্ট শর্তানুযায়ী নোট লুকিয়ে রাখে।" + hardDescription: "নির্দিষ্ট শর্তানুযায়ী নোটগুলিকে টাইমলাইন থেকে বাদ দেয়। আপনি শর্ত পরিবর্তন করলেও যে নোটগুলি যোগ করা হয়নি সেগুলি বাদ দেওয়া হবে।" + soft: "নমনীয়" + hard: "কঠোর" + mutedNotes: "মিউট করা নোটগুলি" +_instanceMute: + instanceMuteDescription: "কনফিগার করা ইন্সট্যান্সের সব নোট এবং রিনোট মিউট করুন, মিউট করা ইন্সট্যান্সের ব্যবহারকারীদের উত্তর সহ।" + instanceMuteDescription2: "প্রতিটিকে আলাদা লাইনে লিখুন" + title: "কনফিগার করা ইন্সট্যান্সের নোটগুলিকে লুকিয়ে রাখে।" + heading: "মিউট করা ইন্সত্যান্সের তালিকা" +_theme: + explore: "থিমগুলি ঘুরে দেখুন" + install: "থিম ইনস্টল করুন" + manage: "থিম ব্যাবস্থাপনা" + code: "থিম কোড" + description: "বর্ণনা" + installed: "{name} ইন্সটল করা হয়েছে" + installedThemes: "ইন্সটল করা থিমসমূহ" + builtinThemes: "বিল্ট-ইন থিমসমূহ" + alreadyInstalled: "এই থিমটি ইতিমধ্যে ইন্সটল করা হয়েছে" + invalid: "থিমটির ফরম্যাট সঠিক নয়" + make: "থিম বানান" + base: "বেস" + addConstant: "ধ্রুবক যোগ করুন" + constant: "ধ্রুবক" + defaultValue: "ডিফল্ট মান" + color: "রং" + refProp: "প্রোপার্টি রেফারেন্স করুন" + refConst: "ধ্রুবক রেফারেন্স করুন" + key: "কী" + func: "ফাংশন" + funcKind: "ফাংশনের ধরন" + argument: "আর্গুমেন্ট" + basedProp: "রেফারেন্স করা প্রোপার্টি" + alpha: "অস্বচ্ছতা" + darken: "অন্ধকার করুন" + lighten: "উজ্জ্বল করুন" + inputConstantName: "ধ্রুবকটির নাম লিখুন" + importInfo: "আপনি এখানে থিম কোড পেস্ট করতে পারেন এবং সেটিকে এডিটরে ইম্পোর্ট করতে পারেন" + deleteConstantConfirm: "আপনি কি ধ্রুবক {const} মুছে ফেলতে চান?" + keys: + accent: "অ্যাকসেন্ট" + bg: "পটভূমি" + fg: "লেখা" + focus: "ফোকাস" + indicator: "ইনডিকেটর" + panel: "প্যানেল" + shadow: "ছায়া" + header: "হেডার" + navBg: "সাইডবারের পটভূমি" + navFg: "সাইডবারের পাঠ্য" + navHoverFg: "সাইডবারের পাঠ্য (হভার)" + navActive: "সাইডবারের পাঠ্য (অ্যাকটিভ)" + navIndicator: "সাইডবারের ইনডিকেটর" + link: "লিংক" + hashtag: "হ্যাশট্যাগ" + mention: "উল্লেখ" + mentionMe: "আপনাকে উল্লেখ্য করা" + renote: "রিনোট" + modalBg: "মোডালের পটভূমি" + divider: "খন্ডক" + scrollbarHandle: "স্ক্রলবার হ্যান্ডেল" + scrollbarHandleHover: "স্ক্রলবার হ্যান্ডেল (হভার)" + dateLabelFg: "তারিখ লেবেলের পাঠ্য" + infoBg: "তথ্যের পটভূমি" + infoFg: "তথ্যের পাঠ্য" + infoWarnBg: "ওয়ার্নিং এর পটভূমি" + infoWarnFg: "ওয়ার্নিং এর পাঠ্য" + cwBg: "CW বাটনের পটভূমি" + cwFg: "CW বাটনের পাঠ্য" + cwHoverBg: "CW বাটনের পটভূমি (হভার)" + toastBg: "বিজ্ঞপ্তির পটভূমি" + toastFg: "বিজ্ঞপ্তির পাঠ্য" + buttonBg: "বাটনের পটভূমি" + buttonHoverBg: "বাটনের পটভূমি (হভার)" + inputBorder: "ইনপুট ফিল্ডের বর্ডার" + listItemHoverBg: "লিস্ট আইটেমের পটভূমি (হোভার)" + driveFolderBg: "ড্রাইভ ফোল্ডারের পটভূমি" + wallpaperOverlay: "ওয়ালপেপার ওভারলে" + badge: "ব্যাজ" + messageBg: "চ্যাটের পটভূমি" + accentDarken: "অ্যাকসেন্ট (গাঢ়)" + accentLighten: "অ্যাকসেন্ট (হাল্কা)" + fgHighlighted: "হাইলাইট করা পাঠ্য" +_sfx: + note: "নোটগুলি" + noteMy: "নোট (আপনার)" + notification: "বিজ্ঞপ্তি" + chat: "চ্যাট" + chatBg: "চ্যাট (ব্যাকগ্রাউন্ড)" + antenna: "অ্যান্টেনাগুলি" + channel: "চ্যানেলের বিজ্ঞপ্তি" +_ago: + future: "ভবিষ্যৎ" + justNow: "এইমাত্র" + secondsAgo: "{n} সেকেন্ড আগে" + minutesAgo: "{n} মিনিট আগে" + hoursAgo: "{n} ঘণ্টা আগে" + daysAgo: "{n} দিন আগে" + weeksAgo: "{n} সপ্তাহ আগে" + monthsAgo: "{n} মাস আগে" + yearsAgo: "{n} বছর আগে" +_time: + second: "সেকেন্ড" + minute: "মিনিট" + hour: "ঘণ্টা" + day: "দিন" +_tutorial: + title: "How to use Calckey" + step1_1: "Welcome!" + step1_2: "Let's get you set up. You'll be up and running in no time!" + step2_1: "First, please fill out your profile." + step2_2: "Providing some information about who you are will make it easier for others to tell if they want to see your notes or follow you." + step3_1: "Now time to follow some people!" + step3_2: "Your home and social timelines are based off of who you follow, so try following a couple accounts to get started.\nClick the plus circle on the top right of a profile to follow them." + step4_1: "Let's get you out there." + step4_2: "For your first post, some people like to made a {introduction} post or a simple \"Hello world!\"" + step5_1: "Timelines, timelines everywhere!" + step5_2: "Your instance has {timelines} different timelines enabled." + step5_3: "The Home {icon} timeline is where you can see posts from your followers." + step5_4: "The Local {icon} timeline is where you can see posts from everyone else on this instance." + step5_5: "The Recommended {icon} timeline is where you can see posts from instances the admins recommend." + step5_6: "The Social {icon} timeline is where you can see posts from friends of your followers." + step5_7: "The Global {icon} timeline is where you can see posts from every other connected instance." + step6_1: "So, what is this place?" + step6_2: "Well, you didn't just join Calckey. You joined a portal to the Fediverse, an interconnected network of thousands of servers, called \"instances\"." + step6_3: "Each server works in different ways, and not all servers run Calckey. This one does though! It's a bit complicated, but you'll get the hang of it in no time." + step6_4: "Now go, explore, and have fun!" +_2fa: + alreadyRegistered: "আপনি ইতিমধ্যে একটি 2-ফ্যাক্টর অথেনটিকেশন ডিভাইস নিবন্ধন করেছেন৷" + registerTOTP: "নতুন ডিভাইস নিবন্ধন করুন" + registerSecurityKey: "সিকিউরিটি কী নিবন্ধন করুন" + step1: "প্রথমে, আপনার ডিভাইসে {a} বা {b} এর মতো একটি অথেনটিকেশন অ্যাপ ইনস্টল করুন৷" + step2: "এরপরে, অ্যাপের সাহায্যে প্রদর্শিত QR কোডটি স্ক্যান করুন।" + step2Url: "ডেস্কটপ অ্যাপে, নিম্নলিখিত URL লিখুন:" + step3: "অ্যাপে প্রদর্শিত টোকেনটি লিখুন এবং আপনার কাজ শেষ।" + step4: "আপনাকে এখন থেকে লগ ইন করার সময়, এইভাবে টোকেন লিখতে হবে।" + securityKeyInfo: "আপনি একটি হার্ডওয়্যার সিকিউরিটি কী ব্যবহার করে লগ ইন করতে পারেন যা FIDO2 বা ডিভাইসের ফিঙ্গারপ্রিন্ট সেন্সর বা পিন সমর্থন করে৷" +_permissions: + "read:account": "অ্যাকাউন্টের তথ্য দেখুন" + "write:account": "অ্যাকাউন্টের তথ্য সম্পাদন করুন" + "read:blocks": "ব্লক করা ব্যাবহারকারীদের তালিকা দেখুন" + "write:blocks": "ব্লক করা ব্যাবহারকারীদের তালিকা সম্পাদনা করুন" + "read:drive": "ড্রাইভের ফাইল এবং ফোল্ডারসমূহ পড়া" + "write:drive": "ড্রাইভের ফাইল এবং ফোল্ডারসমূহ সম্পাদনা করা" + "read:favorites": "পছন্দের তালিকা পড়া" + "write:favorites": "পছন্দের তালিকা সম্পাদনা করা" + "read:following": "অনুসরণ তথ্য দেখুন" + "write:following": "অনুসরণ তথ্য সম্পাদনা করা" + "read:messaging": "চ্যাটগুলি দেখুন" + "write:messaging": "চ্যাটগুলি সম্পাদনা করুন" + "read:mutes": "মিউটের লিস্ট দেখুন" + "write:mutes": "মিউটের লিস্ট সম্পাদনা করুন" + "write:notes": "নোট লিখা" + "read:notifications": "বিজ্ঞপ্তিগুলি দেখুন" + "write:notifications": "বিজ্ঞপ্তি নিয়ে কাজ করে" + "read:reactions": "রিঅ্যাকশনগুলি দেখুন" + "write:reactions": "রিঅ্যাকশনগুলি সম্পাদনা করুন" + "write:votes": "ভোট দিন" + "read:pages": "আপনার পেজগুলি দেখুন" + "write:pages": "পেজগুলি সম্পাদনা বা ডিলিট করুন" + "read:page-likes": "পৃষ্ঠায় দেয়া পছন্দগুলি দেখুন" + "write:page-likes": "পৃষ্ঠায় দেয়া পছন্দগুলি সম্পাদনা করুন" + "read:user-groups": "ব্যাবহারকারী গ্রুপগুলি দেখুন" + "write:user-groups": "ব্যাবহারকারী গ্রুপগুলি সম্পাদনা করুন" + "read:channels": "চ্যানেলগুলি দেখুন" + "write:channels": "চ্যানেলগুলি সম্পাদনা করুন" + "read:gallery": "গ্যালারী দেখুন" + "write:gallery": "গ্যালারী সম্পাদনা করুন" + "read:gallery-likes": "গ্যালারীর পছন্দগুলি দেখুন" + "write:gallery-likes": "গ্যালারীর পছন্দগুলি সম্পাদনা করুন" +_auth: + shareAccess: "\"{name}\" কে অ্যাকাউন্টের অ্যাক্সেস দিবেন?" + shareAccessAsk: "অ্যাপ্লিকেশনটিকে অ্যাকাউন্টের অ্যাক্সেস দিবেন?" + permissionAsk: "এই অ্যাপ্লিকেশনটি নিম্নলিখিত অনুমতি চাই" + pleaseGoBack: "দয়া করে অ্যাপ্লিকেশনে ফিরে যান" + callback: "অ্যাপ্লিকেশনে ফিরে যাচ্ছি" + denied: "প্রবেশ নিষেধ" +_antennaSources: + all: "সকল নোট" + homeTimeline: "আপনি অনুসরণ করছেন, এমন ব্যবহারকারীদের নোট" + users: "এক বা একাধিক নির্দিষ্ট ব্যবহারকারীর নোট" + userList: "নির্দিষ্ট তালিকায় নাম থাকা ব্যবহারকারীদের নোট" + userGroup: "নির্দিষ্ট গ্রুপে থাকা ব্যবহারকারীদের নোট" +_weekday: + sunday: "রবিবার" + monday: "সোমবার" + tuesday: "মঙ্গলবার" + wednesday: "বুধবার" + thursday: "বৃহস্পতিবার" + friday: "শুক্রবার" + saturday: "শনিবার" +_widgets: + memo: "স্টিকি নোট" + notifications: "বিজ্ঞপ্তি" + timeline: "টাইমলাইন" + calendar: "ক্যালেন্ডার" + trends: "বর্তমানে জনপ্রিয়" + clock: "ঘড়ি" + rss: "RSS রিডার" + activity: "কার্যকলাপ" + photos: "ফটোগুলি" + digitalClock: "ডিজিটাল ঘড়ি" + federation: "ফেডিভার্স" + postForm: "নোট লিখুন" + slideshow: "স্লাইডশো" + button: "বাটন" + onlineUsers: "অনলাইনে থাকা ব্যবহারকারীগণ" + jobQueue: "জব কিউ" + serverMetric: "সার্ভার মেট্রিক্স" + aiscript: "AiScript কনসোল" + aichan: "আই চান" +_cw: + hide: "লুকান" + show: "আরও দেখুন" + chars: "{count} টি অক্ষর" + files: "{count} টি ফাইল" +_poll: + noOnlyOneChoice: "সর্বনিম্ন 2 টি অপশন বেছে নিতে হবে" + choiceN: "বিকল্পগুলি {n}" + noMore: "আপনি আর কোন বিকল্প যোগ করতে পারবেন না" + canMultipleVote: "একাধিক বিকল্প বাছাই করা যাবে" + expiration: "পোলের সময়সীমা" + infinite: "অনির্দিষ্ট" + at: "শেষ হবে" + after: "শেষ হবে" + deadlineDate: "শেষ হওয়ার তারিখ" + deadlineTime: "ঘণ্টা" + duration: "ব্যাপ্তিকাল" + votesCount: "{n} টি ভোট" + totalVotes: "সর্বমোট {n} টি ভোট" + vote: "ভোট দিন" + showResult: "রেজাল্ট দেখান" + voted: "ভোট দিয়েছেন" + closed: "শেষ হয়ে গেছে" + remainingDays: "আর {d} দিন {h} ঘণ্টা বাকি আছে" + remainingHours: "আর {h} ঘণ্টা {m} মিনিট বাকি আছে" + remainingMinutes: "আর বাকি আছে {m} মিনিট {s} সেকেন্ড" + remainingSeconds: "আর বাকি আছে {s} সেকেন্ড" +_visibility: + public: "সর্বজনীন" + publicDescription: "সবাই আপনার নোটগুলি দেখতে পাবে" + home: "মূল পাতা" + homeDescription: "শুধুমাত্র হোম টাইমলাইনে আপনার নোটগুলি পোস্ট করুন" + followers: "অনুসরণকারী" + followersDescription: "শুধুমাত্র আপনার অনুসরণকারীদের নিকট পোস্ট করুন" + specified: "ডাইরেক্ট নোট" + specifiedDescription: "শুধুমাত্র নির্দিষ্ট ব্যাবহারকারীর নিকট পাঠান" + localOnly: "শুধুমাত্র লোকাল" + localOnlyDescription: "রিমোট ব্যাবহারকারীদের নিকট দৃশ্যমান নয়" +_postForm: + replyPlaceholder: "নোটটির জবাব দিন..." + quotePlaceholder: "নোটটিকে উদ্ধৃত করুন..." + channelPlaceholder: "চ্যানেলে পোস্ট করুন..." + _placeholders: + a: "আপনি এখন কি করছেন?" + b: "আপনার আশে পাশে কি হচ্ছে?" + c: "আপনি কি ভাবছেন?" + d: "আপনি কি বলতে চান?" + e: "লেখা শুরু করুন..." + f: "আপনার লেখার জন্য অপেক্ষা করছি..." +_profile: + name: "নাম" + username: "ব্যবহারকারীর নাম" + description: "আপনার সম্পর্কে" + youCanIncludeHashtags: "হ্যাশট্যাগ অন্তর্ভুক্ত করা যেতে পারে।" + metadata: "অতিরিক্ত তথ্য" + metadataEdit: "অতিরিক্ত তথ্য সম্পাদনা করুন" + metadataDescription: "আপনি আপনার প্রোফাইলে একটি টেবিল হিসাবে চারটি অতিরিক্ত তথ্য দেখাতে পারেন।" + metadataLabel: "লেবেল" + metadataContent: "বিষয়বস্তু" + changeAvatar: "অ্যাভাটার পরিবর্তন করুন" + changeBanner: "ব্যানার পরিবর্তন করুন" +_exportOrImport: + allNotes: "সকল নোট" + followingList: "অনুসরণ করা হচ্ছে" + muteList: "মিউট" + blockingList: "ব্লক" + userLists: "লিস্ট" + excludeMutingUsers: "মিউটকৃত ব্যবহারকারীদের বাদ দিন" + excludeInactiveUsers: "অব্যাবহৃত অ্যাকাউন্ট বাদ দিন" +_charts: + federation: "ফেডিভার্স" + apRequest: "অনুরোধসমূহ" + usersIncDec: "ব্যবহারকারীদের সংখ্যার পরিবর্তন" + usersTotal: "ব্যবহারকারীদের সংখ্যা" + activeUsers: "সক্রিয় ব্যাবহারকারী" + notesIncDec: "নোটের সংখ্যার পরিবর্তন" + localNotesIncDec: "লোকাল নোটের সংখ্যার পরিবর্তন" + remoteNotesIncDec: "রিমোট নোটের সংখ্যার পরিবর্তন" + notesTotal: "নোটের সংখ্যা" + filesIncDec: "ফাইলের সংখ্যার পরিবর্তন" + filesTotal: "ফাইলের সংখ্যা" + storageUsageIncDec: "স্টোরেজের ব্যাবহারের পরিবর্তন" + storageUsageTotal: "মোট স্টোরেজের ব্যাবহার" +_instanceCharts: + requests: "অনুরোধসমূহ" + users: "ব্যবহারকারীদের সংখ্যার পরিবর্তন" + usersTotal: "ক্রমবর্ধমান ব্যবহারকারীদের সংখ্যা" + notes: "নোটের সংখ্যার পরিবর্তন" + notesTotal: "ক্রমবর্ধমান নোটের সংখ্যা" + ff: "অনুসরণকারী / অনুসরণ করা ব্যাবহারকারীদের সংখ্যার পরিবর্তন" + ffTotal: "অনুসরণকারী / অনুসরণ করা ব্যাবহারকারীদের ক্রমবর্ধমান সংখ্যা" + cacheSize: "ক্যাশ সাইজের পরিবর্তন" + cacheSizeTotal: "ক্রমবর্ধমান ক্যাশ সাইজ" + files: "ফাইলের সংখ্যার পরিবর্তন" + filesTotal: "ক্রমবর্ধমান ফাইলের সংখ্যা" +_timelines: + home: "মূল পাতা" + local: "স্থানীয়" + social: "সামাজিক" + global: "গ্লোবাল" +_pages: + newPage: "নতুন পৃষ্ঠা বানান" + editPage: "পৃষ্ঠাটি সম্পাদনা করুন" + readPage: "উৎস দেখছেন" + created: "পৃষ্ঠা তৈরি করা হয়েছে" + updated: "পৃষ্ঠা সম্পাদনা করা হয়েছে" + deleted: "পৃষ্ঠা মুছে ফেলা হয়েছে" + pageSetting: "পৃষ্ঠার সেটিংস" + nameAlreadyExists: "পৃষ্ঠার URLটি ইতিমধ্যেই ব্যাবহার করা হয়েছে" + invalidNameTitle: "পৃষ্ঠার URL অবৈধ" + invalidNameText: "নিশ্চিত করুন যে এটি ফাঁকা নয়" + editThisPage: "পৃষ্ঠাটি সম্পাদনা করুন" + viewSource: "উৎস দেখুন" + viewPage: "আপনার পেজগুলি দেখুন" + like: "পছন্দ" + unlike: "পছন্দ সরান" + my: "আমার পৃষ্ঠাগুলি" + liked: "পছন্দ করা পৃষ্ঠাগুলি" + featured: "জনপ্রিয়" + inspector: "ইনিস্পেক্টর" + contents: "বিষয়বস্তু" + content: "পৃষ্ঠার ব্লক" + variables: "চলকগুলি" + title: "শিরোনাম" + url: "পৃষ্ঠার URL" + summary: "পৃষ্ঠার বর্ণনা" + alignCenter: "সেন্টার" + hideTitleWhenPinned: "পিন করা হলে টাইটেল লুকান" + font: "ফন্ট" + fontSerif: "সেরিফ" + fontSansSerif: "স্যান্স সেরিফ" + eyeCatchingImageSet: "থাম্বনেইল সেট করুন" + eyeCatchingImageRemove: "থাম্বনেইল সরান" + chooseBlock: "ব্লক যোগ করুন" + selectType: "ধরন নির্বাচন করুন" + enterVariableName: "চলকের নাম লিখুন" + variableNameIsAlreadyUsed: "চলকের নামটি ইতিপূর্বে ব্যাবহৃত হয়েছে" + contentBlocks: "বিষয়বস্তু" + inputBlocks: "ইনপুট" + specialBlocks: "বিশেষ" + blocks: + text: "লেখা" + textarea: "টেক্সট এরিয়া" + section: "বিভাগ" + image: "ছবি" + button: "বাটন" + if: "যদি" + _if: + variable: "চলকগুলি" + post: "নোট লিখুন" + _post: + text: "বিষয়বস্তু" + attachCanvasImage: "ক্যানভাস ছবিসহ পোস্ট করুন" + canvasId: "ক্যানভাস ID" + textInput: "টেক্সট ইনপুট" + _textInput: + name: "চলকের নাম" + text: "শিরোনাম" + default: "ডিফল্ট মান" + textareaInput: "একাধিক লাইনের টেক্সট ইনপুট" + _textareaInput: + name: "চলকের নাম" + text: "শিরোনাম" + default: "ডিফল্ট মান" + numberInput: "সংখ্যা ইনপুট" + _numberInput: + name: "চলকের নাম" + text: "শিরোনাম" + default: "ডিফল্ট মান" + canvas: "ক্যানভাস" + _canvas: + id: "ক্যানভাস ID" + width: "প্রস্থ" + height: "উচ্চতা" + note: "এম্বেড নোট" + _note: + id: "নোট ID" + idDescription: "আপনি এর বদলে নোটের URL পেস্ট করতে পারেন." + detailed: "বিস্তারিত দেখুন" + switch: "সুইচ" + _switch: + name: "চলকের নাম" + text: "শিরোনাম" + default: "ডিফল্ট মান" + counter: "কাউন্টার" + _counter: + name: "চলকের নাম" + text: "শিরোনাম" + inc: "এভাবে মান বাড়ান" + _button: + text: "শিরোনাম" + colored: "রঙ্গিন" + action: "বাটনে ক্লিক করলে যা হবে" + _action: + dialog: "ডায়ালগ দেখান " + _dialog: + content: "বিষয়বস্তু" + resetRandom: "র‍্যানডম সিড রিসেট করুন" + pushEvent: "ইভেন্ট পাঠান" + _pushEvent: + event: "ইভেন্টের নাম" + message: "চালু হলে প্রদর্শনের জন্য বার্তা" + variable: "পাঠানো চলক" + no-variable: "কিছুই না" + callAiScript: "AiScript চালান" + _callAiScript: + functionName: "ফাংশনের নাম" + radioButton: "বহুনির্বাচনী" + _radioButton: + name: "চলকের নাম" + title: "শিরোনাম" + values: "বিকল্পগুলিকে আলাদা লাইনে লিখুন" + default: "ডিফল্ট মান" + script: + categories: + flow: "নিয়ন্ত্রণ" + logical: "লজিক্যাল অপারেশন" + operation: "হিসাব-নিকাশ" + comparison: "তুলনা" + random: "র‍্যান্ডম" + value: "মান" + fn: "ফাংশন" + text: "টেক্সট ম্যানিপুলেশন" + convert: "রুপান্তর" + list: "লিস্ট" + blocks: + text: "লেখা" + multiLineText: "লেখা (একাধিক লাইন)" + textList: "লেখার লিস্ট" + _textList: + info: "প্রতিটি এন্ট্রিকে আলাদা লাইনে লিখুন" + strLen: "লেখার দৈর্ঘ্য" + _strLen: + arg1: "লেখা" + strPick: "অক্ষর বের করে আনুন" + _strPick: + arg1: "লেখা" + arg2: "অক্ষরের অবস্থান" + strReplace: "লেখা প্রতিস্থাপন" + _strReplace: + arg1: "লেখা" + arg2: "যে লেখা প্রতিস্থাপন করা হবে" + arg3: "যা দ্বারা প্রতিস্থাপন করা হবে" + strReverse: "লেখা উল্টান" + _strReverse: + arg1: "লেখা" + join: "লেখা যুক্ত করুন" + _join: + arg1: "লিস্ট" + arg2: "বিভাজক" + add: "যোগ" + _add: + arg1: "A" + arg2: "B" + subtract: "বিয়োগ" + _subtract: + arg1: "A" + arg2: "B" + multiply: "গুন" + _multiply: + arg1: "A" + arg2: "B" + divide: "ভাগ" + _divide: + arg1: "A" + arg2: "B" + mod: "ভাগশেষ" + _mod: + arg1: "A" + arg2: "B" + round: "দশমিক রাউন্ড করুন" + _round: + arg1: "সংখ্যা" + eq: "A ও B সমান" + _eq: + arg1: "A" + arg2: "B" + notEq: "A ও B সমান না" + _notEq: + arg1: "A" + arg2: "B" + and: "A এবং B" + _and: + arg1: "A" + arg2: "B" + or: "A অথবা B" + _or: + arg1: "A" + arg2: "B" + lt: "< A , B হতে কম" + _lt: + arg1: "A" + arg2: "B" + gt: "> A , B হতে বেশী" + _gt: + arg1: "A" + arg2: "B" + ltEq: "<= A , B হতে কম বা সমান" + _ltEq: + arg1: "A" + arg2: "B" + gtEq: ">= A , B হতে বেশী বা সমান" + _gtEq: + arg1: "A" + arg2: "B" + if: "যদি" + _if: + arg1: "যদি" + arg2: "তাহলে" + arg3: "তাছাড়া" + not: "না" + _not: + arg1: "না" + random: "র‍্যান্ডম" + _random: + arg1: "সম্ভাব্যতা" + rannum: "র‍্যানডম সংখ্যা" + _rannum: + arg1: "ন্যূনতম মান" + arg2: "সর্বোচ্চ মান" + randomPick: "তালিকা থেকে দৈবচয়ন করুন" + _randomPick: + arg1: "লিস্ট" + dailyRandom: "র‍্যান্ডম সংখ্যা (প্রতিটি ব্যবহারকারীর জন্য প্রতিদিন পরিবর্তীত হয়)" + _dailyRandom: + arg1: "সম্ভাব্যতা" + dailyRannum: "র‍্যান্ডম সংখ্যা (প্রতিটি ব্যবহারকারীর জন্য প্রতিদিন পরিবর্তীত হয়)" + _dailyRannum: + arg1: "ন্যূনতম মান" + arg2: "সর্বোচ্চ মান" + dailyRandomPick: "তালিকা থেকে এলোমেলোভাবে নির্বাচন করুন (প্রতিটি ব্যবহারকারীর জন্য প্রতিদিন পরিবর্তীত হয়)" + _dailyRandomPick: + arg1: "লিস্ট" + seedRandom: "র‍্যানডম (সীড দ্বারা)" + _seedRandom: + arg1: "সীড" + arg2: "সম্ভাব্যতা" + seedRannum: "র‍্যানডম সংখ্যা (সীড দ্বারা)" + _seedRannum: + arg1: "সীড" + arg2: "ন্যূনতম মান" + arg3: "সর্বোচ্চ মান" + seedRandomPick: "তালিকা থেকে দৈবচয়ন করুন (সীড দ্বারা)" + _seedRandomPick: + arg1: "সীড" + arg2: "লিস্ট" + DRPWPM: "সম্ভাব্যতা সহ একটি তালিকা থেকে এলোমেলোভাবে নির্বাচন করুন (প্রতিটি ব্যবহারকারীর জন্য প্রতিদিন)" + _DRPWPM: + arg1: "লেখার লিস্ট" + pick: "তালিকা থেকে নির্বাচন করুন" + _pick: + arg1: "লিস্ট" + arg2: "অবস্থান" + listLen: "লিস্টের দৈর্ঘ্য পান" + _listLen: + arg1: "লিস্ট" + number: "সংখ্যা" + stringToNumber: "পাঠ্য থেকে সংখ্যা" + _stringToNumber: + arg1: "লেখা" + numberToString: "সংখ্যা থেকে পাঠ্য" + _numberToString: + arg1: "সংখ্যা" + splitStrByLine: "পাঠ্যকে লাইনে বিভক্ত করুন" + _splitStrByLine: + arg1: "লেখা" + ref: "চলক" + aiScriptVar: "AiScript চলক" + fn: "ফাংশন" + _fn: + slots: "স্লটগুলি" + slots-info: "প্রতিটি স্লটকে আলাদা লাইনে লিখুন" + arg1: "আউটপুট" + for: "for-লুপ" + _for: + arg1: "কতবার চলবে" + arg2: "অ্যাকশন" + typeError: "স্লট {slot}, {expect} ধরনের মান গ্রহণ করে, কিন্তু {actual} ধরনের মান দেওয়া হয়েছে!" + thereIsEmptySlot: "স্লট {slot} খালি!" + types: + string: "লেখা" + number: "সংখ্যা" + boolean: "ফ্ল্যাগ" + array: "লিস্ট" + stringArray: "লেখার লিস্ট" + emptySlot: "খালি স্লট" + enviromentVariables: "এনভাইরনমেন্ট ভ্যারিয়েবল" + pageVariables: "পেজের চলক" + argVariables: "ইনপুটের জায়গা" +_relayStatus: + requesting: "অপেক্ষমান" + accepted: "অনুমোদিত" + rejected: "প্রত্যাখিত" +_notification: + fileUploaded: "ফাইল সফলভাবে আপলোড করা হয়েছে" + youGotMention: "{name} আপনাকে উল্লেখ্য করেছে" + youGotReply: "{name} আপনাকে জবাব দিয়েছে" + youGotQuote: "{name} আপনাকে উদ্ধৃত করেছে" + youRenoted: "{name} এর Renote" + youGotPoll: "{name} আপনার পোলে ভোট দিয়েছে" + youGotMessagingMessageFromUser: "{name} আপনাকে মেসেজ করেছে" + youGotMessagingMessageFromGroup: "{name} গ্রুপে একটি নতুন মেসেজ আছে" + youWereFollowed: "আপনাকে অনুসরণ করছে" + youReceivedFollowRequest: "অনুসরণ করার জন্য অনুরোধ পাওয়া গেছে" + yourFollowRequestAccepted: "আপনার অনুসরণ করার অনুরোধ গৃহীত হয়েছে" + youWereInvitedToGroup: "আপনি একটি গ্রুপে আমন্ত্রিত হয়েছেন" + pollEnded: "পোলের ফলাফল দেখা যাবে" + emptyPushNotificationMessage: "আপডেট করা পুশ বিজ্ঞপ্তি" + _types: + all: "সকল" + follow: "অনুসরণ করা হচ্ছে" + mention: "উল্লেখ" + reply: "উত্তর দিন" + renote: "রিনোট" + quote: "উদ্ধৃতি" + reaction: "প্রতিক্রিয়া" + pollVote: "পোলে ভোট আছে" + pollEnded: "পোল শেষ" + receiveFollowRequest: "প্রাপ্ত অনুসরণের অনুরোধসমূহ" + followRequestAccepted: "গৃহীত অনুসরণের অনুরোধসমূহ" + groupInvited: "গ্রুপের আমন্ত্রনসমূহ" + app: "লিঙ্ক করা অ্যাপ থেকে বিজ্ঞপ্তি" + _actions: + followBack: "ফলো ব্যাক করেছে" + reply: "জবাব" + renote: "রিনোট" +_deck: + alwaysShowMainColumn: "সর্বদা মেইন কলাম দেখান" + columnAlign: "কলাম সাজান" + addColumn: "কলাম যুক্ত করুন" + configureColumn: "কলাম সেটিংস" + swapLeft: "বামে সরান" + swapRight: "ডানে সরান" + swapUp: "উপরে উঠান" + swapDown: "নিচে নামান" + stackLeft: "বাম কলামে সাজান" + popRight: "ডানদিকে রাখুন" + profile: "প্রোফাইল" + _columns: + main: "প্রধান" + widgets: "উইজেটগুলি" + notifications: "বিজ্ঞপ্তি" + tl: "টাইমলাইন" + antenna: "অ্যান্টেনা" + list: "লিস্ট" + mentions: "উল্লেখসমূহ" + direct: "ডাইরেক্ট নোটগুলি" diff --git a/fe_calckey/frontend/locales/ca-ES.yml b/fe_calckey/frontend/locales/ca-ES.yml new file mode 100644 index 0000000..9a04270 --- /dev/null +++ b/fe_calckey/frontend/locales/ca-ES.yml @@ -0,0 +1,2134 @@ +_lang_: "Català" +headlineMisskey: "Una xarxa social de codi obert, descentralitzada i gratuïta per + a sempre! 🚀" +introMisskey: "Benvinguts! Calckey és una plataforma social de codi obert, descentralitzada + i gratuïta per a sempre! 🚀" +monthAndDay: "{day}/{month}" +search: "Cerca" +notifications: "Notificacions" +username: "Nom d'usuari" +password: "Contrasenya" +forgotPassword: "Contrasenya oblidada" +fetchingAsApObject: "Cercant en el Fediverse" +ok: "D'acord" +gotIt: "Ho he entès!" +cancel: "Cancel·la" +enterUsername: "Introdueix el teu nom d'usuari" +renotedBy: "Impulsat per {user}" +noNotes: "Cap publicació" +noNotifications: "Cap notificació" +instance: "Servidor" +settings: "Preferències" +basicSettings: "Configuració bàsica" +otherSettings: "Altres opcions" +openInWindow: "Obre en una finestra nova" +profile: "Perfil" +timeline: "Línia de temps" +noAccountDescription: "Aquest usuari encara no ha escrit la seva biografia." +login: "Inicia sessió" +loggingIn: "Iniciant sessió" +logout: "Tanca la sessió" +signup: "Registra'm" +uploading: "S'està pujant…" +save: "Desa" +users: "Usuaris" +addUser: "Afegeix un usuari" +favorite: "Afegeix als marcadors" +favorites: "Marcadors" +unfavorite: "Elimina dels marcadors" +favorited: "S'ha afegit el marcador." +alreadyFavorited: "Ja està afegida als marcadors." +cantFavorite: "No s'ha pogut afegir als marcadors." +pin: "Fixa al perfil" +unpin: "Deixa de fixar al perfil" +copyContent: "Copia el contingut" +copyLink: "Copia l'enllaç" +delete: "Elimina" +deleteAndEdit: "Elimina i edita" +deleteAndEditConfirm: "Segur que vols eliminar la publicació i editar-la? Perdràs + totes les reaccions, impulsos i respostes." +addToList: "Afegeix a la llista" +sendMessage: "Envia un missatge" +copyUsername: "Copia el nom d'usuari" +searchUser: "Cerca un usuari" +reply: "Respon" +loadMore: "Carrega'n més" +showMore: "Mostra'n més" +youGotNewFollower: "t'ha seguit" +receiveFollowRequest: "Sol·licitud de seguiment rebuda" +followRequestAccepted: "Sol·licitud de seguiment acceptada" +mention: "Menció" +mentions: "Mencions" +directNotes: "Missatges directes" +importAndExport: "Importa/exporta dades" +import: "Importa" +export: "Exporta" +files: "Fitxers" +download: "Baixa" +driveFileDeleteConfirm: "Segur que vols eliminar el fitxer «{name}»? S'eliminarà de + totes les notes que el continguin com a fitxer adjunt." +unfollowConfirm: "Segur que vols deixar de seguir a {name}?" +exportRequested: "Has sol·licitat una exportació. Això pot trigar una estona. S'afegirà + al teu Disc un cop completada." +importRequested: "Has sol·licitat una importació. Això pot trigar una estona." +lists: "Llistes" +noLists: "No teniu cap llista" +note: "Publicació" +notes: "Publicacions" +following: "Seguint" +followers: "Seguidors" +followsYou: "Et segueix" +createList: "Crea una llista" +manageLists: "Gestiona les llistes" +error: "Error" +somethingHappened: "S'ha produït un error" +retry: "Torna-ho a intentar" +pageLoadError: "S'ha produït un error en carregar la pàgina." +pageLoadErrorDescription: "Això normalment es deu a errors de xarxa o a la memòria + cau del navegador. Prova d'esborrar la memòria cau i torna-ho a provar després d'esperar + una estona." +serverIsDead: "Aquest servidor no respon. Espera una estona i torna-ho a provar." +youShouldUpgradeClient: "Per veure aquesta pàgina, actualitzeu-la per actualitzar + el vostre client." +enterListName: "Introdueix un nom per a la llista" +privacy: "Privadesa" +makeFollowManuallyApprove: "Les sol·licituds de seguiment requereixen aprovació" +defaultNoteVisibility: "Visibilitat per defecte" +follow: "Segueix" +followRequest: "Segueix" +followRequests: "Sol·licituds de seguiment" +unfollow: "Deixa de seguir" +followRequestPending: "Sol·licituds de seguiment pendents" +enterEmoji: "Introdueix un emoji" +renote: "Impulsa" +unrenote: "Anul·la l'impuls" +renoted: "S'ha impulsat." +cantRenote: "Aquesta publicació no es pot impulsar." +cantReRenote: "No es pot impulsar un impuls." +quote: "Cita" +pinnedNote: "Publicació fixada" +pinned: "Fixa al perfil" +you: "Tu" +clickToShow: "Fes clic per a mostrar" +sensitive: "NSFW" +add: "Afegeix" +reaction: "Reaccions" +reactionSetting: "Reaccions a mostrar al selector de reaccions" +reactionSettingDescription2: "Arrossega per reordenar, fes clic per suprimir, prem + \"+\" per afegir." +rememberNoteVisibility: "Recorda la configuració de visibilitat de les notes" +attachCancel: "Elimina el fitxer adjunt" +markAsSensitive: "Marca com a NSFW" +unmarkAsSensitive: "Desmarca com a NSFW" +enterFileName: "Introdueix un nom de fitxer" +mute: "Silencia" +unmute: "Deixa de silenciar" +block: "Bloqueja" +unblock: "Desbloqueja" +suspend: "Suspèn" +unsuspend: "Treu la suspensió" +instances: "Servidors" +remove: "Elimina" +nsfw: "NSFW" +pinnedNotes: "Publicacions fixades" +userList: "Llistes" +smtpUser: "Nom d'usuari" +smtpPass: "Contrasenya" +user: "Usuari" +searchByGoogle: "Cercar" +file: "Fitxer" +_email: + _follow: + title: "Tens un nou seguidor" + _receiveFollowRequest: + title: Heu rebut una sol·licitud de seguiment +_mfm: + mention: "Menció" + quote: "Citar" + search: "Cercar" + dummy: Calckey amplia el món del Fediverse + hashtag: Etiqueta + intro: MFM és un llenguatge de marques utilitzat a Misskey, Calckey, Akkoma i més + que es pot utilitzar en molts llocs. Aquí podeu veure una llista de tota la sintaxi + MFM disponible. + hashtagDescription: Podeu especificar una etiqueta mitjançant un coixinet i un text. + url: URL + urlDescription: Es poden mostrar URLS. + link: Enllaç + linkDescription: Parts específiques del text es poden mostrar com a URL. + bold: Negreta + boldDescription: Ressalta les lletres fent-les més gruixudes. + smallDescription: Mostra contingut petit i prim. + small: Petit + centerDescription: Mostra el contingut centrat. + inlineCode: Codi (en línia) + inlineMathDescription: Mostra fórmules matemàtiques (KaTeX) en línia + blockCode: Codi (Bloc) + blockCodeDescription: Mostra el ressaltat de sintaxi per al codi de diverses línies + (programa) en un bloc. + inlineMath: Matemàtiques (en línia) + jellyDescription: Dóna al contingut una animació semblant a una gelatina. + bounceDescription: Ofereix al contingut una animació de rebot. + jumpDescription: Dóna al contingut una animació de salt. + shake: Animació (Shake) + shakeDescription: Dóna al contingut una animació tremolosa. + bounce: Animació (Bounce) + x3Description: Mostra contingut encara més gran. + x2Description: Mostra contingut més gran. + twitchDescription: Ofereix al contingut una animació fortament convulsa. + spin: Animació (Spin) + spinDescription: Dóna al contingut una animació giratòria. + x2: Gran + x3: Molt gran + x4: Increïblement gran + blur: Desenfocament + x4Description: Mostra contingut fins i tot més gran que gran que gran. + rainbowDescription: Fa que el contingut aparegui en colors de l'arc de Sant Martí. + sparkle: Brillantor + sparkleDescription: Dóna al contingut un efecte de partícula brillant. + rotate: Girar + rotateDescription: Gira el contingut en un angle especificat. + positionDescription: Mou el contingut en una quantitat especificada. + fontDescription: Estableix el tipus de lletra en què voleu mostrar el contingut. + position: Posició + rainbow: Arc de Sant Martí + jelly: Animació (Jelly) + tada: Animació (Tada) + tadaDescription: Dóna al contingut una animació tipus "Tada!". + jump: Animació (Jump) + twitch: Animació (Twitch) + blurDescription: Desenfoca el contingut. Es mostrarà clarament quan passeu el cursor + per sobre. + font: Tipus de lletra + cheatSheet: Full de trucs de MFM + mentionDescription: Podeu especificar un usuari mitjançant un arrova i un nom d'usuari. + center: Centre + inlineCodeDescription: Mostra el ressaltat de sintaxi en línia per al codi (de programa). + blockMath: Matemàtiques (Bloc) + blockMathDescription: Mostra fórmules matemàtiques (KaTeX) en un bloc + quoteDescription: Mostra el contingut com una cita. + emoji: Emoji personalitzat + emojiDescription: Un emoji personalitzat és pot mostrar envoltant el nom amb dos + punts. + searchDescription: Mostra un quadre de cerca amb el text introduït prèviament. + flip: Capgirar + flipDescription: Capgira el contingut horitzontalment o verticalment. + plainDescription: Desactiva els efectes de tots els MFM continguts en aquest efecte + MFM. + scale: Escala + foreground: Color de primer pla + background: Color de fons + backgroundDescription: Canvia el color de fons del text. + scaleDescription: Escala el contingut en una quantitat especificada. + foregroundDescription: Canvia el color de primer pla del text. + plain: Pla + stop: Parar MFM + play: Posar en marxa MFM + warn: MFM pot contenir animacions cridaneres o que es mouen ràpidament + alwaysPlay: Reprodueix automàticament tots els MFM animats + fade: Esvair + fadeDescription: Esvaeix el contingut cap a dintre i cap en fora. + crop: Retallar + advanced: MFM avançat + advancedDescription: Si està desactivat, només permet l'etiquetatge bàsic tret que + es reproduïnt un MFM animat + cropDescription: Retalla el contingut. +_theme: + keys: + mention: "Menció" + renote: "Impulsar" + fg: Text + navBg: Fons de la barra lateral + navFg: Text de la barra lateral + navHoverFg: Text de la barra lateral (Hover) + hashtag: Etiquetes + mentionMe: Mencions (Jo) + infoBg: Fons de l'informació + infoFg: Text informatiu + toastBg: Fons de notificació + listItemHoverBg: Fons de la llista d'elements (Hover) + driveFolderBg: Fons de la carpeta Disc + wallpaperOverlay: Superposició de fons de pantalla + badge: Distintiu + accentLighten: Accent (Lluminós) + accentDarken: Accent (enfosquit) + fgHighlighted: Text ressaltat + indicator: Indicador + focus: Centrar-se + panel: Panell + navIndicator: Indicador de la barra lateral + accent: Accent + header: Encapçalament + navActive: Text de la barra lateral (Active) + link: Enllaç + modalBg: Fons del modal + divider: Divisor + scrollbarHandle: Mànec de la barra de desplaçament + scrollbarHandleHover: Mànec de la barra de desplaçament (Hover) + dateLabelFg: Text de l'etiqueta de data + infoWarnBg: Fons d'advertència + cwBg: Fons del botó CW + cwFg: Text del botó CW + messageBg: Fons del xat + infoWarnFg: Text d'advertència + bg: Fons + shadow: Ombra + cwHoverBg: Fons del botó CW (Hover) + toastFg: Text de notificació + buttonHoverBg: Fons del botó (Hover) + inputBorder: Vora del camp d'entrada + buttonBg: Fons del botó + description: Descripció + installed: "{name} s'ha instal·lat" + installedThemes: Temes instal·lats + builtinThemes: Temes integrats + alreadyInstalled: Aquest tema ja està instal·lat + invalid: El format d'aquest tema no és vàlid + make: Fes un tema + defaultValue: 'Per defecte: {value}' + color: Color + refProp: Fes referència a una propietat + refConst: Fes referència a una constant + key: Clau + func: Funcions + funcKind: Tipus de funció + argument: Argument + basedProp: Propietat de referència + importInfo: Si introdueixes el codi de tema aquí, podeu importar-lo a l'editor de + temes + inputConstantName: Introdueix un nom per a aquesta constant + addConstant: Afegir una constant + code: Codi del tema + alpha: Opacitat + deleteConstantConfirm: De debò vols esborrar la constant {const}? + manage: Gestionar temes + explore: Explora Temes + darken: Enfosquir + base: Fundament + constant: Constant + lighten: Clar + install: Instal·lar un tema +_sfx: + note: "Publicació nova" + notification: "Notificacions" + antenna: Antenes + channel: Notificacions del canal + noteMy: Publicació propia + chat: Xat + chatBg: Fons del xat +_2fa: + step2Url: "També pots inserir aquest enllaç i utilitzes una aplicació d'escriptori:" + alreadyRegistered: Ja heu registrat un dispositiu d'autenticació de dos factors. + registerTOTP: Registrar un dispositiu nou + securityKeyInfo: A més de l'autenticació d'empremta digital o PIN, també podeu configurar + l'autenticació mitjançant claus de seguretat de maquinari compatibles amb FIDO2 + per protegir encara més el vostre compte. + step4: A partir d'ara, qualsevol intent d'inici de sessió futur demanarà aquest + token d'inici de sessió. + registerSecurityKey: Registrar una clau de seguretat o d'accés + step1: En primer lloc, instal·la una aplicació d'autenticació (com ara {a} o {b}) + al dispositiu. + step2: A continuació, escaneja el codi QR que es mostra en aquesta pantalla. + step3: Introdueix el token que t'ha proporcionat l'aplicació per finalitzar la configuració. + step3Title: Introduïu un codi d'autenticació + chromePasskeyNotSupported: Les claus de pas de Chrome actualment no s'admeten. + securityKeyName: Introduïu un nom de clau + removeKey: Suprimeix la clau de seguretat + removeKeyConfirm: Vols suprimir la clau {name}? + renewTOTP: Tornar a configurar l'aplicació d'autenticació + renewTOTPOk: Reconfigurar + renewTOTPCancel: Cancel·lar + step2Click: Fer clic en aquest codi QR us permetrà registrar 2FA a la vostra clau + de seguretat o aplicació d'autenticació del telèfon. + securityKeyNotSupported: El vostre navegador no admet claus de seguretat. + registerTOTPBeforeKey: Configureu una aplicació d'autenticació per registrar una + clau de seguretat o de passi. + tapSecurityKey: Si us plau, seguiu el vostre navegador per registrar la clau de + seguretat o d'accés + renewTOTPConfirm: Això farà que els codis de verificació de l'aplicació anterior + deixin de funcionar + whyTOTPOnlyRenew: L’aplicació d’autenticació no es pot eliminar sempre que es hi + hagi una clau de seguretat registrada. +_widgets: + notifications: "Notificacions" + timeline: "Línia de temps" + unixClock: Rellotge d'UNIX + federation: Federació + instanceCloud: Núvol de servidors + trends: Tendència + clock: Rellotge + calendar: Calendari + activity: Activitat + photos: Fotos + rssTicker: Teletip RSS + onlineUsers: Usuaris en línia + memo: Notes adhesives + digitalClock: Rellotge digital + postForm: Formulari per publicar + slideshow: Presentació de diapositives + serverMetric: Estadístiques del servidor + userList: Llista d'usuaris + rss: Lector d'RSS + jobQueue: Cua de treball + _userList: + chooseList: Selecciona una llista + aiscript: Consola AiScript + button: Botó + serverInfo: Informació del servidor + meiliStatus: Estat del servidor + meiliSize: Mida de l'índex + meiliIndexCount: Publicacions indexades +_cw: + show: "Carregar més" + files: '{count} fitxers' + hide: Amaga + chars: '{count} caràcters' +_visibility: + followers: "Seguidors" + publicDescription: La teva publicació serà visible per a tots els usuaris + localOnly: Només Local + specified: Directe + home: Sense llistar + homeDescription: Publica només a la línea de temps local + followersDescription: Fes visible només per als teus seguidors + specifiedDescription: Fer visible només per a usuaris determinats + public: Públic + localOnlyDescription: No és visible per als usuaris remots +_profile: + username: "Nom d'usuari" + metadataEdit: Editar informació addicional + youCanIncludeHashtags: També pots incloure etiquetes al teu perfil. + metadata: Informació adicional + description: Perfil + metadataLabel: Etiqueta + metadataContent: Contingut + changeAvatar: Canvia l'avatar + changeBanner: Canvia el banner + locationDescription: Si primer introduïu la vostra ciutat, es mostrarà l'hora local + a altres usuaris. + name: Nom + metadataDescription: Fent servir això, podràs mostrar camps d'informació addicionals + al vostre perfil. +_exportOrImport: + followingList: "Usuaris que segueixes" + muteList: "Silencia" + blockingList: "Bloqueja" + userLists: "Llistes" + excludeMutingUsers: Exclou els usuaris silenciats + allNotes: Totes les notes + excludeInactiveUsers: Exclou usuaris inactius +_pages: + script: + categories: + list: "Llistes" + flow: Control de flux + random: Aleatori + value: Valors + fn: Funcions + text: Operacions de text + convert: Transformacions + logical: Operació lògica + operation: Càlcul + comparison: Comparació + blocks: + _join: + arg1: "Llistes" + arg2: Separador + _randomPick: + arg1: "Llistes" + _dailyRandomPick: + arg1: "Llistes" + _seedRandomPick: + arg2: "Llistes" + arg1: Llavor + _pick: + arg1: "Llistes" + arg2: Posició + _listLen: + arg1: "Llistes" + add: Afegir + _subtract: + arg1: A + arg2: B + subtract: Restar + _round: + arg1: Número + eq: A i B són iguals + _mod: + arg2: B + arg1: A + round: Arrodoniment decimal + _and: + arg1: A + arg2: B + or: A O B + _or: + arg1: A + arg2: B + lt: < A és menor que B + _lt: + arg1: A + arg2: B + gt: '> A és més gran que B' + _gt: + arg1: A + arg2: B + seedRannum: Nombre aleatori (amb llavor) + _seedRannum: + arg1: Llavor + arg2: Valor mínim + arg3: Valor màxim + _eq: + arg1: A + arg2: B + ltEq: <= A és menor o igual que B + _multiply: + arg2: B + arg1: A + divide: Dividir + notEq: A i B són diferents + _notEq: + arg1: A + arg2: B + and: A I B + _ltEq: + arg2: B + arg1: A + gtEq: '>= A és més gran o igual que B' + _gtEq: + arg1: A + arg2: B + if: Branca + _if: + arg1: Si + arg2: Aleshores + arg3: Altrament + not: NO + random: Aleatori + _dailyRandom: + arg1: Probabilitat + dailyRannum: Nombre aleatori (canvia un cop al dia per a cada usuari) + _add: + arg1: A + arg2: B + _divide: + arg1: A + arg2: B + mod: Resta + _not: + arg1: NO + _random: + arg1: Probabilitat + rannum: Nombre aleatori + _rannum: + arg1: Valor mínim + arg2: Valor màxim + randomPick: Tria aleatòriament de la llista + dailyRandom: Aleatori (canvia un cop al dia per a cada usuari) + _dailyRannum: + arg2: Valor màxim + arg1: Valor mínim + dailyRandomPick: Tria aleatòriament d'una llista (Canvis un cop al dia per a + cada usuari) + seedRandom: Aleatori (amb llavor) + _seedRandom: + arg1: Llavor + arg2: Probabilitat + seedRandomPick: Tria aleatòriament de la llista (amb llavor) + multiply: Multiplicar + text: Text + _strPick: + arg1: Text + arg2: Ubicació de la cadena + strPick: Extreure cadena + strReplace: Cadena de substitució + _strReplace: + arg1: Text + arg3: Substitueix per + arg2: Text a substituir + strReverse: Voltejar text + _strReverse: + arg1: Text + join: Concatenació de textos + pick: Selecciona de la llista + listLen: Obtenir la longitud de la llista + stringToNumber: Text a número + number: Número + _stringToNumber: + arg1: Text + splitStrByLine: Dividir el text per salts de línia + _fn: + slots: Ranures + slots-info: Separa cada ranura amb un salt de línia + arg1: Sortida + aiScriptVar: Variable AiScript + fn: Funció + for: Repetir + _numberToString: + arg1: Número + _DRPWPM: + arg1: Llista de text + numberToString: Número a text + _splitStrByLine: + arg1: Text + ref: Variable + DRPWPM: Tria aleatòriament d'una llista ponderada (Canvis un cop al dia per + a cada usuari) + _for: + arg1: Nombre de vegades a repetir + arg2: Acció + strLen: Longitud del text + multiLineText: Text (multilínia) + _strLen: + arg1: Text + textList: Llista de text + _textList: + info: Separa cada ranura amb un salt de línia + types: + array: "Llistes" + stringArray: Llista de text + boolean: Bandera + string: Text + number: Número + emptySlot: Ranura buida + enviromentVariables: Variables d'entorn + pageVariables: Variables de pàgina + argVariables: Ranures d'entrada + thereIsEmptySlot: L'espai {slot} està buit! + typeError: L'espai {slot} accepta valors del tipus "{expect}", però el valor proporcionat + és del tipus "{actual}"! + newPage: Crea una pàgina nova + editPage: Edita aquesta pàgina + readPage: S'està veient la font d'aquesta pàgina + created: Pàgina creada correctament + updated: Pàgina editada correctament + invalidNameText: Assegurat que el títol de la pàgina no estigui buit + editThisPage: Edita aquesta pàgina + deleted: Pàgina suprimida correctament + pageSetting: Configuració de la pàgina + nameAlreadyExists: L'URL de la pàgina especificat ja existeix + invalidNameTitle: L'URL de la pàgina especificat no és vàlid + viewPage: Consulta la teva pàgina + like: M'agrada + viewSource: Veure la font + summary: Resum de la pàgina + alignCenter: Centrar elements + hideTitleWhenPinned: Amaga el títol de la pàgina quan estigui fixat al perfil + font: Tipus de lletra + fontSerif: Serif + fontSansSerif: Sans Serif + eyeCatchingImageSet: Estableix una miniatura + eyeCatchingImageRemove: Suprimeix la miniatura + chooseBlock: Afegeix un bloc + selectType: Selecciona un tipus + enterVariableName: Introduïu un nom de variable + blocks: + section: Secció + text: Text + textarea: Àrea de text + image: Imatges + if: Si + _if: + variable: Variable + post: Formulari de notes + _post: + text: Contingut + attachCanvasImage: Adjuntar imatge de llenç + canvasId: ID del llenç + _textInput: + name: Nom de la variable + text: Títol + default: Valor per defecte + textInput: Entrada de text + _textareaInput: + name: Nom de la variable + text: Títol + default: Valor per defecte + textareaInput: Entrada de text multilínia + numberInput: Entrada numèrica + _note: + id: ID de la publicació + idDescription: També podeu enganxar l'URL de la publicació aquí. + detailed: Vista detallada + switch: Canviar + canvas: Llenç + _canvas: + id: Identificador de llenç + width: Amplada + height: Alçada + note: Publicació incrustada + _counter: + name: Nom de la variable + text: Títol + inc: Pas + _button: + text: Títol + colored: De colors + action: Comportament quan es prem el botó + _action: + _dialog: + content: Contingut + resetRandom: Restableix la llavor aleatòria + pushEvent: Envia un esdeveniment + _pushEvent: + event: Nom de l'esdeveniment + message: Missatge que s'ha de mostrar quan s'activa + variable: Variable per enviar + no-variable: Cap + dialog: Mostra un diàleg + callAiScript: Invoca AiScript + _callAiScript: + functionName: Nom de la funció + _switch: + default: Valor per defecte + name: Nom de la variable + text: Títol + counter: Comptador + _numberInput: + name: Nom de la variable + text: Títol + default: Valor per defecte + button: Botó + _radioButton: + name: Nom de la variable + title: Títol + values: Llista d'opcions separades per salts de línia + default: Valor per defecte + radioButton: Elecció + variableNameIsAlreadyUsed: Aquest nom de variable ja està en ús + contentBlocks: Contingut + inputBlocks: Entrada + specialBlocks: Especial + variables: Variables + title: Títol + url: URL de la pàgina + unlike: Elimina m'agrada + my: Les meves pàgines + liked: Pàgines que m'han agradat + content: Bloc de pàgines + featured: Popular + inspector: Inspector + contents: Contingut +_notification: + youWereFollowed: "t'ha seguit" + _types: + follow: "Nous seguidors" + mention: "Menció" + renote: "Impulsos" + quote: "Citar" + reaction: "Reaccions" + all: Tots + reply: Respostes + pollEnded: S'acaben les enquestes + receiveFollowRequest: S'han rebut peticions de seguiment + followRequestAccepted: Sol·licituds de seguiment acceptades + groupInvited: Invitacions per a grups + app: Notificacions d'aplicacions enllaçades + pollVote: Votacions a les enquestes + _actions: + reply: "Respondre" + renote: "Impulsos" + followBack: t'ha tornat el seguiment + youGotQuote: "{name} t'ha citat" + fileUploaded: El fitxer s'ha penjat correctament + youGotMention: "{nom} t'ha esmentat" + youGotReply: "{name} t'ha respost" + youRenoted: Impuls de {name} + youGotPoll: '{name} ha votat a la teva enquesta' + youGotMessagingMessageFromUser: "{name} t'ha enviat un missatge de xat" + youGotMessagingMessageFromGroup: S'ha enviat un missatge de xat al grup {name} + youReceivedFollowRequest: Has rebut una sol·licitud de seguiment + yourFollowRequestAccepted: S'ha acceptat la vostra sol·licitud de seguiment + pollEnded: Es resultat de la enquesta ja està disponible + emptyPushNotificationMessage: Les notificacions push s'han actualitzat + youWereInvitedToGroup: "{userName} t'ha convidat a un grup" + reacted: Ha reaccionat a la teva publicació + renoted: Ha impulsat la teva publicació + voted: Ha votat a la teva enquesta +_deck: + _columns: + notifications: "Notificacions" + tl: "Línia de temps" + list: "Llistes" + mentions: "Mencions" + widgets: Ginys + main: Principal + antenna: Antena + direct: Missatges directes + channel: Canal + alwaysShowMainColumn: Mostra sempre la columna principal + columnAlign: Alinear columnes + introduction: Crea la interfície perfecta per a tu organitzant columnes lliurement! + swapRight: Canvia amb la columna de la dreta + swapUp: Canvia amb la columna de d'alt + swapDown: Canvia amb la columna de sota + stackLeft: Apilar amb la columna de l'esquerra + popRight: Treu a la dreta + profile: Espai de treball + newProfile: Nou espai de treball + deleteProfile: Suprimir l'espai de treball + introduction2: Feu clic al + a la dreta de la pantalla per afegir noves columnes + sempre que vulgueu. + widgetsIntroduction: Selecciona "Editar ginys" al menú de columnes i afegeix un + giny. + addColumn: Afegeix una columna + configureColumn: Configuració de columnes + swapLeft: Canvia amb la columna de l'esquerra + renameProfile: Canvia el nom de l'espai de treball + nameAlreadyExists: Aquest nom d'espai de treball ja existeix. +blockConfirm: Segur que vols bloquejar aquest compte? +unsuspendConfirm: Segur que vols treure la suspensió d'aquest compte? +unblockConfirm: Segur que vols treure el bloqueig d'aquest compte? +suspendConfirm: Segur que vols suspendre aquest compte? +selectList: Selecciona una llista +selectAntenna: Selecciona una antena +selectWidget: Selecciona un giny +editWidgets: Edita els ginys +editWidgetsExit: Fet +customEmojis: Emojis personalitzats +cacheRemoteFilesDescription: Quan aquesta opció està desactivada, els fitxers remots + es carreguen directament del servidor remot. Desactivar-la farà que baixi l'ús d'emmagatzematge, + però incrementa el tràfic, perquè les miniatures no es generaran. +flagAsBot: Marca aquest compte com a bot +flagAsBotDescription: Activa aquesta opció si aquest compte és controlat per un programa. + Si s'activa, això actuarà com una bandera per a altres desenvolupadors i ajuda a + prevenir cadenes de interaccions infinites amb altres bots a més d'ajustar els sistemes + interns de Calckey per tractar aquest compte com un bot. +flagAsCat: Ets un gat? 🐱 +flagShowTimelineReplies: Mostra respostes a la línia de temps +flagAsCatDescription: Guanyaràs unes orelles de gat i parlares com un gat! +flagShowTimelineRepliesDescription: Si s'activa, es mostraran les respostes d'usuaris + a publicacions d'altres usuaris. +general: General +autoAcceptFollowed: Aprova automàticament les peticions de seguiment d'usuaris que + segueixes +accountMoved: "L'usuari s'ha mogut a un compte nou:" +addAccount: Afegeix un compte +loginFailed: No s'ha pogut iniciar sessió +showOnRemote: Mostra al servidor remot +wallpaper: Fons de pantalla +setWallpaper: Estableix fons de pantalla +removeWallpaper: Elimina el fons de pantalla +followConfirm: Segur que vols seguir a {name}? +proxyAccount: Compte proxy +proxyAccountDescription: Un compte proxy es un compte que actua com un seguidor remot + per a usuaris sota determinades condicions. Per exemple, quant un usuari afegeix + un usuari remot a la llista, l'activitat de l'usuari remot no serà entregada al + servidor si cap usuari local el segueix, així el compte proxy el seguirà. +host: Amfitrió +selectUser: Selecciona un usuari +latestStatus: Últim estat +storageUsage: Ús del emmagatzematge +metadata: Metadades +monitor: Seguiment +software: Programari +version: Versió +jobQueue: Cua de feina +cpuAndMemory: CPU i memòria +network: Xarxa +disk: Disc +instanceInfo: Informació del servidor +statistics: Estadístiques +clearCachedFiles: Esborra la memòria cau +clearQueueConfirmText: Qualsevol publicació que continuï a la cua sense entregar no + será federada. Normalment aquesta operació no es necessària. +clearCachedFilesConfirm: Segur que vols esborrar els fitxers remots de la memòria + cau? +blockedUsers: Usuaris blocats +noUsers: No hi ha cap usuari +editProfile: Edita el perfil +noteDeleteConfirm: Segur que vols eliminar la publicació? +pinLimitExceeded: No pots fixar més notes +muteAndBlock: Silenciats i blocats +mutedUsers: Usuaris silenciats +done: Fet +preview: Vista prèvia +default: Per defecte +intro: La instal·lació de Calckey ha acabat! Crea un compte d'usuari d'administració. +processing: S'està processant +noCustomEmojis: No hi ha cap emoji +noJobs: No hi ha cap feina +federating: Federant +blocked: Bloquejat +subscribing: Subscrivint +publishing: Publicant +notResponding: Sense resposta +instanceUsers: Usuaris d'aquest servidor +instanceFollowing: Seguint al servidor +instanceFollowers: Seguidors del servidor +security: Seguretat +newPasswordRetype: Torna a entrar la nova contrasenya +more: Més! +featured: Destacat +usernameOrUserId: Nom o ID d'usuari +noSuchUser: No s'ha trobat l'usuari +lookup: Cerca +attachFile: Afegeix un fitxer +currentPassword: Contrasenya actual +newPassword: Nova contrasenya +announcements: Anuncis +imageUrl: URL de la imatge +removed: S'ha eliminat correctament +removeAreYouSure: Segur que vols eliminar «{x}»? +deleteAreYouSure: Segur que vols eliminar «{x}»? +resetAreYouSure: Segur que vols restablir? +fromUrl: Des d'una URL +saved: S'ha desat +messaging: Xat +upload: Puja +keepOriginalUploading: Desa la imatge original +keepOriginalUploadingDescription: Desa la imatge original pujada tal com es. Si es + desactiva, es generarà una versió per mostrar en la web al pujar. +fromDrive: Des del Disc +uploadFromUrl: Puja des d'una adreça URL +uploadFromUrlDescription: Adreça URL del fitxer que vols pujar +uploadFromUrlRequested: Pujada demanada +noMoreHistory: No hi ha més historial +tos: Condicions d'ús +start: Comença +startMessaging: Comença una conversa +manageGroups: Gestiona els grups +nUsersRead: llegit per {n} +agreeTo: Estic d'acord amb {0} +activity: Activitat +home: Inici +remoteUserCaution: La informació dels usuaris remots pot estar incompleta. +themeForDarkMode: Tema a fer servir en mode fosc +light: Clar +registeredDate: Data de registre +dark: Fosc +lightThemes: Temes clars +location: Ubicació +theme: Temes +themeForLightMode: Tema a fer servir en mode clar +drive: Disc +selectFile: Tria un fitxer +selectFiles: Tria fitxers +darkThemes: Temes foscos +syncDeviceDarkMode: Sincronitza el mode fosc amb la configuració del teu dispositiu +fileName: Nom del fitxer +createFolder: Crea una carpeta +renameFolder: Canvia-li el nom a la carpeta +deleteFolder: Elimina la carpeta +selectFolder: Tria una carpeta +selectFolders: Tria carpetes +renameFile: Canvia el nom del fitxer +folderName: Nom de la carpeta +inputNewFolderName: Escriu un nom de carpeta nou +addFile: Afegeix un fitxer +emptyDrive: El teu Disc és buit +emptyFolder: Aquesta carpeta és buida +unableToDelete: No es pot eliminar +inputNewFileName: Escriu un nou nom per al fitxer +inputNewDescription: Escriu una descripció nova +circularReferenceFolder: La carpeta de destí és una subcarpeta de la carpeta que vols + moure. +hasChildFilesOrFolders: Aquesta carpeta no es pot eliminar perquè no és buida. +whenServerDisconnected: Quant es perd la conexió amb el servidor +disconnectedFromServer: S'ha perdut la conexió al servidor +reload: Torna a carregar +avatar: Avatar +banner: Bàner +doNothing: Ignora +reloadConfirm: Vols tornar a carregar la línea temporal? +watch: Veure +maintainerName: Administrador +maintainerEmail: Correu electrònic de l'administrador +instanceName: Nom del servidor +instanceDescription: Descripció del servidor +today: Avui +dayX: '{day}' +tosUrl: URL de les Condicions d'ús +thisYear: Any +thisMonth: Mes +integration: Integracions +driveCapacityPerRemoteAccount: Capacitat del Disc per usuari remot +inMb: En megabytes +iconUrl: Adreça URL de la icona +enableRegistration: Activa el registre d'usuaris nous +invite: Convidar +driveCapacityPerLocalAccount: Capacitat del Disc per usuari local +bannerUrl: Adreça URL del banner +backgroundImageUrl: Adreça URL del fons de pantalla +basicInfo: Informació bàsica +pinnedPages: Pàgines fixades +pinnedUsersDescription: Llista de noms d'usuaris per fixar a la pestanya "Explorar" + Un nom per línea. +pinnedPagesDescription: Introdueix la ruta a les pàgines que vols fixar a la página + principal d'aquest servidor, una ruta per línea. +pinnedUsers: Usuaris fixats +enableHcaptcha: Activa hCaptcha +hcaptchaSiteKey: Clau del lloc +hcaptchaSecretKey: Clau secreta +recaptcha: reCAPTCHA +enableGlobalTimeline: Activa la línia de temps global +disablingTimelinesInfo: Els Administradors i Moderadors sempre tenen accés a totes + les líneas temporals, inclòs si hi són desactivades. +showLess: Tanca +clearQueue: Esborra la cua +uploadFromUrlMayTakeTime: Pot trigar un temps fins que la pujada es completi. +noThankYou: No, gràcies +addInstance: Afegeix un servidor +emoji: Emojis +emojis: Emojis +emojiName: Nom del emoji +emojiUrl: URL de l'emoji +addEmoji: Afegeix +settingGuide: Configuració recomenada +searchWith: 'Cerca: {q}' +youHaveNoLists: No tens cap llista +flagSpeakAsCat: Parla com un gat +selectInstance: Selecciona un servidor +flagSpeakAsCatDescription: Les teves publicacions es transformaran en miols quan estiguis + en mode gat +recipient: Destinatari(s) +annotation: Comentaris +blockedInstances: Servidors bloquejats +blockedInstancesDescription: Llista les adreces dels servidors que vols bloquejar. + Els servidors de la llista no podrán comunicarse amb aquests servidors. +hiddenTags: Etiquetes amagades +hiddenTagsDescription: 'Enumereu les etiquetes (sense el #) que voleu ocultar de tendències + i explorar. Les etiquetes ocultes encara es poden descobrir per altres mitjans.' +noInstances: No hi ha cap servidor +defaultValueIs: 'Per defecte: {value}' +suspended: Suspès +all: Tot +changePassword: Canvia la contrasenya +clearQueueConfirmTitle: Segur que vols esborrar la cua? +retypedNotMatch: Els camps no coincideixen. +normal: Normal +monthX: '{month}' +enableRecaptcha: Activa reCAPTCHA +recaptchaSiteKey: Clau del lloc +recaptchaSecretKey: Clau secreta +avoidMultiCaptchaConfirm: Fent servir diferents sistemes de Captcha pot causar interferències + entre ells. Vols desactivar els altres sistemes que es troben activats? Si vols + deixar-los activats fes clic a cancelar. +antennas: Antenes +enableEmojiReactions: Activa reaccions amb emojis +blockThisInstance: Bloqueja aquest servidor +registration: Registra't +showEmojisInReactionNotifications: Mostra els emojis a les notificacions de les reaccions +renoteMute: Silencia els impulsos +renoteUnmute: Treu el silenci als impulsos +cacheRemoteFiles: Fitxers remots a la memòria cau +federation: Federació +registeredAt: Registrat a +latestRequestSentAt: Última petició enviada +latestRequestReceivedAt: Última petició rebuda +charts: Gràfics +perHour: Per hora +perDay: Per dia +stopActivityDelivery: Para d'enviar activitats +operations: Operacions +explore: Explora +messageRead: Llegit +images: Imatges +birthday: Aniversari +yearsOld: '{age} anys' +copyUrl: Copia l'adreça URL +rename: Renombrar +unwatch: Deixa de veure +accept: Accepta +reject: Rebutja +yearX: '{year}' +pages: Pàgines +disconnectService: Desconnectar +connectService: Connectar +enableLocalTimeline: Activa la línea de temps local +enableRecommendedTimeline: Activa la línea de temps de recomanacions +pinnedClipId: ID del clip que vols fixar +hcaptcha: hCaptcha +manageAntennas: Gestiona les Antenes +name: Nom +notesAndReplies: Notes i respostes +silence: Posa en silenci +withFiles: Amb fitxers +popularUsers: Usuaris populars +exploreUsersCount: Hi han {count} usuaris +exploreFediverse: Explora el Fesiverse +popularTags: Etiquetes populars +about: Sobre +recentlyUpdatedUsers: Usuaris actius fa poc +recentlyRegisteredUsers: Usuaris registrats fa poc +recentlyDiscoveredUsers: Nous suaris descoberts +administrator: Administrador +token: Token +registerSecurityKey: Registreu una clau de seguretat +securityKeyName: Nom clau +lastUsed: Feta servir per última vegada +unregister: Anul·lar el registre +passwordLessLogin: Identificació sense contrasenya +share: Comparteix +notFound: No s'ha trobat +newPasswordIs: La nova contrasenya és "{password}" +notFoundDescription: No es pot trobar cap pàgina que correspongui a aquesta adreça + URL. +uploadFolder: Carpeta per defecte per pujar arxius +cacheClear: Netejar la memòria cau +markAsReadAllNotifications: Marca totes les notificacions com llegides +markAsReadAllUnreadNotes: Marca totes les notes com a llegides +markAsReadAllTalkMessages: Marca tots els missatges com llegits +help: Ajuda +inputMessageHere: Escriu aquí el missatge +close: Tancar +group: Grup +groups: Grups +createGroup: Crea un grup +ownedGroups: Grups que et pertanyen +joinedGroups: Grups als que t'has unit +groupName: Nom del grup +members: Membres +transfer: Transferir +messagingWithUser: Conversa privada +title: Títol +text: Text +enable: Activar +next: Següent +retype: Torna a entrar +noteOf: Publicació de {user} +inviteToGroup: Invitar a un grup +quoteAttached: Cita +quoteQuestion: Adjuntar com a cita? +noMessagesYet: Encara no hi han missatges +signinRequired: Si us plau registrat o inicia sessió per continuar +invitations: Invitacions +invitationCode: Codi d'invitació +checking: Comprovant... +usernameInvalidFormat: Pots fer servir lletres en majúscules o minúscules, nombres + i guions baixos. +tooShort: Massa curt +tooLong: Massa llarg +weakPassword: Contrasenya amb seguretat feble +strongPassword: Contrasenya amb seguretat forta +passwordMatched: Coincidències +signinWith: Inicieu sessió com {x} +signinFailed: No es pot iniciar sessió. El nom d'usuari o la contrasenya són incorrectes. +or: O +language: Idioma +uiLanguage: Idioma de la interfície d'usuari +groupInvited: T'han invitat a un grup +aboutX: Sobre {x} +youHaveNoGroups: No tens grups +disableDrawer: No facis servir els menús amb estil de calaix +noHistory: No hi ha historial disponible +signinHistory: Historial d'inicis de sessió +disableAnimatedMfm: Desactiva les animacions amb MFM +doing: Processant... +category: Categoría +existingAccount: El compte ja existeix +regenerate: Regenerar +docSource: Font d'aquest document +createAccount: Crear compte +fontSize: Mida del text +noFollowRequests: No tens cap sol·licitud de seguiment per aprovar +openImageInNewTab: Obre les imatges en una pestanya nova +dashboard: Panell +local: Local +remote: Remot +total: Total +weekOverWeekChanges: Canvis d'ençà la passada setmana +dayOverDayChanges: Canvis d'ençà ahir +appearance: Aparença +clientSettings: Configuració del client +accountSettings: Configuració del compte +promotion: Promogut +promote: Promoure +numberOfDays: Nombre de dies +objectStorageBaseUrl: Adreça URL base +hideThisNote: Amaga aquesta publicació +showFeaturedNotesInTimeline: Mostra les notes destacades a les líneas de temps +objectStorage: Emmagatzematge d'objectes +useObjectStorage: Fes servir l'emmagatzema d'objectes +expandTweet: Amplia el tuit +themeEditor: Editor de temes +description: Descripció +leaveConfirm: Hi han canvis que no s'han desat. Els vols descartar? +manage: Administració +plugins: Afegits +preferencesBackups: Preferències de còpies de seguretat +undeck: Treure el Taulell +useBlurEffectForModal: Fes servir efectes de difuminació en les finestres modals +useFullReactionPicker: Fes servir el selector de reaccions a tamany complert +deck: Taulell +width: Amplada +generateAccessToken: Genera un token d'accés +medium: Mitja +small: Petit +permission: Permisos +enableAll: Activa tots +tokenRequested: Garantir accés al compte +pluginTokenRequestedDescription: Aquest afegit podrà fer servir els permisos configurats + aquí. +emailServer: Servidor de correu electrònic +notificationType: Tipus de notificació +edit: Editar +emailAddress: Adreça de Correu electrònic +smtpConfig: Configuració del servidor SMTP +smtpHost: Host +enableEmail: Activa la distribució de correu electrònic +smtpPort: Port +emailConfigInfo: Fet servir per confirmar les adreçats de correu electrònic al registrar-se + o si s'oblida la contrasenya +email: Correu electrònic +smtpSecure: Fes servir SSL/TLS implícit per connectar-se per SMTP +emptyToDisableSmtpAuth: Deixa el nom d'usuari i la contrasenya sense emplenar per + desactivar la verificació SMTP +smtpSecureInfo: Desactiva això quant facis servir STARTTLS +testEmail: Envia un correu electrònic de verificació +wordMute: Silenciar paraules +regexpError: Error a la Expressió Regular +regexpErrorDescription: 'Hi ha un error a la expressió regular a la línea {line} de + la teva {tab} de paraules silenciades:' +userSaysSomething: '{name} va dir alguna cosa' +instanceMute: Silenciar servidor +logs: Registres +copy: Copiar +delayed: Retardat +metrics: Mètriques +overview: Vista general +database: Base de dades +regenerateLoginToken: Regenera el token d'inici de sessió +reduceUiAnimation: Redueix les animacions de la UI +messagingWithGroup: Conversa en grup +invites: Invitacions +unavailable: No disponible +newMessageExists: Tens nous missatges +onlyOneFileCanBeAttached: Només pots adjuntar un fitxer per missatge +normalPassword: Contrasenya amb seguretat mitjana +passwordNotMatched: No hi han coincidències +useOsNativeEmojis: Fes servir els emojis per defecte del Sistema Operatiu +joinOrCreateGroup: Fes que et convidin a un grup o crea el teu propi. +objectStorageBaseUrlDesc: "Es l'adreça URL que serveix com a referència. Específica + la adreça URL del CDN o Proxy si fas servir.\nPer fer servir S3 'https://.s3.amazonaws.com' + i per GCS o serveis semblants 'https://storage.googleapis.com/', etc." +height: Alçada +large: Gran +notificationSetting: Preferències de notificacions +makeActive: Activar +notificationSettingDesc: Tria el tipus de notificació que es veure. +notifyAntenna: Notificar publicacions noves +withFileAntenna: Només notes amb fitxers +enableServiceworker: Activa les notificacions push per al teu navegador +antennaUsersDescription: Escriu un nom d'usuari per línea +antennaInstancesDescription: Escriu la adreça d'un servidor per línea +tags: Etiquetes +antennaSource: Font de la antena +antennaKeywords: Paraules claus a escoltar +antennaExcludeKeywords: Paraules clau a excluir +antennaKeywordsDescription: Separades amb espais per fer una condició AND i amb una + línea nova per fer una condició OR. +caseSensitive: Sensible a majúscules i minúscules +withReplies: Inclou respostes +connectedTo: Aquest(s) compte(s) estan connectats +silenceConfirm: Segur que vols posa en silenci aquest usuari? +unsilence: Desfés posar en silenci +unsilenceConfirm: Segur que vols treure el silenci a aquest usuari? +aboutMisskey: Sobre Calckey +twoStepAuthentication: Autentificació de dos factors +moderator: Moderador +moderation: Moderació +available: Disponible +tapSecurityKey: Escriu la teva clau de seguretat +nUsersMentioned: Esmentat per {n} usuari(s) +securityKey: Clau de seguretat +resetPassword: Restablir contrasenya +describeFile: Afegeix una descripció +enterFileDescription: Entra una descripció +author: Autor +disableAll: Desactiva tots +userSaysSomethingReason: '{name} va dir {reason}' +display: Visualització +channel: Canals +create: Crear +useGlobalSetting: Fes servir els ajusts globals +useGlobalSettingDesc: Si s'activa, es faran servir els ajusts de notificacions del + teu compte. Si es desactiva , es poden fer configuracions individuals. +other: Altres +menu: Menú +addItem: Afegeix un element +divider: Divisor +relays: Relés +addRelay: Afegeix un Relé +inboxUrl: Adreça de la safata d'entrada +addedRelays: Relés afegits +serviceworkerInfo: Ha de estar activat per les notificacions push. +poll: Enquesta +deletedNote: Publicació esborrada +disablePlayer: Tancar el reproductor de vídeo +fileIdOrUrl: ID o adreça URL del fitxer +behavior: Comportament +regenerateLoginTokenDescription: Regenera el token que es fa servir de manera interna + durant l'inici de sessió. Normalment això no és necessari. Si es torna a genera + el token, es tancarà la sessió a tots els dispositius. +setMultipleBySeparatingWithSpace: Separa diferents entrades amb espais. +reportAbuseOf: Informa d'un abús de {name} +sample: Exemple +abuseReports: Informes +reportAbuse: Informe +reporter: Informador +reporterOrigin: Origen informador +forwardReport: Envia l'informe a un servidor remot +abuseReported: El teu informe ha sigut enviat. Moltes gràcies. +reporteeOrigin: Origen de l'informe +send: Enviar +abuseMarkAsResolved: Marcar l'informe com a resolt +visibility: Visibilitat +useCw: Amaga el contingut +enablePlayer: Obre el reproductor de vídeo +yourAccountSuspendedDescription: Aquest compte ha sigut suspès per no seguir els termes + de servei d'aquest servidor o quelcom similar. Contacte amb l'administrador si vols + conèixer la raó amb més detall. Si us plau no facis un compte nou. +invisibleNote: Publicació oculta +enableInfiniteScroll: Carregar més de forma automàtica +fillAbuseReportDescription: Si us plau omple els detalls sobre aquest informe. Si + es sobre una publicació en concret, si us plau, inclou l'adreça URL. +forwardReportIsAnonymous: Com a informador el servidor remot no veure el teu compte, + si no un compte anònim. +openInNewTab: Obrir en una pestanya nova +openInSideView: Obrir a la vista lateral +defaultNavigationBehaviour: Navegació per defecte +editTheseSettingsMayBreakAccount: Si edites aquestes configuracions pots fer mal bé + el teu compte. +userSilenced: Aquest usuari ha sigut silenciat. +instanceTicker: Informació de notes del servidor +waitingFor: Esperant a {x} +random: Aleatori +system: Sistema +switchUi: Interfície d'usuari +createNewClip: Crear un clip nou +unclip: Treure clip +public: Públic +renotesCount: Nombre d'impulsos fets +sentReactionsCount: Nombre de reaccions fetes +receivedReactionsCount: Nombre de reaccions rebudes +pollVotesCount: Nombre de vots fets en enquestes +pollVotedCount: Nombre de vots rebuts en enquestes +yes: Sí +no: No +noCrawle: Rebutjar la indexació dels restrejadors +driveUsage: Espai fet servir al Disk +noCrawleDescription: No permetre que els buscadors guardin la informació de les pàgines + de perfil, notes, Pàgines, etc. +alwaysMarkSensitive: Marcar per defecte com a NSFW +lockedAccountInfo: Si has configurat la visibilitat del compte per "Només seguidors" + les teves notes no seren visibles per a ningú més, inclús si has d'aprovar els teus + seguidors manualment. +disableShowingAnimatedImages: No reproduir les imatges animades +verificationEmailSent: S'ha enviat correu electrònic de verificació. Si us plau segueix + les instruccions per completar la verificació. +notSet: Sense especificar +emailVerified: El correu electrònic s'ha verificat +loadRawImages: Carregar les imatges originals en comptes de mostrar les miniatures +noteFavoritesCount: Nombre de notes afegides a favorits +useSystemFont: Fes servir la font per defecte del sistema +contact: Contacte +clips: Retalls +experimentalFeatures: Característiques experimentals +developer: Desenvolupador +makeExplorableDescription: Si desactives aquesta funció el teu compte no sortirà a + la secció "Explora". +showGapBetweenNotesInTimeline: Mostra un espai entre notes a la línea de temps +makeExplorable: Fes el compte visible a "Explora" +duplicate: Duplicar +left: Esquerra +wide: Ample +narrow: Estret +reloadToApplySetting: Aquesta configuració només sortirà efecte després de recarregar + la pàgina. Vols fer-ho ara? +needReloadToApply: Es requereix recarregar la pàgina perquè això surti efecte. +showTitlebar: Mostrar la barra de títol +onlineUsersCount: Hi han {n} usuaris connectats +nUsers: '{n} Usuaris' +nNotes: '{n} Notes' +sendErrorReports: Enviar informe d'error +clearCache: Netejar memòria cau +switchAccount: Canvia de compte +enabled: Activat +configure: Configurar +noBotProtectionWarning: La protecció contra bots no està configurada. +ads: Publicitat +ratio: Ràtio +global: Global +sent: Enviat +received: Rebut +whatIsNew: Mostra els canvis +usernameInfo: Un nom que identifica el vostre compte d'altres en aquest servidor. + Podeu utilitzar l'alfabet (a~z, A~Z), els dígits (0~9) o el guió baix (_). Els noms + d'usuari no es poden canviar més tard. +breakFollow: Suprimeix el seguidor +makeReactionsPublicDescription: Això farà que la llista de totes les vostres reaccions + passades sigui visible públicament. +hide: Amagar +leaveGroupConfirm: Estàs segur que vols deixar "{name}"? +voteConfirm: Vols confirmar el teu vot per a "{choice}"? +leaveGroup: Sortir del grup +rateLimitExceeded: S'ha excedit el límit proporcionat +cropImage: Retalla la imatge +cropImageAsk: Vols retallar aquesta imatge? +failedToFetchAccountInformation: No s'ha pogut obtenir la informació del compte +driveCapOverrideCaption: Restableix la capacitat per defecte introduint un valor de + 0 o inferior. +type: Tipus +label: Etiqueta +beta: Beta +navbar: Barra de navegació +adminCustomCssWarn: Aquesta configuració només s'ha d'utilitzar si sabeu què fa. La + introducció de valors inadequats pot fer que els clients de TOTS deixin de funcionar + amb normalitat. Assegureu-vos que el vostre CSS funcioni correctament provant-lo + a la configuració de l'usuari. +showUpdates: Mostra una finestra emergent quan Calckey s'actualitzi +recommendedInstances: Servidors recomanats +recommendedInstancesDescription: Servidors recomanats separats per salts de línia + que apareixen a la línia de temps recomanada. NO afegiu `https://`, NOMÉS el domini. +caption: Descripció Automàtica +splash: Pantalla de Benvinguda +swipeOnDesktop: Permet lliscar a l'estil del mòbil a l'escriptori +updateAvailable: Pot ser que hi hagi una actualització disponible! +logoImageUrl: URL de la imatge del logotip +showAdminUpdates: Indica que hi ha disponible una versió nova de Calckey (només per + a administradors) +replayTutorial: Repetició del tutorial +migration: Migració +moveAccountDescription: Aquest procés és irreversible. Assegureu-vos que hàgiu configurat + un àlies per a aquest compte al vostre compte nou abans de moure's. Introduïu l'etiqueta + del compte amb el format @persona@servidor.com +moveToLabel: 'Compte al qual us moveu:' +moveAccount: Mou el compte! +moveFromDescription: Això establirà un àlies del vostre compte antic perquè pugueu + passar d'aquest compte a aquest actual. Feu això ABANS de moure's del vostre compte + anterior. Introduïu l'etiqueta del compte amb el format @persona@servidor.com +_sensitiveMediaDetection: + description: Redueix l'esforç de moderació del servidor mitjançant el reconeixement + automàtic dels mitjans NSFW mitjançant l'aprenentatge automàtic. Això augmentarà + lleugerament la càrrega al servidor. + setSensitiveFlagAutomaticallyDescription: Els resultats de la detecció interna es + conservaran encara que aquesta opció estigui desactivada. + analyzeVideos: Activa l'anàlisi de vídeos + analyzeVideosDescription: Analitza vídeos a més d'imatges. Això augmentarà lleugerament + la càrrega al servidor. + setSensitiveFlagAutomatically: Marca com a NSFW + sensitivity: Sensibilitat de detecció + sensitivityDescription: La reducció de la sensibilitat comportarà menys deteccions + errònies (falsos positius), mentre que augmentar-la comportarà menys deteccions + falses (falsos negatius). +_emailUnavailable: + used: Aquesta adreça de correu electrònic ja s'està utilitzant + format: El format d'aquesta adreça de correu electrònic no és vàlid + disposable: Les adreces de correu electrònic d'un sol ús no es poden utilitzar + mx: Aquest servidor de correu electrònic no és vàlid + smtp: Aquest servidor de correu electrònic no respon +_ffVisibility: + public: Públic + followers: Visible només per als seguidors + private: Privat +_signup: + emailAddressInfo: Introduïu la vostra adreça de correu electrònic. No es farà públic. + almostThere: Gairebé està + emailSent: S'ha enviat un correu electrònic de confirmació a la vostra adreça electrònica + ({email}). Feu clic a l'enllaç inclòs per completar la creació del compte. +_accountDelete: + started: S'ha iniciat la supressió. + accountDelete: Suprimeix el compte + mayTakeTime: Com que la supressió del compte és un procés que requereix molts recursos, + pot ser que trigui algun temps a completar-se en funció de la quantitat de contingut + que hàgiu creat i de quants fitxers hàgiu penjat. + sendEmail: Un cop s'hagi completat la supressió del compte, s'enviarà un correu + electrònic a l'adreça de correu electrònic registrada en aquest compte. + inProgress: La supressió del compte està en curs + requestAccountDelete: Sol·licitar la supressió del compte +_ad: + back: Enrera + reduceFrequencyOfThisAd: Mostrar aquest anunci menys +_gallery: + my: La meva Galeria + liked: Notes que m'han agradat + unlike: Elimina m'agrada + like: M'agrada +_forgotPassword: + contactAdmin: Aquest servidor no admet l'ús d'adreces de correu electrònic; poseu-vos + en contacte amb l'administrador del servidor per restablir la contrasenya. + ifNoEmail: Si no heu utilitzat cap correu electrònic durant el registre, poseu-vos + en contacte amb l'administrador del servidor. + enterEmail: Introduïu l'adreça de correu electrònic que heu utilitzat per registrar-vos. + A continuació, se li enviarà un enllaç amb el qual podeu restablir la vostra contrasenya. +_plugin: + install: Instal·leu connectors + installWarn: Si us plau, no instal·leu connectors que no siguin fiables. + manage: Gestionar els connectors +_preferencesBackups: + saveNew: Desa una còpia de seguretat nova + apply: Aplicar a aquest dispositiu + loadFile: Carrega des del fitxer + save: Desa els canvis + nameAlreadyExists: Ja existeix una còpia de seguretat anomenada "{name}". Introduïu + un nom diferent. + renameConfirm: Canviar el nom d'aquesta còpia de seguretat de "{old}" a "{new}"? + noBackups: No existeixen còpies de seguretat. Podeu fer una còpia de seguretat de + la configuració del vostre client en aquest servidor utilitzant "Crea una còpia + de seguretat nova". + deleteConfirm: Vols suprimir la còpia de seguretat anomanada {name}? + updatedAt: 'Actualitzat el: {time} {date}' + createdAt: 'Creat el: {time} {date}' + cannotLoad: No s'ha pogut carregar + inputName: Introduïu un nom per a aquesta còpia de seguretat + saveConfirm: Deseu la còpia de seguretat com a {name}? + invalidFile: Format de fitxer no vàlid + applyConfirm: Realment voleu aplicar la còpia de seguretat "{name}" a aquest dispositiu? + La configuració existent d'aquest dispositiu es sobreescriurà. + list: Còpies de seguretat creades + cannotSave: S'ha produït un error en desar +_registry: + domain: Domini + createKey: Crea la clau + scope: Àmbit + key: Clau + keys: Claus +silenced: Silenciat +objectStorageUseSSL: Fes servir SSL +yourAccountSuspendedTitle: Aquest compte està suspès +i18nInfo: Calckey està sent traduït a diversos idiomes per voluntaris. Pots ajudar + {link}. +manageAccessTokens: Administrar tokens d'accés +accountInfo: Informació del compte +pageLikedCount: Nombre de m'agrada rebuts a Pàgines +center: Centre +registry: Registre +closeAccount: Tancar el compte +currentVersion: Versió actual +latestVersion: Versió més nova +newVersionOfClientAvailable: Aquesta és la versió del client més nova disponible. +usageAmount: Ús +capacity: Capacitat +editCode: Editar codi +apply: Aplicar +repliesCount: Nombre de contestacions fetes +repliedCount: Nombre de respostes rebudes +renotedCount: Nombre d'impulsos rebuts +followingCount: Nombre de comptes seguits +followersCount: Nombre de seguidors +goBack: Enrera +quitFullView: Sortí de la vista complerta +addDescription: Afegeix una descripció +notSpecifiedMentionWarning: Aquesta publicació conté mencions a usuaris no inclosos + com a destinataris +info: Sobre +hideOnlineStatus: Amagar l'estat de conexió +onlineStatus: Estat de conexió +online: En línea +offline: Desconectat +notRecommended: No recomanat +botProtection: Protecció contra Bots +instanceBlocking: Gestió de la federació +selectAccount: Seleccionar un compte +disabled: Desactivat +quickAction: Accions ràpides +administration: Administració +switch: Canviar +gallery: Galeria +popularPosts: Pàgines populars +shareWithNote: Comparteix amb una publicació +expiration: Data límit +memo: Recordatori +priority: Prioritat +high: Alta +middle: Mitjana +low: Baixa +emailNotConfiguredWarning: L'adreça de correu electrònic no està definida. +instanceSecurity: Seguretat del servidor +privateMode: Mode Privat +allowedInstances: Servidors a la llista blanca +allowedInstancesDescription: Llista blanca de Hosts amb qui federar, cadascún separat + per una línia nova (només s'aplica en mode privat). +previewNoteText: Mostra la vista prèvia +customCss: CSS personalitzat +recommended: Recomanat +seperateRenoteQuote: Botons d'impuls i de citació separats +searchResult: Resultats de la cerca +hashtags: Etiquetes +troubleshooting: Resolució de problemes +learnMore: Més informació +misskeyUpdated: Calckey s'ha actualitzat! +translate: Tradueix +translatedFrom: Traduït per {x} +aiChanMode: Ai-chan a la interfície d'usuari clàssica +keepCw: Mantenir els avisos de contingut +pubSub: Comptes Pub/Sub +lastCommunication: Última comunicació +breakFollowConfirm: Confirmes que vols eliminar el seguidor? +itsOn: Activat +itsOff: Desactivat +emailRequiredForSignup: Requereix una adreça de correu electrònic per registrar-te +unread: Sense llegir +controlPanel: Tauler de control +manageAccounts: Gestionar comptes +makeReactionsPublic: Estableix l'historial de reaccions com a públic +classic: Centrat +muteThread: Silenciar el fil +ffVisibility: Visibilitat dels Seguiments/Seguidors +incorrectPassword: Contrasenya incorrecta. +clickToFinishEmailVerification: Feu clic a [{ok}] per completar la verificació del + correu electrònic. +overridedDeviceKind: Tipus de dispositiu +smartphone: Telèfon intel·ligent +tablet: Tauleta +auto: Automàtic +recentNHours: Últimes {n} hores +recentNDays: Últims {n} dies +noEmailServerWarning: El servidor de correu electrònic no està configurat. +check: Comprovar +fast: Ràpida +sensitiveMediaDetection: Detecció de mitjans NSFW +remoteOnly: Només remotes +failedToUpload: S'ha produït un error en la càrrega +cannotUploadBecauseInappropriate: Aquest fitxer no s'ha pogut carregar perquè s'han + detectat parts d'aquest com a potencialment NSFW. +cannotUploadBecauseNoFreeSpace: La pujada ha fallat a causa de la manca d'espai al + Disc. +enableAutoSensitive: Marcatge automàtic NSFW +moveTo: Mou el compte actual al compte nou +customKaTeXMacro: Macros KaTeX personalitzats +_aboutMisskey: + contributors: Col·laboradors principals + allContributors: Tots els col·laboradors + donate: Fes una donació a Calckey + source: Codi font + translation: Tradueix Calckey + about: Calckey és una bifurcació de Misskey feta per ThatOneCalculator, que està + en desenvolupament des del 2022. + morePatrons: També agraïm el suport de molts altres ajudants que no figuren aquí. + Gràcies! 🥰 + patrons: Mecenes de Calckey +unknown: Desconegut +pageLikesCount: Nombre de pàgines amb M'agrada +youAreRunningUpToDateClient: Estás fent servir la versió del client més nova. +unlikeConfirm: Vols treure el teu m'agrada? +fullView: Vista complerta +desktop: Escritori +notesCount: Nombre de notes +confirmToUnclipAlreadyClippedNote: Aquesta publicació ja és al clip "{name}". La vols + treure d'aquest clip? +driveFilesCount: Nombre de fitxers al Disk +silencedInstances: Servidors silenciats +silenceThisInstance: Silencia el servidor +silencedInstancesDescription: Llista amb els noms dels servidors que vols silenciar. + Els comptes als servidors silenciats seran tractades com "Silenciades", només poden + fer sol·licituds de seguiments, i no poden mencionar comptes locals si no les segueixen. + Això no afectarà els servidors bloquejats. +objectStorageEndpointDesc: Deixa això buit si fas servir AWS, S3, d'una altre manera + específica un "endpoint" com a '' o ':', depend del proveïdor + que facis servir. +objectStorageRegionDesc: Especifica una regió com a 'xx-east-1'. Si el teu proveïdor + no distingeix entre regions, deixa això en buit o pots escriure 'us-east-1'. +userPagePinTip: Pots mostrar publicacions aquí escollint "Fixar al perfil" dintre + del menú de cada publicació. +userInfo: Informació d'usuari +hideOnlineStatusDescription: Amagant el teu estat en línea redueix la comoditat d'ús + d'algunes característiques com ara la recerca. +active: Actiu +accounts: Comptes +postToGallery: Crea una publicació nova a la galeria +secureMode: Mode segur (Recuperació Autoritzada) +customCssWarn: Aquesta configuració només s'ha d'utilitzar si sabeu què fa. La introducció + de valors indeguts pot provocar que el client deixi de funcionar amb normalitat. +squareAvatars: Mostra avatars quadrats +secureModeInfo: Quan es faci una solicitut d'altres servidors no contestar sense una + prova. +privateModeInfo: Quan està activat, només els servidors a la llista blanca es poden + federar amb el vostre servidor. Totes les publicacions s'amagaran al públic. +useBlurEffect: Utilitzeu efectes de desenfocament a la interfície d'usuari +accountDeletionInProgress: La supressió del compte està en curs +unmuteThread: Desfés el silenci al fil +deleteAccountConfirm: Això suprimirà el vostre compte de manera irreversible. Procedir? +requireAdminForView: Heu d'iniciar sessió amb un compte d'administrador per veure-ho. +enableAutoSensitiveDescription: Permet la detecció i el marcatge automàtics dels mitjans + NSFW mitjançant Machine Learning sempre que sigui possible. Fins i tot si aquesta + opció està desactivada, és possible que estigui habilitada a tot el servidor. +localOnly: Només local +customKaTeXMacroDescription: "Configura macros per escriure expressions matemàtiques + fàcilment! La notació s'ajusta a les definicions de l'ordre LaTeX i s'escriu com + a \\newcommand{\\ name}{content} o \\newcommand{\\name}[nombre d'arguments]{content}. + Per exemple, \\newcommand{\\add}[2]{#1 + #2} ampliarà \\add{3}{foo} a 3 + foo. Els + claudàtors que envolten el nom de la macro es poden canviar per claudàtors rodons + o quadrats. Això afecta els claudàtors utilitzats per als arguments. Es pot definir + una (i només una) macro per línia, i no podeu trencar la línia al mig de la definició. + Les línies no vàlides simplement s'ignoren. Només s'admeten funcions de substitució + de cadenes senzilles; La sintaxi avançada, com ara la ramificació condicional, no + es pot utilitzar aquí." +objectStorageRegion: Regió +objectStoragePrefix: Prefix +objectStoragePrefixDesc: Els fitxers es guardaran dins de carpetes amb aquest prefix. +objectStorageEndpoint: Extrem +newNoteRecived: Hi han notes noves +sounds: Sons +listen: Escoltar +none: Res +showInPage: Mostrar a la página +popout: Apareixa +volume: Volum +objectStorageUseSSLDesc: Desactiva això si no fas servir HTTPS per les connexions + API +objectStorageUseProxy: Connectar-se mitjançant un Proxy +objectStorageUseProxyDesc: Desactiva això si no faràs servir un servidor Proxy per + conexions amb l'API +objectStorageSetPublicRead: Fixar com a "public-read" al pujar +serverLogs: Registres del servidor +deleteAll: Esborrar tot +showFixedPostForm: Mostrar el formulari de notes al principi de la línia de temps +unableToProcess: Aquesta operació no es pot acabar +recentUsed: Fet servir fa poc +install: Instal·lar +masterVolume: Volum principal +uninstall: Desinstal·lar +installedApps: Aplicacions autoritzades +nothing: No hi a res per veure +installedDate: Data d'autorització +details: Detalls +chooseEmoji: Selecciona un emoji +removeAllFollowingDescription: Fent això deixes de seguir tots els comptes de {host}. + Si us plau fes servir això sí, per exemple, el servidor deixa d'existir. +userSuspended: Aquest usuari ha sigut suspès. +lastUsedDate: Data d'últim ús +state: Estat +sort: Ordenar +ascendingOrder: Ascendent +descendingOrder: Descendent +scratchpad: Bloc de notes +scratchpadDescription: El bloc de notes proporciona un entorn per experiments amb + AiScript. Pots escriure, executar i comprovar els resultats interactuant amb Calckey. +output: Sortida +script: Script +disablePagesScript: Desactivar AiScript a les pàgines +updateRemoteUser: Actualitzar la informació de l'usuari remot +deleteAllFiles: Esborrar tots els fitxers +deleteAllFilesConfirm: Segur que vols esborrar tots els fitxers? +removeAllFollowing: Deixar de seguir a tots els usuaris que segueixes +accentColor: Color principal +textColor: Color del text +value: Valor +sendErrorReportsDescription: "Quan està activat, quan es produeixi un problema la + informació detallada d'errors es compartirà amb Calckey, ajudant a millorar la qualitat + de Calckey.\nAixò inclourà informació com la versió del vostre sistema operatiu, + quin navegador utilitzeu, la vostra activitat a Calckey, etc." +myTheme: El meu tema +backgroundColor: Color de fons +saveAs: Desa com... +advanced: Avançat +invalidValue: Valor invàlid. +createdAt: Data de creació +updatedAt: Data d'actualització +saveConfirm: Desa canvis? +deleteConfirm: De veritat ho vols esborrar? +receiveAnnouncementFromInstance: Rep notificacions d'aquest servidor +emailNotification: Notificacions per correu electrònic +publish: Publicar +inChannelSearch: Buscar al canal +useReactionPickerForContextMenu: Obrir el selector de reaccions al fer click esquerra +typingUsers: L'{users} està escrivint +oneDay: Un dia +instanceDefaultLightTheme: Tema de llum predeterminat per a tot el servidor +instanceDefaultDarkTheme: Tema fosc predeterminat per tot el servidor +instanceDefaultThemeDescription: Introduïu el codi del tema en format d'objecte. +mutePeriod: Durada del silenci +indefinitely: Permanentment +tenMinutes: 10 minuts +oneHour: Una hora +oneWeek: Una setmana +reflectMayTakeTime: Pot trigar una mica a reflectir-se. +thereIsUnresolvedAbuseReportWarning: Hi ha informes sense resoldre. +driveCapOverrideLabel: Canvieu la capacitat del disc per a aquest usuari +isSystemAccount: Aquest compte és creat i operat automàticament pel sistema. Si us + plau, no modereu, editeu, suprimiu o modifiqueu aquest compte de cap forma, o podria + trencar el vostre servidor. +typeToConfirm: Introduïu {x} per confirmar +deleteAccount: Suprimeix el compte +document: Documentació +sendPushNotificationReadMessage: Suprimeix les notificacions push un cop s'hagin llegit + les notificacions o missatges rellevants +sendPushNotificationReadMessageCaption: Es mostrarà una notificació amb el text "{emptyPushNotificationMessage}" + durant un breu temps. Això pot augmentar l'ús de la bateria del vostre dispositiu, + si escau. +showAds: Mostrar publicitat +enterSendsMessage: Pren retorn al formulari del missatge per enviar (quant no s'activa + es Ctrl + Return) +customMOTD: MOTD personalitzat (missatges de la pantalla de benvinguda) +customMOTDDescription: Missatges personalitzats per al MOTD (pantalla de benvinguda) + separats per salts de línia, es mostraran aleatòriament cada vegada que un usuari + carrega/recarrega la pàgina. +customSplashIcons: Icones personalitzades de la pantalla de benvinguda (urls) +customSplashIconsDescription: Les URLS de les icones personalitzades a la pantalla + de benvinguda separades per salts de línia. Es mostraran aleatòriament cada vegada + que un usuari carrega/recarrega la pàgina. Si us plau, assegureu-vos que les imatges + estiguin en una URL estàtica, preferiblement amb imatges amb la de 192 x 192. +moveFrom: Mou a aquest compte des d'un compte anterior +moveFromLabel: 'Compte des del qual us moveu:' +migrationConfirm: "Esteu absolutament segur que voleu migrar el vostre compte a {account}? + Un cop ho feu, no podreu revertir-ho i no podreu tornar a utilitzar el vostre compte + amb normalitat.\nA més, assegureu-vos d'haver configurat aquest compte actual com + el compte del qual us moveu." +defaultReaction: Reacció d'emoji predeterminada per a notes sortints i entrants +enableCustomKaTeXMacro: Activa les macros KaTeX personalitzades +noteId: ID de la publicació +_nsfw: + respect: Amaga els mitjans NSFW + ignore: No amagueu els mitjans NSFW + force: Amaga tots els mitjans +inUse: Utilitzat +ffVisibilityDescription: Et permet configurar qui pot veure a qui segueixes i qui + et segueix. +continueThread: Continuar el fil +reverse: Revés +objectStorageBucket: Cubell +objectStorageBucketDesc: Si us plau específica el nom del cubell que faràs servir + al teu proveïdor. +clip: Retall +createNew: Crear una nova +optional: Opcional +jumpToSpecifiedDate: Vés a una data concreta +showingPastTimeline: Ara es mostra un línea de temps antiga +clear: Netejar +markAllAsRead: Marcar tot com a llegit +recentPosts: Pàgines recents +noMaintainerInformationWarning: La informació de l'administrador no està configurada. +resolved: Resolt +unresolved: Sense resoldre +filter: Filtre +slow: Lenta +useDrawerReactionPickerForMobile: Mostra el selector de reaccions com a calaix al + mòbil +welcomeBackWithName: Benvingut de nou, {name} +showLocalPosts: 'Mostra les notes locals a:' +homeTimeline: Línea de temps Inicial +socialTimeline: Línea de temps Social +themeColor: Color del Teletip del servidor +size: Mida +numberOfColumn: Nombre de columnes +numberOfPageCache: Nombre de pàgines emmagatzemades a la memòria cau +numberOfPageCacheDescription: L'augment d'aquest nombre millorarà la comoditat dels + usuaris, però provocarà més càrrega del servidor i utilitzarà més memòria. +logoutConfirm: Vols tancar la sessió? +lastActiveDate: Data d'últim ús +statusbar: Barra d'estat +pleaseSelect: Selecciona una opció +colored: Color +refreshInterval: "Interval d'actualització " +speed: Velocitat +cannotUploadBecauseExceedsFileSizeLimit: Aquest fitxer no s'ha pogut carregar perquè + supera la mida màxima permesa. +activeEmailValidationDescription: Permet una validació més estricta de les adreces + de correu electrònic, que inclou la comprovació d'adreces d'un sol ús i si realment + es pot comunicar amb elles. Quan no està marcat, només es valida el format del correu + electrònic. +shuffle: Barrejar +account: Compte +move: Moure +pushNotification: Notificacions push +subscribePushNotification: Activar les notificacions push +unsubscribePushNotification: Desactivar les notificacions push +pushNotificationAlreadySubscribed: Les notificacions push ja estan activades +pushNotificationNotSupported: El vostre navegador o servidor no admet notificacions + push +license: Llicència +indexPosts: Índex de notes +indexFrom: Índex a partir de l'ID de Publicacions +indexFromDescription: Deixeu en blanc per indexar cada publicació +indexNotice: Ara indexant. Això probablement trigarà una estona, si us plau, no reinicieu + el servidor durant almenys una hora. +_instanceTicker: + none: No mostrar mai + remote: Mostra per a usuaris remots + always: Mostra sempre +_serverDisconnectedBehavior: + nothing: No fer res + quiet: Mostra un avís discret + reload: Torna a carregar automàticament + dialog: Mostra el diàleg d'avís +_channel: + create: Crea un canal + edit: Edita el canal + setBanner: Establir bàner + removeBanner: Suprimeix el bàner + featured: Tendència + owned: Propietari + usersCount: '{n} Participants' + following: Seguit per + notesCount: '{n} Notes' + nameAndDescription: Nom i descripció + nameOnly: Només nom +_instanceMute: + instanceMuteDescription: Això silenciara les publicacions o els impulsos dels servidors + indicats, incloses les dels usuaris que responguin a un usuari des d'un servidor + silenciat. + title: Amaga les publicacions dels servidors a la llista. + instanceMuteDescription2: Separar amb noves línies + heading: Llista de servidors que cal silenciar +_ago: + future: Futur + justNow: Ara mateix + minutesAgo: Fa {n}m + hoursAgo: Fa {n}h + daysAgo: Fa {n}d + secondsAgo: Fa {n}s + weeksAgo: Fa {n}set + monthsAgo: Fa {n}me + yearsAgo: Fa {n}a +_time: + second: Segon(s) + minute: Minut(s) + hour: Hora(s) + day: Dia(s) +_tutorial: + step5_4: La línea de temps Local {icon} és on pots veure les publicacions de tots + els altres usuaris d'aquest servidor. + step5_2: El teu servidor té activades {timelines} diferents. + step5_3: La línea de temps d'inici {icon} es on pots veure les publicacions dels + comptes que segueixes. + step5_6: La línia de temps de Recomanats {icon} és on pots veure les publicacions + dels servidors que recomanen els administradors. + step5_7: La línia de temps Global {icon} és on pots veure les publicacions de tots + els servidors connectats. + step6_1: Aleshores, què és aquest lloc? + step6_4: Ara ves, explora i diverteix-te! + step1_2: Anem a fer la configuració. Estaràs en funcionament en un tres i no res! + title: Com utilitzar Calckey + step1_1: Benvingut! + step2_1: En primer lloc, empleneu el vostre perfil. + step4_1: Anem a treure't allà fora. + step5_5: La línea de temps Social {icon} és una combinació de les línies de temps + d'Inici i Local. + step6_3: Cada servidor funciona de diferents maneres, i no tots els servidors executen + Calckey. Aquest sí que sí! És una mica complicat, però ho aconseguiràs en poc + temps. + step2_2: Proporcionar informació sobre qui sou facilitarà que altres puguin saber + si volen veure les vostres notes o seguir-vos. + step3_1: Ara toca seguir a algunes persones! + step3_2: "Les teves líneas de temps d'inici i social es basen en qui seguiu, així + que proveu de seguir un parell de comptes per començar.\nFeu clic al cercle més + situat a la part superior dreta d'un perfil per seguir-los." + step4_2: A algunes persones els agrada fer una publicació de {introduction} o un + senzill "Hola món!" + step5_1: Línies de temps, línies de temps a tot arreu! + step6_2: Bé, no només t'has unit a Calckey. T'has unit a un portal al Fediverse, + una xarxa interconnectada de milers de servidors. +_permissions: + "read:account": Consulta la informació del teu compte + "read:blocks": Consulta la teva llista d'usuaris bloquejats + "write:account": Editar la informació del compte + "read:drive": Accedir als fitxers i carpetes del Disc + "read:messaging": Consulta els teus xats + "write:following": Segueix o deixa de seguir altres comptes + "write:mutes": Editar la teva llista d'usuaris silenciats + "read:notifications": Consulta les teves notificacions + "write:notifications": Gestiona les teves notificacions + "write:user-groups": Editar o suprimir grups d'usuaris + "write:blocks": Editar la llista d'usuaris bloquejats + "write:notes": Redactar o suprimir notes + "write:channels": Editar els teus canals + "read:gallery-likes": Consulta la llista de notes que t'agraden de la galeria + "write:drive": Editar o suprimir fitxers i carpetes del Disc + "read:favorites": Consulta la teva llista d'adreces d'interès + "write:favorites": Editeu la teva llista d'adreces d'interès + "write:messaging": Escriu o suprimeix missatges de xat + "read:mutes": Consulta la teva llista d'usuaris silenciats + "write:reactions": Edita les teves reaccions + "write:votes": Vota en una enquesta + "write:pages": Edita o suprimeix la teva pàgina + "write:page-likes": Editar les pàgines que t'agraden + "read:user-groups": Consulta els teus grups d'usuaris + "read:channels": Consulta els teus canals + "read:gallery": Consulta la teva galeria + "write:gallery": Edita la teva galeria + "write:gallery-likes": Edita la llista de notes que t'agraden de la galeria + "read:following": Consulta la informació sobre a qui segueixes + "read:reactions": Consulta les teves reaccions + "read:pages": Consulta la teva pàgina + "read:page-likes": Veure les pàgines que t'agraden +_poll: + noOnlyOneChoice: Calen almenys dues opcions + canMultipleVote: Permet seleccionar diverses opcions + expiration: Finalitzar l'enquesta + after: Acaba després... + duration: Durada + votesCount: '{n} vots' + totalVotes: '{n} vots en total' + showResult: Veure resultats + choiceN: Opció {n} + noMore: No es poden afegir més opcions + infinite: Mai + at: Acaba el... + deadlineDate: Data de finalització + deadlineTime: Temps + remainingHours: Queden {h} hora(s) {m} minut(s) + remainingDays: Queden {d} dia(s) {h} hores + remainingMinutes: Queden {m} minut(s) {s} segons + voted: Votat + closed: S'ha acabat + remainingSeconds: Queden {s} segons + vote: Vota +_postForm: + _placeholders: + d: Què vols dir? + e: Comença a escriure... + f: Esperant que escriguis... + b: Què passa al teu voltant? + c: En què penses? + a: Què et portes entre mans? + quotePlaceholder: Cita aquesta publicació... + replyPlaceholder: Respon a aquesta publicació... + channelPlaceholder: Publica en un canal... +_charts: + federation: Federació + usersIncDec: Diferència en el nombre d'usuaris + apRequest: Sol·licituds + usersTotal: Nombre total d'usuaris + activeUsers: Usuaris actius + notesIncDec: Diferència en el nombre de notes + localNotesIncDec: Diferència en el nombre de notes locals + remoteNotesIncDec: Diferència en el nombre de notes remotes + notesTotal: Nombre total de notes + filesIncDec: Diferència en el nombre de fitxers + filesTotal: Nombre total de fitxers + storageUsageTotal: Ús total d'emmagatzematge + storageUsageIncDec: Diferència en l'ús d'emmagatzematge +_instanceCharts: + requests: Sol·licituds + users: Diferència en el nombre d'usuaris + usersTotal: Nombre acumulat d'usuaris + notes: Diferència en el nombre de notes + ffTotal: Nombre acumulat d'usuaris que segueixes/et segueixen + cacheSize: Diferència en la mida de la memòria cau + cacheSizeTotal: Mida total acumulada de la memòria cau + files: Diferència en el nombre de fitxers + filesTotal: Nombre acumulat de fitxers + notesTotal: Nombre acumulat de notes + ff: "Diferència en el nombre d'usuaris que segueixes/que et segueixen " +_timelines: + home: Inici + local: Local + recommended: Recomanat + social: Social + global: Global +_menuDisplay: + hide: Amagar + top: Superior + sideFull: Costat + sideIcon: Costat (Icones) +_wordMute: + muteWords: Paraules silenciades + muteWordsDescription: Separeu amb espais per a una condició AND o amb salts de línia + per a una condició OR. + soft: Suau + hard: Dur + muteWordsDescription2: Envolta les paraules clau amb barres inclinades per utilitzar + expressions regulars. + softDescription: Amaga les notes que compleixen les condicions establertes de la + línia de temps. + hardDescription: Evita que les notes que compleixin les condicions establertes s'afegeixin + a la línia de temps. A més, aquestes notes no s'afegiran a la línia de temps encara + que es modifiquin les condicions. + mutedNotes: Notes silenciades +_auth: + shareAccessAsk: Estàs segur que vols autoritzar aquesta aplicació per accedir al + teu compte? + shareAccess: Vols autoritzar "{name}" per accedir a aquest compte? + permissionAsk: Aquesta aplicació sol·licita els següents permisos + callback: Tornant a l'aplicació + denied: Accés denegat + pleaseGoBack: Si us plau, torneu a l'aplicació + copyAsk: Posa el següent codi d'autorització a l'aplicació +_weekday: + wednesday: Dimecres + saturday: Dissabte + monday: Dilluns + tuesday: Dimarts + friday: Divendres + sunday: Diumenge + thursday: Dijous +_messaging: + groups: Grups + dms: Privat +_antennaSources: + all: Totes les notes + homeTimeline: Publicacions dels usuaris que segueixes + users: Notes d'usuaris concrets + userGroup: Notes d'usuaris d'un grup determinat + userList: Notes d'una llista determinada d'usuaris + instances: Publicacions de tots els usuaris d'un servidor +_relayStatus: + requesting: Pendent + accepted: Acceptat + rejected: Rebutjat +deleted: Eliminat +editNote: Edita la nota +edited: 'Editat a {date} {time}' +findOtherInstance: Cercar un altre servidor +signupsDisabled: Actualment, les inscripcions en aquest servidor estan desactivades, + però sempre podeu registrar-vos en un altre servidor. Si teniu un codi d'invitació + per a aquest servidor, introduïu-lo a continuació. +userSaysSomethingReasonQuote: '{name} ha citat una publicació que conté {reason}' +userSaysSomethingReasonReply: '{name} ha respost a una publicació que conté {reason}' +userSaysSomethingReasonRenote: '{name} ha impulsat una publicació que conté {reason}' +highlightCw: Ressalta el contingut de les publicacions advertides +apps: Aplicacions +sendModMail: Envia avís de moderació +preventAiLearning: Evita l'indexació dels bots +preventAiLearningDescription: Sol·liciteu que els models de llenguatge d'IA de tercers + no estudiïn el contingut que pengeu, com ara publicacions i imatges. +pwa: Instal·lar PWA +_experiments: + alpha: Alfa + beta: Beta + release: Publicà + enablePostEditing: Activà l'edició de publicacions + title: Experiments + postEditingCaption: Mostra l'opció perquè els usuaris editin les seves publicacions + mitjançant el menú d'opcions de publicació, i permet rebre publicacions editades + d'altres servidors. + enablePostImports: Activar l'importació de publicacions + postImportsCaption: Permet els usuaris importar publicacions desde comptes a Calckey, + Misskey, Mastodon, Akkoma i Pleroma. Pot fer que el servidor vagi més lent durant + la càrrega si tens un coll d'ampolla a la cua. +noGraze: Si us plau, desactiva l'extensió del navegador "Graze for Mastodon", ja que + interfereix amb Calckey. +accessibility: Accessibilitat +jumpToReply: Vés a la resposta +newer: Més nou +older: Més antic +silencedWarning: S'està mostrant aquesta pàgina per què aquest usuari és d'un servidor + que l'administrador a silenciat, així que pot ser spam. +jumpToPrevious: Vés a l'anterior +cw: Avís de contingut +antennasDesc: "Les antenes mostren publicacions noves que coincideixen amb els criteris + establerts!\nS'hi pot accedir des de la pàgina de línies de temps." +expandOnNoteClick: Obre la publicació amb un clic +expandOnNoteClickDesc: Si està desactivat, encara pots obrir les publicacions al menú + del botó dret o fent clic a la marca de temps. +channelFederationWarn: Els canals encara no es federen amb altres servidors +searchPlaceholder: Cerca a Calckey +listsDesc: Les llistes et permeten crear línies de temps amb usuaris específics. Es + pot accedir des de la pàgina de línies de temps. +clipsDesc: Els clips són com marcadors categoritzats que es poden compartir. Podeu + crear clips des del menú de publicacions individuals. +selectChannel: Selecciona un canal +isLocked: Aquest compte té les següents aprovacions +isPatron: Mecenes de Calkey +isBot: Aquest compte és un bot +isModerator: Moderador +isAdmin: Administrador +_filters: + fromDomain: Des del domini + notesBefore: Publicacions anteriors + notesAfter: Publicacions posteriors + followingOnly: Només seguint + followersOnly: Només seguidors + withFile: Amb arxiu + fromUser: De l'usuari +image: Imatge +video: Vídeo +audio: Àudio +_dialog: + charactersExceeded: "S'han superat el màxim de caràcters! Actual: {current}/Límit: + {max}" + charactersBelow: 'No hi ha caràcters suficients! Corrent: {current}/Limit: {min}' +removeReaction: Elimina la teva reacció +reactionPickerSkinTone: To de pell d'emoji preferit diff --git a/fe_calckey/frontend/locales/cs-CZ.yml b/fe_calckey/frontend/locales/cs-CZ.yml new file mode 100644 index 0000000..e6394f3 --- /dev/null +++ b/fe_calckey/frontend/locales/cs-CZ.yml @@ -0,0 +1,1009 @@ +_lang_: "Čeština" +headlineMisskey: "Síť propojená poznámkami" +introMisskey: "Vítejte! Calckey je otevřený a decentralizovaný microblogový servis.\n\ + \"Poznámkami\" můžete sdílet co se zrovna děje se všemi ve Vašem okolí. \U0001F4E1\ + \nPomocí \"reakcí\" můžete sdílet své názory a pocity na ostatní poznámky. \U0001F44D\ + \nPojďte objevovat nový svět! \U0001F680" +monthAndDay: "{day}. {month}." +search: "Vyhledávání" +notifications: "Oznámení" +username: "Uživatelské jméno" +password: "Heslo" +forgotPassword: "Zapomenuté heslo" +fetchingAsApObject: "Načítám data z Fediversu" +ok: "Potvrdit" +gotIt: "Rozumím!" +cancel: "Zrušit" +enterUsername: "Zadej uživatelské jméno" +renotedBy: "{user} přeposla/a" +noNotes: "Žádné poznámky" +noNotifications: "Žádná oznámení" +instance: "Instance" +settings: "Nastavení" +basicSettings: "Obecná nastavení" +otherSettings: "Rozšířená nastavení" +openInWindow: "Otevřít v novém okně" +profile: "Váš profil" +timeline: "Časová osa" +noAccountDescription: "Tento uživatel zatím nenapsal svou biografii." +login: "Přihlásit se" +loggingIn: "Probíhá přihlašování" +logout: "Odhlásit" +signup: "Registrace" +uploading: "Nahrávám" +save: "Uložit" +users: "Uživatelé" +addUser: "Přidat uživatele" +favorite: "Oblíbené" +favorites: "Oblíbené" +unfavorite: "Odebrat z oblízených" +favorited: "Přidáno do oblíbených" +alreadyFavorited: "Už je mezi oblíbenými" +cantFavorite: "Nepodařilo se přidat mezi oblíbené." +pin: "Připnout" +unpin: "Odepnout" +copyContent: "Zkopírovat obsah" +copyLink: "Kopírovat odkaz" +delete: "Smazat" +deleteAndEdit: "Smazat a upravit" +deleteAndEditConfirm: "Jste si jistí že chcete smazat tuto poznámku a editovat ji?\ + \ Ztratíte tím všechny reakce, sdílení a odpovědi na ni." +addToList: "Přidat do seznamu" +sendMessage: "Odeslat zprávu" +copyUsername: "Kopírovat uživatelské jméno" +searchUser: "Vyhledat uživatele" +reply: "Odpovědět" +loadMore: "Zobrazit více" +showMore: "Zobrazit více" +showLess: "Zavřít" +youGotNewFollower: "Máte nového následovníka" +receiveFollowRequest: "Žádost o sledování přijata" +followRequestAccepted: "Žádost o sledování přijata" +mention: "Zmínění" +mentions: "Zmínění" +importAndExport: "Import a export" +import: "Importovat" +export: "Exportovat" +files: "Soubor(ů)" +download: "Stáhnout" +driveFileDeleteConfirm: "Opravdu chcete smazat soubor \"{name}\"? Soubor bude odstraněn\ + \ ze všech příspěvků, které ji obsahují jako přílohu." +unfollowConfirm: "Jste si jisti že už nechcete sledovat {name}?" +exportRequested: "Požádali jste o export. To může chvíli trvat. Přidáme ho na váš\ + \ Disk až bude dokončen." +importRequested: "Požádali jste o export. To může chvilku trvat." +lists: "Seznamy" +noLists: "Nemáte žádné seznamy" +note: "Poznámka" +notes: "Poznámky" +following: "Sledovaní" +followers: "Sledující" +followsYou: "Sledují vás" +createList: "Vytvořit seznam" +manageLists: "Spravovat seznam" +error: "Chyba" +somethingHappened: "Jejda. Něco se nepovedlo." +retry: "Opakovat" +pageLoadError: "Nepodařilo se načíst stránku" +serverIsDead: "Server neodpovídá. Počkejte chvíli a zkuste to znovu." +youShouldUpgradeClient: "Pro zobrazení této stránky obnovte stránku pro aktualizaci\ + \ klienta." +enterListName: "Jméno seznamu" +privacy: "Soukromí" +makeFollowManuallyApprove: "Žádosti o sledování vyžadují potvrzení" +defaultNoteVisibility: "Výchozí viditelnost" +follow: "Sledovaní" +followRequest: "Odeslat žádost o sledování" +followRequests: "Žádosti o sledování" +unfollow: "Přestat sledovat" +followRequestPending: "Čekající žádosti o sledování" +enterEmoji: "Vložte emoji" +renote: "Přeposlat" +unrenote: "Zrušit přeposlání" +renoted: "Přeposláno" +cantRenote: "Tento příspěvek nelze přeposlat." +cantReRenote: "Odpověď nemůže být odstraněna." +quote: "Citovat" +pinnedNote: "Připnutá poznámka" +pinned: "Připnout" +you: "Vy" +clickToShow: "Klikněte pro zobrazení" +sensitive: "NSFW" +add: "Přidat" +reaction: "Reakce" +reactionSettingDescription2: "Přetažením změníte pořadí, kliknutím smažete, zmáčkněte\ + \ \"+\" k přidání" +rememberNoteVisibility: "Zapamatovat nastavení zobrazení poznámky" +attachCancel: "Odstranit přílohu" +markAsSensitive: "Označit jako NSFW" +unmarkAsSensitive: "Odznačit jako NSFW" +enterFileName: "Zadejte název souboru" +mute: "Ztlumit" +unmute: "Odmlčet" +block: "Zablokovat" +unblock: "Odblokovat" +suspend: "Zmrazit" +unsuspend: "Odmrazit" +blockConfirm: "Jste si jistí že chcete zablokovat tento účet?" +unblockConfirm: "Jste si jistí že chcete odblokovat tento účet?" +suspendConfirm: "Jste si jistí že chcete suspendovat tenhle účet?" +unsuspendConfirm: "Jste si jistí že chcete obnovit tenhle účet?" +selectList: "Vybrat seznam" +selectAntenna: "Vyberte Anténu" +selectWidget: "Zvolte widget" +editWidgets: "Upravit widget" +editWidgetsExit: "Hotovo" +customEmojis: "Vlastní emoji" +emoji: "Emoji" +emojis: "Emoji" +emojiName: "Jméno emoji" +emojiUrl: "URL obrázku" +addEmoji: "Přidat emoji" +settingGuide: "Doporučené nastavení" +cacheRemoteFiles: "Ukládání vzdálených souborů do mezipaměti" +cacheRemoteFilesDescription: "Zakázání tohoto nastavení způsobí, že vzdálené soubory\ + \ budou odkazovány přímo, místo aby byly ukládány do mezipaměti. Tím se ušetří úložiště\ + \ na serveru, ale zvýší se provoz, protože se negenerují miniatury." +flagAsBot: "Tento účet je bot" +flagAsBotDescription: "Pokud je tento účet kontrolován programem zaškrtněte tuto možnost.\ + \ To označí tento účet jako bot pro ostatní vývojáře a zabrání tak nekonečným interakcím\ + \ s ostatními boty a upraví Calckey systém aby se choval k tomuhle účtu jako bot." +flagAsCat: "Tenhle účet je kočka" +flagAsCatDescription: "Vyberte tuto možnost aby tento účet byl označen jako kočka." +flagShowTimelineReplies: "Zobrazovat odpovědi na časové ose" +flagShowTimelineRepliesDescription: "Je-li zapnuto, zobrazí odpovědi uživatelů na\ + \ poznámky jiných uživatelů na vaší časové ose." +autoAcceptFollowed: "Automaticky akceptovat následování od účtů které sledujete" +addAccount: "Přidat účet" +loginFailed: "Přihlášení se nezdařilo." +showOnRemote: "Více na původním profilu" +general: "Obecně" +wallpaper: "Obrázek na pozadí" +setWallpaper: "Nastavení obrázku na pozadí" +removeWallpaper: "Odstranit pozadí" +searchWith: "Hledat: {q}" +youHaveNoLists: "Nemáte žádné seznamy" +followConfirm: "Jste si jisti, že chcete sledovat {name}?" +proxyAccount: "Proxy účet" +proxyAccountDescription: "Proxy účet je účet, který za určitých podmínek sleduje uživatele\ + \ na dálku vaším jménem. Například když uživatel zařadí vzdáleného uživatele do\ + \ seznamu, pokud nikdo nesleduje uživatele na seznamu, aktivita nebude doručena\ + \ instanci, takže místo toho bude uživatele sledovat účet proxy." +host: "Hostitel" +selectUser: "Vyberte uživatele" +recipient: "Pro" +annotation: "Komentáře" +federation: "Federace" +instances: "Instance" +registeredAt: "Registrován" +latestRequestSentAt: "Poslední požadavek poslán" +latestRequestReceivedAt: "Poslední požadavek přijat" +latestStatus: "Poslední status" +storageUsage: "Využití úložiště" +charts: "Grafy" +perHour: "za hodinu" +perDay: "za den" +stopActivityDelivery: "Přestat zasílat aktivitu" +blockThisInstance: "Blokovat tuto instanci" +operations: "Operace" +software: "Software" +version: "Verze" +metadata: "Metadata" +monitor: "Monitorovat" +jobQueue: "Fronta úloh" +cpuAndMemory: "CPU a paměť" +network: "Síť" +disk: "Disk" +instanceInfo: "Informace o instanci" +statistics: "Statistiky" +clearQueue: "Vyčistit frontu" +clearQueueConfirmTitle: "Jste si jisti že zrušit všechny úlohy ve frontě?" +clearCachedFiles: "Vyprázdnit mezipaměť" +blockedInstances: "Blokované instance" +noUsers: "Žádní uživatelé" +editProfile: "Upravit můj profil" +pinLimitExceeded: "Nemůžete připnout další poznámky." +intro: "Instalace Calckey byla dokončena! Prosím vytvořte admina." +done: "Hotovo" +processing: "Zpracovávám" +preview: "Náhled" +default: "Výchozí" +noCustomEmojis: "Bez Emoji" +blocked: "Blokováno" +suspended: "Suspendováno" +all: "Vše" +subscribing: "Odebíráte" +publishing: "Publikuji" +notResponding: "Neodpovídá" +instanceFollowing: "Následovníci na instanci" +instanceFollowers: "Následovníci na instanci" +instanceUsers: "Uživatelé této instance" +changePassword: "Změnit heslo" +security: "Zabezpečení" +retypedNotMatch: "Zadané údaje se neshodují." +currentPassword: "Současné heslo" +newPassword: "Nové heslo" +newPasswordRetype: "Nové heslo (znovu)" +attachFile: "Přiložit soubor" +more: "Více!" +featured: "Oblíbené poznámky" +usernameOrUserId: "Uživatelské jméno nebo uživatelské id" +noSuchUser: "Uživatel nebyl nalezen" +announcements: "Oznámení" +imageUrl: "URL obrázku" +remove: "Smazat" +removed: "Smazáno" +removeAreYouSure: "Jste si jistí že chcete smazat \"{x}\"?" +deleteAreYouSure: "Jste si jistí že chcete smazat \"{x}\"?" +resetAreYouSure: "Opravdu resetovat?" +saved: "Uloženo" +messaging: "Zprávy" +upload: "Nahrát soubory" +fromDrive: "Z disku" +fromUrl: "Z URL" +uploadFromUrl: "Nahrát z URL adresy" +uploadFromUrlDescription: "URL adresa souboru, který chcete nahrát" +uploadFromUrlMayTakeTime: "Může trvat nějakou dobu, dokud nebude dokončeno nahrávání." +explore: "Objevovat" +messageRead: "Přečtené" +noMoreHistory: "To je vše" +startMessaging: "Zahájit chat" +nUsersRead: "přečteno {n} uživateli" +agreeTo: "Souhlasím s {0}" +tos: "Podmínky užívání" +start: "Začít" +home: "Domů" +remoteUserCaution: "Tyto informace nemusí být aktuální jelikož uživatel je ze vzdálené\ + \ instance." +activity: "Aktivita" +images: "Obrázky" +birthday: "Datum narození" +yearsOld: "{age} let" +registeredDate: "Datum registrace" +location: "Lokace" +theme: "Vzhled" +themeForLightMode: "Vzhled pro použití ve světlém režimu" +themeForDarkMode: "Vzhled k použití v tmavém režimu" +light: "Světlý" +dark: "Tmavý" +lightThemes: "Světlý vzhled" +darkThemes: "Tmavý vzhled" +syncDeviceDarkMode: "Synchronizovat tmavý vzhled s nastavením Vašeho systému" +drive: "Úložiště" +fileName: "Název souboru" +selectFile: "Vybrat soubor" +selectFiles: "Vybrat soubory" +selectFolder: "Vyberte složku" +selectFolders: "Vyberte složky" +renameFile: "Přejmenovat soubor" +folderName: "Název složky" +createFolder: "Vytvořit složku" +renameFolder: "Přejmenovat složku" +deleteFolder: "Odstranit složku" +addFile: "Přidat soubor" +emptyFolder: "Tato složka je prázdná" +unableToDelete: "Nelze smazat" +inputNewFileName: "Zadejte nový název" +inputNewFolderName: "Zadejte název nové složky" +copyUrl: "Kopírovat URL" +rename: "Přejmenovat" +avatar: "Avatar" +banner: "Baner" +nsfw: "NSFW" +disconnectedFromServer: "Spojení bylo přerušeno" +reload: "Aktualizovat" +doNothing: "Ignorovat" +watch: "Sledovat" +unwatch: "Přestat sledovat" +accept: "Souhlasím" +reject: "Odmítnout" +normal: "Normální" +instanceName: "Název instance" +instanceDescription: "Popis instance" +maintainerName: "Správce" +maintainerEmail: "E-mailová adresa správce" +tosUrl: "URL pro smluvní podmínky" +thisYear: "Tento rok" +thisMonth: "Tento měsíc" +today: "Dnes" +dayX: "{day}" +monthX: "{month}" +yearX: "{year}" +pages: "Stránky" +integration: "Integrace" +connectService: "Připojit" +disconnectService: "Odpojit" +enableLocalTimeline: "Povolit lokální čas" +enableGlobalTimeline: "Povolit globální čas" +registration: "Registrace" +enableRegistration: "Povolit registraci novým uživatelům" +invite: "Pozvat" +inMb: "V megabajtech" +iconUrl: "Favicon URL" +bannerUrl: "Baner URL" +backgroundImageUrl: "Adresa URL obrázku pozadí" +basicInfo: "Základní informace" +pinnedUsers: "Připnutí uživatelé" +pinnedNotes: "Připnutá poznámka" +hcaptcha: "hCaptcha" +enableHcaptcha: "Aktivovat hCaptchu" +hcaptchaSiteKey: "Klíč stránky" +hcaptchaSecretKey: "Tajný Klíč (Secret Key)" +recaptcha: "reCAPTCHA" +enableRecaptcha: "Zapnout ReCAPTCHu" +recaptchaSiteKey: "Klíč stránky" +recaptchaSecretKey: "Tajný Klíč (Secret Key)" +antennas: "Antény" +manageAntennas: "Spravovat Antény" +name: "Jméno" +antennaSource: "Zdroj Antény" +enableServiceworker: "Povolit ServiceWorker" +caseSensitive: "Rozlišuje malá a velká písmena" +connectedTo: "Následující účty jsou připojeny" +notesAndReplies: "Poznámky a odpovědi" +withFiles: "Včetně souborů" +popularUsers: "Populární uživatelé" +recentlyUpdatedUsers: "Nedávno aktívni uživatelé" +popularTags: "Populární tagy" +userList: "Seznamy" +about: "Informace" +aboutMisskey: "O Calckey" +administrator: "Administrátor" +token: "Token" +twoStepAuthentication: "Dvoufaktorová autentikace" +moderator: "Moderátor" +nUsersMentioned: "{n} uživatelů zmínilo" +securityKey: "Bezpečnostní klíč" +securityKeyName: "Název klíče" +registerSecurityKey: "Registrovat bezpečnostní klíč" +lastUsed: "Naposledy použito" +unregister: "Odstranit" +resetPassword: "Resetovat heslo" +newPasswordIs: "Nové heslo je \"{password}\"" +reduceUiAnimation: "Snížit UI animace" +share: "Sdílet" +notFound: "Nenalezeno" +notFoundDescription: "Nebyla nalezená žádná stránka korespondující se zadanou URL." +uploadFolder: "Výchozí lokace pro upload" +cacheClear: "Vymazat cache" +markAsReadAllNotifications: "Označit všechna oznámení za přečtená" +markAsReadAllUnreadNotes: "Označit všechny příspěvky za přečtené" +markAsReadAllTalkMessages: "Označit všechny zprávy za přečtené" +help: "Nápověda" +inputMessageHere: "Sem zadejte zprávu" +close: "Zavřít" +group: "Skupina" +groups: "Skupiny" +createGroup: "Vytvořit skupinu" +ownedGroups: "Vlastněné skupiny" +joinedGroups: "Členství ve skupinách" +invites: "Pozvat" +groupName: "Název skupiny" +members: "Členové" +transfer: "Převod" +title: "Titulek" +text: "Text" +enable: "Povolit" +next: "Další" +retype: "Zadejte znovu" +noteOf: "{user} poznámky" +inviteToGroup: "Pozvat do skupiny" +quoteAttached: "Citace" +quoteQuestion: "Přiložit jako citaci?" +noMessagesYet: "Zatím tu nejsou žádné zprávy" +newMessageExists: "Máte novou zprávu" +onlyOneFileCanBeAttached: "Ke zprávě můžete přiložit jenom jeden soubor" +signinRequired: "Přihlašte se, prosím" +invitations: "Pozvat" +invitationCode: "Kód pozvánky" +checking: "Ověřuji" +available: "K dispozici" +unavailable: "Není k dispozici" +usernameInvalidFormat: "Písmena, čísla a _ jsou povolená." +tooShort: "Příliš krátké" +tooLong: "Příliš dlouhé" +weakPassword: "Slabé heslo" +normalPassword: "Dobré heslo" +strongPassword: "Silné heslo" +passwordMatched: "Hesla se schodují" +passwordNotMatched: "Hesla se neschodují" +signinWith: "Přihlásit se s {x}" +signinFailed: "Nelze se přihlásit. Zkontrolujte prosím své uživatelské jméno a heslo." +tapSecurityKey: "Ťukněte na bezpečnostní klíč" +or: "Nebo" +language: "Jazyk" +uiLanguage: "Jazyk uživatelského rozhraní" +groupInvited: "Pozvat do skupiny" +aboutX: "O {x}" +useOsNativeEmojis: "Použití nativních emoji operačního systému" +youHaveNoGroups: "Nemáte žádné skupiny" +joinOrCreateGroup: "Můžete požádat o pozvání do stávající skupiny nebo vytvořit novou." +noHistory: "Žádná historie" +signinHistory: "Historie přihlášení" +category: "Kategorie" +tags: "Štítky" +createAccount: "Vytvořit účet" +existingAccount: "Existující účet" +regenerate: "Obnovit" +fontSize: "Velikost písma" +openImageInNewTab: "Otevřít obrázek v novém panelu" +dashboard: "Přehled" +local: "Lokální" +remote: "Vzdálené" +total: "Celkem" +weekOverWeekChanges: "Týdně" +dayOverDayChanges: "Denně" +appearance: "Vzhled" +clientSettings: "Nastavení klienta" +accountSettings: "Nastavení účtu" +promotion: "Propagace" +promote: "Propagovat" +numberOfDays: "Počet dní" +objectStorageBaseUrl: "Base URL" +objectStorageBucket: "Bucket" +objectStoragePrefix: "Předpona" +objectStorageEndpoint: "Endpoint" +objectStorageRegion: "Región" +objectStorageUseSSL: "Použít SSL" +deleteAll: "Smazat vše" +showFixedPostForm: "Zobrazit formulář pro nové příspěvky nad časovou osou" +listen: "Poslouchat" +showInPage: "Zobrazit na stránce" +popout: "Pop-out" +volume: "Hlasitost" +masterVolume: "Celková hlasitost" +details: "Detaily" +chooseEmoji: "Vybrat emotikon" +unableToProcess: "Operace nebyla dokončena." +recentUsed: "Naposledy použité" +install: "Nainstalovat" +uninstall: "Odinstalovat" +installedApps: "Autorizované aplikace" +nothing: "Nic nebylo nalezeno" +lastUsedDate: "Poslední použití" +state: "Stav" +sort: "Seřadit" +ascendingOrder: "Vzestupně" +descendingOrder: "Sestupně" +scratchpad: "Zápisník" +output: "Výstup" +script: "Skript" +updateRemoteUser: "Aktualizovat informace o vzdáleném účtu" +deleteAllFiles: "Smazat všechny soubory" +deleteAllFilesConfirm: "Jste si jistí že chcete smazat všechny soubory?" +userSuspended: "Tomuto uživateli byl pozastaven účet." +menu: "Menu" +divider: "Dělící čára" +addItem: "Přidat položku" +relays: "Relay" +addRelay: "Přidat Relay" +inboxUrl: "Inbox URL" +deletedNote: "Odstraněné příspěvky" +invisibleNote: "Skryté příspěvky" +description: "Popis" +author: "Autor" +manage: "Administrace" +width: "Šířka" +height: "Výška" +large: "Velké" +medium: "Střední" +small: "Malé" +generateAccessToken: "Vygenerovat přístupový token" +permission: "Oprávnění" +enableAll: "Povolit vše" +disableAll: "Vypnout vše" +notificationType: "Typy oznámení" +edit: "Upravit" +emailServer: "Mailový server" +enableEmail: "Zapnout email dystribuci" +email: "Email" +emailAddress: "Emailová adresa" +smtpConfig: "Konfigurace SMTP serveru" +smtpHost: "Hostitel" +smtpPort: "Port" +smtpUser: "Uživatelské jméno" +smtpPass: "Heslo" +smtpSecureInfo: "Toto vypněte pokud používáte STARTTLS" +testEmail: "Otestovat doručení emailů" +makeActive: "Aktivovat" +display: "Zobrazit" +copy: "Kopírovat" +metrics: "Metriky" +overview: "Shrnutí" +logs: "Logy" +delayed: "Prodleva" +database: "Databáze" +channel: "Kanály" +create: "Vytvořit" +notificationSetting: "Nastavení oznámení" +useGlobalSetting: "Použít globální nastavení" +other: "Ostatní" +fileIdOrUrl: "ID nebo URL souboru" +behavior: "Chování" +sample: "Ukázka" +send: "Odeslat" +openInNewTab: "Otevřít v nové kartě" +random: "Náhodně" +system: "Systém" +desktop: "Plocha" +clip: "Oříznout" +createNew: "Vytvořit nový" +optional: "Volitelné" +yes: "Ano" +no: "Ne" +notSet: "Není nastaveno" +emailVerified: "Váš e-mail byl ověřen" +contact: "Kontakt" +useSystemFont: "Použít výchozí font systému" +clips: "Oříznout" +experimentalFeatures: "Experimentální funkce" +developer: "Vývojář" +duplicate: "Duplikovat" +left: "Vlevo" +center: "Uprostřed" +wide: "Široké" +narrow: "Úzké" +clearCache: "Vyprázdnit mezipaměť" +nUsers: "{n} užívatelů" +nNotes: "{n} poznámek" +myTheme: "Moje vzhledy" +backgroundColor: "Pozadí" +accentColor: "Akcent" +textColor: "Barva textu" +saveAs: "Uložit jako…" +advanced: "Pokročilé" +value: "Hodnota" +createdAt: "Vytvořeno" +updatedAt: "Upraveno" +saveConfirm: "Uložit změny?" +deleteConfirm: "Opravdu smazat?" +invalidValue: "Neplatná hodnota." +registry: "Registr" +info: "Informace" +unknown: "Neznámý" +onlineStatus: "Online status" +hideOnlineStatus: "Skrýt Váš online status" +hideOnlineStatusDescription: "Skrytí vašeho online stavu může snížit funkcionalitu\ + \ některých funkcí, například vyhledávání." +online: "Online" +active: "Aktivní" +offline: "Offline" +notRecommended: "Nedoporučuje se" +botProtection: "Bot ochrana" +instanceBlocking: "Blokované instance" +selectAccount: "Vybrat účet" +switchAccount: "Přepnout účet" +enabled: "Zapnuto" +disabled: "Vypnuto" +quickAction: "Rychlé akce" +user: "Uživatelé" +administration: "Administrace" +accounts: "Účty" +switch: "Přepnout" +configure: "Nastavit" +gallery: "Galerie" +recentPosts: "Poslední příspěvky" +ads: "Reklamy" +memo: "Memo" +priority: "Priorita" +high: "Vysoká" +middle: "Střední" +low: "Nízká" +emailNotConfiguredWarning: "E-mailová adresa není nastavena." +ratio: "Poměr" +global: "Globální" +sent: "Odeslat" +hashtags: "Hashtagy" +troubleshooting: "Poradce při potížích" +whatIsNew: "Zobrazit změny" +translate: "Přeložit" +hide: "Skrýt" +smartphone: "Telefon" +tablet: "Tablet" +auto: "Auto" +size: "Velikost" +numberOfColumn: "Počet sloupců" +searchByGoogle: "Vyhledávání" +indefinitely: "Navždy" +tenMinutes: "10 minut" +oneHour: "1 hodina" +oneDay: "1 den" +oneWeek: "1 týden" +reflectMayTakeTime: "Může trvat nějakou dobu, než se projeví změny." +cropImage: "Oříznout obrázek" +file: "Soubor(ů)" +recentNHours: "Posledních {n} hodin" +recentNDays: "Posledních {n} dnů" +recommended: "Doporučeno" +deleteAccount: "Odstranit účet" +document: "Dokumentace" +logoutConfirm: "Opravdu se chcete odhlásit?" +pleaseSelect: "Vybrat možnost" +reverse: "Otočit" +colored: "Barevné" +type: "Typ" +speed: "Rychlost" +slow: "Pomalá" +fast: "Rychlá" +account: "Účty" +_ad: + back: "Zpět" +_gallery: + my: "Moje galerie" +_email: + _follow: + title: "Máte nového následovníka" +_plugin: + install: "Instalovat plugin" + manage: "Správce pluginů" +_preferencesBackups: + list: "Vytvořit backup" + loadFile: "Načíst ze souboru" + save: "Uložit změny" +_registry: + scope: "Rozsah" + key: "Klíč" + keys: "Klíče" + domain: "Doména" + createKey: "Vytvořit klíč" +_aboutMisskey: + allContributors: "Všichni přispěvatelé" + source: "Zdrojový kód" +_mfm: + mention: "Zmínění" + hashtag: "Hashtag" + link: "Odkaz" + bold: "Tučně" + quote: "Citovat" + emoji: "Vlastní emoji" + search: "Vyhledávání" + flip: "Otočit" + tada: "Animace (tadá)" + blur: "Rozmazání" + font: "Font" + rainbow: "Duha" +_channel: + featured: "Trendy" +_menuDisplay: + top: "Nahoru" + hide: "Skrýt" +_theme: + install: "Nainstalovat vzhled" + manage: "Správa vzhledů" + code: "Kód vzhledu" + description: "Popis" + installedThemes: "Nainstalované vzhledy" + constant: "Konstanta" + defaultValue: "Výchozí hodnota" + color: "Barva" + key: "Klíč" + func: "Funkce " + keys: + shadow: "Stín" + header: "Nadpis" + link: "Odkaz" + hashtag: "Hashtag" + mention: "Zmínění" + renote: "Přeposlat" + divider: "Dělící čára" +_sfx: + note: "Poznámky" + notification: "Oznámení" + chat: "Zprávy" +_ago: + future: "Budoucí" + justNow: "Teď" +_time: + second: "Sekund" + minute: "Minut" + hour: "Hodin" +_2fa: + registerTOTP: "Přidat zařízení" + registerSecurityKey: "Přidat bezpečnostní klíč" +_weekday: + sunday: "Neděle" + monday: "Pondělí" + tuesday: "Úterý" + wednesday: "Středa" + thursday: "Čtvrtek" + friday: "Pátek" + saturday: "Sobota" +_widgets: + notifications: "Oznámení" + timeline: "Časová osa" + calendar: "Kalendář" + trends: "Trendy" + clock: "Hodiny" + rss: "RSS čtečka" + activity: "Aktivita" + photos: "Fotky" + digitalClock: "Digitální hodiny" + federation: "Federace" + slideshow: "Prezentace" + button: "Tlačítko" + onlineUsers: "Online uživatelé" + jobQueue: "Fronta úloh" + aiscript: "AiScript conzole" + aichan: "Ai" +_cw: + hide: "Skrýt" + show: "Zobrazit více" +_poll: + noMore: "Více už přidat nemůžete" + infinite: "Nikdy" + deadlineDate: "Datum ukončení" + deadlineTime: "Hodin" + duration: "Trvání" +_visibility: + home: "Domů" + followers: "Sledující" +_postForm: + _placeholders: + f: "Čekám, až něco napíšete..." +_profile: + name: "Jméno" + username: "Uživatelské jméno" + description: "O mně" + youCanIncludeHashtags: "V popisku o Vás můžete použít i hastagy." + metadata: "Doplňující informace" + metadataContent: "Obsah" +_exportOrImport: + allNotes: "Všechny poznámky" + followingList: "Sledovaní" + muteList: "Ztlumit" + blockingList: "Zablokovat" + userLists: "Seznamy" +_charts: + federation: "Federace" + apRequest: "Požadavek" + usersTotal: "Celkem uživatelů" + activeUsers: "Aktivní uživatelé" + notesTotal: "Celkový počet poznámek" +_timelines: + home: "Domů" + global: "Globální" +_pages: + newPage: "Vytvořit novou stránku" + editPage: "Upravit stránku" + created: "Stránka byla úspěšně vytvořena" + updated: "Stránka byla úspěšně aktualizována" + deleted: "Stránka byla úspěšně smazána" + pageSetting: "Nastavení stránky" + invalidNameText: "Ujistěte se že jméno stránky je vyplněno" + contents: "Obsah" + fontSerif: "Serif" + fontSansSerif: "Sans Serif" + chooseBlock: "Přidat blok" + selectType: "Vyberte typ" + contentBlocks: "Obsah" + inputBlocks: "Vstup" + specialBlocks: "Speciální" + blocks: + text: "Text" + textarea: "Textové pole" + section: "Sekce" + image: "Obrázky" + button: "Tlačítko" + if: "Pokud" + _if: + variable: "Proměnná" + _post: + text: "Obsah" + canvasId: "Canvas ID" + _textInput: + name: "Jméno proměnné" + text: "Titulek" + default: "Výchozí hodnota" + _textareaInput: + name: "Jméno proměnné" + text: "Titulek" + default: "Výchozí hodnota" + _numberInput: + name: "Jméno proměnné" + text: "Titulek" + default: "Výchozí hodnota" + canvas: "Canvas" + _canvas: + id: "Canvas ID" + width: "Šířka" + height: "Výška" + _switch: + name: "Jméno proměnné" + text: "Titulek" + default: "Výchozí hodnota" + _counter: + name: "Jméno proměnné" + text: "Titulek" + inc: "Krok" + _button: + text: "Titulek" + colored: "Barevné" + _action: + _dialog: + content: "Obsah" + _radioButton: + name: "Jméno proměnné" + default: "Výchozí hodnota" + script: + categories: + list: "Seznamy" + blocks: + text: "Text" + _strLen: + arg1: "Text" + _strPick: + arg1: "Text" + _strReplace: + arg1: "Text" + _strReverse: + arg1: "Text" + _join: + arg1: "Seznamy" + _subtract: + arg1: "A" + arg2: "B" + _multiply: + arg1: "A" + arg2: "B" + _divide: + arg1: "A" + arg2: "B" + _mod: + arg1: "A" + arg2: "B" + round: "Zaokrouhlení zlomku" + _round: + arg1: "Číselná hodnota" + eq: "A a B jsou stejné" + _eq: + arg1: "A" + arg2: "B" + notEq: "A a B jsou odlišné" + _notEq: + arg1: "A" + arg2: "B" + _and: + arg1: "A" + arg2: "B" + _or: + arg1: "A" + arg2: "B" + _lt: + arg1: "A" + arg2: "B" + _gt: + arg1: "A" + arg2: "B" + _ltEq: + arg1: "A" + arg2: "B" + _gtEq: + arg1: "A" + arg2: "B" + if: "Větev" + _if: + arg1: "Pokud" + arg2: "Potom" + arg3: "Nebo" + random: "Náhodně" + _random: + arg1: "Pravděpodobnost" + rannum: "Náhodné číslo" + _rannum: + arg1: "Minimální hodnota" + arg2: "Maximální hodnota" + _randomPick: + arg1: "Seznamy" + _dailyRandom: + arg1: "Pravděpodobnost" + _dailyRannum: + arg1: "Minimální hodnota" + arg2: "Maximální hodnota" + _dailyRandomPick: + arg1: "Seznamy" + _seedRandom: + arg2: "Pravděpodobnost" + _seedRannum: + arg2: "Minimální hodnota" + arg3: "Maximální hodnota" + _seedRandomPick: + arg2: "Seznamy" + _pick: + arg1: "Seznamy" + _listLen: + arg1: "Seznamy" + number: "Číselná hodnota" + _stringToNumber: + arg1: "Text" + _numberToString: + arg1: "Číselná hodnota" + _splitStrByLine: + arg1: "Text" + types: + string: "Text" + number: "Číselná hodnota" + array: "Seznamy" +_notification: + youWereFollowed: "Máte nového následovníka" + youWereInvitedToGroup: "Pozvat do skupiny" + _types: + all: "Vše" + follow: "Sledovaní" + mention: "Zmínění" + reply: "Odpovědi" + renote: "Přeposlat" + quote: "Citovat" + reaction: "Reakce" + _actions: + reply: "Odpovědět" + renote: "Přeposlat" +_deck: + _columns: + notifications: "Oznámení" + tl: "Časová osa" + antenna: "Antény" + list: "Seznamy" + mentions: "Zmínění" +noteDeleteConfirm: Chcete opravdu smazat tento příspěvek? +defaultValueIs: 'Výchozí: {value}' +lookup: Hledat +keepOriginalUploading: Ponechat originální obrázek +uploadFromUrlRequested: Vyžádáno nahrání souboru +manageGroups: Spravovat skupiny +reloadConfirm: Znovu načíst časovou osu? +driveCapacityPerRemoteAccount: Místo na disku pro vzdálené uživatele +silenceThisInstance: Ztlumit tuto instance +silencedInstances: Ztlumené instance +blockedInstancesDescription: Zadejte seznam domén instancí, jež chcete blokovat. Uvedené + instance nebudou moci s touto instancí komunikovat. +hiddenTags: Skryté hashtagy +noInstances: Nejsou zde žádné instance +silenced: Ztlumené +disablingTimelinesInfo: Administrátoři a moderátoři budou vždy mít přístup ke všem + časovým osám, i pokud jsou vypnuté. +deleted: Vymazáno +editNote: Upravit poznámku +edited: 'Upraveno dne {date} {time}' +silencedInstancesDescription: Vypište hostnames instancí, které chcete ztlumit. Účty + v uvedených instancích jsou považovány za "ztlumené", mohou pouze zadávat požadavky + na sledování a nemohou zmiňovat místní účty, pokud nejsou sledovány. Na blokované + instance toto nebude mít vliv. +hiddenTagsDescription: 'Vypište hashtagy (bez #), které chcete skrýt před trendy a + prozkoumat. Skryté hashtagy jsou stále zjistitelné jinými způsoby. Blokované případy + nejsou ovlivněny, i když jsou zde uvedeny.' +circularReferenceFolder: Cílová složka je podsložka přesouvané složky. +whenServerDisconnected: Při ztrátě spojení se serverem +pinnedUsersDescription: Uveďte uživatelská jména uživatelů připnutých na stránce "Procházet", + jedno na řádek. +pinnedPagesDescription: Zadejte cesty ke stránkám, které chcete připnout na horní + stránku této instance, oddělené zlomy řádků. +pageLoadErrorDescription: Toto je obvykle způsobeno chybami sítě nebo mezipaměti prohlížeče. + Zkuste vymazat mezipaměť a po chvíli čekání to zkuste znovu. +emptyDrive: Váš disk je prázdný +inputNewDescription: Zadejte nový popisek +hasChildFilesOrFolders: Složka nemůže být smazána, protože není prázdná. +noThankYou: Ne, děkuji +addInstance: Přidat instance +selectInstance: Vybrat si instance +blockedUsers: Zablokovaní uživatelé +muteAndBlock: Ztlumení a blokace +noJobs: Žádné úlohy +federating: Federace +clearQueueConfirmText: Nedoručené příspěvky, které zůstanou ve frontě, nebudou federovány. + Obvykle tato operace není potřeba. +clearCachedFilesConfirm: Chcete opravdu vymazat mezipaměť všech vzdálených souborů? +accountMoved: 'Uživatel/ka se přesunul/a na nový účet:' +keepOriginalUploadingDescription: Ponechá originálně nahraný obrázek tak, jak je. + Pokud vypnuto, verze pro zobrazení na webu bude vygenerována při nahrání. +mutedUsers: Ztlumení uživatelé +enableRecommendedTimeline: Povolit doporučenou časovou osu +driveCapacityPerLocalAccount: Místo na disku pro místní uživatele +pinnedPages: Připnuté Stránky +directNotes: Přímé zprávy +enableEmojiReactions: Povolit reakce pomocí emoji +showEmojisInReactionNotifications: Zobrazit emotikony v oznámeních o reakcích +reactionSetting: Reakce, které se mají zobrazit v seznamu reakcí +renoteMute: Ztlumit přeposílání +renoteUnmute: Zrušit ztlumení přeposílání +flagSpeakAsCat: Mluvit jako kočka +flagSpeakAsCatDescription: Vaše příspěvky budou v kočičím režimu nyanifikovány. diff --git a/fe_calckey/frontend/locales/da-DK.yml b/fe_calckey/frontend/locales/da-DK.yml new file mode 100644 index 0000000..f0e6523 --- /dev/null +++ b/fe_calckey/frontend/locales/da-DK.yml @@ -0,0 +1,236 @@ +_lang_: "Dansk" +monthAndDay: '{month}/{day}' +search: Søge +notifications: Notifikationer +username: Brugernavn +password: Adgangskode +forgotPassword: Glemt adgangskode +fetchingAsApObject: Henter fra Fediverset +ok: OK +gotIt: Forstået! +cancel: Annullere +enterUsername: Indtast brugernavn +instance: Instans +renotedBy: Forstærket fra {user} +noNotes: Ingen opslag +otherSettings: Andre Indstillinger +profile: Profil +timeline: Tidslinje +signup: Registrere +logout: Log Ud +login: Log ind +uploading: Uploader... +save: Gem +users: Brugere +favorited: Tilsat til bogmærker. +unfavorite: Fjerne fra bogmærker +alreadyFavorited: Allerede inden i bogmærker. +pin: Fastgøre til profil +unpin: Løse fra profil +delete: Slet +addToList: Tilsæt til liste +deleteAndEdit: Slet og ændre +reply: Svar +loadMore: Indlæs mere +receiveFollowRequest: Følgeanmodning er blevet sendt +import: Importere +export: Eksportere +driveFileDeleteConfirm: Er du sikker på at du vil slette filen "{name}"? Denne vil + blive slettet fra alle tilknyttede opslage. +unfollowConfirm: Er du sikker på at du vil ikke følge {name} længere? +privacy: Privatlivs +enterListName: Indtast navnen for denne list +makeFollowManuallyApprove: Følgeanmodninger kræver godkendelse +unrenote: Fratag forstærkelse +renote: Forstærk +add: Tilsæt +reactionSetting: Reaktioner til at vise i reaktion-vælgeren +reactionSettingDescription2: Bevæg til at flytte om på, tryk til at slette og indtast + "+" til at tilsætte. +rememberNoteVisibility: Husk opslagsynlidhedsindstillinger +emojis: Emoji +flagShowTimelineReplies: Vis svare i tidslinjen +flagAsCatDescription: Du kommer til at få katøre og tale som en kat! +showOnRemote: Vis på fjerninstans +general: Generelt +accountMoved: 'Bruger har flyttet til et nyt konto:' +settings: Indstillinger +basicSettings: Primær Indstillinger +openInWindow: Åben i vindue +noAccountDescription: Denne bruger har ikke skrevet deres bio endnu. +loggingIn: Logger ind +cantFavorite: Kunne ikke tilsætte til bogmærker. +copyUsername: Kopi brugernavn +copyContent: Kopi indholdet +copyLink: Kopi link +searchUser: Søg for en bruger +files: Filer +noLists: Du har ingen liste +lists: Lister +reaction: Reaktioner +sensitive: NSFW +emoji: Emoji +cacheRemoteFilesDescription: Når denne indstilling er deaktiveret, fremmed filer bliver + indlæset direkte fra denne fjerneinstans. Hvis du deaktivere dette så vil det formindske + brugte opbevaringsplads men det vil også få netværktraffic til at stige fordi miniaturebilleder + vil ikke blive skabt. +flagAsBot: Markere denne konto som en robot +flagShowTimelineRepliesDescription: Vis svare af brugere til opslage af andre brugere + i tidslinjen hvis den bliver tændt. +loginFailed: Kunne ikke logge ind +silenceThisInstance: Nedtone denne instans +deleteAndEditConfirm: Er du sikker på at du vil slet denne opslag og ændre det? Du + vil tabe alle reaktioner, forstærkninger og svarer indenfor denne opslag. +editNote: Ændre note +deleted: Slettet +edited: 'Ændret den {date} {time}' +sendMessage: Send en besked +youShouldUpgradeClient: Til at vise denne side, vær sød at refresh til at opdatere + din brugerenhed. +defaultNoteVisibility: Standard synlighed +follow: Følge +followRequest: Følge +followRequests: Følgeanmodninger +unfollow: Følge ikke længere +followRequestPending: Følgeanmodning ventes på +enterEmoji: Indtast en emoji +renoted: Forstærket. +cantRenote: Denne opslag kunne ikke forstærkes. +cantReRenote: En forstærkelse kan ikke forstærkes. +quote: Citere +pinnedNote: Fastgjort opslag +pinned: Fastgøre til profil +you: Dig +clickToShow: Tryk til at vise +unblock: Blokere ikke længere +suspend: Suspendere +unsuspend: Suspendere ikke længere +blockConfirm: Er du sikker på at du vil blokere denne konto? +unblockConfirm: Er du sikker på at du vil ikke blokere denne konto endnu længere? +suspendConfirm: Er du sikker på at du vil suspendere denne konto? +selectAntenna: Vælg en antenne +selectWidget: Vælg en widget +editWidgets: Ændre widgettere +customEmojis: Brugerdefineret emoji +emojiName: Emoji navn +operations: Operationer +software: Software +metadata: Metadata +version: Version +monitor: Vagt +jobQueue: Jobkø +statistics: Statistik +cpuAndMemory: CPU og hukommelse +network: Netværk +disk: Disk +instanceInfo: Instans information +noThankYou: Nej tak +noNotifications: Intet notifikationer +addUser: Indsæt en bruger +addInstance: Indsæt en instans +favorite: Indsæt til bogmærker +favorites: Bogmærker +showMore: Vis mere +showLess: Luk +youGotNewFollower: følgte dig +followRequestAccepted: Følgeanmodning accepteret +mention: Nævne +mentions: Nævnene +directNotes: Direkt beskeder +importAndExport: Importere/Eksporter data +download: Download +exportRequested: Du har bedt om en eksport. Det vil tage noget tid. Den vil blive + tilsæt til din Drev når den er færdig. +importRequested: Du har bedt om en eksport. Det vil tage noget tid. +note: Opslag +notes: Opslage +following: Følger +followers: Følgere +followsYou: Følger dig +createList: Skab en list +manageLists: Administrere lister +error: Fejl +somethingHappened: En fejl har opstået +retry: Gentage +pageLoadError: En fejl har opstået ved indlæsning af siden. +pageLoadErrorDescription: Dette er normalt på grund af netværksproblemer eller din + browser's cache. Prøv at ryd cachen og så gentage efter et styk tid. +serverIsDead: Serveren svarer ikke. Vær sød at vente et styk tid og prøv igen. +editWidgetsExit: Færdig +headlineMisskey: En åben-kildekode, decentraliseret social-media platform som er frit + forevigt! 🚀 +introMisskey: Velkommen! Calckey er en åbent-kildekode, decentraliseret social-media + platform som er frit forevigt!🚀 +enableEmojiReactions: Aktivere emoji reaktioner +unsuspendConfirm: Er du sikker på at du vil ikke suspendere denne konto endnu længere? +selectList: Vælg en list +showEmojisInReactionNotifications: Vis emoji i reaktion notifikationer +attachCancel: Fjern tilknyttelse +markAsSensitive: Markere som NSFW +unmarkAsSensitive: Markere ikke som NSFW længere +enterFileName: Indtast filnavn +mute: Nedtone +unmute: Nedtone ikke længere +renoteMute: Nedtone forstærkninger +renoteUnmute: Nedtone forstærkninger ikke længere +block: Blokere +cacheRemoteFiles: Cachere fremmed filer +flagAsBotDescription: Aktivere denne valgmulighed hvis denne konto er kontrolleret + af en komputerprogram. Hvis den et tændt så vil det signalere til andre udviklere + som arbejder på komputer-kontrolleret social-media kontoer og det vil også adjustere + Calckey's indresystemer til at behandle denne konto som en robot. +flagAsCat: Er du en kat? 😺 +flagSpeakAsCat: Tale som en kat +emojiUrl: Emoji URL +addEmoji: Tilsæt +settingGuide: Anbefalet indstillinger +flagSpeakAsCatDescription: Din opslage vil blive nyaniferet når du er i kat-mode +autoAcceptFollowed: Automatisk godkende følgeanmodninger fra brugere som du selv følger +addAccount: Tilsæt konto +wallpaper: Baggrund +setWallpaper: Sæt baggrund +removeWallpaper: Fjern baggrund +host: Host +selectUser: Vælg en bruger +searchWith: 'Søge: {q}' +youHaveNoLists: Du har ingen liste +followConfirm: Er du sikker på at du vil gerne følge {name}? +proxyAccount: Proxykonto +proxyAccountDescription: En proxykonto er en konto som virker som en fremmed følger + for bruger under særlige konditioner. For eksempel, når en bruger tilsætter en fjernbruger + til denne list, vil denne fjernbruger's aktivitet ikke blive leveret til den instans + hvis ingen lokalebruger følger fjernbrugeren, så denne proxykonto vil følge den + istedetfor. +instances: Instanser +registeredAt: Registreret på +latestRequestSentAt: Sidste anmodning sendt +latestRequestReceivedAt: Sidste anmodning modtaget +selectInstance: Vælg en instans +recipient: Recipient(er) +annotation: Kommentarer +federation: Føderation +latestStatus: Senest status +storageUsage: Opbevaringspladsbrug +charts: Grafer +perHour: Hver time +perDay: Hver dag +stopActivityDelivery: Stop med at sende aktiviteter +blockThisInstance: Blokere denne instans +muteAndBlock: Mutes og blokeringer +mutedUsers: Mutede brugere +newer: nyere +older: ældre +silencedInstances: Nedtonede servere +clearQueue: Ryd kø +clearQueueConfirmTitle: Er du sikker på, at du ønsker at rydde køen? +clearCachedFiles: Ryd cache +clearCachedFilesConfirm: Er du sikker på, at du ønsker at slette alle cachede eksterne + filer? +blockedInstances: Blokerede servere +blockedInstancesDescription: Listen af navne på servere, du ønsker at blokere. Servere + på listen vil ikke længere kunne kommunikere med denne server. +hiddenTags: Skjulte hashtags +clearQueueConfirmText: De indlæg i denne kø, der ikke allerede er leveret, vil ikke + blive federeret. Denne operation er almindeligvis ikke påkrævet. +jumpToPrevious: Spring til tidligere +cw: Advarsel om indhold diff --git a/fe_calckey/frontend/locales/de-DE.yml b/fe_calckey/frontend/locales/de-DE.yml new file mode 100644 index 0000000..4a1bcdf --- /dev/null +++ b/fe_calckey/frontend/locales/de-DE.yml @@ -0,0 +1,2153 @@ +_lang_: "Deutsch" +headlineMisskey: "Eine dezentralisierte Open-Source Social Media Plattform, die für + immer gratis bleibt! 🚀" +introMisskey: "Willkommen! Calckey ist eine dezentralisierte Open-Source Social Media + Plattform, die für immer gratis bleibt!🚀" +monthAndDay: "{month}/{day}" +search: "Suchen" +notifications: "Benachrichtigungen" +username: "Nutzername" +password: "Passwort" +forgotPassword: "Passwort vergessen" +fetchingAsApObject: "Wird aus dem Fediverse angefragt" +ok: "OK" +gotIt: "Verstanden!" +cancel: "Abbrechen" +enterUsername: "Nutzername eingeben" +renotedBy: "Geteilt von {user}" +noNotes: "Keine Beiträge" +noNotifications: "Keine Benachrichtigungen" +instance: "Server" +settings: "Einstellungen" +basicSettings: "Grundeinstellungen" +otherSettings: "Weitere Einstellungen" +openInWindow: "In einem Fenster öffnen" +profile: "Profil" +timeline: "Timelines" +noAccountDescription: "Dieser Nutzer hat seine Profilbeschreibung noch nicht ausgefüllt." +login: "Login" +loggingIn: "Du wirst angemeldet" +logout: "Logout" +signup: "Registrieren" +uploading: "Wird hochgeladen …" +save: "Speichern" +users: "Nutzer" +addUser: "Nutzer hinzufügen" +favorite: "Zu den Lesezeichen hinzufügen" +favorites: "Lesezeichen" +unfavorite: "Aus den Lesezeichen entfernen" +favorited: "Zu den Lesezeichen hinzugefügt." +alreadyFavorited: "Bereits zu den Lesezeichen hinzugefügt." +cantFavorite: "Hinzufügen zu den Lesezeichen fehlgeschlagen." +pin: "An dein Profil anheften" +unpin: "Von deinem Profil lösen" +copyContent: "Inhalt kopieren" +copyLink: "Link kopieren" +delete: "Löschen" +deleteAndEdit: "Löschen und Bearbeiten" +deleteAndEditConfirm: "Möchtest du diesen Beitrag wirklich löschen und bearbeiten? + Alle Rückmeldungen, Renotes und Antworten dieses Beitrages werden verloren gehen." +addToList: "Zu Liste hinzufügen" +sendMessage: "Eine Mitteilung senden" +copyUsername: "Nutzernamen kopieren" +searchUser: "Nach einem Nutzer suchen" +reply: "Antworten" +loadMore: "Mehr laden" +showMore: "Mehr anzeigen" +showLess: "Schließen" +youGotNewFollower: "folgt dir" +receiveFollowRequest: "Follow-Anfrage erhalten" +followRequestAccepted: "Follow-Anfrage akzeptiert" +mention: "Erwähnung" +mentions: "Erwähnungen" +directNotes: "Direktmitteilungen" +importAndExport: "Daten Im- und Export" +import: "Import" +export: "Export" +files: "Dateien" +download: "Herunterladen" +driveFileDeleteConfirm: "Möchtest du die Datei \"{name}\" wirklich löschen? Es wird + aus allen Beiträgen entfernt, die die Datei als Anhang enthalten." +unfollowConfirm: "Bist du dir sicher, daß du {name} nicht mehr folgen möchtest?" +exportRequested: "Du hast einen Export angefragt. Dies kann etwas Zeit in Anspruch + nehmen. Sobald der Export abgeschlossen ist, wird er deinem Laufwerk hinzugefügt." +importRequested: "Du hast einen Import angefragt. Dies kann etwas Zeit in Anspruch + nehmen." +lists: "Listen" +noLists: "Du hast keine Listen angelegt" +note: "Beitrag" +notes: "Beiträge" +following: "Folge ich" +followers: "Folgen mir" +followsYou: "Folgt dir" +createList: "Liste erstellen" +manageLists: "Listen verwalten" +error: "Fehler" +somethingHappened: "Ein Fehler ist aufgetreten" +retry: "Wiederholen" +pageLoadError: "Beim Laden der Seite ist ein Fehler aufgetreten." +pageLoadErrorDescription: "Dies wird in der Regel durch Netzwerkfehler oder den Cache + des Browsers verursacht. Versuchen Sie, den Cache zu leeren, und versuchen Sie es + dann erneut, nachdem Sie eine Weile gewartet haben." +serverIsDead: "Der Server antwortet nicht. Bitte warte einen Moment und versuche es + dann erneut." +youShouldUpgradeClient: "Bitte aktualisiere diese Seite, um eine neuere Version deines + Clients zu verwenden." +enterListName: "Gib einen Namen für die Liste ein" +privacy: "Privatsphäre" +makeFollowManuallyApprove: "Folgeanfragen bedürfen der Genehmigung" +defaultNoteVisibility: "Standard-Sichtbarkeit" +follow: "Folge ich" +followRequest: "Follow anfragen" +followRequests: "Follow-Anfragen" +unfollow: "Nicht mehr folgen" +followRequestPending: "Follow-up-Anfrage ausstehend" +enterEmoji: "Ein Emoji eingeben" +renote: "Boost" +unrenote: "Boost zurücknehmen" +renoted: "Geboostet." +cantRenote: "Dieser Beitrag kann nicht geboostet werden." +cantReRenote: "Ein Boost kann nicht geboostet werden." +quote: "Zitieren" +pinnedNote: "Angepinnter Beitrag" +pinned: "An das Profil anheften" +you: "Du" +clickToShow: "Zum Anzeigen anklicken" +sensitive: "NSFW" +add: "Hinzufügen" +reaction: "Reaktionen" +reactionSetting: "Reaktionen, die in der Reaktionsauswahl angezeigt werden sollen" +reactionSettingDescription2: "Ziehen Sie, um neu zu ordnen,\nklicken Sie, um zu löschen,\n + drücken Sie \"+\", um hinzuzufügen." +rememberNoteVisibility: "Einstellungen für die Sichtbarkeit von Beiträgen speichern" +attachCancel: "Anhang entfernen" +markAsSensitive: "Als NSFW kennzeichnen" +accountMoved: "Der Nutzer ist zu einem neuen Konto umgezogen:" +unmarkAsSensitive: "NSFW Kennzeichnung aufheben" +enterFileName: "Dateiname eingeben" +mute: "Stummschalten" +unmute: "Stummschaltung aufheben" +block: "Blockieren" +unblock: "Blockierung aufheben" +suspend: "Suspendieren" +unsuspend: "Suspendierung aufheben" +blockConfirm: "Sind Sie sicher, dass Sie dieses Konto sperren wollen?" +unblockConfirm: "Sind Sie sicher, dass Sie die Sperrung dieses Kontos aufheben wollen?" +suspendConfirm: "Sind Sie sicher, dass Sie dieses Konto sperren wollen?" +unsuspendConfirm: "Sind Sie sicher, dass Sie dieses Konto entsperren wollen?" +selectList: "Wählen Sie eine Liste aus" +selectAntenna: "News-Picker auswählen" +selectWidget: "Ein Widget auswählen" +editWidgets: "Widgets bearbeiten" +editWidgetsExit: "Erledigt" +customEmojis: "Benutzerdefinierte Emoji" +emoji: "Emoji" +emojis: "Emoji" +emojiName: "Emoji-Name" +emojiUrl: "Emoji-URL" +addEmoji: "Emoji hinzufügen" +settingGuide: "Empfohlene Einstellungen" +cacheRemoteFiles: "Cache für entfernte Dateien" +cacheRemoteFilesDescription: "Ist diese Einstellung deaktiviert, so werden Dateien + von anderen Servern direkt von dort geladen. Hierdurch wird Speicherplatz auf diesem + Server eingespart, aber durch die fehlende Generierung von Vorschaubildern wird + mehr Bandbreite benötigt." +flagAsBot: "Dieses Nutzerkonto als Bot kennzeichnen" +flagAsBotDescription: "Aktiviere diese Option, falls dieses Nutzerkonto durch ein + Programm gesteuert wird. Falls aktiviert, agiert es als Flag für andere Entwickler + zur Verhinderung von endlosen Kettenreaktionen mit anderen Bots und lässt Calckeys + interne Systeme dieses Nutzerkonto als Bot behandeln." +flagAsCat: "Bist du eine Katze? 😺" +flagAsCatDescription: "Du bekommst Katzenohren und sprichst wie eine Katze!" +flagShowTimelineReplies: "Antworten in der Timeline anzeigen" +flagShowTimelineRepliesDescription: "Zeigt Antworten von Nutzern auf Beiträge anderer + Nutzer in der Timeline an, wenn diese Funktion aktiviert ist." +autoAcceptFollowed: "Automatisches Genehmigen von Folgeanfragen von Benutzern, denen + Sie folgen" +addAccount: "Nutzerkonto hinzufügen" +loginFailed: "Anmeldung fehlgeschlagen" +showOnRemote: "Zur Ansicht auf dem Herkunftsserver" +general: "Allgemein" +wallpaper: "Hintergrundbild" +setWallpaper: "Hintergrundbild festlegen" +removeWallpaper: "Hintergrundbild entfernen" +searchWith: "Suchen: {q}" +youHaveNoLists: "Sie haben keine Listen" +followConfirm: "Sind Sie sicher, dass Sie {name} folgen möchten?" +proxyAccount: "Proxy-Konto" +proxyAccountDescription: "Ein Proxy-Konto ist ein Nutzerkonto, das sich für Nutzer + unter bestimmten Konditionen wie ein Follower von einem anderen Server verhält. + Zum Beispiel wird die Aktivität eines Nutzers von einem anderen Server nicht an + diesen Server übermittelt, falls es keinen Nutzer von diesem Server gibt, der diesem + Nutzer von einem anderen Server folgt. In diesem Fall folgt stattdessen das Proxy-Nutzerkonto." +host: "Host" +selectUser: "Wählen Sie einen Nutzer" +recipient: "Empfänger" +annotation: "Anmerkungen" +federation: "Föderation" +instances: "Server" +registeredAt: "Registriert unter" +latestRequestSentAt: "Letzte Anfrage gesendet" +latestRequestReceivedAt: "Letzte erhaltene Anfrage" +latestStatus: "Aktueller Stand" +storageUsage: "Nutzung des Speichers" +charts: "Diagramme" +perHour: "Pro Stunde" +perDay: "Pro Tag" +stopActivityDelivery: "Sendeaktivitäten einstellen" +blockThisInstance: "Diesen Server blockieren" +operations: "Tätigkeiten" +software: "Software" +version: "Version" +metadata: "Metadaten" +monitor: "Überwachung" +jobQueue: "Auftragswarteschlange" +cpuAndMemory: "CPU und Speicher" +network: "Netzwerk" +disk: "Festplatte" +instanceInfo: "Serverinformationen" +statistics: "Statistiken" +clearQueue: "Warteschlange löschen" +clearQueueConfirmTitle: "Sind Sie sicher, dass Sie die Warteschlange löschen wollen?" +clearQueueConfirmText: "Nicht zugestellte Beiträge, die in der Warteschlange verbleiben, + werden nicht föderiert. Normalerweise ist dieser Vorgang nicht erforderlich." +clearCachedFiles: "Cache leeren" +clearCachedFilesConfirm: "Sind Sie sicher, dass Sie alle im Cache zwischengespeicherten + Dateien löschen wollen?" +blockedInstances: "Blockierte Server" +blockedInstancesDescription: "Geben Sie die Hostnamen der Server, getrennt durch einen + Zeilenumbruch, an, die Sie blockieren möchten. Aufgelistete (blockierte) Server + können nicht mehr mit diesem Server kommunizieren." +muteAndBlock: "Stummschaltungen und Blockierungen" +mutedUsers: "Stummgeschaltete Nutzer" +blockedUsers: "Blockierte Nutzer" +noUsers: "Es sind keine Nutzer vorhanden" +editProfile: "Profil bearbeiten" +noteDeleteConfirm: "Sind Sie sicher, dass Sie diesen Beitrag löschen wollen?" +pinLimitExceeded: "Sie können keine weiteren Beiträge anpinnen" +intro: "Die Installation von Calckey ist abgeschlossen! Bitte erstellen Sie einen + Admin-Benutzer." +done: "Erledigt" +processing: "In Bearbeitung" +preview: "Vorschau" +default: "Standard" +defaultValueIs: "Der Standardwert ist: {value}" +noCustomEmojis: "Es gibt keine benutzerdefinierten Emoji" +noJobs: "Keine Jobs vorhanden" +federating: "Eine Verbindung zum Server wird hergestellt" +blocked: "Blockiert" +suspended: "suspendiert" +all: "Alles" +subscribing: "Registrieren" +publishing: "Veröffentlichen" +notResponding: "Antwortet nicht" +instanceFollowing: "Folgen auf dem Server" +instanceFollowers: "Follower des Servers" +instanceUsers: "Nutzer dieses Servers" +changePassword: "Passwort ändern" +security: "Sicherheit" +retypedNotMatch: "Die Eingaben stimmen nicht überein." +currentPassword: "Aktuelles Passwort" +newPassword: "Neues Passwort" +newPasswordRetype: "Neues Passwort bestätigen" +attachFile: "Dateien anhängen" +more: "Mehr!" +featured: "Besonderheiten" +usernameOrUserId: "Nutzername oder Nutzer-ID" +noSuchUser: "Nutzer nicht gefunden" +lookup: "Suche nach" +announcements: "Bekanntmachungen" +imageUrl: "Bild-URL" +remove: "Löschen" +removed: "Erfolgreich gelöscht" +removeAreYouSure: "Sind Sie sicher, dass Sie \"{x}\" entfernen wollen?" +deleteAreYouSure: "Sind Sie sicher, dass Sie \"{x}\" löschen wollen?" +resetAreYouSure: "Wirklich zurücksetzen?" +saved: "Gespeichert" +messaging: "Chat" +upload: "Hochladen" +keepOriginalUploading: "Originalbild behalten" +keepOriginalUploadingDescription: "Speichert das ursprünglich hochgeladene Bild so, + wie es ist. Wenn diese Option deaktiviert ist, wird beim Hochladen eine Version + für die Anzeige im Web erstellt." +fromDrive: "Vom Laufwerk" +fromUrl: "Von einer URL" +uploadFromUrl: "Von einer URL hochladen" +uploadFromUrlDescription: "URL der Datei, die Sie hochladen wollen" +uploadFromUrlRequested: "Upload angefordert" +uploadFromUrlMayTakeTime: "Es kann einige Zeit dauern, bis das Hochladen abgeschlossen + ist." +explore: "Erkunden" +messageRead: "Gelesen" +noMoreHistory: "Es gibt keine weitere Historie" +startMessaging: "Einen neuen Chat beginnen" +nUsersRead: "Gelesen von {n}" +agreeTo: "Ich stimme {0} zu" +tos: "Nutzungsbedingungen" +start: "Beginnen Sie" +home: "Home" +remoteUserCaution: "Informationen von Nutzern anderer Server sind möglicherweise unvollständig." +activity: "Aktivität" +images: "Bilder" +birthday: "Geburtstag" +yearsOld: "{age} Jahre alt" +registeredDate: "Registriert am" +location: "Ort" +theme: "Farbverwaltung" +themeForLightMode: "Farbkombination zur Verwendung im hellen Modus" +themeForDarkMode: "Farbkombination zur Verwendung im dunklen Modus" +light: "Hell" +dark: "Dunkel" +lightThemes: "Helle Farbkombinationen" +darkThemes: "Dunkle Farbkombinationen" +syncDeviceDarkMode: "Einstellung deines Geräts übernehmen" +drive: "Cloud-Drive" +fileName: "Dateiname" +selectFile: "Datei auswählen" +selectFiles: "Dateien auswählen" +selectFolder: "Ordner auswählen" +selectFolders: "Ordner auswählen" +renameFile: "Datei umbenennen" +folderName: "Ordnername" +createFolder: "Ordner erstellen" +renameFolder: "Ordner umbenennen" +deleteFolder: "Ordner löschen" +addFile: "Datei hinzufügen" +emptyDrive: "Deine Cloud-Drive ist leer" +emptyFolder: "Dieser Ordner ist leer" +unableToDelete: "Nicht löschbar" +inputNewFileName: "Gib einen neuen Dateinamen ein" +inputNewDescription: "Gib eine neue Beschreibung ein" +inputNewFolderName: "Gib einen neuen Ordnernamen ein" +circularReferenceFolder: "Der Zielordner ist ein Unterorder des Ordners, den du verschieben + möchtest." +hasChildFilesOrFolders: "Dieser Ordner kann nicht gelöscht werden, da er nicht leer + ist." +copyUrl: "URL kopieren" +rename: "Umbenennen" +avatar: "Profilbild" +banner: "Banner" +nsfw: "NSFW" +whenServerDisconnected: "Bei Verbindungsverlust zum Server" +disconnectedFromServer: "Die Verbindung zum Server wurde getrennt" +reload: "Aktualisieren" +doNothing: "Ignorieren" +reloadConfirm: "Seite neu laden?" +watch: "Beobachten" +unwatch: "Nicht mehr beobachten" +accept: "Akzeptieren" +reject: "Ablehnen" +normal: "Normal" +instanceName: "Server-Name" +instanceDescription: "Server-Beschreibung" +maintainerName: "Betreiber" +maintainerEmail: "Betreiber-Email" +tosUrl: "URL der Nutzungsbedingungen" +thisYear: "Jahr" +thisMonth: "Monat" +today: "Heute" +dayX: "{day}" +monthX: "{month}" +yearX: "{year}" +pages: "Nutzer-Seiten" +integration: "Integration" +connectService: "Verbinden" +disconnectService: "Trennen" +enableLocalTimeline: "Local-Timeline aktivieren" +enableGlobalTimeline: "Global-Timeline aktivieren" +disablingTimelinesInfo: "Administratoren und Moderatoren haben immer Zugriff auf alle + Timelines, auch wenn diese deaktiviert sind." +registration: "Registrieren" +enableRegistration: "Registration neuer Nutzer erlauben" +invite: "Einladen" +driveCapacityPerLocalAccount: "Cloud-Drive-Kapazität pro lokalem Nutzerkonto" +driveCapacityPerRemoteAccount: "Laufwerkskapazität pro Remote-Nutzer" +inMb: "In Megabytes" +iconUrl: "Icon-URL (favicon etc)" +bannerUrl: "Banner-URL" +backgroundImageUrl: "Hintergrundbild-URL" +basicInfo: "Grundlegende Informationen" +pinnedUsers: "Angeheftete Nutzer" +pinnedUsersDescription: "Gib durch Leerzeichen getrennte Nutzer an, die an die \"\ + Erkunden\"-Seite angeheftet werden sollen." +pinnedPages: "Angeheftete Nutzer-Seiten" +pinnedPagesDescription: "Geben Sie die Dateipfade, getrennt durch Zeilenumbrüche, + derjenigen Seiten ein, die Sie an die obere Seitenbegrenzung des Servers anpinnen + möchten." +pinnedClipId: "ID des anzuheftenden Clips" +pinnedNotes: "Angeheftete Beiträge" +hcaptcha: "hCaptcha" +enableHcaptcha: "hCaptcha aktivieren" +hcaptchaSiteKey: "Site key" +hcaptchaSecretKey: "Secret key" +recaptcha: "reCAPTCHA" +enableRecaptcha: "reCAPTCHA aktivieren" +recaptchaSiteKey: "Site key" +recaptchaSecretKey: "Secret key" +avoidMultiCaptchaConfirm: "Das Verwenden von mehreren Captcha-Systemen kann zu Störungen + führen. Sollen die anderen Systeme deaktiviert werden? Durch Abbrechen können mehrere + Systeme aktiviert bleiben." +antennas: "News-Picker" +manageAntennas: "News-Picker verwalten" +name: "Name" +antennaSource: "Quellen der News-Picker" +antennaKeywords: "Zu beobachtende Schlüsselwörter" +antennaExcludeKeywords: "Zu ignorierende Schlüsselwörter" +antennaKeywordsDescription: "Zum Nutzen einer \"UND\"-Verknüpfung Einträge mit Leerzeichen + trennen, zum Nutzen einer \"ODER\"-Verknüpfung Einträge mit einem Zeilenumbruch + trennen." +notifyAntenna: "Über neue Beiträge benachrichtigen" +withFileAntenna: "Nur Beiträge mit Dateien" +enableServiceworker: "Push-Benachrichtigungen im Browser aktivieren" +antennaUsersDescription: "Nutzernamen getrennt durch Zeilenumbrüche angeben" +caseSensitive: "Groß-/Kleinschreibung unterscheiden" +withReplies: "Antworten beinhalten" +connectedTo: "Mit folgenden Nutzerkonten verknüpft" +notesAndReplies: "Beiträge und Antworten" +withFiles: "Beiträge mit Dateien" +silence: "stummschalten" +silenceConfirm: "Sind Sie sicher, dass Sie diesen Benutzer Stummschalten möchten?" +unsilence: "Stummschaltung aufheben" +unsilenceConfirm: "Sind Sie sicher, dass Sie die Stummschaltung dieses Benutzers rückgängig + machen wollen?" +popularUsers: "Beliebte Nutzer" +recentlyUpdatedUsers: "Vor kurzem aktive Nutzer" +recentlyRegisteredUsers: "Vor kurzem registrierte Nutzer" +recentlyDiscoveredUsers: "Vor kurzem gefundene Nutzer" +exploreUsersCount: "Es gibt {count} Nutzer" +exploreFediverse: "Das Fediverse erkunden" +popularTags: "Beliebte Schlagwörter" +userList: "Liste" +about: "Über" +aboutMisskey: "Über Calckey" +administrator: "Administrator" +token: "Token" +twoStepAuthentication: "Zwei-Faktor-Authentifizierung" +moderator: "Moderator" +moderation: "Moderation" +nUsersMentioned: "Von {n} Nutzern erwähnt" +securityKey: "Sicherheitsschlüssel" +securityKeyName: "Schlüsselname" +registerSecurityKey: "Sicherheitsschlüssel registrieren" +lastUsed: "Zuletzt benutzt" +unregister: "Deaktivieren" +passwordLessLogin: "Passwortloses Anmelden einrichten" +resetPassword: "Passwort zurücksetzen" +newPasswordIs: "Das neue Passwort ist „{password}“" +reduceUiAnimation: "Animationen der Benutzeroberfläche reduzieren" +share: "Teilen" +notFound: "Nicht gefunden" +notFoundDescription: "Es konnte keine Seite unter dieser URL gefunden werden." +uploadFolder: "Standardordner für Uploads" +cacheClear: "Cache leeren" +markAsReadAllNotifications: "Alle Benachrichtigungen als gelesen markieren" +markAsReadAllUnreadNotes: "Alle Beiträge als gelesen markieren" +markAsReadAllTalkMessages: "Alle Chats als gelesen markieren" +help: "Hilfe" +inputMessageHere: "Hier Beitrag eingeben" +close: "Schließen" +group: "Gruppe" +groups: "Gruppen" +createGroup: "Gruppe erstellen" +ownedGroups: "Meine Gruppen" +joinedGroups: "Beigetretene Gruppen" +invites: "Einladungen" +groupName: "Gruppenname" +members: "Mitglieder" +transfer: "Übertragen" +messagingWithUser: "Privatchat" +messagingWithGroup: "Gruppenchat" +title: "Titel" +text: "Text" +enable: "Aktivieren" +next: "Weiter" +retype: "Erneut eingeben" +noteOf: "Beitrag von {user}" +inviteToGroup: "Zu Gruppe einladen" +quoteAttached: "Zitat" +quoteQuestion: "Als Zitat anhängen?" +noMessagesYet: "Noch keine Beiträge vorhanden" +newMessageExists: "Du hast eine neue Nachricht" +onlyOneFileCanBeAttached: "Es kann pro Beitrag nur eine Datei angehängt werden" +signinRequired: "Bitte registriere oder melde dich an, um fortzufahren" +invitations: "Einladungen" +invitationCode: "Einladungscode" +checking: "Wird überprüft …" +available: "Verfügbar" +unavailable: "Unverfügbar" +usernameInvalidFormat: "Du kannst Klein- und Großbuchstaben, Zahlen sowie Unterstriche + verwenden." +tooShort: "Zu kurz" +tooLong: "Zu lang" +weakPassword: "Schwaches Passwort" +normalPassword: "Durchschnittliches Passwort" +strongPassword: "Starkes Passwort" +passwordMatched: "Stimmt überein" +passwordNotMatched: "Stimmt nicht überein" +signinWith: "Mit {x} anmelden" +signinFailed: "Anmeldung fehlgeschlagen. Überprüfe Nutzername und Passswort." +tapSecurityKey: "Tippe deinen Sicherheitsschlüssel an" +or: "Oder" +language: "Sprache" +uiLanguage: "Sprache der Benutzeroberfläche" +groupInvited: "Du wurdest in eine Gruppe eingeladen" +aboutX: "Über {x}" +useOsNativeEmojis: "Eingebaute Emojis des Betriebssystems benutzen" +disableDrawer: "Keine ausfahrbaren Menüs verwenden" +youHaveNoGroups: "Keine Gruppen vorhanden" +joinOrCreateGroup: "Lass dich zu einer Gruppe einladen oder erstelle deine eigene." +noHistory: "Kein Verlauf gefunden" +signinHistory: "Anmeldungsverlauf" +disableAnimatedMfm: "MFM, die Animationen enthalten, deaktivieren" +doing: "In Bearbeitung …" +category: "Kategorie" +tags: "Schlagwörter" +docSource: "Quellcode dieses Dokuments" +createAccount: "Nutzerkonto erstellen" +existingAccount: "Bestehendes Nutzerkonto" +regenerate: "Regenerieren" +fontSize: "Schriftgröße" +noFollowRequests: "Keine ausstehenden Follow-Anfragen vorhanden" +openImageInNewTab: "Bilder in neuem Tab öffnen" +dashboard: "Dashboard" +local: "Lokal" +remote: "Fremd" +total: "Gesamt" +weekOverWeekChanges: "Veränderung zu letzter Woche" +dayOverDayChanges: "Veränderung zu Gestern" +appearance: "Aussehen" +clientSettings: "Client-Einstellungen" +accountSettings: "Nutzerkonto-Einstellungen" +promotion: "geworben" +promote: "Werben" +numberOfDays: "Anzahl der Tage" +hideThisNote: "Diesen Beitrag verstecken" +showFeaturedNotesInTimeline: "Beliebte Beiträge in der Timeline anzeigen" +objectStorage: "Objektspeicher" +useObjectStorage: "Object Storage verwenden" +objectStorageBaseUrl: "Basis-URL" +objectStorageBaseUrlDesc: "Die als Referenz verwendete URL. Verwendest du einen CDN + oder Proxy, gib dessen URL an. \nFür S3 verwende 'https://.s3.amazonaws.com'. + Für GCS o.ä. verwende 'https://storage.googleapis.com/'." +objectStorageBucket: "Eimer" +objectStorageBucketDesc: "Bitte gib den Namen des Buckets an, der bei deinem Anbieter + verwendet wird." +objectStoragePrefix: "Prefix" +objectStoragePrefixDesc: "Dateien werden in Ordnern unter diesem Prefix gespeichert." +objectStorageEndpoint: "Limit" +objectStorageEndpointDesc: "Im Falle von S3 leerlassen, für andere Anbieter den relevanten + Endpoint im Format „“ oder „:“ angeben." +objectStorageRegion: "Region" +objectStorageRegionDesc: "Gib eine Region wie z.B. „xx-east-1“ an. Falls dein Anbieter + nicht zwischen Regionen unterscheidet, lass dieses Feld leer oder gib „us-east-1“ + an." +objectStorageUseSSL: "SSL verwenden" +objectStorageUseSSLDesc: "Deaktiviere dies, falls du für API-Verbindungen kein HTTPS + verwenden wirst" +objectStorageUseProxy: "Über Proxy verbinden" +objectStorageUseProxyDesc: "Deaktiviere dies, falls du keinen Proxy für den Objektspeicher + verwenden wirst" +objectStorageSetPublicRead: "Bei Upload auf \"public-read\" stellen" +serverLogs: "Serverprotokolle" +deleteAll: "Alle löschen" +showFixedPostForm: "Bereich zum Schreiben neuer Beiträge am Anfang der Timeline anzeigen" +newNoteRecived: "Es gibt neue Beiträge" +sounds: "Töne" +listen: "Anhören" +none: "Nichts" +showInPage: "In einer Seite anzeigen" +popout: "Pop-Up" +volume: "Lautstärke" +masterVolume: "Gesamtlautstärke" +details: "Details" +chooseEmoji: "Emoji auswählen" +unableToProcess: "Der Vorgang konnte nicht abgeschlossen werden" +recentUsed: "Vor kurzem verwendet" +install: "Installieren" +uninstall: "Uninstallieren" +installedApps: "Authorisierte Anwendungen" +nothing: "Hier gibt es nichts zu sehen" +installedDate: "Authorisiert am" +lastUsedDate: "Zuletzt verwendet am" +state: "Status" +sort: "Sortieren" +ascendingOrder: "Aufsteigende Reihenfolge" +descendingOrder: "Absteigende Reihenfolge" +scratchpad: "Testumgebung" +scratchpadDescription: "Die Testumgebung bietet einen Bereich für AiScript-Experimente. + Dort kannst du AiScript schreiben, ausführen sowie dessen Auswirkungen auf Calckey + überprüfen." +output: "Ausgabe" +script: "Skript" +disablePagesScript: "AiScript auf Seiten deaktivieren" +updateRemoteUser: "Nutzerinformationen aktualisieren" +deleteAllFiles: "Alle Dateien löschen" +deleteAllFilesConfirm: "Möchtest du wirklich alle Dateien löschen?" +removeAllFollowing: "Allen gefolgten Nutzern entfolgen" +removeAllFollowingDescription: "Wenn Sie dies ausführen, werden alle Konten von {host} + entfolgt. Bitte führen Sie dies aus, wenn der Server beispielsweise nicht mehr existiert." +userSuspended: "Dieser Nutzer wurde gesperrt." +userSilenced: "Dieser Nutzer wurde instanzweit stummgeschaltet." +yourAccountSuspendedTitle: "Dieses Nutzerkonto ist gesperrt" +yourAccountSuspendedDescription: "Dieses Nutzerkonto wurde gesperrt, da es gegen die + Nutzungsbedingungen dieses Servers verstoßen hat. Trete mit dem Betreiber in Kontakt, + falls du weitere Details erfahren möchtest. Bitte erstelle kein neues Nutzerkonto." +menu: "Menü" +divider: "Trenner" +addItem: "Element hinzufügen" +relays: "Relays" +addRelay: "Relay hinzufügen" +inboxUrl: "inbox-URL" +addedRelays: "Hinzugefügte Relays" +serviceworkerInfo: "Muss für Push-Benachrichtigungen aktiviert sein." +deletedNote: "Gelöschter Beitrag" +invisibleNote: "Privater Beitrag" +enableInfiniteScroll: "Automatisch mehr laden" +visibility: "Sichtbarkeit" +poll: "Umfrage" +useCw: "Inhaltswarnung verwenden" +enablePlayer: "Video-Player öffnen" +disablePlayer: "Video-Player schließen" +expandTweet: "Tweet ausklappen" +themeEditor: "Farbkombinations-Editor" +description: "Beschreibung" +describeFile: "Beschreibung hinzufügen" +enterFileDescription: "Beschreibung eingeben" +author: "Autor" +leaveConfirm: "Es gibt unspeicherte Änderungen. Möchtest du diese verwerfen?" +manage: "Verwaltung" +plugins: "Plugins" +preferencesBackups: "Einstellungsbackups" +deck: "Deck" +undeck: "Deck verlassen" +useBlurEffectForModal: "Weichzeichnungseffekt für Modals verwenden" +useFullReactionPicker: "Vollständige Reaktionsauswahl verwenden" +width: "Breite" +height: "Höhe" +large: "Groß" +medium: "Mittel" +small: "Klein" +generateAccessToken: "Zugriffstoken generieren" +permission: "Berechtigungen" +enableAll: "Alle aktivieren" +disableAll: "Alle deaktivieren" +tokenRequested: "Zugriff zum Nutzerkonto gewähren" +pluginTokenRequestedDescription: "Dieses Plugin wird die hier konfigurierten Berechtigungen + verwenden können." +notificationType: "Art der Benachrichtigung" +edit: "Bearbeiten" +emailServer: "Email-Server" +enableEmail: "Email-Versand aktivieren" +emailConfigInfo: "Zur Email-Bestätigung bei Registrierung oder zum Zurücksetzen des + Passworts verwendet" +email: "Email" +emailAddress: "Email-Adresse" +smtpConfig: "SMTP-Server Konfiguration" +smtpHost: "Host" +smtpPort: "Port" +smtpUser: "Nutzername" +smtpPass: "Passwort" +emptyToDisableSmtpAuth: "Nutzername und Passwort leer lassen, um SMTP-Verifizierung + zu deaktivieren" +smtpSecure: "Für SMTP-Verbindungen implizit SSL/TLS verwenden" +smtpSecureInfo: "Schalte dies aus, falls du STARTTLS verwendest" +testEmail: "Emailversand testen" +wordMute: "Wortfilter" +regexpError: "Fehler in einem regulären Ausdruck" +regexpErrorDescription: "Im regulären Ausdruck deines {tab}en Wortfilters ist ein + Fehler aufgetreten:" +instanceMute: "Server-Stummschaltungen" +userSaysSomething: "{name} hat etwas gesagt" +makeActive: "Aktivieren" +display: "Anzeigeart" +copy: "Kopieren" +metrics: "Metriken" +overview: "Übersicht" +logs: "Protokolle" +delayed: "Verzögert" +database: "Datenbank" +channel: "Channels" +create: "Erstellen" +notificationSetting: "Benachrichtigungseinstellungen" +notificationSettingDesc: "Wähle die Art der anzuzeigenden Benachrichtigungen." +useGlobalSetting: "Globale Einstellung verwenden" +useGlobalSettingDesc: "Ist diese Option aktiviert, werden die Benachrichtigungseinstellungen + deines Nutzerkontos verwendet. Durch ausschalten dieser Option können individuelle + Einstellungen vorgenommen werden." +other: "Anderes" +regenerateLoginToken: "Anmeldetoken regenerieren" +regenerateLoginTokenDescription: "Den zur Anmeldung intern verwendeten Token regenerieren. + Normalerweise wird dies nicht benötigt. Bei Regeneration werden alle Geräte ausgeloggt." +setMultipleBySeparatingWithSpace: "Trenne Elemente durch ein Leerzeichen um mehrere + Einstellungen zu kofigurieren." +fileIdOrUrl: "Datei-ID oder URL" +behavior: "Verhalten" +sample: "Beispiel" +abuseReports: "Meldungen" +reportAbuse: "Melden" +reportAbuseOf: "{name} melden" +fillAbuseReportDescription: "Bitte gib zusätzliche Informationen zu dieser Meldung + an. Falls es sich um einen ungewöhnlichen Beitrag handelt, gib bitte dessen URL + an." +abuseReported: "Deine Meldung wurde versendet. Vielen Dank." +reporter: "Melder" +reporteeOrigin: "Herkunft des Gemeldeten" +reporterOrigin: "Herkunft des Meldenden" +forwardReport: "Einen Meldung zusätzlich an den mit-beteiligten Server senden" +forwardReportIsAnonymous: "Anstelle Ihres Nutzerkontos wird ein anonymes Systemkonto + als Hinweisgeber auf dem mit-beteiligten Server angezeigt." +send: "Senden" +abuseMarkAsResolved: "Meldung als gelöst markieren" +openInNewTab: "In neuem Tab öffnen" +openInSideView: "In Seitenansicht öffnen" +defaultNavigationBehaviour: "Standardnavigationsverhalten" +editTheseSettingsMayBreakAccount: "Bei Bearbeitung dieser Einstellungen besteht die + Gefahr, dein Nutzerkonto zu beschädigen." +instanceTicker: "Zeige zu einem Beitrag den Herkunfts-Server an" +waitingFor: "Warte auf {x}" +random: "Zufällig" +system: "System" +switchUi: "Layout" +desktop: "Desktop" +clip: "Clip erstellen" +createNew: "Neu erstellen" +optional: "optional" +createNewClip: "Neuen Clip erstellen" +unclip: "Aus Clip entfernen" +confirmToUnclipAlreadyClippedNote: "Dieser Beitrag ist bereits im \"{name}\" Clip + enthalten. Möchtest du ihn aus diesem Clip entfernen?" +public: "Öffentlich" +i18nInfo: "Calckey wird durch freiwillige Helfer in viele verschiedene Sprachen übersetzt. + Auf {link} kannst du mithelfen." +manageAccessTokens: "Zugriffstokens verwalten" +accountInfo: "Nutzerkonto-Informationen" +notesCount: "Anzahl der Beiträge" +repliesCount: "Anzahl gesendeter Antworten" +renotesCount: "Anzahl getätigter Renotes" +repliedCount: "Anzahl erhaltener Antworten" +renotedCount: "Anzahl erhaltener Renotes" +followingCount: "Anzahl gefolgter Nutzer" +followersCount: "Anzahl an Followern" +sentReactionsCount: "Anzahl gesendeter Reaktionen" +receivedReactionsCount: "Anzahl erhaltener Reaktionen" +pollVotesCount: "Anzahl gesendeter Antworten auf Umfragen" +pollVotedCount: "Anzahl erhaltener Antworten auf Umfragen" +yes: "Ja" +no: "Nein" +driveFilesCount: "Anzahl der Dateien in Cloud-Drive" +driveUsage: "Cloud-Drive-Auslastung" +noCrawle: "Crawler-Indexierung ablehnen" +noCrawleDescription: "Suchmaschinen bitten, die eigene Profilseite, Beiträge, Nutzer-Seiten + usw. nicht zu indexieren." +lockedAccountInfo: "Auch wenn du Follow-Anfragen auf manuelle Bestätigung setzt, wird + jeder deiner Posts öffentlich sichtbar sein, sofern du ihre Sichtbarkeit nicht auf + \"Nur Follower\" setzt." +alwaysMarkSensitive: "Medien standardmäßig als NSFW markieren" +loadRawImages: "Anstatt Vorschaubilder immer Originalbilder anzeigen" +disableShowingAnimatedImages: "Animierte Bilder nicht abspielen" +verificationEmailSent: "Eine Bestätigungsmail wurde an deine Email-Adresse versendet. + Besuche den dort enthaltenen Link, um die Verifizierung abzuschließen." +notSet: "Nicht konfiguriert" +emailVerified: "Email-Adresse bestätigt" +noteFavoritesCount: "Anzahl der favorisierten Beiträge" +pageLikesCount: "Anzahl an als \"Gefällt mir\" markierter Nutzer-Seiten" +pageLikedCount: "Anzahl erhaltener \"Gefällt mir\" auf Nutzer-Seiten" +contact: "Kontakt" +useSystemFont: "Standardschriftart des Systems verwenden" +clips: "Clips" +experimentalFeatures: "Experimentelle Funktionalitäten" +developer: "Entwickler" +makeExplorable: "Nutzerkonto in „Erkunden“ sichtbar machen" +makeExplorableDescription: "Wenn diese Option deaktiviert ist, ist dein Nutzerkonto + nicht im „Erkunden“-Bereich sichtbar." +showGapBetweenNotesInTimeline: "Abstände zwischen Beiträgen in der Timeline anzeigen" +duplicate: "Duplizieren" +left: "Links" +center: "Mittig" +wide: "Breit" +narrow: "Schmal" +reloadToApplySetting: "Diese Einstellung tritt nach einer Aktualisierung der Seite + in Kraft. Jetzt aktualisieren?" +needReloadToApply: "Diese Einstellung tritt nach einer Aktualisierung der Seite in + Kraft." +showTitlebar: "Titelleiste anzeigen" +clearCache: "Cache leeren" +onlineUsersCount: "{n} Nutzer sind online" +nUsers: "{n} Nutzer" +nNotes: "{n} Beiträge" +sendErrorReports: "Fehlerberichte senden" +sendErrorReportsDescription: "Ist diese Option aktiviert, so werden beim Auftreten + von Fehlern detaillierte Fehlerinformationen an Calckey weitergegeben, was zur Verbesserung + der Qualität von Calckey beiträgt.\nEnthalten in diesen Informationen sind u.a. + die Version deines Betriebssystems, welchen Browser du verwendest und ein Verlauf + deiner Aktivitäten innerhalb Calckey." +myTheme: "Meine Farbkombination" +backgroundColor: "Hintergrundfarbe" +accentColor: "Akzentfarbe" +textColor: "Textfarbe" +saveAs: "Speichern als …" +advanced: "Fortgeschritten" +value: "Wert" +createdAt: "Erstellt am" +updatedAt: "Zuletzt geändert am" +saveConfirm: "Änderungen speichern?" +deleteConfirm: "Wirklich löschen?" +invalidValue: "Dieser Wert ist ungültig." +registry: "Registry" +closeAccount: "Nutzerkonto schließen" +currentVersion: "Momentane Version" +latestVersion: "Neuste Version" +youAreRunningUpToDateClient: "Du verwendest die neuste Version deines Clients." +newVersionOfClientAvailable: "Eine neuere Version deines Clients ist verfügbar." +usageAmount: "Verwendung" +capacity: "Kapazität" +inUse: "Verwendet" +editCode: "Code bearbeiten" +apply: "Anwenden" +receiveAnnouncementFromInstance: "Benachrichtigungen von diesem Server empfangen" +emailNotification: "Email-Benachrichtigungen" +publish: "Veröffentlichen" +inChannelSearch: "In Kanal suchen" +useReactionPickerForContextMenu: "Reaktionsauswahl durch Rechtsklick öffnen" +typingUsers: "{users} ist/sind am schreiben" +jumpToSpecifiedDate: "Zu bestimmtem Datum springen" +showingPastTimeline: "Es wird eine alte Timeline angezeigt" +clear: "Leeren" +markAllAsRead: "Alle als gelesen markieren" +goBack: "Zurück" +unlikeConfirm: "\"Gefällt mir\" wirklich entfernen?" +fullView: "Vollansicht" +quitFullView: "Vollansicht verlassen" +addDescription: "Beschreibung hinzufügen" +userPagePinTip: "Um Beiträge hier erscheinen zu lassen, drücke \"An dein Profil anheften\"\ + \ im Menü individueller Beiträge." +notSpecifiedMentionWarning: "Dieser Beitrag enthält Erwähnungen von Nutzern, die nicht + als Empfänger ausgewählt sind" +info: "Über" +userInfo: "Nutzerinformation" +unknown: "Unbekannt" +onlineStatus: "Onlinestatus" +hideOnlineStatus: "Onlinestatus verbergen" +hideOnlineStatusDescription: "Das Verbergen deines Onlinestatuses reduziert die Nützlichkeit + von Funktionen wie der Suche." +online: "Online" +active: "Aktiv" +offline: "Offline" +notRecommended: "Nicht empfohlen" +botProtection: "Schutz vor Bots" +instanceBlocking: "Verbundene Server verwalten" +selectAccount: "Nutzerkonto auswählen" +switchAccount: "Konto wechseln" +enabled: "Aktiviert" +disabled: "Deaktiviert" +quickAction: "Schnellaktionen" +user: "Nutzer" +administration: "Verwaltung" +accounts: "Nutzerkonten" +switch: "Wechseln" +noMaintainerInformationWarning: "Betreiberinformationen sind nicht konfiguriert." +noBotProtectionWarning: "Schutz vor Bots ist nicht konfiguriert." +configure: "Konfigurieren" +postToGallery: "Erstelle einen neuen Beitrag zur Bilder-Galerie" +gallery: "Bilder-Galerie" +recentPosts: "Neue Beiträge" +popularPosts: "Beliebte Beiträge" +shareWithNote: "Mit Beitrag teilen" +ads: "Werbeanzeigen" +expiration: "Frist" +memo: "Merkzettel" +priority: "Priorität" +high: "Hoch" +middle: "Mittel" +low: "Niedrig" +emailNotConfiguredWarning: "Keine Email-Adresse hinterlegt." +ratio: "Verhältnis" +previewNoteText: "Vorschau anzeigen" +customCss: "Benutzerdefiniertes CSS" +customCssWarn: "Verwende diese Einstellung nur, wenn du weißt, was sie tut. Ungültige + Eingaben können dazu führen, dass der Client nicht mehr normal funktioniert." +global: "Global" +squareAvatars: "Profilbilder quadratisch anzeigen" +sent: "Gesendet" +received: "Erhalten" +searchResult: "Suchergebnisse" +hashtags: "Hashtags" +troubleshooting: "Problembehandlung" +useBlurEffect: "Weichzeichnungseffekt in der Benutzeroberfläche verwenden" +learnMore: "Mehr erfahren" +misskeyUpdated: "Calckey wurde aktualisiert!" +whatIsNew: "Änderungen anzeigen" +translate: "Übersetzen" +translatedFrom: "Aus {x} übersetzt" +accountDeletionInProgress: "Die Löschung deines Nutzerkontos ist momentan in Bearbeitung" +usernameInfo: "Ein Name, durch den dein Nutzerkonto auf diesem Server identifiziert + werden kann. Du kannst das Alphabet (a~z, A~Z), Ziffern (0~9) oder Unterstriche + (_) verwenden. Nutzernamen können später nicht geändert werden." +aiChanMode: "Ai-Modus" +keepCw: "Inhaltswarnungen beibehalten" +pubSub: "Pub/Sub Nutzerkonten" +lastCommunication: "Letzte Kommunikation" +resolved: "Gelöst" +unresolved: "Ungelöst" +breakFollow: "Follower entfernen" +itsOn: "Eingeschaltet" +itsOff: "Ausgeschaltet" +emailRequiredForSignup: "Angabe einer Email-Adresse als benötigt markieren" +unread: "Ungelesen" +filter: "Filter" +controlPanel: "Systemsteuerung" +manageAccounts: "Nutzerkonten verwalten" +makeReactionsPublic: "Reaktionsverlauf veröffentlichen" +makeReactionsPublicDescription: "Jeder wird die Liste deiner gesendeten Reaktionen + einsehen können." +classic: "Mittig/zentriert" +muteThread: "Thread stummschalten" +unmuteThread: "Threadstummschaltung aufheben" +ffVisibility: "Sichtbarkeit von Gefolgten/Followern" +ffVisibilityDescription: "Konfiguriere wer sehen kann, wem du folgst sowie wer dir + folgt." +continueThread: "Beitrag fortsetzen" +deleteAccountConfirm: "Dein Nutzerkonto wird unwiderruflich gelöscht. Trotzdem fortfahren?" +incorrectPassword: "Falsches Passwort." +voteConfirm: "Wirklich für „{choice}“ abstimmen?" +hide: "Inhalt verbergen" +leaveGroup: "Gruppe verlassen" +leaveGroupConfirm: "Möchtest du „{name}“ wirklich verlassen?" +useDrawerReactionPickerForMobile: "Auf mobilen Geräten ausfahrbare Reaktionsauswahl + anzeigen" +welcomeBackWithName: "Willkommen zurück, {name}" +clickToFinishEmailVerification: "Drücke bitte auf [{ok}], um die Email-Bestätigung + abzuschließen." +overridedDeviceKind: "Gerätetyp" +smartphone: "Smartphone" +tablet: "Tablet" +auto: "Automatisch" +themeColor: "Farbe der Ticker-Laufschrift" +size: "Größe" +numberOfColumn: "Spaltenanzahl" +searchByGoogle: "Suchen" +instanceDefaultLightTheme: "Standard-Farbkombination auf diesem Server: \"Hell\"" +instanceDefaultDarkTheme: "Standard-Farbkombination auf diesem Server: \"Dunkel\"" +instanceDefaultThemeDescription: "Gib den Farbschemencode im Objektformat ein." +mutePeriod: "Dauer der Stummschaltung" +indefinitely: "Dauerhaft" +tenMinutes: "10 Minuten" +oneHour: "Eine Stunde" +oneDay: "Einen Tag" +oneWeek: "Eine Woche" +reflectMayTakeTime: "Es kann etwas dauern, bis sich dies widerspiegelt." +failedToFetchAccountInformation: "Nutzerkontoinformationen konnten nicht abgefragt + werden" +rateLimitExceeded: "Anzahl der Versuche überschritten" +cropImage: "Bild zuschneiden" +cropImageAsk: "Möchtest du das Bild zuschneiden?" +file: "Datei" +recentNHours: "Die letzten {n} Stunden" +recentNDays: "Die letzten {n} Tage" +noEmailServerWarning: "Es ist kein Email-Server konfiguriert." +thereIsUnresolvedAbuseReportWarning: "Es liegen ungelöste Meldungen vor." +recommended: "Favoriten" +check: "Kontrolle" +driveCapOverrideLabel: "Die Cloud-Drive-Kapazität dieses Nutzers verändern" +driveCapOverrideCaption: "Gib einen Wert von 0 oder weniger ein, um die Kapazität + auf den Standard zurückzusetzen." +requireAdminForView: "Melde dich mit einem Administratorkonto an, um dies einzusehen." +isSystemAccount: "Dieses Konto wird vom System erstellt und automatisch verwaltet. + Bitte moderieren, bearbeiten, löschen oder manipulieren Sie dieses Konto nicht, + da es sonst zu einem Server-Absturz kommen könnte." +typeToConfirm: "Bitte gib zur Bestätigung {x} ein" +deleteAccount: "Nutzerkonto löschen" +document: "Dokumentation" +numberOfPageCache: "Anzahl der zwischengespeicherten Seiten" +numberOfPageCacheDescription: "Das Erhöhen dieses Caches führt zu einer angenehmerern + Nutzererfahrung, erhöht aber Serverlast und Arbeitsspeicherauslastung." +logoutConfirm: "Wirklich abmelden?" +lastActiveDate: "Zuletzt verwendet am" +statusbar: "Statusleiste" +pleaseSelect: "Wähle eine Option" +reverse: "Umkehren" +colored: "Farbig" +refreshInterval: "Aktualisierungsintervall " +label: "Beschriftung" +type: "Art" +speed: "Geschwindigkeit" +slow: "Langsam" +fast: "Schnell" +sensitiveMediaDetection: "Erkennung von NSFW-Medien" +localOnly: "Nur Lokal" +remoteOnly: "Nur für andere/fremde Server" +failedToUpload: "Hochladen fehlgeschlagen" +cannotUploadBecauseInappropriate: "Diese Datei kann nicht hochgeladen werden, da Anteile + der Datei als möglicherweise NSFW festgestellt wurden." +cannotUploadBecauseNoFreeSpace: "Die Datei konnte nicht hochgeladen werden, da dein + Cloud-Drive-Speicherplatz aufgebraucht ist." +beta: "Beta" +enableAutoSensitive: "Selbstständige NSFW-Kennzeichnung" +enableAutoSensitiveDescription: "Erlaubt, wo möglich, die automatische Erkennung und + Kennzeichnung von NSFW-Medien durch maschinelles Lernen. Auch wenn diese Option + deaktiviert ist, kann sie über den Server aktiviert sein." +activeEmailValidationDescription: "Aktivert strengere Überprüfung von E-Mail-Adressen, + d.h. Testen auf Wegwerfadressen und darauf, ob mit der Adresse tatsächlich kommuniziert + werden kann. Ist dies deaktiviert, so wird nur das Format der E-Mail überprüft." +navbar: "Navigationsleiste" +shuffle: "Mischen" +account: "Nutzerkonto" +move: "Verschieben" +_sensitiveMediaDetection: + description: "Ermöglicht eine Erleichterung der Servermoderation durch die automatische + Erkennungen von NSFW-Medien unter Verwendung von Machine Learning. Hierdurch wird + die Serverlast etwas erhöht." + sensitivity: "Erkennungssensitivität" + sensitivityDescription: "Durch das Senken der Sensitivität kann die Anzahl an Fehlerkennungen + (sog. false positives) reduziert werden. Durch ein Erhöhen dieser kann die Anzahl + an verpassten Erkennungen (sog. false negatives) reduziert werden." + setSensitiveFlagAutomatically: "Als NSFW kennzeichnen" + setSensitiveFlagAutomaticallyDescription: "Die Resultate der internen Erkennung + werden beibehalten, auch wenn diese Option deaktiviert ist." + analyzeVideos: "Videoanalyse aktivieren" + analyzeVideosDescription: "Analysiert zusätzlich zu Bildern auch Videos. Die Last + des Servers wird hierdurch etwas erhöht." +_emailUnavailable: + used: "Diese Email-Adresse wird bereits verwendet" + format: "Das Format dieser Email-Adresse ist ungültig" + disposable: "Wegwerf-Email-Adressen können nicht verwendet werden" + mx: "Dieser Email-Server ist ungültig" + smtp: "Dieser Email-Server antwortet nicht" +_ffVisibility: + public: "Öffentlich" + followers: "Nur für Follower sichtbar" + private: "Privat" +_signup: + almostThere: "Fast geschafft" + emailAddressInfo: "Bitte gib deine Email-Adresse ein. Sie wird nicht öffentlich + einsehbar sein." + emailSent: "An deine Email-Adresse ({email}) wurde soeben eine Bestätigungsmail + geschickt. Bitte klicke auf den enthaltenen Link, um die Erstellung deines Nutzerkontos + abzuschließen." +_accountDelete: + accountDelete: "Nutzerkonto löschen" + mayTakeTime: "Da die Löschung eines Nutzerkontos ein aufwendiger Prozess ist, kann + dessen Dauer davon abhängen, wie viel Inhalt von diesem erstellt wurde oder wie + viele Dateien von diesem hochgeladen wurden." + sendEmail: "Sobald die Löschung abgeschlossen ist, wird an die mit ihm verknüpfte + Email-Adresse eine Benachrichtigung versendet." + requestAccountDelete: "Löschung deines Nutzerkontos anfordern" + started: "Die Löschung wurde eingeleitet." + inProgress: "Löschung in Bearbeitung" +_ad: + back: "Zurück" + reduceFrequencyOfThisAd: "Diese Werbeanzeige weniger anzeigen" +_forgotPassword: + enterEmail: "Gib die Email-Adresse ein, mit der du dich registriert hast. An diese + wird ein Link gesendet, mit dem du dein Passwort zurücksetzen kannst." + ifNoEmail: "Solltest du bei der Registrierung keine Email-Adresse angegeben haben, + wende dich bitte an den Server-Administrator." + contactAdmin: "Dieser Server unterstützt keine Verwendung von Email-Adressen. Kontaktiere + bitte den Server-Administrator, um dein Passwort zurücksetzen zu lassen." +_gallery: + my: "Meine Bilder-Galerie" + liked: "Mit \"Gefällt mir\" markierte Beiträge" + like: "Gefällt mir" + unlike: "\"Gefällt mir\" entfernen" +_email: + _follow: + title: "Du hast einen neuen Follower" + _receiveFollowRequest: + title: "Du hast eine Follow-Anfrage erhalten" +_plugin: + install: "Plugins installieren" + installWarn: "Bitte nur vertrauenswürdige Plugins installieren." + manage: "Plugins verwalten" +_preferencesBackups: + list: "Erstellte Backups" + saveNew: "Neu erstellen" + loadFile: "Von Datei laden" + apply: "Auf dieses Gerät anwenden" + save: "Speichern" + inputName: "Gib einen Namen für dieses Backup ein" + cannotSave: "Speichern fehlgeschlagen" + nameAlreadyExists: "Es existiert bereits ein Backup unter dem Namen \"{name}\". + Bitte gib einen anderen Namen ein." + applyConfirm: "Wirklich das Backup \"{name}\" auf dieses Gerät anwenden? Bestehende + Einstellungen darauf werden überschrieben." + saveConfirm: "Als {name} speichern?" + deleteConfirm: "Das Backup {name} löschen?" + renameConfirm: "Soll dieses Backup von \"{old}\" zu \"{new}\" umbenannt werden?" + noBackups: "Keine Backups existieren. Backups können über \"Neu erstellen\" erstelllt + werden." + createdAt: "Erstellt am: {date} {time}" + updatedAt: "Aktualisiert am: {date} {time}" + cannotLoad: "Laden fehlgeschlagen" + invalidFile: "Ungültiges Dateiformat" +_registry: + scope: "Scope" + key: "Schlüssel" + keys: "Schlüssel" + domain: "Domain" + createKey: "Schlüssel erstellen" +_aboutMisskey: + about: "Calckey ist ein Fork von Misskey, der seit 2022 von ThatOneCalculator entwickelt + wird." + contributors: "Hauptmitwirkende" + allContributors: "Alle Mitwirkenden" + source: "Quellcode" + translation: "Calckey übersetzen" + donate: "An Calckey spenden" + morePatrons: "Wir schätzen ebenso die Unterstützung vieler anderer hier nicht gelisteter + Personen sehr. Danke! 🥰" + patrons: "UnterstützerInnen" +_nsfw: + respect: "Mit NSFW gekennzeichnete Bilder verbergen" + ignore: "Mit NSFW gekennzeichnete Bilder nicht verbergen" + force: "Alle Medien verbergen" +_mfm: + cheatSheet: "MFM Spickzettel" + intro: "MFM ist eine Markup-Sprache, die in Misskey, Calckey, Akkoma und anderen + Programmen verwendet wird und an vielen Stellen eingesetzt werden kann. Hier können + Sie eine Liste aller verfügbaren MFM-Syntaxe einsehen." + dummy: "Calckey erweitert die Welt des Fediverse" + mention: "Erwähnung" + mentionDescription: "Mit At-Zeichen und Nutzername kann ein individueller Nutzer + angegeben werden." + hashtag: "Hashtag" + hashtagDescription: "Mit einer Raute und Text kann ein Hashtag angegeben werden." + url: "URL" + urlDescription: "Zeigt URLs an." + link: "Link" + linkDescription: "Zeigt spezifische Textabschnitte als URL an." + bold: "Fett" + boldDescription: "Zeichen zur Betonung dicker erscheinen lassen." + small: "Klein" + smallDescription: "Inhalt klein und dünn erscheinen lassen." + center: "Zentrieren" + centerDescription: "Inhalt zentriert anzeigen." + inlineCode: "Code (Eingebettet)" + inlineCodeDescription: "Syntax-Hervorhebung für (Programm-)Code eingebettet anzeigen." + blockCode: "Code (Block)" + blockCodeDescription: "Syntax-Hervorhebung für mehrzeiligen (Programm-)Code als + Block anzeigen." + inlineMath: "Mathe (Eingebettet)" + inlineMathDescription: "Mathematische Formeln (KaTeX) eingebettet anzeigen" + blockMath: "Mathe (Block)" + blockMathDescription: "Mathematische Formeln (KaTeX) als Block einbetten" + quote: "Zitationen" + quoteDescription: "Inhalt als Zitat anzeigen." + emoji: "Benutzerdefinierte Emojis" + emojiDescription: "Durch das Umschließen von Emoji-Namen durch Doppelpunkte können + benutzerdefinierte Emojis angezeigt werden." + search: "Suche" + searchDescription: "Eine vorgefertige Suchanfragebox anzeigen." + flip: "Spiegelung" + flipDescription: "Inhalt horizontal oder vertikal gespiegelt anzeigen." + jelly: "Animation (Dehnen)" + jellyDescription: "Verleiht Inhalt eine sich dehnende Animation." + tada: "Animation (Tada)" + tadaDescription: "Verleiht Inhalt eine Animation mit \"Tada!\"-Gefühl." + jump: "Animation (Sprung)" + jumpDescription: "Verleiht Inhalt eine springende Animation." + bounce: "Animation (Federn)" + bounceDescription: "Verleiht Inhalt eine federnde Animation." + shake: "Animation (Zittern)" + shakeDescription: "Verleiht Inhalt eine zitternde Animation." + twitch: "Animation (Zucken)" + twitchDescription: "Verleiht Inhalt eine sehr stark zuckende Animation." + spin: "Animation (Rotieren)" + spinDescription: "Verleiht Inhalt eine rotierende Animation." + x2: "Groß" + x2Description: "Inhalte größer anzeigen." + x3: "Sehr groß" + x3Description: "Inhalte noch größer anzeigen." + x4: "Unglaublich groß" + x4Description: "Lässt Inhalte noch größer als größer als groß angezeigt werden." + blur: "Weichzeichnen" + blurDescription: "Inhalte durch Weihzeichnung verschwimmen lassen. Durch das Bewegen + des Mauszeigers über den Inhalt wird er klar angezeigt." + font: "Schriftart" + fontDescription: "Setzt die Schriftart des Inhaltes fest." + rainbow: "Regenbogen" + rainbowDescription: "Lässt den Inhalt in Regenbogenfarben erscheinen." + sparkle: "Glitzer" + sparkleDescription: "Verleiht Inhalt einen glitzernden Partikeleffekt." + rotate: "Drehen" + rotateDescription: "Dreht den Inhalt um einen angegebenen Winkel." + fade: "Ein-/Ausblenden" + fadeDescription: "Blended Inhalt ein and aus." + plain: "Schlicht" + plainDescription: "Deaktiviert jegliche MFM-Syntax, die sich innerhalb dieses MFM-Effekts + befindet." + foreground: Vordergrundfarbe + background: Hintergrundfarbe + positionDescription: Inhalt um einen bestimmten Betrag verschieben. + position: Position + cropDescription: Inhalt zuschneiden. + crop: Zuschneiden + scale: Maßstab + scaleDescription: Skaliere den Inhalt um einen bestimmten Betrag. + foregroundDescription: Ändern der Vordergrundfarbe von Text. + backgroundDescription: Ändern der Hintergrundfarbe von Text + play: MFM abspielen + stop: MFM anhalten + warn: MFM können schnell bewegte oder anderweitig auffallende Animationen enthalten + alwaysPlay: Alle animierten MFM immer automatisch abspielen + advancedDescription: Wenn diese Funktion deaktiviert ist, können nur einfache Formatierungen + vorgenommen werden, es sei denn, animiertes MFM ist aktiviert +_instanceTicker: + none: "Nie anzeigen" + remote: "Für Nutzer eines anderen Servers anzeigen" + always: "Immer anzeigen" +_serverDisconnectedBehavior: + reload: "Automatisch aktualisieren" + dialog: "Warnungsfenster zeigen" + quiet: "Unaufdringlich warnen" + nothing: Nichts ändern +_channel: + create: "Kanal erstellen" + edit: "Kanal bearbeiten" + setBanner: "Kanalbanner festlegen" + removeBanner: "Kanalbanner entfernen" + featured: "Trends" + owned: "In Besitz" + following: "Gefolgt" + usersCount: "{n} Teilnehmer" + notesCount: "{n} Beiträge" + nameAndDescription: Name und Beschreibung + nameOnly: Nur den Namen +_menuDisplay: + sideFull: "Seitlich" + sideIcon: "Seitlich (Icons)" + top: "Oben" + hide: "Ausblenden" +_wordMute: + muteWords: "Stummgeschaltete Wörter" + muteWordsDescription: "Zum Nutzen einer \"UND\"-Verknüpfung Einträge mit Leerzeichen + trennen, zum Nutzen einer \"ODER\"-Verknüpfung Einträge mit einem Zeilenumbruch + trennen." + muteWordsDescription2: "Umgib Schlüsselworter mit Schrägstrichen, um Reguläre Ausdrücke + zu verwenden." + softDescription: "Beiträge, die die angegebenen Konditionen erfüllen, in der Timeline + ausblenden." + hardDescription: "Verhindern, dass Beiträge, die die angegebenen Konditionen erfüllen, + der Timeline hinzugefügt werden. Zudem werden diese Beiträge auch nicht der Timeline + hinzugefügt, falls die Konditionen geändert werden." + soft: "Leicht" + hard: "Schwer" + mutedNotes: "Stummgeschaltete Beiträge" +_instanceMute: + instanceMuteDescription: "Schaltet alle Beiträge/Boosts stumm, die von den gelisteten + Servern stammen, inklusive Antworten von Nutzern an einen Nutzer eines stummgeschalteten + Servers." + instanceMuteDescription2: "Mit Zeilenumbrüchen trennen" + title: "Blendet Beiträge von aufgelisteten Servern aus." + heading: "Liste der Server die stummgeschaltet werden sollen" +_theme: + explore: "Farbkombinationen finden" + install: "Eine Farbkombination installieren" + manage: "Farbkombinationen verwalten" + code: "Farbschemencode" + description: "Beschreibung" + installed: "{name} wurde installiert" + installedThemes: "Installierte Farbkombinationen" + builtinThemes: "Vorinstallierte Farbkombinationen" + alreadyInstalled: "Diese Farbkombination ist bereits installiert" + invalid: "Diese Farbkombination ist nicht möglich" + make: "Erstelle eine Farbkombination" + base: "Vorlage" + addConstant: "Konstante hinzufügen" + constant: "Konstante" + defaultValue: "Standardwert" + color: "Farbe" + refProp: "Eigenschaft referenzieren" + refConst: "Konstante referenzieren" + key: "Schlüssel" + func: "Funktionen" + funcKind: "Funktionsart" + argument: "Parameter" + basedProp: "Referenzierte Eigenschaft" + alpha: "Transparenz" + darken: "Verdunkeln" + lighten: "Erhellen" + inputConstantName: "Name der Konstanten eingeben" + importInfo: "Hier kannst du Farbschemencode einfügen, um ihn in den Editor zu importieren" + deleteConstantConfirm: "Die Konstante {const} wirklich löschen?" + keys: + accent: "Akzentfarbe" + bg: "Hintergrund" + fg: "Text" + focus: "Fokus" + indicator: "Indikator" + panel: "Panel" + shadow: "Schatten" + header: "Kopfzeile" + navBg: "Hintergrund der Seitenleiste" + navFg: "Text der Seitenleiste" + navHoverFg: "Text der Seitenleiste (Mouseover)" + navActive: "Text der Seitenleiste (Aktiv)" + navIndicator: "Indikator der Seitenleiste" + link: "Link" + hashtag: "Hashtag" + mention: "Erwähnung" + mentionMe: "Erwähnung (Ich)" + renote: "Renote" + modalBg: "Modalhintergrund" + divider: "Trenner" + scrollbarHandle: "Griff des Scrollbalkens" + scrollbarHandleHover: "Griff des Scrollbalkens (Mouseover)" + dateLabelFg: "Text von Datumsbeschriftungen" + infoBg: "Hintergrund von Informationen" + infoFg: "Text von Informationen" + infoWarnBg: "Hintergrund von Warnungen" + infoWarnFg: "Text von Warnungen" + cwBg: "Hintergrund des Inhaltswarnungsknopfs" + cwFg: "Text des Inhaltswarnungsknopfs" + cwHoverBg: "Hintergrund des Inhaltswarnungsknopfs (Mouseover)" + toastBg: "Hintergrund von Benachrichtigungen" + toastFg: "Text von Benachrichtigungen" + buttonBg: "Hintergrund von Schaltflächen" + buttonHoverBg: "Hintergrund von Schaltflächen (Mouseover)" + inputBorder: "Rahmen von Eingabefeldern" + listItemHoverBg: "Hintergrund von Listeneinträgen (Mouseover)" + driveFolderBg: "Hintergrund von Cloud-Drive-Ordnern" + wallpaperOverlay: "Hintergrundbild-Overlay" + badge: "Wappen" + messageBg: "Hintergrund von Chats" + accentDarken: "Akzent (Verdunkelt)" + accentLighten: "Akzent (Erhellt)" + fgHighlighted: "Hervorgehobener Text" +_sfx: + note: "Beiträge" + noteMy: "Meine Beiträge" + notification: "Benachrichtigungen" + chat: "Chat" + chatBg: "Chat (Hintergrund)" + antenna: "News-Picker" + channel: "Kanalbenachrichtigung" +_ago: + future: "Zukunft" + justNow: "Gerade eben" + secondsAgo: "vor {n} s" + minutesAgo: "vor {n} min" + hoursAgo: "vor {n} h" + daysAgo: "vor {n} T" + weeksAgo: "vor {n} W" + monthsAgo: "vor {n} M" + yearsAgo: "vor {n} J" +_time: + second: "Sekunde(n)" + minute: "Minute(n)" + hour: "Stunde(n)" + day: "Tag(en)" +_tutorial: + title: "Wie man Calckey benutzt" + step1_1: "Willkommen!" + step1_2: "Wir werden Sie einrichten. Sie werden im Handumdrehen einsatzbereit sein!" + step2_1: "Bitte füllen Sie zuerst Ihr Profil aus." + step2_2: "Wenn du ein paar Angaben zu deiner Person machst, können andere leichter + erkennen, ob sie deine Beiträge sehen oder dir folgen wollen." + step3_1: "Jetzt ist es an der Zeit, einigen Leuten zu folgen!" + step3_2: "Deine Home- und Social-Timeline basiert darauf, wem du folgst, also folge + für den Anfang ein paar Nutzerkonten.\nKlicke das Plus Symbol oben links in einem + Profil um ihm zu folgen." + step4_1: "Wir bringen dich nach draußen." + step4_2: "Für Ihren ersten Beitrag machen einige Leute gerne einen {introduction}-Beitrag + oder ein einfaches \"Hallo Welt!\"" + step5_1: "Timelines, Timelines überall!" + step5_2: "Dein Server hat {timelines} verschiedene Timelines aktiviert." + step5_3: "Die {icon} Home-Timeline ist die Timeline, in der du die Beiträge der + Nutzerkonten sehen kannst, denen du folgst." + step5_4: "In der {Icon} Local-Timeline kannst du die Beiträge von jedem/jeder sehen + der/die auf diesem Server registriert ist." + step5_5: "Die Social-Timeline {icon} ist eine Kombination aus der Home-Timeline + und der Local-Timeline." + step5_6: "In der Empfohlen-Timeline {icon} kannst du Posts sehen, die von den Admins + vorgeschlagen wurden." + step5_7: "In der {icon} Global-Timeline können Sie Beiträge von allen verknüpften + Servern aus dem Fediverse sehen." + step6_1: "Also, was ist das hier?" + step6_2: "Mit Deiner Anmeldung zu Calckey bist Du gleichzeitig einem Portal zum + Fediverse beigetreten, einem Netzwerk mit Tausenden von, miteinander verbundenen, + Servern." + step6_3: "Jeder der Server funktioniert auf unterschiedliche Weise, und nicht alle + Server führen Calckey aus. Dieser jedoch schon! Es ist zu Beginn vielleicht ein + wenig kompliziert, aber Sie werden in kürzester Zeit den Dreh raus haben." + step6_4: "Jetzt bist Du startbereit, entdecke die Möglichkeiten und hab Spaß dabei!" +_2fa: + alreadyRegistered: "Du hast bereits ein Gerät für Zwei-Faktor-Authentifizierung + registriert." + registerTOTP: "Neues Gerät registrieren" + registerSecurityKey: "Neuen Sicherheitsschlüssel registrieren" + step1: "Installiere zuerst eine Authentifizierungsapp (z.B. {a} oder {b}) auf deinem + Gerät." + step2: "Dann, scanne den angezeigten QR-Code mit deinem Gerät." + step2Url: "Nutzt du ein Desktopprogramm kannst du alternativ diese URL eingeben:" + step3: "Gib zum Abschluss den Token ein, der von deiner App angezeigt wird." + step4: "Alle folgenden Anmeldungsversuche werden ab sofort die Eingabe eines solchen + Tokens benötigen." + securityKeyInfo: "Du kannst neben Fingerabdruck- oder PIN-Authentifizierung auf + deinem Gerät auch Anmeldung mit Hilfe eines FIDO2-kompatiblen Hardware-Sicherheitsschlüssels + einrichten." + step3Title: Gib deinen Authentifizierungscode ein + renewTOTPOk: Neu konfigurieren + securityKeyNotSupported: Dein Browser unterstützt Hardware-Security-Keys nicht. + chromePasskeyNotSupported: Chrome Passkeys werden momentan nicht unterstützt. + renewTOTP: Konfiguriere deine Authenticator App neu + renewTOTPCancel: Abbrechen + tapSecurityKey: Bitte folge den Anweisungen deines Browsers, um einen Hardware-Security-Key + oder einen Passkey zu registrieren + removeKey: Entferne deinen Hardware-Security-Key + removeKeyConfirm: Möchtest du wirklich deinen Key mit der Bezeichnung {name} löschen? + renewTOTPConfirm: Das wird dazu führen, dass du Verifizierungscodes deiner vorherigen + Authenticator App nicht mehr nutzen kannst + whyTOTPOnlyRenew: Die Authentificator App kann nicht entfernt werden, solange ein + Hardware-Security-Key registriert ist. + step2Click: Ein Klick auf diesen QR-Code erlaubt es dir eine 2FA-Methode zu deinem + Security Key oder deiner Authenticator App hinzuzufügen. + registerTOTPBeforeKey: Bitte registriere eine Authentificator App, um einen Hardware-Security-Key + oder einen Passkey zu nutzen. + securityKeyName: Gib einen Namen für den Key ein +_permissions: + "read:account": "Deine Nutzerkontoinformationen lesen" + "write:account": "Deine Nutzerkontoinformationen bearbeiten" + "read:blocks": "Die Liste deiner blockierten Nutzer lesen" + "write:blocks": "Die Liste deiner blockierten Nutzer bearbeiten" + "read:drive": "Deine Cloud-Drive-Dateien und Ordner lesen" + "write:drive": "Deine Cloud-Drive-Dateien und Ordner bearbeiten oder löschen" + "read:favorites": "Deine Lesezeichen-Liste lesen" + "write:favorites": "Deine Lesezeichen-Liste bearbeiten" + "read:following": "Die Liste der Nutzer, denen du folgst, lesen" + "write:following": "Anderen Nutzern folgen oder entfolgen" + "read:messaging": "Chats lesen" + "write:messaging": "Chats bedienen" + "read:mutes": "Stummschaltungen lesen" + "write:mutes": "Stummschaltungen bearbeiten" + "write:notes": "Beiträge schreiben oder löschen" + "read:notifications": "Benachrichtigungen lesen" + "write:notifications": "Benachrichtigungen bedienen" + "read:reactions": "Reaktionen lesen" + "write:reactions": "Reaktionen bedienen" + "write:votes": "Umfragen bedienen" + "read:pages": "Deine Nutzer-Seiten lesen" + "write:pages": "Deine Nutzer-Seiten bearbeiten oder löschen" + "read:page-likes": "Liste der Nutzer-Seiten, die mir gefallen, lesen" + "write:page-likes": "Liste der Nutzer-Seiten, die mir gefallen, bearbeiten" + "read:user-groups": "Nutzergruppen lesen" + "write:user-groups": "Nutzergruppen bearbeiten oder löschen" + "read:channels": "Channels lesen" + "write:channels": "Channels bedienen" + "read:gallery": "Beiträge deiner Bilder-Galerie lesen" + "write:gallery": "Deine Bilder-Galerie bearbeiten" + "read:gallery-likes": "Liste deiner mit \"Gefällt mir\" markierten Bilder-Galerie-Beiträge + lesen" + "write:gallery-likes": "Liste deiner mit \"Gefällt mir\" markierten Bilder-Galerie-Beiträge + bearbeiten" +_auth: + shareAccess: "Möchtest du „{name}“ authorisieren, auf dieses Nutzerkonto zugreifen + zu können?" + shareAccessAsk: "Bist du dir sicher, dass du diese Anwendung authorisieren möchtest, + auf dein Nutzerkonto zugreifen zu können?" + permissionAsk: "Diese Anwendung fordert folgende Berechtigungen" + pleaseGoBack: "Bitte kehre zur Anwendung zurück" + callback: "Es wird zur Anwendung zurückgekehrt" + denied: "Zugriff verweigert" + copyAsk: Bitte fügen Sie den folgenden Autorisierungscode in die Anwendung ein +_antennaSources: + all: "Alle Beiträge" + homeTimeline: "Beiträge von Nutzern, denen gefolgt wird" + users: "Beiträge von einem oder mehreren angegebenen Nutzern" + userList: "Beiträge von allen Nutzern einer Liste" + userGroup: "Beiträge von allen Nutzern einer Gruppe" + instances: Beiträge von allen Nutzern auf einem Server +_weekday: + sunday: "Sonntag" + monday: "Montag" + tuesday: "Dienstag" + wednesday: "Mittwoch" + thursday: "Donnerstag" + friday: "Freitag" + saturday: "Samstag" +_widgets: + memo: "Merkzettel" + notifications: "Benachrichtigungen" + timeline: "Timeline" + calendar: "Kalender" + trends: "Trends" + clock: "Uhr" + rss: "RSS-Reader" + rssTicker: "RSS Ticker" + activity: "Aktivität" + photos: "Fotos" + digitalClock: "Digitaluhr" + unixClock: "UNIX-Uhr" + federation: "Föderation" + instanceCloud: "Server-Cloud" + postForm: "Beitragsfeld" + slideshow: "Diashow" + button: "Knopf" + onlineUsers: "Nutzer Online" + jobQueue: "Job-Warteschlange" + serverMetric: "Servermetriken" + aiscript: "AiScript-Konsole" + aichan: "Ai" + _userList: + chooseList: Wählen Sie eine Liste aus + userList: Benutzerliste + serverInfo: Server-Infos + meiliStatus: Server-Status + meiliSize: Indexgröße + meiliIndexCount: Indexierte Beiträge +_cw: + hide: "Verbergen" + show: "Inhalt anzeigen" + chars: "{count} Zeichen" + files: "{count} Datei(en)" +_poll: + noOnlyOneChoice: "Es müssen mindestens zwei Antwortmöglichkeiten vorhanden sein" + choiceN: "Auswahl {n}" + noMore: "Du kannst keine weiteren Auswahlmöglichkeiten hinzufügen" + canMultipleVote: "Auswahl mehrerer Antworten erlauben" + expiration: "Abstimmung beenden" + infinite: "Nie" + at: "Beenden am …" + after: "Beenden nach …" + deadlineDate: "Enddatum" + deadlineTime: "Zeit" + duration: "Dauer" + votesCount: "{n} Stimmen" + totalVotes: "Insgesamt {n} Stimmen" + vote: "Abstimmen" + showResult: "Ergebnis anzeigen" + voted: "Abgestimmt" + closed: "Beendet" + remainingDays: "{d} Tag(e) {h} Stunde(n) verbleibend" + remainingHours: "{h} Stunde(n) {m} Minute(n) verbleibend" + remainingMinutes: "{m} Minute(n) {s} Sekunde(n) verbleibend" + remainingSeconds: "{s} Sekunde(n) verbleibend" +_visibility: + public: "Öffentlich" + publicDescription: "Dein Beitrag wird global für alle Nutzer sichtbar sein" + home: "nicht aufgelistet" + homeDescription: "Beitrag nur auf der Home-Timeline anzeigen" + followers: "Follower" + followersDescription: "Nur für Follower sichtbar" + specified: "Direkt" + specifiedDescription: "Nur für bestimmte Nutzer sichtbar" + localOnly: "Nur Lokal" + localOnlyDescription: "Unsichtbar für Nutzer anderer Server" +_postForm: + replyPlaceholder: "Diesem Beitrag antworten …" + quotePlaceholder: "Diesen Beitrag zitieren …" + channelPlaceholder: "In einen Kanal senden..." + _placeholders: + a: "Was machst du momentan?" + b: "Was ist um dich herum los?" + c: "Was geht dir durch den Kopf?" + d: "Was möchtest du sagen?" + e: "Fang an zu schreiben …" + f: "Ich warte darauf, dass du schreibst …" +_profile: + name: "Name" + username: "Benutzername" + description: "Profilbeschreibung" + youCanIncludeHashtags: "Du kannst auch Hashtags in deiner Profilbeschreibung verwenden." + metadata: "Zusätzliche Informationen" + metadataEdit: "Zusätzliche Informationen bearbeiten" + metadataDescription: "Hierdurch kannst du auf deinem Profil zusätzliche Informationsblöcke + anzeigen lassen." + metadataLabel: "Beschriftung" + metadataContent: "Inhalt" + changeAvatar: "Profilbild ändern" + changeBanner: "Banner ändern" + locationDescription: Wenn Sie Ihren Ort zuerst eingeben, wird für andere Benutzer + die Ortszeit angezeigt. +_exportOrImport: + allNotes: "Alle Beiträge" + followingList: "Gefolgte Nutzer" + muteList: "Stummschaltungen" + blockingList: "Blockierungen" + userLists: "Listen" + excludeMutingUsers: "Stummgeschaltete Nutzer aussortieren" + excludeInactiveUsers: "Inaktive Nutzer aussortieren" +_charts: + federation: "Föderation" + apRequest: "Anfragen" + usersIncDec: "Unterschied in der Anzahl von Nutzern" + usersTotal: "Anzahl aller Nutzer" + activeUsers: "Aktive Nutzer" + notesIncDec: "Unterschied bei der Anzahl an Beiträgen" + localNotesIncDec: "Unterschied bei der Anzahl an lokalen Beiträgen" + remoteNotesIncDec: "Differenz zur Anzahl von Beiträgen von anderen Servern." + notesTotal: "Anzahl aller Beiträge" + filesIncDec: "Unterschied in der Anzahl an Dateien" + filesTotal: "Anzahl aller Dateien" + storageUsageIncDec: "Unterschied in der Höhe der Speichernutzung" + storageUsageTotal: "Gesamte Speichernutzung" +_instanceCharts: + requests: "Anfragen" + users: "Unterschied in der Anzahl an Nutzern" + usersTotal: "Gesamtanzahl an Nutzern" + notes: "Unterschied in der Anzahl an Beiträgen" + notesTotal: "Gesamtanzahl der Beiträge" + ff: "Unterschied in der Anzahl an gefolgten Nutzern und Followern " + ffTotal: "Gesamtanzahl an gefolgten Nutzern und Followern" + cacheSize: "Unterschied in der Größe des Caches" + cacheSizeTotal: "Gesamtgröße des Caches" + files: "Unterschied in der Anzahl an Dateien" + filesTotal: "Gesamtanzahl an Dateien" +_timelines: + home: "Home-TL" + local: "Local-TL" + social: "Social-TL" + global: "Global-TL" + recommended: Admin-Favoriten +_pages: + newPage: "Neue Seite erstellen" + editPage: "Seite bearbeiten" + readPage: "Quelltextansicht" + created: "Seite erfolgreich erstellt" + updated: "Seite erfolgreich aktualisiert" + deleted: "Seite erfolgreich gelöscht" + pageSetting: "Seiteneinstellungen" + nameAlreadyExists: "Die angegebene Seiten-URL existiert bereits" + invalidNameTitle: "Die angegebene Seiten-URL ist ungültig" + invalidNameText: "Überprüfe, ob der Seitentitel nicht leer ist" + editThisPage: "Diese Seite bearbeiten" + viewSource: "Quelltext anzeigen" + viewPage: "Seite anschauen" + like: "Gefällt mir" + unlike: "\"Gefällt mir\" entfernen" + my: "Meine Nutzer-Seiten" + liked: "Nutzer-Seiten, die mir gefallen" + featured: "Beliebt" + inspector: "Inspektor" + contents: "Inhalte" + content: "Seitenblock" + variables: "Variablen" + title: "Titel" + url: "Nutzer-Seiten-URL" + summary: "Zusammenfassung" + alignCenter: "Zentrieren" + hideTitleWhenPinned: "Nutzer-Seitentitel wenn angeheftet ausblenden" + font: "Schriftart" + fontSerif: "Serif" + fontSansSerif: "sans-serif" + eyeCatchingImageSet: "Vorschaubild festlegen" + eyeCatchingImageRemove: "Vorschaubild entfernen" + chooseBlock: "Block hinzufügen" + selectType: "Typ auswählen" + enterVariableName: "Gib einen Variablennamen ein" + variableNameIsAlreadyUsed: "Dieser Name wird bereits von einer anderen Variable + verwendet" + contentBlocks: "Inhalt" + inputBlocks: "Eingabe" + specialBlocks: "Spezial" + blocks: + text: "Text" + textarea: "Textfeld" + section: "Abschnitt" + image: "Bild" + button: "Knopf" + if: "Falls" + _if: + variable: "Variable" + post: "Beitragsfeld" + _post: + text: "Inhalt" + attachCanvasImage: "Leinwandbild anfügen" + canvasId: "Leinwand-ID" + textInput: "Texteingabe" + _textInput: + name: "Variablenname" + text: "Titel" + default: "Standardwert" + textareaInput: "Mehrzeiliges Texteingabefeld" + _textareaInput: + name: "Variablenname" + text: "Titel" + default: "Standardwert" + numberInput: "Zahleneingabe" + _numberInput: + name: "Variablenname" + text: "Titel" + default: "Standardwert" + canvas: "Leinwand" + _canvas: + id: "Leinwand-ID" + width: "Breite" + height: "Höhe" + note: "Eingebetteter Beitrag" + _note: + id: "Beitrags-ID" + idDescription: "Du kannst alternativ auch die Beitrags-URL angeben." + detailed: "Detailierte Ansicht" + switch: "Fallunterscheidung" + _switch: + name: "Variablenname" + text: "Titel" + default: "Standardwert" + counter: "Zähler" + _counter: + name: "Variablenname" + text: "Titel" + inc: "Schrittgröße" + _button: + text: "Titel" + colored: "Farbig" + action: "Aktion, die bei Knopfdruck ausgeführt wird" + _action: + dialog: "Dialogfenster anzeigen" + _dialog: + content: "Inhalt" + resetRandom: "Zufallswert zurücksetzen" + pushEvent: "Ein Event senden" + _pushEvent: + event: "Eventname" + message: "Meldung, die bei Aktivierung angezeigt werden soll" + variable: "Variable, die gesendet werden soll" + no-variable: "Keine" + callAiScript: "AiScript ausführen" + _callAiScript: + functionName: "Funktionsname" + radioButton: "Optionsfeld" + _radioButton: + name: "Variablenname" + title: "Titel" + values: "Durch Zeilenümbrüche getrennte Auswahlmöglichkeiten" + default: "Standardwert" + script: + categories: + flow: "Steuerung" + logical: "Logische Operationen" + operation: "Berechnungen" + comparison: "Vergleiche" + random: "Zufällig" + value: "Werte" + fn: "Funktionen" + text: "Textoperationen" + convert: "Konvertierungen" + list: "Listen" + blocks: + text: "Text" + multiLineText: "Text (Mehrzeilig)" + textList: "Textliste" + _textList: + info: "Trenne jeden Eintrag mit einem Zeilenumbruch" + strLen: "Textlänge" + _strLen: + arg1: "Text" + strPick: "Text extrahieren" + _strPick: + arg1: "Text" + arg2: "Textposition" + strReplace: "Textersetzung" + _strReplace: + arg1: "Text" + arg2: "Zu ersetzender Text" + arg3: "Ersetzen mit" + strReverse: "Text umkehren" + _strReverse: + arg1: "Text" + join: "Text zusammenfügen" + _join: + arg1: "Liste" + arg2: "Trennzeichen" + add: "Addieren" + _add: + arg1: "A" + arg2: "B" + subtract: "Subtrahieren" + _subtract: + arg1: "A" + arg2: "B" + multiply: "Multiplizieren" + _multiply: + arg1: "A" + arg2: "B" + divide: "Teilen" + _divide: + arg1: "A" + arg2: "B" + mod: "Rest" + _mod: + arg1: "A" + arg2: "B" + round: "Rundung von Dezimalstellen" + _round: + arg1: "Nummer" + eq: "A und B sind gleich" + _eq: + arg1: "A" + arg2: "B" + notEq: "A und B sind nicht gleich" + _notEq: + arg1: "A" + arg2: "B" + and: "A UND B" + _and: + arg1: "A" + arg2: "B" + or: "A ODER B" + _or: + arg1: "A" + arg2: "B" + lt: "< A ist kleiner als B" + _lt: + arg1: "A" + arg2: "B" + gt: "> A ist größer als B" + _gt: + arg1: "A" + arg2: "B" + ltEq: "<= A ist kleiner als oder gleich B" + _ltEq: + arg1: "A" + arg2: "B" + gtEq: ">= A ist größer als oder gleich B" + _gtEq: + arg1: "A" + arg2: "B" + if: "Kondition" + _if: + arg1: "Falls" + arg2: "Wenn wahr" + arg3: "Sonst" + not: "NICHT" + _not: + arg1: "NICHT" + random: "Zufällig" + _random: + arg1: "Warscheinlichkeit" + rannum: "Zufallsnummer" + _rannum: + arg1: "Minimum" + arg2: "Maximum" + randomPick: "Zufallswahl aus Liste" + _randomPick: + arg1: "Liste" + dailyRandom: "Zufällig (Pro Nutzer jeden Tag verschieden)" + _dailyRandom: + arg1: "Warscheinlichkeit" + dailyRannum: "Zufallsnummer (Pro Nutzer jeden Tag verschieden)" + _dailyRannum: + arg1: "Minimum" + arg2: "Maximum" + dailyRandomPick: "Zufallsauswahl aus einer Liste (Pro Nutzer jeden Tag verschieden)" + _dailyRandomPick: + arg1: "Liste" + seedRandom: "Zufällig (mit Startwert / Seed)" + _seedRandom: + arg1: "Startwert / Seed" + arg2: "Warscheinlichkeit" + seedRannum: "Zufallsnummer (mit Startwert / Seed)" + _seedRannum: + arg1: "Startwert / Seed" + arg2: "Minimum" + arg3: "Maximum" + seedRandomPick: "Zufallsauswahl aus Liste (mit Startwert / Seed)" + _seedRandomPick: + arg1: "Startwert / Seed" + arg2: "Liste" + DRPWPM: "Zufallsauswahl aus gewichteter Liste (Pro Nutzer jeden Tag verschieden)" + _DRPWPM: + arg1: "Textliste" + pick: "Aus einer Liste wählen" + _pick: + arg1: "Liste" + arg2: "Position" + listLen: "Listenlänge abrufen" + _listLen: + arg1: "Liste" + number: "Nummer" + stringToNumber: "Text zu Nummer" + _stringToNumber: + arg1: "Text" + numberToString: "Nummer zu Text" + _numberToString: + arg1: "Nummer" + splitStrByLine: "Text nach Zeilenumbrüchen aufteilen" + _splitStrByLine: + arg1: "Text" + ref: "Variable" + aiScriptVar: "AiScript Variable" + fn: "Funktion" + _fn: + slots: "Slots" + slots-info: "Trenne jeden Slot mit einem Zeilenumbruch" + arg1: "Ausgabe" + for: "for-Schleife" + _for: + arg1: "Anzahl der Schleifendurchläufe" + arg2: "Aktion" + typeError: "Slot {slot} akzeptiert Werte vom Typ „{expect}“, aber es wurde ein + „{actual}“ Wert angegeben!" + thereIsEmptySlot: "Slot {slot} ist leer!" + types: + string: "Text" + number: "Nummer" + boolean: "Wahrheitswert" + array: "Liste" + stringArray: "Textliste" + emptySlot: "Leerer Slot" + enviromentVariables: "Umgebungsvariable" + pageVariables: "Seitenelemente" + argVariables: "Eingabeslots" +_relayStatus: + requesting: "Ausstehend" + accepted: "Akzeptiert" + rejected: "Abgelehnt" +_notification: + fileUploaded: "Datei erfolgreich hochgeladen" + youGotMention: "{name} hat dich erwähnt" + youGotReply: "{name} hat dir geantwortet" + youGotQuote: "{name} hat dich zitiert" + youRenoted: "Renote deines Beitrages von {name}" + youGotPoll: "{name} hat in deiner Umfrage abgestimmt" + youGotMessagingMessageFromUser: "{name} hat dir eine Chatnachricht gesendet" + youGotMessagingMessageFromGroup: "In die Gruppe {name} wurde eine Chatnachricht + gesendet" + youWereFollowed: "folgt dir nun" + youReceivedFollowRequest: "Du hast eine Follow-Anfrage erhalten" + yourFollowRequestAccepted: "Deine Follow-Anfrage wurde akzeptiert" + youWereInvitedToGroup: "{userName} hat dich in eine Gruppe eingeladen" + pollEnded: "Umfrageergebnisse sind verfügbar" + emptyPushNotificationMessage: "Push-Benachrichtigungen wurden aktualisiert" + _types: + all: "Alle" + follow: "Neue Follower" + mention: "Erwähnungen" + reply: "Antworten" + renote: "Renotes" + quote: "Zitationen" + reaction: "Reaktionen" + pollVote: "Antworten auf Umfragen" + pollEnded: "Ende von Umfragen" + receiveFollowRequest: "Erhaltene Follow-Anfragen" + followRequestAccepted: "Akzeptierte Follow-Anfragen" + groupInvited: "Erhaltene Gruppeneinladungen" + app: "Benachrichtigungen von Apps" + _actions: + followBack: "folgt dir nun auch" + reply: "Antworten" + renote: "Renote" + voted: haben bei deiner Umfrage abgestimmt + reacted: hat auf deinen Beitrag reagiert + renoted: hat Ihren Beitrag geteilt +_deck: + alwaysShowMainColumn: "Hauptspalte immer zeigen" + columnAlign: "Spaltenausrichtung" + addColumn: "Spalte hinzufügen" + configureColumn: "Spalteneinstellungen" + swapLeft: "Mit linker Spalte tauschen" + swapRight: "Mit rechter Spalte tauschen" + swapUp: "Mit oberer Spalte tauschen" + swapDown: "Mit unterer Spalte tauschen" + stackLeft: "Auf linke Spalte stapeln" + popRight: "Nach rechts vom Stapel nehmen" + profile: "Arbeitsbereich" + newProfile: "Neuer Arbeitsbereich" + deleteProfile: "Arbeitsbereich löschen" + introduction: "Erstelle eine auf dich zugeschneiderte Benutzeroberfläche durch das + Aneinanderreihen von Spalten!" + introduction2: "Klicke auf das + rechts um wann immer du möchtest neue Spalten hinzuzufügen." + widgetsIntroduction: "Drücke bitte \"Widgets bearbeiten\" im Spaltenmenü und füge + ein Widget hinzu." + _columns: + main: "Hauptspalte" + widgets: "Widgets" + notifications: "Benachrichtigungen" + tl: "Timeline" + antenna: "Antenne" + list: "Listen" + mentions: "Erwähnungen" + direct: "Direktnachrichten" + channel: Kanal + renameProfile: Arbeitsbereich umbenennen + nameAlreadyExists: Der Name für den Arbeitsbereich ist bereits vorhanden. +enableRecommendedTimeline: '"Favoriten"-Timeline einschalten' +secureMode: Sicherer Modus (Autorisierter Abruf) +instanceSecurity: Server-Sicherheit +manageGroups: Gruppen verwalten +noThankYou: Nein, danke +privateMode: Privater Modus +enableEmojiReactions: Emoji-Reaktionen aktivieren +flagSpeakAsCat: Wie eine Katze sprechen +showEmojisInReactionNotifications: Emojis in Reaktionsbenachrichtigungen anzeigen +userSaysSomethingReason: '{name} sagte {reason}' +hiddenTagsDescription: 'Geben sie hier die Schlagworte (ohne #hashtag) an, die vom + "Trending and Explore" ausgeschlossen werden sollen. Versteckte Schlagworte sind + immer noch über andere Wege auffindbar.' +addInstance: Server hinzufügen +flagSpeakAsCatDescription: Deine Beiträge werden im Katzenmodus nyanisiert +hiddenTags: Versteckte Hashtags +antennaInstancesDescription: Geben sie einen Server-Namen pro Zeile ein +secureModeInfo: Bei Anfragen an andere Server nicht ohne Nachweis zurücksenden. +renoteMute: Boosts stummschalten +renoteUnmute: Stummschaltung von Boosts aufheben +noInstances: Keine Server gefunden +privateModeInfo: Wenn diese Option aktiviert ist, können nur als vertrauenswürdig + eingestufte Server mit diesem Server verknüpft werden. Alle Beiträge werden für + die Öffentlichkeit verborgen. +allowedInstances: Vertrauenswürdige Server +selectInstance: Wähle einen Server aus +silencedInstancesDescription: Liste die Hostnamen der Server auf, die du stummschalten + möchtest. Nutzerkonten in den aufgelisteten Servern werden als "Stumm" behandelt, + können nur Follow-Anfragen stellen und können keine lokalen Nutzerkonten erwähnen, + wenn sie nicht gefolgt werden. Dies wirkt sich nicht auf die blockierten Server + aus. +editNote: Beitrag bearbeiten +edited: 'Bearbeitet um {date} {time}' +silenceThisInstance: Diesen Server stummschalten +silencedInstances: Stummgeschaltete Server +silenced: Stummgeschaltet +deleted: Gelöscht +breakFollowConfirm: Sind sie sicher, dass sie eine(n) Follower entfernen möchten? +unsubscribePushNotification: Push-Benachrichtigungen deaktivieren +pushNotificationAlreadySubscribed: Push-Benachrichtigungen sind bereits aktiviert +pushNotificationNotSupported: Ihr Browser oder der Server unterstützt keine Push-Benachrichtigungen +pushNotification: Push-Benachrichtigungen +subscribePushNotification: Push-Benachrichtigungen aktivieren +showLocalPosts: 'Zeige lokale Beiträge in:' +homeTimeline: Home-Timeline +cannotUploadBecauseExceedsFileSizeLimit: Die Datei konnte nicht hochgeladen werden, + da sie die maximal zulässige Größe überschreitet. +moveFromLabel: 'Nutzerkonto von dem Sie umziehen:' +moveAccount: Nutzerkonto umziehen! +defaultReaction: Standard-Emoji-Reaktion für ausgehende und eingehende Beiträge +moveTo: Umzug des Nutzerkontos zu einem neuen Nutzerkonto +moveToLabel: 'Nutzerkonto zu dem sie umziehen:' +moveAccountDescription: 'Dieser Vorgang kann nicht rückgängig gemacht werden! Stellen + sie vor dem Umzug dieses Nutzerkontos sicher, dass Sie einen Namen für Ihr neues + Nutzerkonto eingerichtet haben. Bitte geben sie die Bezeichnung des neuen Nutzerkontos + wie folgt ein: @name@server.xyz' +findOtherInstance: Einen anderen Server finden +sendPushNotificationReadMessage: Löschung der Push-Benachrichtigungen sobald die entsprechenden + Benachrichtigungen oder Beiträge gelesen wurden. +signupsDisabled: Derzeit sind keine Anmeldungen auf diesem Server möglich! Anmeldungen + auf anderen Servern sind jedoch möglich! Wenn Sie einen Einladungscode für diesen + Server haben, geben Sie ihn bitte unten ein. +swipeOnDesktop: Am Desktop PC das Wischen wie bei mobilen Geräten zulassen +enterSendsMessage: Drücken sie zum Senden des Beitrages die Eingabetaste (Strg-Taste + ausgeschaltet) +showUpdates: Zeigt ein Popup-Fenster an, wenn Calckey aktualisiert wird. +socialTimeline: Social-Timeline +moveFrom: Bisheriges Nutzerkonto zu diesem Nutzerkonto umziehen +_messaging: + groups: Gruppen + dms: Privat +recommendedInstances: Empfohlene Server +logoImageUrl: URL des Logo-Bildes +userSaysSomethingReasonReply: '{name} hat auf einen Beitrag geantwortet der {reason} + beinhaltet' +userSaysSomethingReasonRenote: '{name} hat einen Beitrag geteilt der {reason} beinhaltet' +userSaysSomethingReasonQuote: '{name} hat einen Beitrag zitiert der {reason} beinhaltet' +seperateRenoteQuote: Getrennte Boost- und Zitat-Schaltflächen +showAds: Anzeigen anzeigen +splash: Begrüßungsbildschirm +customSplashIconsDescription: URLs für benutzerdefinierte Splash-Screen-Symbole, die + durch Zeilenumbrüche getrennt sind und nach dem Zufallsprinzip jedes Mal angezeigt + werden, wenn ein Benutzer die Seite lädt/neu lädt. Bitte stelle sicher, dass die + Bilder unter einer statischen URL stehen, vorzugsweise alle in der Größe 192x192. +sendPushNotificationReadMessageCaption: Eine Benachrichtigung mit dem Text "{emptyPushNotificationMessage}" + wird für kurze Zeit angezeigt. Dies kann ggf. den Akkuverbrauch Ihres Geräts erhöhen. +customSplashIcons: Benutzerdefinierte Begrüßungsbildschirmsymbole (URLs) +adminCustomCssWarn: Diese Einstellung sollte nur verwendet werden, wenn Sie wissen, + was sie tut. Die Eingabe falscher Werte kann dazu führen, dass ALLE Clients nicht + mehr normal funktionieren. Bitte stellen Sie sicher, dass Ihr CSS ordnungsgemäß + funktioniert, indem Sie es in Ihren Benutzereinstellungen testen. +customMOTD: Benutzerdefinierte Meldung des Tages (Begrüßungsbildschirmmeldungen) +allowedInstancesDescription: Hosts von Servern, die zur Verbindung auf die Liste vertrauenswürdiger + Server gesetzt werden sollen, werden jeweils durch eine neue Zeile getrennt eingegeben + (gilt nur im privaten Modus). +migration: Migration +updateAvailable: Es könnte eine Aktualisierung verfügbar sein! +showAdminUpdates: Anzeigen, dass eine neue Calckey-Version verfügbar ist (nur Administrator) +customMOTDDescription: Benutzerdefinierte Meldungen für die Meldung des Tages (Begrüßungsbildschirm), + die durch Zeilenumbrüche getrennt sind und nach dem Zufallsprinzip jedes Mal angezeigt + werden, wenn ein Benutzer die Seite (neu) lädt. +recommendedInstancesDescription: Empfohlene Server, die durch Zeilenumbrüche getrennt + sind, werden in der "Favoriten"-Timeline angezeigt. Fügen Sie NICHT "https://" hinzu, + sondern NUR die Domain. +sendModMail: Moderationshinweis senden +moveFromDescription: 'Dadurch wird ein Alias Ihres alten Nutzerkontos festgelegt, + sodass Sie von ihrem bisherigen Konto zu diesem Nutzerkonto wechseln können. Tun + Sie dies, BEVOR Sie von Ihrem bisherigen Nutzerkonto hierhin wechseln. Bitte geben + Sie den Namen des Nutzerkontos wie folgt ein: @person@server.xyz' +preventAiLearning: KI gestütztes bot-scraping unterdrücken +preventAiLearningDescription: Fordern Sie KI-Sprachmodelle von Drittanbietern auf, + die von Ihnen hochgeladenen Inhalte, wie z. B. Beiträge und Bilder, nicht zu untersuchen. +license: Genehmigung +indexPosts: Gelistete Beiträge +migrationConfirm: "Sind Sie absolut sicher, dass Sie Ihr Nutzerkonto zu diesem {account} + umziehen möchten? Sobald Sie dies bestätigt haben, kann dies nicht mehr rückgängig + gemacht werden und Ihr Nutzerkonto kann nicht mehr von ihnen genutzt werden.\nStellen + Sie außerdem sicher, dass Sie dieses Nutzerkonto als das Konto festgelegt haben, + von dem Sie umziehen." +noteId: Beitrags-ID +customKaTeXMacro: Individuelle KaTeX Makros +enableCustomKaTeXMacro: Individuelle KaTeX-Makros aktivieren +replayTutorial: Wiederhole die Benutzeranleitung +apps: Apps +caption: Automatische Untertitelung +pwa: PWA installieren +cw: Inhaltswarnung +older: älter +newer: neuer +accessibility: Erreichbarkeit +jumpToPrevious: Zum Vorherigen springen +silencedWarning: Diese Meldung wird angezeigt, weil diese Nutzer von Servern stammen, + die Ihr Administrator abgeschaltet hat, so dass es sich möglicherweise um Spam handelt. +_experiments: + enablePostEditing: Beitragsbearbeitung ermöglichen + title: Funktionstests + postEditingCaption: Zeigt die Option für Nutzer an, ihre bestehenden Beiträge über + das Menü "Beitragsoptionen" zu bearbeiten + enablePostImports: Beitragsimporte aktivieren + postImportsCaption: Erlaubt es Nutzer:innen ihre Posts von alten Calckey, Misskey, + Mastodon, Akkoma und Pleroma Accounts zu importieren. Bei Engpässen in der Warteschlange + kann es zu Verlangsamungen beim Laden während des Imports kommen. +noGraze: Bitte deaktivieren Sie die Browsererweiterung "Graze for Mastodon", da sie + die Funktion von Calckey stört. +indexFrom: Indexieren ab Beitragskennung aufwärts +indexNotice: Wird jetzt indexiert. Dies wird wahrscheinlich eine Weile dauern, bitte + starten Sie Ihren Server für mindestens eine Stunde nicht neu. +customKaTeXMacroDescription: "Richten Sie Makros ein, um mathematische Ausdrücke einfach + zu schreiben! Die Notation entspricht den LaTeX-Befehlsdefinitionen und wird als\n + \\newcommand{\\name}{content} or \\newcommand{\\name}[number of arguments]{content}\n + geschrieben.\nZum Beispiel wird\n\\newcommand{\\add}[2]{#1 + #2} \\add{3}{foo} um + 3 + foo erweitert.\nDie geschweiften Klammern, die den Makronamen umgeben, können + in runde oder eckige Klammern geändert werden. Dies hat Auswirkungen auf die Klammern, + die für die Argumente verwendet werden. Pro Zeile kann ein (und nur ein) Makro definiert + werden, und Sie können die Zeile nicht mitten in der Definition umbrechen. Ungültige + Zeilen werden einfach ignoriert. Es werden nur einfache Funktionen zur Substitution + von Zeichenketten unterstützt; erweiterte Syntax, wie z. B. bedingte Verzweigungen, + können hier nicht verwendet werden." +expandOnNoteClickDesc: Wenn deaktiviert, können Sie Beiträge trotzdem über das Rechtsklickmenü + oder durch Anklicken des Zeitstempels öffnen. +selectChannel: Wählen Sie einen Kanal aus +expandOnNoteClick: Beitrag bei Klick öffnen +image: Bild +video: Video +audio: Audio +indexFromDescription: Leer lassen, um jeden Beitrag zu indexieren +_filters: + fromUser: Von Benutzer + notesAfter: Beiträge nach + withFile: Mit Datei + fromDomain: Von Domain + notesBefore: Beiträge vor + followingOnly: Nur Folgende +isBot: Dieses Konto ist ein Bot +isModerator: Moderator +isAdmin: Administrator +_dialog: + charactersExceeded: 'Maximale Anzahl an Zeichen aufgebraucht! Limit: {current} / + {max}' + charactersBelow: Nicht genug Zeichen! Du hast aktuell {current} von {min} Zeichen +searchPlaceholder: Calckey durchsuchen +antennasDesc: "Antennen zeigen neue Posts an, die deinen definierten Kriterien entsprechen!\n + Sie können von der Timeline-Seite aufgerufen werden." +isPatron: Calckey Patron +removeReaction: Entferne deine Reaktion +listsDesc: Listen lassen dich Timelines mit bestimmten Nutzer:innen erstellen. Sie + können von der Timeline-Seite erreicht werden. +clipsDesc: Clips sind wie teilbare, kategorisierte Lesezeichen. Du kannst Clips vom + Menü individueller Posts aus erstellen. +channelFederationWarn: Kanäle föderieren noch nicht zu anderen Servern diff --git a/fe_calckey/frontend/locales/el-GR.yml b/fe_calckey/frontend/locales/el-GR.yml new file mode 100644 index 0000000..d444882 --- /dev/null +++ b/fe_calckey/frontend/locales/el-GR.yml @@ -0,0 +1,819 @@ +_lang_: "Ελληνικά" +monthAndDay: "{day}/{month}" +search: "Αναζήτηση" +notifications: "Ειδοποιήσεις" +username: "Όνομα μέλους" +password: "Κωδικός πρόσβασης" +forgotPassword: "Ξέχασα τον κωδικό πρόσβασης" +fetchingAsApObject: "Άντληση από το Fediverse" +ok: "Εντάξει" +gotIt: "Τό'πιασα!" +cancel: "Ακύρωση" +enterUsername: "Εισαγωγή ονόματος μέλους" +renotedBy: "Προωθήθηκε από {user}" +noNotes: "Δεν υπάρχουν δημοσιεύσεις" +noNotifications: "Δεν υπάρχουν ειδοποιήσεις" +settings: "Ρυθμίσεις" +basicSettings: "Βασικές Ρυθμίσεις" +otherSettings: "Άλλες Ρυθμίσεις" +openInWindow: "Άνοιγμα σε παράθυρο" +profile: "Προφίλ" +timeline: "Χρονολόγιο" +noAccountDescription: "Αυτό το μέλος δεν έχει γράψει βιογραφικό ακόμη." +login: "Σύνδεση" +loggingIn: "Συνδέεστε" +logout: "Αποσύνδεση" +signup: "Εγγραφή" +uploading: "Ανέβασμα..." +save: "Αποθήκευση" +users: "Μέλη" +addUser: "Προσθήκη μέλους" +favorite: "Προσθήκη στους σελιδοδείκτες" +favorites: "Σελιδοδείκτες" +unfavorite: "Αφαίρεση από τους σελιδοδείκτες" +favorited: "Προστέθηκε στους σελιδοδείκτες." +alreadyFavorited: "Έχει ήδη προστεθεί στους σελιδοδείκτες." +cantFavorite: "Αδυναμία προσθήκης στους σελιδοδείκτες." +pin: "Καρφίτσωμα στο προφίλ" +unpin: "Ξεκαρφίτσωμα από το προφίλ" +copyContent: "Αντιγραφή περιεχομένων" +copyLink: "Αντιγραφή συνδέσμου" +delete: "Διαγραφή" +deleteAndEdit: "Διαγραφή και επεξεργασία" +deleteAndEditConfirm: "Σίγουρα θέλετε να διαγράψετε αυτή τη δημοσίευση και να την\ + \ επεξεργαστείτε; Θα χάσετε όλες τις αντιδράσεις, προωθήσεις και απαντήσεις σε αυτήν." +addToList: "Προσθήκη στη λίστα" +sendMessage: "Αποστολή μηνύματος" +copyUsername: "Αντιγραφή ονόματος μέλους" +searchUser: "Αναζήτηση μέλους" +reply: "Απάντηση" +loadMore: "Φόρτωσε περισσότερα" +showMore: "Δείξε περισσότερα" +showLess: "Κλείσιμο" +youGotNewFollower: "σε ακολούθησε" +receiveFollowRequest: "Λάβατε αίτημα ακολούθησης" +followRequestAccepted: "Το αίτημα ακολούθησης έγινε δεκτό" +mention: "Επισήμανση" +mentions: "Επισημάνσεις" +directNotes: "Απευθείας μηνύματα" +importAndExport: "Εισαγωγή/Εξαγωγή Δεδομένων" +import: "Εισαγωγή" +export: "Εξαγωγή" +files: "Αρχεία" +download: "Κατέβασμα" +driveFileDeleteConfirm: "Θέλετε σίγουρα να διαγράψετε το αρχείο \"{name}\"; Οι δημοσιεύσεις\ + \ με αυτό το συνημμένο αρχείο επίσης θα διαγραφούν." +unfollowConfirm: "Θέλετε σίγουρα να σταματήσετε να ακολουθείτε το μέλος {name};" +exportRequested: "Ζητήσατε μία εξαγωγή. Αυτό μπορεί να πάρει κάποιον χρόνο. Θα προστεθεί\ + \ στον Αποθηκευτικό Χώρο σας μόλις ολοκληρωθεί." +importRequested: "Ζητήσατε μια εισαγωγή. Αυτό μπορεί να πάρει κάποιον χρόνο." +lists: "Λίστες" +noLists: "Δεν έχετε λίστες" +note: "Δημοσίευση" +notes: "Δημοσιεύσεις" +following: "Ακολουθεί" +followers: "Ακολουθούν" +followsYou: "Σε ακολουθεί" +createList: "Δημιουργία λίστας" +manageLists: "Διαχείριση λιστών" +error: "Σφάλμα" +somethingHappened: "Προέκυψε ένα σφάλμα" +retry: "Προσπάθεια ξανά" +pageLoadError: "Ένα σφάλμα προέκυψε φορτώνοντας τη σελίδα." +pageLoadErrorDescription: "Αυτό κανονικά προκαλείται από σφάλματα δικτύου ή από την\ + \ προσωρινή μνήμη του προγράμματος περιήγησης. Δοκιμάστε να σβήσετε την προσωρινή\ + \ μνήμη (cache) και να δοκιμάσετε ξανά μετά από λίγο." +serverIsDead: "Αυτός ο διακομιστής (server) δεν αποκρίνεται. Παρακαλώ περιμένετε λίγο\ + \ και δοκιμάστε ξανά." +youShouldUpgradeClient: "Για να δείτε αυτή τη σελίδα, παρακαλώ επαναφορτώστε για να\ + \ γίνει ενημέρωση." +enterListName: "Πληκτρολογήστε ένα όνομα για τη λίστα" +privacy: "Ιδιωτικότητα" +makeFollowManuallyApprove: "Τα αιτήματα ακολούθησης χρειάζονται έγκριση" +defaultNoteVisibility: "Προεπιλεγμένη ορατότητα" +follow: "Ακολουθήστε" +followRequest: "Ακολουθήστε" +followRequests: "Αιτήματα ακολούθησης" +unfollow: "Να μην ακολουθώ" +followRequestPending: "Το αίτημα ακολούθησης εκκρεμεί" +enterEmoji: "Εισάγετε ένα emoji" +renote: "Προώθηση" +unrenote: "Αναίρεση προώθησης" +renoted: "Προωθήθηκε." +cantRenote: "Αυτή η δημοσίευση δεν μπορεί να προωθηθεί." +cantReRenote: "Μία προώθηση δεν μπορεί να προωθηθεί." +quote: "Παράθεση" +pinnedNote: "Καρφιτσωμένη δημοσίευση" +pinned: "Καρφίτσωμα στο προφίλ" +you: "Εσύ" +clickToShow: "Κάντε κλικ για εμφάνιση" +add: "Προσθήκη" +reaction: "Αντιδράσεις" +reactionSetting: "Αντιδράσεις που θα εμφανίζονται στον επιλογέα" +reactionSettingDescription2: "Σύρετε για να αλλάξετε τη σειρά, κάντε κλικ για να διαγράψετε,\ + \ πατήστε \"+\" για να προσθέσετε." +rememberNoteVisibility: "Θυμήσου τις ρυθμίσεις ορατότητας για τις δημοσιεύσεις" +attachCancel: "Αφαίρεση επισυναπτόμενου" +enterFileName: "Πληκτρολογήστε όνομα αρχείου" +mute: "Σίγαση" +unmute: "Διακοπή σίγασης" +block: "Μπλοκάρισμα" +unblock: "Διακοπή μπλοκαρίσματος" +suspend: "Αποβολή" +unsuspend: "Διακοπή αποβολής" +blockConfirm: "Θέλετε σίγουρα να μπλοκάρετε αυτόν τον λογαριασμό;" +unblockConfirm: "Θέλετε σίγουρα να ξεμπλοκάρετε αυτόν τον λογαριασμό;" +suspendConfirm: "Θέλετε σίγουρα να αποβάλετε αυτόν τον λογαριασμό;" +unsuspendConfirm: "Θέλετε σίγουρα να άρετε την αποβολή αυτού του λογαριασμού;" +selectList: "Επιλέξτε μια λίστα" +selectAntenna: "Επιλέξτε μια αντένα" +selectWidget: "Επιλέξτε ένα πρόσθετο" +editWidgets: "Επεξεργασία πρόσθετων" +editWidgetsExit: "Ολοκληρώθηκε" +customEmojis: "Προσαρμοσμένα Emoji" +emojiName: "Όνομα emoji" +addEmoji: "Προσθήκη" +settingGuide: "Προτεινόμενες ρυθμίσεις" +flagAsBot: "Δήλωση αυτού του λογαριασμού ως bot" +flagAsCat: "Είσαι γατί; \U0001F63A" +flagShowTimelineReplies: "Εμφάνιση απαντήσεων στο χρονολόγιο" +addAccount: "Προσθήκη λογαριασμού" +general: "Γενικές" +wallpaper: "Ταπετσαρία" +setWallpaper: "Ορισμός ταπετσαρίας" +removeWallpaper: "Αφαίρεση ταπετσαρίας" +searchWith: "Αναζήτηση: {q}" +youHaveNoLists: "Δεν έχετε λίστες" +followConfirm: "Θέλετε σίγουρα να ακολουθήσετε τον λογαριασμό {name};" +host: "Φιλοξενεί (Host)" +selectUser: "Επιλέξτε ένα μέλος" +recipient: "Αποδέκτης-τρια(-ες)" +annotation: "Σχόλια" +federation: "Ομοσπονδία" +storageUsage: "Χρήση χώρου" +version: "Έκδοση" +metadata: "Μεταδεδομένα" +network: "Δίκτυο" +disk: "Δίσκος" +instanceInfo: "Πληροφορίες Instance" +statistics: "Στατιστικά" +clearQueue: "Εκκαθάριση ουράς" +clearQueueConfirmTitle: "Θέλετε να διαγράψετε την ουρά;" +clearCachedFiles: "Εκκαθάριση προσωρινής μνήμης (cache)" +done: "Ολοκληρώθηκε" +attachFile: "Επισύναψη αρχείων" +more: "Περισσότερα!" +noSuchUser: "Το μέλος δεν βρέθηκε" +announcements: "Ανακοινώσεις" +imageUrl: "URL εικόνας" +remove: "Διαγραφή" +removed: "Η διαγραφή ολοκληρώθηκε επιτυχώς" +saved: "Αποθηκεύτηκε" +messaging: "Συνομιλία" +upload: "Ανεβάστε" +fromDrive: "Από τον Αποθηκευτικό Χώρο" +fromUrl: "Από URL" +uploadFromUrl: "Ανέβασμα από URL" +explore: "Εξερεύνηση" +messageRead: "Διαβάστηκε" +startMessaging: "Ξεκινήστε μια νέα συνομιλία" +nUsersRead: "διαβάστηκε από {n}" +tos: "Όροι Χρήσης" +start: "Ας αρχίσουμε" +home: "Κεντρικό" +activity: "Δραστηριότητα" +images: "Εικόνες" +birthday: "Γενέθλια" +registeredDate: "Έγινε μέλος στις" +location: "Τοποθεσία" +theme: "Θέματα" +light: "Φωτεινό" +dark: "Σκοτεινό" +drive: "Αποθηκευτικός Χώρος" +fileName: "Όνομα αρχείου" +selectFile: "Επιλέξτε ένα αρχείο" +selectFiles: "Επιλέξτε αρχεία" +selectFolder: "Επιλέξτε φάκελο" +selectFolders: "Επιλέξτε φακέλους" +renameFile: "Μετονομασία αρχείου" +addFile: "Προσθέστε ένα αρχείο" +emptyDrive: "Ο Αποθηκευτικός Χώρος σας είναι άδειος" +copyUrl: "Αντιγραφή διεύθυνσης URL" +rename: "Μετονομασία" +avatar: "Άβαταρ" +banner: "Εξώφυλλο" +reload: "Ανανέωση" +doNothing: "Αγνόηση" +watch: "Παρακολούθηση" +unwatch: "Διακοπή παρακολούθησης" +accept: "Αποδοχή" +reject: "Απόρριψη" +normal: "Κανονικό" +instanceName: "Όνομα instance" +thisYear: "Έτος" +thisMonth: "Μήνας" +today: "Σήμερα" +dayX: "{day}" +pages: "Σελίδες" +connectService: "Σύνδεση" +disconnectService: "Αποσύνδεση" +registration: "Εγγραφή" +pinnedPages: "Καρφιτσωμένες Σελίδες" +pinnedNotes: "Καρφιτσωμένες δημοσιεύσεις" +antennas: "Αντένες" +manageAntennas: "Διαχείριση Αντενών" +name: "Όνομα" +antennaSource: "Πηγή Αντένας" +antennaKeywords: "Λέξεις-κλειδιά για παρακολούθηση" +antennaExcludeKeywords: "Λέξεις-κλειδιά για εξαίρεση" +notifyAntenna: "Ειδοποίηση για νέες δημοσιεύσεις" +withFileAntenna: "Μόνο δημοσιεύσεις με αρχεία" +caseSensitive: "Διάκριση Πεζών-Κεφαλαίων" +popularTags: "Δημοφιλείς ετικέτες" +userList: "Λίστες" +about: "Σχετικά με" +moderator: "Συντονιστής/στρια" +moderation: "Συντονισμός" +cacheClear: "Εκκαθάριση προσωρινής μνήμης (cache)" +markAsReadAllNotifications: "Σημειώστε όλες τις ειδοποιήσεις ως διαβασμένες" +group: "Ομάδα" +groups: "Ομάδες" +createGroup: "Δημιουργία ομάδας" +ownedGroups: "Οι ομάδες σας" +groupName: "Όνομα ομάδας" +members: "Μέλη" +transfer: "Μεταφορά" +messagingWithUser: "Προσωπική συνομιλία" +messagingWithGroup: "Ομαδική συνομιλία" +title: "Τίτλος" +text: "Κείμενο" +enable: "Ενεργοποίηση" +next: "Επόμενο" +noteOf: "Δημοσίευση από {user}" +inviteToGroup: "Πρόσκληση στην ομάδα" +quoteAttached: "Παράθεση" +signinRequired: "Παρακαλούμε δημιουργήστε λογαριασμό ή συνδεθείτε πριν συνεχίσετε" +category: "Κατηγορία" +tags: "Ετικέτες" +createAccount: "Δημιουργία λογαριασμού" +local: "Τοπικό" +remote: "Απομακρυσμένο" +total: "Σύνολο" +appearance: "Εμφάνιση" +accountSettings: "Ρυθμίσεις Λογαριασμού" +sounds: "Ήχοι" +sound: "Ήχοι" +listen: "Ακρόαση" +showInPage: "Εμφάνιση στη σελίδα" +volume: "Ένταση" +masterVolume: "Κεντρική ένταση" +details: "Λεπτομέρειες" +install: "Εγκαταστήστε" +uninstall: "Απεγκατάσταση" +manage: "Διαχείριση" +smtpHost: "Φιλοξενεί (Host)" +smtpUser: "Όνομα μέλους" +smtpPass: "Κωδικός" +notificationSetting: "Ρυθμίσεις ειδοποιήσεων" +notificationSettingDesc: "Επιλέξτε τους τύπους ειδοποιήσεων για προβολή." +switchUi: "Διάταξη" +clip: "Κλιπ" +driveFilesCount: "Αριθμός αρχείων Αποθηκευτικού Χώρου" +driveUsage: "Χρήση Αποθηκευτικού Χώρου" +noteFavoritesCount: "Αριθμός αγαπημένων σημειωμάτων" +clips: "Κλιπ" +clearCache: "Εκκαθάριση προσωρινής μνήμης" +emailNotification: "Ειδοποιήσεις μέσω mail" +inChannelSearch: "Αναζήτηση στο κανάλι" +info: "Πληροφορίες" +notRecommended: "Δεν προτείνεται" +switchAccount: "Αλλαγή λογαριασμού" +user: "Μέλη" +administration: "Διαχείριση" +switch: "Εναλλαγή" +gallery: "Γκαλερί" +global: "Παγκόσμιο" +searchResult: "Αποτελέσματα αναζήτησης" +learnMore: "Μάθετε περισσότερα" +controlPanel: "Πίνακας ελέγχου" +manageAccounts: "Διαχείριση Λογαριασμών" +searchByGoogle: "Αναζήτηση" +file: "Αρχεία" +recommended: "Προτεινόμενα" +cannotUploadBecauseNoFreeSpace: "Το ανέβασμα απέτυχε λόγω ανεπαρκούς Αποθηκευτικού\ + \ Χώρου." +_email: + _follow: + title: "Έχετε ένα νέο ακόλουθο" +_mfm: + mention: "Επισήμανση" + quote: "Παράθεση" + emoji: "Επιπλέον emoji" + search: "Αναζήτηση" +_channel: + featured: "Δημοφιλή" +_theme: + keys: + panel: "Πίνακας" + mention: "Επισήμανση" + renote: "Κοινοποίηση σημειώματος" +_sfx: + note: "Σημειώματα" + notification: "Ειδοποιήσεις" + chat: "Συνομιλία" + chatBg: "Συνομιλία (Παρασκήνιο)" + antenna: "Αντένες" + channel: "Ειδοποιήσεις καναλιών" +_ago: + future: "Μελλοντικό" + justNow: "Μόλις τώρα" + secondsAgo: "{n} δευτερόλεπτο(α) πριν" + minutesAgo: "{n} λεπτό(ά) πριν" + hoursAgo: "{n} ώρα(ες) πριν" + daysAgo: "{n} μέρα(ες) πριν" + weeksAgo: "{n} εβδομάδα(ες) πριν" + monthsAgo: "{n} μήνα(ες) πριν" + yearsAgo: "{n} έτος(η) πριν" +_permissions: + "write:drive": "Επεξεργαστείτε ή διαγράψτε τα αρχεία και τους φακέλους του Αποθηκευτικού\ + \ Χώρου σας" + "read:favorites": "Δείτε τη λίστα με τους σελιδοδείκτες σας" + "write:favorites": "Επεξεργαστείτε τη λίστα με τους σελιδοδείκτες σας" + "read:messaging": "Δείτε τις συνομιλίες σας" + "write:messaging": "Γράψτε ή διαγράψτε μηνύματα συνομιλίας" + "read:notifications": "Δείτε τις ειδοποιήσεις σας" + "write:notifications": "Διαχειριστείτε τις ειδοποιήσεις σας" + "read:pages": "Δείτε τις Σελίδες σας" + "write:pages": "Επεξεργαστείτε ή διαγράψτε τις σελίδες σας" + "write:gallery-likes": Επεξεργασία της λίστας των αγαπημένων σας δημοσιεύσεων γκαλερί + "read:gallery": Δείτε την γκαλερί σας + "write:gallery": Επεξεργασία της γκαλερί σας + "read:gallery-likes": Δείτε τη λίστα των αγαπημένων σας δημοσιεύσεων γκαλερί +_antennaSources: + all: "Όλα τα σημειώματα" + homeTimeline: "Σημειώματα από μέλη που ακολουθείτε" + users: "Σημειώματα από συγκεκριμένα μέλη" + userList: "Σημειώματα από καθορισμένη λίστα μελών" + userGroup: "Σημειώματα από μέλη καθορισμένης ομάδας" +_widgets: + profile: "Προφίλ" + instanceInfo: "Πληροφορίες του instance" + notifications: "Ειδοποιήσεις" + timeline: "Χρονολόγιο" + calendar: "Ημερολόγιο" + trends: "Δημοφιλή" + clock: "Ρολόι" + activity: "Δραστηριότητα" + photos: "Φωτογραφίες" + digitalClock: "Ψηφιακό ρολόι" + federation: "Ομοσπονδία" + postForm: "Φόρμα δημοσίευσης" + button: "Κουμπί" + onlineUsers: "Συνδεδεμένα μέλη" + _userList: + chooseList: "Επιλέξτε μία λίστα" +_cw: + show: "Δείτε περισσότερα" +_visibility: + home: "Κεντρικό" + homeDescription: "Δημοσίευση στο κεντρικό χρονολόγιο μόνο" + followers: "Ακολουθούν" +_profile: + name: "Όνομα" + username: "Όνομα μέλους" + changeAvatar: Αλλαγή άβαταρ +_exportOrImport: + allNotes: "Όλα τα σημειώματα" + followingList: "Ακολουθεί" + muteList: "Μέλη σε σίγαση" + blockingList: "Μπλοκαρισμένα μέλη" + userLists: "Λίστες" +_charts: + federation: "Ομοσπονδία" +_timelines: + home: "Κεντρικό" + local: "Τοπικό" + social: "Κοινωνικό" + global: "Παγκόσμιο" +_pages: + viewPage: "Δείτε τις Σελίδες σας" + blocks: + image: "Εικόνες" +_notification: + youGotMessagingMessageFromUser: "{name} σάς έστειλε ένα μήνυμα συνομιλίας" + youWereFollowed: "σε ακολούθησε" + _types: + follow: "Νέοι ακόλουθοι" + mention: "Επισήμανση" + renote: "Κοινοποίηση σημειώματος" + quote: "Παράθεση" + reaction: "Αντιδράσεις" + _actions: + reply: "Απάντηση" + renote: "Κοινοποίηση σημειώματος" +_deck: + widgetsIntroduction: "Παρακαλούμε επιλέξτε \"Επεξεργασία πρόσθετων\" στο μενού και\ + \ προσθέστε μαραφέτι." + _columns: + widgets: "Πρόσθετα" + notifications: "Ειδοποιήσεις" + tl: "Χρονολόγιο" + antenna: "Αντένες" + list: "Λίστα" + mentions: "Επισημάνσεις" +sensitive: Ευαίσθητο περιεχόμενο (NSFW) +createFolder: Δημιουργία φακέλου +uploadFromUrlDescription: Το URL του αρχείου που θέλετε να ανεβάσετε +emptyFolder: Αυτός ο φάκελος είναι άδειος +unableToDelete: Αδυναμία διαγραφής +recentlyUpdatedUsers: Πρόσφατα ενεργά μέλη +recentlyRegisteredUsers: Νέα μέλη +exploreUsersCount: Υπάρχουν {count} μέλη +help: Βοήθεια +inputNewFileName: Πληκτρολογήστε ένα νέο όνομα αρχείου +nothing: Δεν υπάρχει τίποτα να δείτε εδώ +newNoteRecived: Υπάρχουν νέες δημοσιεύσεις +passwordMatched: Ταιριάζει +unmarkAsSensitive: Αναίρεση επισήμανσης ως Ευαίσθητο Περιεχόμενο (NSFW) +blockedUsers: Μπλοκαρισμένα μέλη +noteDeleteConfirm: Θέλετε σίγουρα να διαγράψετε αυτή τη δημοσίευση; +preview: Προεπισκόπηση +noCustomEmojis: Δεν υπάρχουν emoji +tosUrl: URL Όρων Χρήσης +monthX: '{month}' +markAsReadAllTalkMessages: Σημειώστε όλα τα μηνύματα ως διαβασμένα +inputMessageHere: Γράψτε εδώ το μήνυμά σας +close: Κλείσιμο +newMessageExists: Υπάρχουν νέα μηνύματα +usernameInvalidFormat: Μπορείτε να χρησιμοποιήσετε κεφαλαία και μικρά γράμματα, αριθμούς, + και κάτω παύλες. +tooShort: Πολύ σύντομο +passwordNotMatched: Δεν ταιριάζει +existingAccount: Υπάρχων λογαριασμός +deleteAll: Διαγραφή όλων +chooseEmoji: Επιλέξτε ένα emoji +sort: Ταξινόμηση +descendingOrder: Φθίνουσα +deleteAllFiles: Διαγραφή όλων των αρχείων +userSuspended: Αυτό το μέλος έχει αποβληθεί. +menu: Μενού +divider: Χώρισμα +deletedNote: Διαγραμμένη δημοσίευση +useCw: Απόκρυψη περιεχομένου +description: Περιγραφή +width: Πλάτος +disableAll: Απενεργοποίηση όλων +notificationType: Τύπος ειδοποίησης +wordMute: Σίγαση λέξεων +userSaysSomething: '{name} είπε κάτι' +metrics: Μετρήσεις +overview: Γενική εικόνα +database: Βάση δεδομένων +channel: Κανάλια +other: Άλλα +abuseReports: Αναφορές +reportAbuse: Αναφορά +unclip: Ακύρωση κλιπ +public: Δημόσιο +renotedCount: Αριθμός προωθήσεων που ελήφθησαν +alwaysMarkSensitive: Επισήμανση ως ευαίσθητο περιεχόμενο (NSFW) ως προεπιλογή +markAllAsRead: Σημειώστε τα όλα ως διαβασμένα +_gallery: + like: Μου αρέσει + liked: Αγαπημένες δημοσιεύσεις + my: Η Γκαλερί μου + unlike: Δεν μου αρέσει +showOnRemote: Δείτε στο απομακρυσμένο instance +perDay: Ανά Ημέρα +software: Λογισμικό +cpuAndMemory: CPU και Μνήμη +noUsers: Δεν υπάρχουν μέλη +processing: Επεξεργασία +changePassword: Αλλαγή κωδικού +security: Ασφάλεια +featured: Προτεινόμενα +keepOriginalUploading: Διατήρηση πρωτότυπης εικόνας +manageGroups: Διαχείριση ομάδων +deleteFolder: Διαγραφή φακέλου +nsfw: Ευαίσθητο περιεχόμενο (NSFW) +nUsersMentioned: Έχει αναφερθεί από {n} μέλη +notFound: Δεν βρέθηκε +markAsReadAllUnreadNotes: Σημειώστε όλες τις δημοσιεύσεις ως διαβασμένες +invites: Προσκλήσεις +quoteQuestion: Να προστεθεί ως Παράθεση; +noMessagesYet: Δεν υπάρχουν μηνύματα ακόμη +onlyOneFileCanBeAttached: Μπορείτε να επισυνάψετε μόνο ένα αρχείο σε ένα μήνυμα +tooLong: Υπερβολικά μακροσκελές +or: Ή +language: Γλώσσα +groupInvited: Προσκληθήκατε σε μία ομάδα +ascendingOrder: Αύξουσα +visibility: Ορατότητα +invisibleNote: Αόρατη δημοσίευση +enableInfiniteScroll: Αυτόματη φόρτωση περισσοτέρων +poll: Ψηφοφορία +enablePlayer: Άνοιγμα προβολής βίντεο +large: Μεγάλο +medium: Μεσαίο +small: Μικρό +postToGallery: Δημιουργία νέας δημοσίευσης γκαλερί +reloadConfirm: Θα θέλατε να ανανεώσετε το χρονολόγιο; +enableAll: Ενεργοποίηση όλων +permission: Εξουσιοδοτήσεις +sample: Δείγμα +copy: Αντιγραφή +display: Προβολή +send: Αποστολή +behavior: Συμπεριφορά +useGlobalSetting: Χρήση παγκόσμιων ρυθμίσεων +abuseMarkAsResolved: Επισήμανση της αναφοράς ως επιλυμένης +openInNewTab: Άνοιγμα σε νέα καρτέλα +_sensitiveMediaDetection: + setSensitiveFlagAutomatically: Επισήμανση ως ευαίσθητο περιεχόμενο (NSFW) +defaultNavigationBehaviour: Προεπιλεγμένη συμπεριφορά περιήγησης +system: Σύστημα +createNew: Δημιουργία νέου +createNewClip: Δημιουργία νέου κλιπ +repliesCount: Αριθμός απεσταλμένων απαντήσεων +optional: Προαιρετικό +renotesCount: Αριθμός προωθήσεων σε δημοσιεύσεις άλλων +addItem: Προσθήκη αντικειμένου +disablePlayer: Κλείσιμο προβολής βίντεο +describeFile: Προσθήκη περιγραφής +enterFileDescription: Πληκτρολογήστε περιγραφή +author: Συντάκτης/τρια +setMultipleBySeparatingWithSpace: Διαχωρίστε πολλαπλές καταχωρήσεις με κενά. +random: Τυχαίο +accountInfo: Πληροφορίες Λογαριασμού +notesCount: Αριθμός δημοσιεύσεων +repliedCount: Αριθμός απαντήσεων που ελήφθησαν +flagAsCatDescription: Θα έχεις γατοαυτιά και θα μιλάς σαν γατί! +muteAndBlock: Σιγάσεις και Μπλοκαρίσματα +mutedUsers: Σιγασμένα μέλη +editProfile: Επεξεργασία προφίλ +pinLimitExceeded: Δεν μπορείτε να καρφιτσώσετε άλλες δημοσιεύσεις +currentPassword: Τρέχων κωδικός +newPassword: Νέος κωδικός +newPasswordRetype: Ξαναπληκτρολογήστε τον νέο κωδικό +notesAndReplies: Δημοσιεύσεις και απαντήσεις +popularUsers: Δημοφιλή μέλη +share: Κοινοποίηση +retype: Πληκτρολογήστε ξανά +invitations: Προσκλήσεις +available: Διαθέσιμο +unavailable: Μη διαθέσιμο +youHaveNoGroups: Δεν έχετε ομάδες +doing: Επεξεργασία... +yourAccountSuspendedTitle: Αυτός ο λογαριασμός έχει αποβληθεί +leaveConfirm: Υπάρχουν αλλαγές που δεν έχουν σωθεί. Θέλετε να τις απορρίψετε; +height: Ύψος +edit: Επεξεργασία +headlineMisskey: Μία ανοιχτού λογισμικού, αποκεντρωμένη πλατφόρμα κοινωνικής δικτύωσης + που θα είναι για πάντα ελεύθερη! 🚀 +introMisskey: Καλώς ήρθατε! Το Calckey είναι μία ανοιχτού λογισμικού, αποκεντρωμένη + πλατφόρμα κοινωνικής δικτύωσης που θα είναι για πάντα ελεύθερη! 🚀 +markAsSensitive: Επισήμανση ως Ευαίσθητο Περιεχόμενο (NSFW) +autoAcceptFollowed: Αυτόματη έγκριση αιτημάτων ακολούθησης από λογαριασμούς που ακολουθείτε +loginFailed: Αποτυχία σύνδεσης +accountMoved: 'Έχει μεταφερθεί σε νέο λογαριασμό:' +perHour: Ανά Ώρα +remoteUserCaution: Οι πληροφορίες από απομακρυσμένους λογαριασμούς μπορεί να είναι + ατελείς. +folderName: Όνομα φακέλου +renameFolder: Μετονομασία φακέλου +recentUsed: Χρησιμοποιήθηκαν πρόσφατα +deleteAllFilesConfirm: Σίγουρα θέλετε να διαγράψετε όλα τα αρχεία; +removeAllFollowing: Διακοπή ακολούθησης όλων των ακολουθούμενων μελών +userSilenced: Αυτό το μέλος είναι υπό σιώπηση. +makeActive: Ενεργοποίηση +create: Δημιουργία +reportAbuseOf: Αναφορά {name} +cacheRemoteFilesDescription: Όταν αυτή η ρύθμιση είναι απενεργοποιημένη, τα απομακρυσμένα + αρχεία φορτώνονται απευθείας από το απομακρυσμένο instance. Η απενεργοποίηση θα + μειώσει τη χρήση του δίσκου σας, αλλά θα αυξήσει την κίνηση δεδομένων, καθώς δεν + θα δημιουργούνται σμικρύνσεις αρχείων (thumbnails). +registeredAt: Εγγράφηκε στις +latestStatus: Τελευταία κατάσταση +charts: Πίνακες +stopActivityDelivery: Σταμάτα να στέλνεις δραστηριότητες +operations: Λειτουργίες +monitor: Παρακολούθηση +jobQueue: Ουρά εργασιών +blockedInstances: Μπλοκαρισμένα Instances +blockedInstancesDescription: Παραθέστε τις διευθύνσεις (hostnames) των instances που + θέλετε να μπλοκάρετε. Τα παρακάτω instances δεν θα μπορούν πλέον να επικοινωνούν + με αυτό το instance. +intro: Η εγκατάσταση του Calckey τελείωσε! Παρακαλώ δημιουργήστε ένα μέλος διαχειριστή/στρια. +noThankYou: Όχι, ευχαριστώ +addInstance: Προσθήκη instance +renoteMute: Σίγαση προωθήσεων +emojiUrl: Διεύθυνση emoji (URL) +cacheRemoteFiles: Προσωρινή αποθήκευση απομακρυσμένων αρχείων +flagSpeakAsCat: Να μιλάς σαν γατί +flagSpeakAsCatDescription: Οι δημοσιεύσεις σου θα nyaοποιούνται όταν είσαι γατί +selectInstance: Επιλέξτε ένα instance +latestRequestSentAt: Τελευταίο αίτημα στάλθηκε +hiddenTags: Κρυμμένες Ετικέτες (Hashtags) +noInstances: Δεν υπάρχουν instances +renoteUnmute: Διακοπή σίγασης προωθήσεων +flagAsBotDescription: Ενεργοποιήστε αυτή την επιλογή αν αυτός ο λογαριασμός ελέγχεται + από ένα πρόγραμμα. Αν ενεργοποιηθεί, θα λειτουργεί σαν σημάδι για τους προγραμματιστές, + ώστε να αποφύγουν ατέρμονη αλληλεπίδραση με άλλα bots και για να ρυθμίσει τα εσωτερικά + συστήματα του Calckey ώστε να αντιμετωπίζουν αυτόν τον λογαριασμό ως bot. +flagShowTimelineRepliesDescription: Εμφάνιση απαντήσεων μελών σε δημοσιεύσεις άλλων + μελών στο χρονολόγιο. +latestRequestReceivedAt: Τελευταίο αίτημα ελήφθη +blockThisInstance: Μπλοκάρισμα αυτού του instance +clearQueueConfirmText: Τυχόν δημοσιεύσεις στην ουρά που δεν έχουν αποσταλεί δεν θα + ομοσπονδοποιηθούν. Συνήθως αυτή η λειτουργία δεν χρειάζεται. +clearCachedFilesConfirm: Σίγουρα θέλετε να διαγράψετε όλα τα προσωρινά αποθηκευμένα + απομακρυσμένα αρχεία; +default: Προεπιλεγμένο +defaultValueIs: 'Προεπιλεγμένο: {value}' +noJobs: Δεν υπάρχουν εργασίες (jobs) +federating: Ομοσπονδοποιείται +blocked: Μπλοκαρισμένο +suspended: Σε αποβολή +instanceFollowing: Ακολουθεί στο instance +instanceFollowers: Ακόλουθοι του instance +instanceUsers: Μέλη αυτού του instance +retypedNotMatch: Οι καταχωρήσεις δεν ταιριάζουν. +usernameOrUserId: Όνομα μέλους ή ταυτότητα μέλους (id) +removeAreYouSure: Θέλετε σίγουρα να αφαιρέσετε το "{x}"; +deleteAreYouSure: Θέλετε σίγουρα να διαγράψετε το "{x}"; +resetAreYouSure: Σίγουρα επανεκκίνηση; +uploadFromUrlMayTakeTime: Ίσως πάρει λίγο χρόνο μέχρι το ανέβασμα να ολοκληρωθεί. +noMoreHistory: Δεν υπάρχει περαιτέρω ιστορικό +agreeTo: Συμφωνώ στο {0} +yearsOld: '{age} ετών' +themeForDarkMode: Θέμα για τη Σκοτεινή Λειτουργία +syncDeviceDarkMode: Συγχρονισμός της Σκοτεινής Λειτουργίας με τις ρυθμίσεις της συσκευής + σας +inputNewDescription: Προσθέστε νέα περιγραφή +whenServerDisconnected: Όταν χάνεται η σύνδεση στον σέρβερ +disconnectedFromServer: Η σύνδεση στον σέρβερ έχει χαθεί +instanceDescription: Περιγραφή instance +maintainerEmail: Διεύθυνση email προγραμματιστή/στριας +yearX: '{year}' +enableGlobalTimeline: Ενεργοποίηση παγκόσμιου χρονολογίου +enableLocalTimeline: Ενεργοποίηση τοπικού χρονολογίου +enableRegistration: Ενεργοποίηση εγγραφής νέων μελών +invite: Πρόσκληση +disablingTimelinesInfo: Οι Διαχειρίστριες-ες και οι Συντονιστές-στριες θα έχουν πάντα + πρόσβαση σε όλα τα χρονολόγια, ακόμα κι αν δεν είναι ενεργοποιημένα. +inMb: Σε megabytes +iconUrl: Διεύθυνση URL εικονιδίου +bannerUrl: Διεύθυνση URL εικόνας Εξώφυλλου +pinnedUsers: Καρφιτσωμένα μέλη +hcaptchaSiteKey: Κλειδί του site +recaptcha: Προστασία reCAPTCHA +enableServiceworker: Ενεργοποίηση Ειδοποιήσεων Push για τον browser σας +recentlyDiscoveredUsers: Μέλη που ανακαλύφθηκαν πρόσφατα +twoStepAuthentication: Επαλήθευση δύο παραγόντων +securityKey: Κλειδί ασφάλειας +registerSecurityKey: Καταχωρήστε ένα κλειδί ασφάλειας +resetPassword: Επαναφορά κωδικού +newPasswordIs: Ο νέος κωδικός είναι "{password}" +uploadFolder: Προεπιλεγμένος φάκελος για ανέβασμα αρχείων +joinedGroups: Οι ομάδες που είστε μέλος +checking: Έλεγχος... +invitationCode: Κωδικός πρόσκλησης +normalPassword: Μέτριος κωδικός +weakPassword: Αδύναμος κωδικός +strongPassword: Δυνατός κωδικός +signinWith: Συνδεθείτε με {x} +tapSecurityKey: Βάλτε το κλειδί ασφάλειας +signinFailed: Αδυναμία σύνδεσης. Το όνομα μέλους ή ο κωδικός είναι λάθος. +aboutX: Σχετικά με {x} +useOsNativeEmojis: Χρήση των Emoji του λειτουργικού συστήματος +uiLanguage: Γλώσσα διεπαφής +disableDrawer: Να μη χρησιμοποιούνται μενού σε στιλ συρταριού +noHistory: Δεν υπάρχει διαθέσιμο ιστορικό +joinOrCreateGroup: Λάβετε πρόσκληση για μία ομάδα ή δημιουργήστε τη δική σας. +docSource: Πηγή αυτού του εγγράφου +regenerate: Επαναδημιουργία +fontSize: Μέγεθος γραμματοσειράς +noFollowRequests: Δεν έχετε αιτήματα ακολούθησης σε αναμονή +dashboard: Ταμπλό +clientSettings: Ρυθμίσεις διεπαφής +numberOfDays: Αριθμός ημερών +hideThisNote: Απόκρυψη αυτής της δημοσίευσης +showFeaturedNotesInTimeline: Εμφάνιση προτεινόμενων δημοσιεύσεων στα χρονολόγια +objectStorage: Αποθήκευση Object Storage +useObjectStorage: Χρήση object storage +objectStorageBucket: '' +showFixedPostForm: Εμφάνιση της φόρμας δημοσίευσης στο πάνω μέρος των χρονολογίων +none: Κανένα +unableToProcess: Η επιχείρηση ήταν αδύνατο να ολοκληρωθεί +installedApps: Εφαρμογές με εξουσιοδότηση +state: Κατάσταση +installedDate: Εξουσιοδοτήθηκε στις +lastUsedDate: Χρησιμοποιήθηκε τελευταία φορά στις +scratchpadDescription: Το σημειωματάριο παρέχει ένα περιβάλλον για πειραματισμό με + AiScript. Σε αυτό μπορείτε να γράψετε, να εκτελέσετε, και να δοκιμάσετε τα αποτελέσματα + της αλληλεπίδρασης του AiScript με το Calckey. +scratchpad: Σημειωματάριο +output: Αποτέλεσμα +updateRemoteUser: Ανανέωση πληροφοριών απομακρυσμένου μέλους +disablePagesScript: Απενεργοποίηση του AiScript στις Σελίδες +removeAllFollowingDescription: Η εκτέλεση θα διακόψη την ακολούθηση όλων των μελών + από {host}. Παρακαλούμε εκτελέστε το αν το instance π.χ. δεν υπάρχει πια. +caption: Αυτόματη Περιγραφή +all: Όλα +subscribing: Εγγραφή σε συνδρομή +publishing: Δημοσιεύεται +notResponding: Δεν αποκρίνεται +keepOriginalUploadingDescription: Αποθηκεύει το πρωτότυπο αρχείο όπως είναι. Αν απενεργοποιηθεί, + μία έκδοση για προβολή στο ίντερνετ θα δημιουργηθεί κατά το ανέβασμα. +lookup: Αναζήτηση +lightThemes: Φωτεινά θέματα +darkThemes: Σκοτεινά θέματα +inputNewFolderName: Πληκτρολογήστε ένα νέο όνομα φακέλου +hasChildFilesOrFolders: Εφόσον αυτός ο φάκελος δεν είναι άδειος, δεν μπορεί να διαγραφεί. +integration: Ενσωματώσεις +enableRecommendedTimeline: Ενεργοποίηση χρονολογίου προτεινόμενων +driveCapacityPerLocalAccount: Μέγεθος Αποθηκευτικού Χώρου ανά τοπικό μέλος +driveCapacityPerRemoteAccount: Μέγεθος Αποθηκευτικού Χώρου ανά απομακρυσμένο μέλος +basicInfo: Βασικές πληροφορίες +pinnedClipId: Ταυτότητα (id) του κλιπ για καρφίτσωμα +hcaptcha: Προστασία hCaptcha +enableHcaptcha: Ενεργοποίηση hCaptcha +hcaptchaSecretKey: Μυστικό κλειδί +enableRecaptcha: Ενεργοποίηση reCAPTCHA +recaptchaSiteKey: Κλειδί του site +recaptchaSecretKey: Μυστικό κλειδί +antennaKeywordsDescription: Διαχωρίστε με κενά για συνθήκη ΚΑΙ ή με αλλαγή γραμμής + για συνθήκη Ή. +antennaUsersDescription: Παραθέστε ένα όνομα μέλους ανά γραμμή +antennaInstancesDescription: Παραθέστε ένα instance host ανά γραμμή +withReplies: Να περιλαμβάνονται οι απαντήσεις +withFiles: Να περιλαμβάνουν αρχεία +silence: Σιώπηση +silenceConfirm: Θέλετε σίγουρα να σιωπήσετε αυτό το μέλος; +unsilenceConfirm: Σίγουρα θέλετε να αναιρέσετε τη σιώπηση αυτού του μέλους; +securityKeyName: Όνομα κλειδιού +lastUsed: Τελευταία χρήση +unregister: Απεγγραφή +notFoundDescription: Δεν ήταν δυνατό να βρεθεί σελίδα που να ανταποκρίνεται σε αυτή + τη διεύθυνση URL. +signinHistory: Ιστορικό συνδέσεων +disableAnimatedMfm: Απενεργοποίηση του MFM με κίνηση +dayOverDayChanges: Αλλαγές την τελευταία ημέρα +promotion: Προμοταρισμένα +promote: Προμοτάρισμα +squareAvatars: Εμφάνιση τετραγωνισμένων άβαταρ +aboutMisskey: Σχετικά με το Calckey +maintainerName: Προγραμματιστής/στρια +uploadFromUrlRequested: Το ανέβασμα ζητήθηκε +themeForLightMode: Θέμα για τη Φωτεινή Λειτουργία +circularReferenceFolder: Ο φάκελος του προορισμού είναι υποφάκελος του φακέλου που + θέλετε να μετακινήσετε. +backgroundImageUrl: Διεύθυνση URL εικόνας φόντου +pinnedUsersDescription: Παραθέστε τα ονόματα μελών που θα είναι καρφιτσωμένα στην + καρτέλα "Εξερεύνηση" χωρίζοντάς τα με αλλαγή γραμμής. +openImageInNewTab: Άνοιγμα εικόνων σε νέα καρτέλα +weekOverWeekChanges: Αλλαγές την τελευταία εβδομάδα +exploreFediverse: Εξερευνήστε το Fediverse +unsilence: Αναίρεση σιώπησης +administrator: Διαχειριστής/στρια +passwordLessLogin: Σύνδεση χωρίς κωδικό +reduceUiAnimation: Ελάττωση των κινούμενων εικόνων +serviceworkerInfo: Πρέπει να είναι ενεργοποιημένο για ειδοποιήσεις push. +expandTweet: Διεύρυνση τουιτ +themeEditor: Επεξεργασία θεμάτων +deck: Ντεκ +undeck: Έξοδος από το Ντεκ +useFullReactionPicker: Χρήση επιλογέα αντιδράσεων πλήρους μεγέθους +tokenRequested: Παροχή πρόσβασης στον λογαριασμό +emailServer: Σέρβερ email +enableEmail: Ενεργοποίηση του email distribution +emailAddress: Διεύθυνση email +emailConfigInfo: Χρησιμοποιείται για επιβεβαίωση του email σας κατά την εγγραφή ή + αν ξεχάσετε τον κωδικό σας +regenerateLoginToken: Επαναδημιουργία token σύνδεσης +fileIdOrUrl: Ταυτότητα αρχείου (ID) ή διεύθυνση URL +typingUsers: '{users} πληκτρολογεί' +yourAccountSuspendedDescription: Αυτός ο λογαριασμός έχει αποβληθεί λόγω μη συμμόρφωσης + με τους κανόνες του σέρβερ ή κάτι παρόμοιο. Επικοινωνήστε με τον διαχειριστή/στρια + αν θα θέλατε έναν πιο λεπτομερή λόγο. Παρακαλούμε μη δημιουργήσετε νέο λογαριασμό. +inboxUrl: Διεύθυνση URL των Εισερχομένων +generateAccessToken: Δημιουργία token πρόσβασης +emptyToDisableSmtpAuth: Αφήστε το όνομα μέλους και τον κωδικό άδεια για να απενεργοποιήσετε + την επαλήθευση SMTP +instanceMute: Σιγάσεις instance +userSaysSomethingReason: '{name} είπε {reason}' +logs: Αρχεία καταγραφής +abuseReported: Η αναφορά σας στάλθηκε. Ευχαριστούμε πολύ. +reporter: Έκανε την αναφορά +reporteeOrigin: Καταγωγή αναφερόμενου λογαριασμού +reporterOrigin: Καταγωγή λογαριασμού που έκανε την αναφορά +forwardReport: Προώθηση της αναφοράς στο απομακρυσμένο instance +openInSideView: Άνοιγμα σε προβολή παράθεσης +delayed: Με καθυστέρηση +useGlobalSettingDesc: Αν ενεργοποιηθεί, οι ρυθμίσεις ειδοποιήσεων του λογαριασμού + σας θα χρησιμοποιηθούν. Αν απενεργοποιηθεί, μπορούν να γίνουν ανεξάρτητες ρυθμίσεις. +fillAbuseReportDescription: Παρακαλούμε συμπληρώστε λεπτομέρειες σχετικά με αυτή την + αναφορά. Αν πρόκειται για συγκεκριμένη δημοσίευση, παρακαλούμε συμπεριλάβετε τη + διεύθυνση URL της δημοσίευσης. +forwardReportIsAnonymous: Αντί για τον λογαριασμό σας, μία ανώνυμη αναφορά από λογαριασμό + του συστήματος θα εμφανιστεί στο απομακρυσμένο instance. diff --git a/fe_calckey/frontend/locales/en-US.yml b/fe_calckey/frontend/locales/en-US.yml new file mode 100644 index 0000000..c619c26 --- /dev/null +++ b/fe_calckey/frontend/locales/en-US.yml @@ -0,0 +1,2078 @@ +_lang_: "English" +headlineMisskey: "An open source, decentralized social media platform that's free + forever! 🚀" +introMisskey: "Welcome! Calckey is an open source, decentralized social media platform + that's free forever! 🚀" +monthAndDay: "{month}/{day}" +search: "Search" +searchPlaceholder: "Search Calckey" +notifications: "Notifications" +username: "Username" +password: "Password" +forgotPassword: "Forgot password" +fetchingAsApObject: "Fetching from the Fediverse" +ok: "OK" +gotIt: "Got it!" +cancel: "Cancel" +noThankYou: "No thank you" +enterUsername: "Enter username" +renotedBy: "Boosted by {user}" +noNotes: "No posts" +noNotifications: "No notifications" +instance: "Server" +settings: "Settings" +basicSettings: "Basic Settings" +otherSettings: "Other Settings" +openInWindow: "Open in window" +profile: "Profile" +timeline: "Timeline" +noAccountDescription: "This user has not written their bio yet." +login: "Sign In" +loggingIn: "Signing In" +logout: "Sign Out" +signup: "Sign Up" +uploading: "Uploading..." +save: "Save" +users: "Users" +addUser: "Add a user" +addInstance: "Add a server" +favorite: "Add to bookmarks" +favorites: "Bookmarks" +unfavorite: "Remove from bookmarks" +favorited: "Added to bookmarks." +alreadyFavorited: "Already added to bookmarks." +cantFavorite: "Couldn't add to bookmarks." +pin: "Pin to profile" +unpin: "Unpin from profile" +copyContent: "Copy contents" +copyLink: "Copy link" +delete: "Delete" +deleted: "Deleted" +deleteAndEdit: "Delete and edit" +deleteAndEditConfirm: "Are you sure you want to delete this post and edit it? You + will lose all reactions, boosts and replies to it." +editNote: "Edit note" +edited: "Edited at {date} {time}" +addToList: "Add to list" +sendMessage: "Send a message" +copyUsername: "Copy username" +searchUser: "Search for a user" +reply: "Reply" +jumpToPrevious: "Jump to previous" +loadMore: "Load more" +showMore: "Show more" +newer: "newer" +older: "older" +showLess: "Close" +youGotNewFollower: "followed you" +receiveFollowRequest: "Follow request received" +followRequestAccepted: "Follow request accepted" +mention: "Mention" +mentions: "Mentions" +directNotes: "Direct messages" +cw: "Content warning" +importAndExport: "Import/Export Data" +import: "Import" +export: "Export" +files: "Files" +download: "Download" +driveFileDeleteConfirm: "Are you sure you want to delete the file \"{name}\"? It will + be removed from all posts that contain it as an attachment." +unfollowConfirm: "Are you sure that you want to unfollow {name}?" +exportRequested: "You've requested an export. This may take a while. It will be added + to your Drive once completed." +importRequested: "You've requested an import. This may take a while." +lists: "Lists" +listsDesc: "Lists let you create timelines with specified users. They can be accessed from the timelines page." +noLists: "You don't have any lists" +note: "Post" +notes: "Posts" +following: "Following" +followers: "Followers" +followsYou: "Follows you" +createList: "Create list" +manageLists: "Manage lists" +error: "Error" +somethingHappened: "An error has occurred" +retry: "Retry" +pageLoadError: "An error occurred loading the page." +pageLoadErrorDescription: "This is normally caused by network errors or the browser's + cache. Try clearing the cache and then try again after waiting a little while." +serverIsDead: "This server is not responding. Please wait for a while and try again." +youShouldUpgradeClient: "To view this page, please refresh to update your client." +enterListName: "Enter a name for the list" +privacy: "Privacy" +makeFollowManuallyApprove: "Follow requests require approval" +defaultNoteVisibility: "Default visibility" +follow: "Follow" +followRequest: "Follow" +followRequests: "Follow requests" +unfollow: "Unfollow" +followRequestPending: "Follow request pending" +enterEmoji: "Enter an emoji" +renote: "Boost" +unrenote: "Take back boost" +renoted: "Boosted." +cantRenote: "This post can't be boosted." +cantReRenote: "A boost can't be boosted." +quote: "Quote" +pinnedNote: "Pinned post" +pinned: "Pin to profile" +you: "You" +clickToShow: "Click to show" +sensitive: "NSFW" +add: "Add" +reaction: "Reactions" +removeReaction: "Remove your reaction" +enableEmojiReactions: "Enable emoji reactions" +showEmojisInReactionNotifications: "Show emojis in reaction notifications" +reactionSetting: "Reactions to show in the reaction picker" +reactionSettingDescription2: "Drag to reorder, click to delete, press \"+\" to add." +rememberNoteVisibility: "Remember post visibility settings" +attachCancel: "Remove attachment" +markAsSensitive: "Mark as NSFW" +unmarkAsSensitive: "Unmark as NSFW" +enterFileName: "Enter filename" +mute: "Mute" +unmute: "Unmute" +renoteMute: "Mute boosts" +renoteUnmute: "Unmute boosts" +block: "Block" +unblock: "Unblock" +suspend: "Suspend" +unsuspend: "Unsuspend" +blockConfirm: "Are you sure that you want to block this account?" +unblockConfirm: "Are you sure that you want to unblock this account?" +suspendConfirm: "Are you sure that you want to suspend this account?" +unsuspendConfirm: "Are you sure that you want to unsuspend this account?" +selectList: "Select a list" +selectAntenna: "Select an antenna" +selectWidget: "Select a widget" +selectChannel: "Select a channel" +editWidgets: "Edit widgets" +editWidgetsExit: "Done" +customEmojis: "Custom Emoji" +emoji: "Emoji" +emojis: "Emoji" +emojiName: "Emoji name" +emojiUrl: "Emoji URL" +addEmoji: "Add" +settingGuide: "Recommended settings" +cacheRemoteFiles: "Cache remote files" +cacheRemoteFilesDescription: "When this setting is disabled, remote files are loaded + directly from the remote server. Disabling this will decrease storage usage, but + increase traffic, as thumbnails will not be generated." +flagAsBot: "Mark this account as a bot" +flagAsBotDescription: "Enable this option if this account is controlled by a program. + If enabled, it will act as a flag for other developers to prevent endless interaction + chains with other bots and adjust Calckey's internal systems to treat this account + as a bot." +flagAsCat: "Are you a cat? 😺" +flagAsCatDescription: "You'll get cat ears and speak like a cat!" +flagSpeakAsCat: "Speak as a cat" +flagSpeakAsCatDescription: "Your posts will get nyanified when in cat mode" +flagShowTimelineReplies: "Show replies in timeline" +flagShowTimelineRepliesDescription: "Shows replies of users to posts of other users + in the timeline if turned on." +autoAcceptFollowed: "Automatically approve follow requests from users you're following" +addAccount: "Add account" +loginFailed: "Failed to sign in" +showOnRemote: "View on remote server" +general: "General" +accountMoved: "User has moved to a new account:" +wallpaper: "Wallpaper" +setWallpaper: "Set wallpaper" +removeWallpaper: "Remove wallpaper" +searchWith: "Search: {q}" +youHaveNoLists: "You don't have any lists" +followConfirm: "Are you sure that you want to follow {name}?" +proxyAccount: "Proxy Account" +proxyAccountDescription: "A proxy account is an account that acts as a remote follower + for users under certain conditions. For example, when a user adds a remote user + to the list, the remote user's activity will not be delivered to the server if no + local user is following that user, so the proxy account will follow instead." +host: "Host" +selectUser: "Select a user" +selectInstance: "Select an server" +recipient: "Recipient(s)" +annotation: "Comments" +federation: "Federation" +instances: "Servers" +registeredAt: "Registered at" +latestRequestSentAt: "Last request sent" +latestRequestReceivedAt: "Last request received" +latestStatus: "Latest status" +storageUsage: "Storage usage" +charts: "Charts" +perHour: "Per Hour" +perDay: "Per Day" +stopActivityDelivery: "Stop sending activities" +blockThisInstance: "Block this server" +silenceThisInstance: "Silence this server" +operations: "Operations" +software: "Software" +version: "Version" +metadata: "Metadata" +monitor: "Monitor" +jobQueue: "Job Queue" +cpuAndMemory: "CPU and Memory" +network: "Network" +disk: "Disk" +instanceInfo: "Server Information" +statistics: "Statistics" +clearQueue: "Clear queue" +clearQueueConfirmTitle: "Are you sure that you want to clear the queue?" +clearQueueConfirmText: "Any undelivered posts remaining in the queue will not be federated. + Usually this operation is not needed." +clearCachedFiles: "Clear cache" +clearCachedFilesConfirm: "Are you sure that you want to delete all cached remote files?" +blockedInstances: "Blocked Servers" +blockedInstancesDescription: "List the hostnames of the servers that you want to block. + Listed servers will no longer be able to communicate with this servers." +silencedInstances: "Silenced Servers" +silencedInstancesDescription: "List the hostnames of the servers that you want to + silence. Accounts in the listed servers are treated as \"Silenced\", can only make + follow requests, and cannot mention local accounts if not followed. This will not + affect the blocked servers." +hiddenTags: "Hidden Hashtags" +hiddenTagsDescription: "List the hashtags (without the #) of the hashtags you wish + to hide from trending and explore. Hidden hashtags are still discoverable via other + means." +muteAndBlock: "Mutes and Blocks" +mutedUsers: "Muted users" +blockedUsers: "Blocked users" +noUsers: "There are no users" +noInstances: "There are no servers" +editProfile: "Edit profile" +noteDeleteConfirm: "Are you sure you want to delete this post?" +pinLimitExceeded: "You cannot pin any more posts" +intro: "Installation of Calckey has been finished! Please create an admin user." +done: "Done" +processing: "Processing" +preview: "Preview" +default: "Default" +defaultValueIs: "Default: {value}" +noCustomEmojis: "There are no emoji" +noJobs: "There are no jobs" +federating: "Federating" +blocked: "Blocked" +silenced: "Silenced" +suspended: "Suspended" +all: "All" +subscribing: "Subscribing" +publishing: "Publishing" +notResponding: "Not responding" +instanceFollowing: "Following on server" +instanceFollowers: "Followers of server" +instanceUsers: "Users of this server" +changePassword: "Change password" +security: "Security" +retypedNotMatch: "The inputs do not match." +currentPassword: "Current password" +newPassword: "New password" +newPasswordRetype: "Retype new password" +attachFile: "Attach files" +more: "More!" +featured: "Featured" +usernameOrUserId: "Username or user id" +noSuchUser: "User not found" +lookup: "Lookup" +announcements: "Announcements" +imageUrl: "Image URL" +remove: "Delete" +removed: "Successfully deleted" +removeAreYouSure: "Are you sure that you want to remove \"{x}\"?" +deleteAreYouSure: "Are you sure that you want to delete \"{x}\"?" +resetAreYouSure: "Really reset?" +saved: "Saved" +messaging: "Chat" +upload: "Upload" +keepOriginalUploading: "Keep original image" +keepOriginalUploadingDescription: "Saves the originally uploaded image as-is. If turned + off, a version to display on the web will be generated on upload." +fromDrive: "From Drive" +fromUrl: "From URL" +uploadFromUrl: "Upload from a URL" +uploadFromUrlDescription: "URL of the file you want to upload" +uploadFromUrlRequested: "Upload requested" +uploadFromUrlMayTakeTime: "It may take some time until the upload is complete." +explore: "Explore" +messageRead: "Read" +noMoreHistory: "There is no further history" +startMessaging: "Start a new chat" +manageGroups: "Manage groups" +nUsersRead: "read by {n}" +agreeTo: "I agree to {0}" +tos: "Terms of Service" +start: "Begin" +home: "Home" +remoteUserCaution: "Information from remote users may be incomplete." +activity: "Activity" +images: "Images" +birthday: "Birthday" +yearsOld: "{age} years old" +registeredDate: "Joined on" +location: "Location" +theme: "Themes" +themeForLightMode: "Theme to use in Light Mode" +themeForDarkMode: "Theme to use in Dark Mode" +light: "Light" +dark: "Dark" +lightThemes: "Light themes" +darkThemes: "Dark themes" +syncDeviceDarkMode: "Sync Dark Mode with your device settings" +drive: "Drive" +fileName: "Filename" +selectFile: "Select a file" +selectFiles: "Select files" +selectFolder: "Select a folder" +selectFolders: "Select folders" +renameFile: "Rename file" +folderName: "Folder name" +createFolder: "Create a folder" +renameFolder: "Rename this folder" +deleteFolder: "Delete this folder" +addFile: "Add a file" +emptyDrive: "Your Drive is empty" +emptyFolder: "This folder is empty" +unableToDelete: "Unable to delete" +inputNewFileName: "Enter a new filename" +inputNewDescription: "Enter new caption" +inputNewFolderName: "Enter a new folder name" +circularReferenceFolder: "The destination folder is a subfolder of the folder you + wish to move." +hasChildFilesOrFolders: "Since this folder is not empty, it can not be deleted." +copyUrl: "Copy URL" +rename: "Rename" +avatar: "Avatar" +banner: "Banner" +nsfw: "NSFW" +whenServerDisconnected: "When losing connection to the server" +disconnectedFromServer: "Connection to server has been lost" +reload: "Refresh" +doNothing: "Ignore" +reloadConfirm: "Would you like to refresh the timeline?" +watch: "Watch" +unwatch: "Stop watching" +accept: "Accept" +reject: "Reject" +normal: "Normal" +instanceName: "Server name" +instanceDescription: "Server description" +maintainerName: "Maintainer" +maintainerEmail: "Maintainer email" +tosUrl: "Terms of Service URL" +thisYear: "Year" +thisMonth: "Month" +today: "Today" +dayX: "{day}" +monthX: "{month}" +yearX: "{year}" +pages: "Pages" +integration: "Integrations" +connectService: "Connect" +disconnectService: "Disconnect" +enableLocalTimeline: "Enable local timeline" +enableGlobalTimeline: "Enable global timeline" +enableRecommendedTimeline: "Enable recommended timeline" +disablingTimelinesInfo: "Adminstrators and Moderators will always have access to all + timelines, even if they are not enabled." +registration: "Register" +enableRegistration: "Enable new user registration" +invite: "Invite" +driveCapacityPerLocalAccount: "Drive capacity per local user" +driveCapacityPerRemoteAccount: "Drive capacity per remote user" +inMb: "In megabytes" +iconUrl: "Icon URL" +bannerUrl: "Banner image URL" +backgroundImageUrl: "Background image URL" +basicInfo: "Basic info" +pinnedUsers: "Pinned users" +pinnedUsersDescription: "List usernames separated by line breaks to be pinned in the + \"Explore\" tab." +pinnedPages: "Pinned Pages" +pinnedPagesDescription: "Enter the paths of the Pages you want to pin to the top page + of this server, separated by line breaks." +pinnedClipId: "ID of the clip to pin" +pinnedNotes: "Pinned posts" +hcaptcha: "hCaptcha" +enableHcaptcha: "Enable hCaptcha" +hcaptchaSiteKey: "Site key" +hcaptchaSecretKey: "Secret key" +recaptcha: "reCAPTCHA" +enableRecaptcha: "Enable reCAPTCHA" +recaptchaSiteKey: "Site key" +recaptchaSecretKey: "Secret key" +avoidMultiCaptchaConfirm: "Using multiple Captcha systems may cause interference between + them. Would you like to disable the other Captcha systems currently active? If you + would like them to stay enabled, press cancel." +antennas: "Antennas" +antennasDesc: "Antennas display new posts matching the criteria you set!\n They can be accessed from the timelines page." +manageAntennas: "Manage Antennas" +name: "Name" +antennaSource: "Antenna source" +antennaKeywords: "Keywords to listen to" +antennaExcludeKeywords: "Keywords to exclude" +antennaKeywordsDescription: "Separate with spaces for an AND condition or with line + breaks for an OR condition." +notifyAntenna: "Notify about new posts" +withFileAntenna: "Only posts with files" +enableServiceworker: "Enable Push-Notifications for your Browser" +antennaUsersDescription: "List one username per line" +antennaInstancesDescription: "List one server host per line" +caseSensitive: "Case sensitive" +withReplies: "Include replies" +connectedTo: "Following account(s) are connected" +notesAndReplies: "Posts and replies" +withFiles: "Including files" +silence: "Silence" +silenceConfirm: "Are you sure that you want to silence this user?" +unsilence: "Undo silencing" +unsilenceConfirm: "Are you sure that you want to undo the silencing of this user?" +popularUsers: "Popular users" +recentlyUpdatedUsers: "Recently active users" +recentlyRegisteredUsers: "Newly joined users" +recentlyDiscoveredUsers: "Newly discovered users" +exploreUsersCount: "There are {count} users" +exploreFediverse: "Explore the Fediverse" +popularTags: "Popular tags" +userList: "Lists" +about: "About" +aboutMisskey: "About Calckey" +administrator: "Administrator" +token: "Token" +twoStepAuthentication: "Two-factor authentication" +moderator: "Moderator" +moderation: "Moderation" +nUsersMentioned: "Mentioned by {n} users" +securityKey: "Security key" +securityKeyName: "Key name" +registerSecurityKey: "Register a security key" +lastUsed: "Last used" +unregister: "Unregister" +passwordLessLogin: "Password-less login" +resetPassword: "Reset password" +newPasswordIs: "The new password is \"{password}\"" +reduceUiAnimation: "Reduce UI animations" +share: "Share" +notFound: "Not found" +notFoundDescription: "No page corresponding to this URL could be found." +uploadFolder: "Default folder for uploads" +cacheClear: "Clear cache" +markAsReadAllNotifications: "Mark all notifications as read" +markAsReadAllUnreadNotes: "Mark all posts as read" +markAsReadAllTalkMessages: "Mark all messages as read" +help: "Help" +inputMessageHere: "Enter message here" +close: "Close" +group: "Group" +groups: "Groups" +createGroup: "Create a group" +ownedGroups: "Owned Groups" +joinedGroups: "Joined groups" +invites: "Invites" +groupName: "Group name" +members: "Members" +transfer: "Transfer" +messagingWithUser: "Private chat" +messagingWithGroup: "Group chat" +title: "Title" +text: "Text" +enable: "Enable" +next: "Next" +retype: "Enter again" +noteOf: "Post by {user}" +inviteToGroup: "Invite to group" +quoteAttached: "Quote" +quoteQuestion: "Append as quote?" +noMessagesYet: "No messages yet" +newMessageExists: "There are new messages" +onlyOneFileCanBeAttached: "You can only attach one file to a message" +signinRequired: "Please register or sign in before continuing" +invitations: "Invites" +invitationCode: "Invitation code" +checking: "Checking..." +available: "Available" +unavailable: "Not available" +usernameInvalidFormat: "You can use upper- and lowercase letters, numbers, and underscores." +tooShort: "Too short" +tooLong: "Too long" +weakPassword: "Weak password" +normalPassword: "Average password" +strongPassword: "Strong password" +passwordMatched: "Matches" +passwordNotMatched: "Does not match" +signinWith: "Sign in with {x}" +signinFailed: "Unable to sign in. The entered username or password is incorrect." +tapSecurityKey: "Tap your security key" +or: "Or" +language: "Language" +uiLanguage: "User interface language" +groupInvited: "You've been invited to a group" +aboutX: "About {x}" +useOsNativeEmojis: "Use OS native Emoji" +disableDrawer: "Don't use drawer-style menus" +youHaveNoGroups: "You have no groups" +joinOrCreateGroup: "Get invited to a group or create your own." +noHistory: "No history available" +signinHistory: "Login history" +disableAnimatedMfm: "Disable MFM with animation" +doing: "Processing..." +category: "Category" +tags: "Tags" +docSource: "Source of this document" +createAccount: "Create account" +existingAccount: "Existing account" +regenerate: "Regenerate" +fontSize: "Font size" +noFollowRequests: "You don't have any pending follow requests" +openImageInNewTab: "Open images in new tab" +dashboard: "Dashboard" +local: "Local" +remote: "Remote" +total: "Total" +weekOverWeekChanges: "Changes to last week" +dayOverDayChanges: "Changes to yesterday" +appearance: "Appearance" +accessibility: "Accessibility" +clientSettings: "Client Settings" +accountSettings: "Account Settings" +promotion: "Promoted" +promote: "Promote" +numberOfDays: "Number of days" +hideThisNote: "Hide this post" +showFeaturedNotesInTimeline: "Show featured posts in timelines" +objectStorage: "Object Storage" +useObjectStorage: "Use object storage" +objectStorageBaseUrl: "Base URL" +objectStorageBaseUrlDesc: "The URL used as reference. Specify the URL of your CDN + or Proxy if you are using either.\nFor S3 use 'https://.s3.amazonaws.com' + and for GCS or equivalent services use 'https://storage.googleapis.com/', + etc." +objectStorageBucket: "Bucket" +objectStorageBucketDesc: "Please specify the bucket name used at your provider." +objectStoragePrefix: "Prefix" +objectStoragePrefixDesc: "Files will be stored under directories with this prefix." +objectStorageEndpoint: "Endpoint" +objectStorageEndpointDesc: "Leave this empty if you are using AWS S3, otherwise specify + the endpoint as '' or ':', depending on the service you are using." +objectStorageRegion: "Region" +objectStorageRegionDesc: "Specify a region like 'xx-east-1'. If your service does + not distinguish between regions, leave this blank or enter 'us-east-1'." +objectStorageUseSSL: "Use SSL" +objectStorageUseSSLDesc: "Turn this off if you are not going to use HTTPS for API + connections" +objectStorageUseProxy: "Connect over Proxy" +objectStorageUseProxyDesc: "Turn this off if you are not going to use a Proxy for + API connections" +objectStorageSetPublicRead: "Set \"public-read\" on upload" +serverLogs: "Server logs" +deleteAll: "Delete all" +showFixedPostForm: "Display the posting form at the top of the timeline" +newNoteRecived: "There are new posts" +sounds: "Sounds" +listen: "Listen" +none: "None" +showInPage: "Show in page" +popout: "Pop-out" +volume: "Volume" +masterVolume: "Master volume" +details: "Details" +chooseEmoji: "Select an emoji" +unableToProcess: "The operation could not be completed" +recentUsed: "Recently used" +install: "Install" +uninstall: "Uninstall" +installedApps: "Authorized Applications" +nothing: "There's nothing to see here" +installedDate: "Authorized at" +lastUsedDate: "Last used at" +state: "State" +sort: "Sort" +ascendingOrder: "Ascending" +descendingOrder: "Descending" +scratchpad: "Scratchpad" +scratchpadDescription: "The scratchpad provides an environment for AiScript experiments. + You can write, execute, and check the results of it interacting with Calckey in + it." +output: "Output" +script: "Script" +disablePagesScript: "Disable AiScript on Pages" +expandOnNoteClick: "Open post on click" +expandOnNoteClickDesc: "If disabled, you can still open posts in the right-click menu or by clicking the timestamp." +updateRemoteUser: "Update remote user information" +deleteAllFiles: "Delete all files" +deleteAllFilesConfirm: "Are you sure that you want to delete all files?" +removeAllFollowing: "Unfollow all followed users" +removeAllFollowingDescription: "Executing this unfollows all accounts from {host}. + Please run this if the server e.g. no longer exists." +userSuspended: "This user has been suspended." +userSilenced: "This user is being silenced." +yourAccountSuspendedTitle: "This account is suspended" +yourAccountSuspendedDescription: "This account has been suspended due to breaking + the server's terms of services or similar. Contact the administrator if you would + like to know a more detailed reason. Please do not create a new account." +menu: "Menu" +divider: "Divider" +addItem: "Add Item" +relays: "Relays" +addRelay: "Add Relay" +inboxUrl: "Inbox URL" +addedRelays: "Added Relays" +serviceworkerInfo: "Must be enabled for push notifications." +deletedNote: "Deleted post" +invisibleNote: "Invisible post" +enableInfiniteScroll: "Automatically load more" +visibility: "Visiblility" +poll: "Poll" +useCw: "Hide content" +enablePlayer: "Open video player" +disablePlayer: "Close video player" +expandTweet: "Expand tweet" +themeEditor: "Theme editor" +description: "Description" +describeFile: "Add caption" +enterFileDescription: "Enter caption" +author: "Author" +leaveConfirm: "There are unsaved changes. Do you want to discard them?" +manage: "Management" +plugins: "Plugins" +preferencesBackups: "Preference backups" +deck: "Deck" +undeck: "Leave Deck" +useBlurEffectForModal: "Use blur effect for modals" +useFullReactionPicker: "Use full-size reaction picker" +width: "Width" +height: "Height" +large: "Big" +medium: "Medium" +small: "Small" +generateAccessToken: "Generate access token" +permission: "Permissions" +enableAll: "Enable all" +disableAll: "Disable all" +tokenRequested: "Grant access to account" +pluginTokenRequestedDescription: "This plugin will be able to use the permissions + set here." +notificationType: "Notification type" +edit: "Edit" +emailServer: "Email server" +enableEmail: "Enable email distribution" +emailConfigInfo: "Used to confirm your email during sign-up or if you forget your + password" +email: "Email" +emailAddress: "Email address" +smtpConfig: "SMTP Server Configuration" +smtpHost: "Host" +smtpPort: "Port" +smtpUser: "Username" +smtpPass: "Password" +emptyToDisableSmtpAuth: "Leave username and password empty to disable SMTP verification" +smtpSecure: "Use implicit SSL/TLS for SMTP connections" +smtpSecureInfo: "Turn this off when using STARTTLS" +testEmail: "Test email delivery" +wordMute: "Word mute" +regexpError: "Regular Expression error" +regexpErrorDescription: "An error occurred in the regular expression on line {line} + of your {tab} word mutes:" +instanceMute: "Server Mutes" +userSaysSomething: "{name} said something" +userSaysSomethingReason: "{name} said {reason}" +userSaysSomethingReasonReply: "{name} replied to a post containing {reason}" +userSaysSomethingReasonRenote: "{name} boosted a post containing {reason}" +userSaysSomethingReasonQuote: "{name} quoted a post containing {reason}" +makeActive: "Activate" +display: "Display" +copy: "Copy" +metrics: "Metrics" +overview: "Overview" +logs: "Logs" +delayed: "Delayed" +database: "Database" +channel: "Channels" +channelFederationWarn: "Channels do not yet federate to other servers" +create: "Create" +notificationSetting: "Notification settings" +notificationSettingDesc: "Select the types of notification to display." +useGlobalSetting: "Use global settings" +useGlobalSettingDesc: "If turned on, your account's notification settings will be + used. If turned off, individual configurations can be made." +other: "Other" +regenerateLoginToken: "Regenerate login token" +regenerateLoginTokenDescription: "Regenerates the token used internally during login. + Normally this action is not necessary. If regenerated, all devices will be logged + out." +setMultipleBySeparatingWithSpace: "Separate multiple entries with spaces." +fileIdOrUrl: "File ID or URL" +behavior: "Behavior" +sample: "Sample" +abuseReports: "Reports" +reportAbuse: "Report" +reportAbuseOf: "Report {name}" +fillAbuseReportDescription: "Please fill in details regarding this report. If it is + about a specific post, please include its URL." +abuseReported: "Your report has been sent. Thank you very much." +reporter: "Reporter" +reporteeOrigin: "Reportee Origin" +reporterOrigin: "Reporter Origin" +forwardReport: "Forward report to remote server" +forwardReportIsAnonymous: "Instead of your account, an anonymous system account will + be displayed as reporter at the remote server." +send: "Send" +abuseMarkAsResolved: "Mark report as resolved" +openInNewTab: "Open in new tab" +openInSideView: "Open in side view" +defaultNavigationBehaviour: "Default navigation behavior" +editTheseSettingsMayBreakAccount: "Editing these settings may damage your account." +instanceTicker: "Server information of posts" +waitingFor: "Waiting for {x}" +random: "Random" +system: "System" +switchUi: "Layout" +desktop: "Desktop" +clip: "Clip" +createNew: "Create new" +optional: "Optional" +createNewClip: "Create new clip" +unclip: "Unclip" +confirmToUnclipAlreadyClippedNote: "This post is already part of the \"{name}\" clip. + Do you want to remove it from this clip instead?" +public: "Public" +i18nInfo: "Calckey is being translated into various languages by volunteers. You can + help at {link}." +manageAccessTokens: "Manage access tokens" +accountInfo: "Account Info" +notesCount: "Number of posts" +repliesCount: "Number of replies sent" +renotesCount: "Number of boosts sent" +repliedCount: "Number of replies received" +renotedCount: "Number of boosts received" +followingCount: "Number of followed accounts" +followersCount: "Number of followers" +sentReactionsCount: "Number of sent reactions" +receivedReactionsCount: "Number of received reactions" +pollVotesCount: "Number of sent poll votes" +pollVotedCount: "Number of received poll votes" +yes: "Yes" +no: "No" +driveFilesCount: "Number of Drive files" +driveUsage: "Drive space usage" +noCrawle: "Reject crawler indexing" +noCrawleDescription: "Ask search engines to not index your profile page, posts, Pages, + etc." +lockedAccountInfo: "Unless you set your post visiblity to \"Followers only\", your + posts will be visible to anyone, even if you require followers to be manually approved." +alwaysMarkSensitive: "Mark as NSFW by default" +loadRawImages: "Load original images instead of showing thumbnails" +disableShowingAnimatedImages: "Don't play animated images" +verificationEmailSent: "A verification email has been sent. Please follow the included + link to complete verification." +notSet: "Not set" +emailVerified: "Email has been verified" +noteFavoritesCount: "Number of bookmarked posts" +pageLikesCount: "Number of liked Pages" +pageLikedCount: "Number of received Page likes" +contact: "Contact" +useSystemFont: "Use the system's default font" +clips: "Clips" +clipsDesc: "Clips are like share-able categorized bookmarks. You can create clips from the menu of individual posts." +experimentalFeatures: "Experimental features" +developer: "Developer" +makeExplorable: "Make account visible in \"Explore\"" +makeExplorableDescription: "If you turn this off, your account will not show up in + the \"Explore\" section." +showGapBetweenNotesInTimeline: "Show a gap between posts on the timeline" +duplicate: "Duplicate" +left: "Left" +center: "Center" +wide: "Wide" +narrow: "Narrow" +reloadToApplySetting: "This setting will only apply after a page reload. Reload now?" +needReloadToApply: "A reload is required for this to be reflected." +showTitlebar: "Show title bar" +clearCache: "Clear cache" +onlineUsersCount: "{n} users are online" +nUsers: "{n} Users" +nNotes: "{n} Posts" +sendErrorReports: "Send error reports" +sendErrorReportsDescription: "When turned on, detailed error information will be shared + with Calckey when a problem occurs, helping to improve the quality of Calckey.\n + This will include information such the version of your OS, what browser you're using, + your activity in Calckey, etc." +myTheme: "My theme" +backgroundColor: "Background color" +accentColor: "Accent color" +textColor: "Text color" +saveAs: "Save as..." +advanced: "Advanced" +value: "Value" +createdAt: "Created at" +updatedAt: "Updated at" +saveConfirm: "Save changes?" +deleteConfirm: "Really delete?" +invalidValue: "Invalid value." +registry: "Registry" +closeAccount: "Close account" +currentVersion: "Current version" +latestVersion: "Newest version" +youAreRunningUpToDateClient: "You are using the newest version of your client." +newVersionOfClientAvailable: "There is a newer version of your client available." +usageAmount: "Usage" +capacity: "Capacity" +inUse: "Used" +editCode: "Edit code" +apply: "Apply" +receiveAnnouncementFromInstance: "Receive notifications from this server" +emailNotification: "Email notifications" +publish: "Publish" +inChannelSearch: "Search in channel" +useReactionPickerForContextMenu: "Open reaction picker on right-click" +typingUsers: "{users} is typing" +jumpToSpecifiedDate: "Jump to specific date" +showingPastTimeline: "Currently displaying an old timeline" +clear: "Clear" +markAllAsRead: "Mark all as read" +goBack: "Back" +unlikeConfirm: "Really remove your like?" +fullView: "Full view" +quitFullView: "Exit full view" +addDescription: "Add description" +userPagePinTip: "You can display posts here by selecting \"Pin to profile\" from the + menu of individual posts." +notSpecifiedMentionWarning: "This post contains mentions of users not included as + recipients" +info: "About" +userInfo: "User information" +unknown: "Unknown" +onlineStatus: "Online status" +hideOnlineStatus: "Hide online status" +hideOnlineStatusDescription: "Hiding your online status reduces the convenience of + some features such as the search." +online: "Online" +active: "Active" +offline: "Offline" +notRecommended: "Not recommended" +botProtection: "Bot Protection" +instanceBlocking: "Federation Management" +selectAccount: "Select account" +switchAccount: "Switch account" +enabled: "Enabled" +disabled: "Disabled" +quickAction: "Quick actions" +user: "User" +administration: "Management" +accounts: "Accounts" +switch: "Switch" +noMaintainerInformationWarning: "Maintainer information is not configured." +noBotProtectionWarning: "Bot protection is not configured." +configure: "Configure" +postToGallery: "Create new gallery post" +gallery: "Gallery" +recentPosts: "Recent pages" +popularPosts: "Popular pages" +shareWithNote: "Share with post" +ads: "Advertisements" +expiration: "Deadline" +memo: "Memo" +priority: "Priority" +high: "High" +middle: "Medium" +low: "Low" +emailNotConfiguredWarning: "Email address not set." +ratio: "Ratio" +secureMode: "Secure Mode (Authorized Fetch)" +instanceSecurity: "Server Security" +secureModeInfo: "When requesting from other servers, do not send back without proof." +privateMode: "Private Mode" +privateModeInfo: "When enabled, only whitelisted servers can federate with your server. + All posts will be hidden from the public." +allowedInstances: "Whitelisted Servers" +allowedInstancesDescription: "Hosts of servers to be whitelisted for federation, each + separated by a new line (only applies in private mode)." +previewNoteText: "Show preview" +customCss: "Custom CSS" +customCssWarn: "This setting should only be used if you know what it does. Entering + improper values may cause the client to stop functioning normally." +global: "Global" +recommended: "Recommended" +squareAvatars: "Display squared avatars" +seperateRenoteQuote: "Separate boost and quote buttons" +sent: "Sent" +received: "Received" +searchResult: "Search results" +hashtags: "Hashtags" +troubleshooting: "Troubleshooting" +useBlurEffect: "Use blur effects in the UI" +learnMore: "Learn more" +misskeyUpdated: "Calckey has been updated!" +whatIsNew: "Show changes" +translate: "Translate" +translatedFrom: "Translated from {x}" +accountDeletionInProgress: "Account deletion is currently in progress" +usernameInfo: "A name that identifies your account from others on this server. You + can use the alphabet (a~z, A~Z), digits (0~9) or underscores (_). Usernames cannot + be changed later." +aiChanMode: "Ai-chan in Classic UI" +keepCw: "Keep content warnings" +pubSub: "Pub/Sub Accounts" +lastCommunication: "Last communication" +resolved: "Resolved" +unresolved: "Unresolved" +breakFollow: "Remove follower" +breakFollowConfirm: "Are you sure want to remove follower?" +itsOn: "Enabled" +itsOff: "Disabled" +emailRequiredForSignup: "Require email address for sign-up" +unread: "Unread" +filter: "Filter" +controlPanel: "Control Panel" +manageAccounts: "Manage Accounts" +makeReactionsPublic: "Set reaction history to public" +makeReactionsPublicDescription: "This will make the list of all your past reactions + publicly visible." +classic: "Centered" +muteThread: "Mute thread" +unmuteThread: "Unmute thread" +ffVisibility: "Follows/Followers Visibility" +ffVisibilityDescription: "Allows you to configure who can see who you follow and who + follows you." +continueThread: "Continue thread" +deleteAccountConfirm: "This will irreversibly delete your account. Proceed?" +incorrectPassword: "Incorrect password." +voteConfirm: "Confirm your vote for \"{choice}\"?" +hide: "Hide" +leaveGroup: "Leave group" +leaveGroupConfirm: "Are you sure you want to leave \"{name}\"?" +useDrawerReactionPickerForMobile: "Display reaction picker as drawer on mobile" +welcomeBackWithName: "Welcome back, {name}" +clickToFinishEmailVerification: "Please click [{ok}] to complete email verification." +overridedDeviceKind: "Device type" +smartphone: "Smartphone" +tablet: "Tablet" +auto: "Auto" +themeColor: "Server Ticker Color" +size: "Size" +numberOfColumn: "Number of columns" +searchByGoogle: "Search" +instanceDefaultLightTheme: "Server-wide default light theme" +instanceDefaultDarkTheme: "Server-wide default dark theme" +instanceDefaultThemeDescription: "Enter the theme code in object format." +mutePeriod: "Mute duration" +indefinitely: "Permanently" +tenMinutes: "10 minutes" +oneHour: "One hour" +oneDay: "One day" +oneWeek: "One week" +reflectMayTakeTime: "It may take some time for this to be reflected." +failedToFetchAccountInformation: "Could not fetch account information" +rateLimitExceeded: "Rate limit exceeded" +cropImage: "Crop image" +cropImageAsk: "Do you want to crop this image?" +file: "File" +image: "Image" +video: "Video" +audio: "Audio" +recentNHours: "Last {n} hours" +recentNDays: "Last {n} days" +noEmailServerWarning: "Email server not configured." +thereIsUnresolvedAbuseReportWarning: "There are unsolved reports." +check: "Check" +driveCapOverrideLabel: "Change the drive capacity for this user" +driveCapOverrideCaption: "Reset the capacity to default by inputting a value of 0 + or lower." +requireAdminForView: "You must log in with an administrator account to view this." +isSystemAccount: "This account is created and automatically operated by the system. + Please do not moderate, edit, delete, or otherwise tamper with this account, or + it may break your server." +typeToConfirm: "Please enter {x} to confirm" +deleteAccount: "Delete account" +document: "Documentation" +numberOfPageCache: "Number of cached pages" +numberOfPageCacheDescription: "Increasing this number will improve convenience for + users but cause more server load as well as more memory to be used." +logoutConfirm: "Really log out?" +lastActiveDate: "Last used at" +statusbar: "Status bar" +pleaseSelect: "Select an option" +reverse: "Reverse" +colored: "Colored" +refreshInterval: "Update interval " +label: "Label" +type: "Type" +speed: "Speed" +slow: "Slow" +fast: "Fast" +sensitiveMediaDetection: "Detection of NSFW media" +localOnly: "Local only" +remoteOnly: "Remote only" +failedToUpload: "Upload failed" +cannotUploadBecauseInappropriate: "This file could not be uploaded because parts of + it have been detected as potentially NSFW." +cannotUploadBecauseNoFreeSpace: "Upload failed due to lack of Drive capacity." +cannotUploadBecauseExceedsFileSizeLimit: "This file could not be uploaded because + it exceeds the maximum allowed size." +beta: "Beta" +enableAutoSensitive: "Automatic NSFW-Marking" +enableAutoSensitiveDescription: "Allows automatic detection and marking of NSFW media + through Machine Learning where possible. Even if this option is disabled, it may + be enabled server-wide." +activeEmailValidationDescription: "Enables stricter validation of email addresses, + which includes checking for disposable addresses and by whether it can actually + be communicated with. When unchecked, only the format of the email is validated." +navbar: "Navigation bar" +shuffle: "Shuffle" +account: "Account" +move: "Move" +pushNotification: "Push notifications" +subscribePushNotification: "Enable push notifications" +unsubscribePushNotification: "Disable push notifications" +pushNotificationAlreadySubscribed: "Push notifications are already enabled" +pushNotificationNotSupported: "Your browser or server does not support push notifications" +sendPushNotificationReadMessage: "Delete push notifications once the relevant notifications + or messages have been read" +sendPushNotificationReadMessageCaption: "A notification containing the text \"{emptyPushNotificationMessage}\"\ + \ will be displayed for a short time. This may increase the battery usage of your + device, if applicable." +showAds: "Show ads" +enterSendsMessage: "Press Return in Messaging to send message (off is Ctrl + Return)" +adminCustomCssWarn: "This setting should only be used if you know what it does. Entering + improper values may cause EVERYONE'S clients to stop functioning normally. Please + ensure your CSS works properly by testing it in your user settings." +customMOTD: "Custom MOTD (splash screen messages)" +customMOTDDescription: "Custom messages for the MOTD (splash screen) separated by + line breaks to be shown randomly every time a user loads/reloads the page." +customSplashIcons: "Custom splash screen icons (urls)" +customSplashIconsDescription: "URLs for custom splash screen icons separated by line + breaks to be shown randomly every time a user loads/reloads the page. Please make + sure the images are on a static URL, preferably all resized to 192x192." +showUpdates: "Show a popup when Calckey updates" +recommendedInstances: "Recommended servers" +recommendedInstancesDescription: "Recommended servers separated by line breaks to + appear in the recommended timeline. Do NOT add `https://`, ONLY the domain." +caption: "Auto Caption" +splash: "Splash Screen" +updateAvailable: "There might be an update available!" +swipeOnDesktop: "Allow mobile-style swiping on desktop" +logoImageUrl: "Logo image URL" +showAdminUpdates: "Indicate a new Calckey version is avaliable (admin only)" +replayTutorial: "Replay tutorial" +migration: "Migration" +moveTo: "Move current account to new account" +moveToLabel: "Account you're moving to:" +moveAccount: "Move account!" +moveAccountDescription: "This process is irreversible. Make sure you've set up an + alias for this account on your new account before moving. Please enter the tag of + the account formatted like @person@server.com" +moveFrom: "Move to this account from an older account" +moveFromLabel: "Account you're moving from:" +moveFromDescription: "This will set an alias of your old account so that you can move + from that account to this current one. Do this BEFORE moving from your older account. + Please enter the tag of the account formatted like @person@server.com" +migrationConfirm: "Are you absolutely sure you want to migrate your account to {account}? + Once you do this, you won't be able to reverse it, and you won't be able to use + your account normally again.\nAlso, please ensure that you've set this current account + as the account you're moving from." +defaultReaction: "Default emoji reaction for outgoing and incoming posts" +license: "License" +indexPosts: "Index Posts" +indexFrom: "Index from Post ID onwards" +indexFromDescription: "Leave blank to index every post" +indexNotice: "Now indexing. This will probably take a while, please don't restart\ + \ your server for at least an hour." +customKaTeXMacro: "Custom KaTeX macros" +customKaTeXMacroDescription: "Set up macros to write mathematical expressions easily! + The notation conforms to the LaTeX command definitions and is written as \\newcommand{\\ + name}{content} or \\newcommand{\\name}[number of arguments]{content}. For example, + \\newcommand{\\add}[2]{#1 + #2} will expand \\add{3}{foo} to 3 + foo. The curly + brackets surrounding the macro name can be changed to round or square brackets. + This affects the brackets used for arguments. One (and only one) macro can be defined + per line, and you can't break the line in the middle of the definition. Invalid + lines are simply ignored. Only simple string substitution functions are supported; + advanced syntax, such as conditional branching, cannot be used here." +enableCustomKaTeXMacro: "Enable custom KaTeX macros" +noteId: "Post ID" +signupsDisabled: "Signups on this server are currently disabled, but you can always + sign up at another server! If you have an invitation code for this server, please + enter it below." +findOtherInstance: "Find another server" +apps: "Apps" +sendModMail: "Send Moderation Notice" +preventAiLearning: "Prevent AI bot scraping" +preventAiLearningDescription: "Request third-party AI language models not to study + content you upload, such as posts and images." +noGraze: "Please disable the \"Graze for Mastodon\" browser extension, as it interferes + with Calckey." +silencedWarning: "This page is showing because these users are from servers your admin + silenced, so they may potentially be spam." +isBot: "This account is a bot" +isLocked: "This account has follow approvals" +isModerator: "Moderator" +isAdmin: "Administrator" +isPatron: "Calckey Patron" +reactionPickerSkinTone: "Preferred emoji skin tone" + +_sensitiveMediaDetection: + description: "Reduces the effort of server moderation through automatically recognizing + NSFW media via Machine Learning. This will slightly increase the load on the server." + sensitivity: "Detection sensitivity" + sensitivityDescription: "Reducing the sensitivity will lead to fewer misdetections + (false positives) whereas increasing it will lead to fewer missed detections (false + negatives)." + setSensitiveFlagAutomatically: "Mark as NSFW" + setSensitiveFlagAutomaticallyDescription: "The results of the internal detection + will be retained even if this option is turned off." + analyzeVideos: "Enable analysis of videos" + analyzeVideosDescription: "Analyzes videos in addition to images. This will slightly + increase the load on the server." +_emailUnavailable: + used: "This email address is already being used" + format: "The format of this email address is invalid" + disposable: "Disposable email addresses may not be used" + mx: "This email server is invalid" + smtp: "This email server is not responding" +_ffVisibility: + public: "Public" + followers: "Visible to followers only" + private: "Private" +_signup: + almostThere: "Almost there" + emailAddressInfo: "Please enter your email address. It will not be made public." + emailSent: "A confirmation email has been sent to your email address ({email}). + Please click the included link to complete account creation." +_accountDelete: + accountDelete: "Delete account" + mayTakeTime: "As account deletion is a resource-heavy process, it may take some + time to complete depending on how much content you have created and how many files + you have uploaded." + sendEmail: "Once account deletion has been completed, an email will be sent to the + email address registered to this account." + requestAccountDelete: "Request account deletion" + started: "Deletion has been started." + inProgress: "Deletion is currently in progress" +_ad: + back: "Back" + reduceFrequencyOfThisAd: "Show this ad less" +_forgotPassword: + enterEmail: "Enter the email address you used to register. A link with which you + can reset your password will then be sent to it." + ifNoEmail: "If you did not use an email during registration, please contact the + server administrator instead." + contactAdmin: "This server does not support using email addresses, please contact + the server administrator to reset your password instead." +_gallery: + my: "My Gallery" + liked: "Liked Posts" + like: "Like" + unlike: "Remove like" +_email: + _follow: + title: "You've got a new follower" + _receiveFollowRequest: + title: "You've received a follow request" +_plugin: + install: "Install plugins" + installWarn: "Please do not install untrustworthy plugins." + manage: "Manage plugins" +_preferencesBackups: + list: "Created backups" + saveNew: "Save new backup" + loadFile: "Load from file" + apply: "Apply to this device" + save: "Save changes" + inputName: "Please enter a name for this backup" + cannotSave: "Saving failed" + nameAlreadyExists: "A backup called \"{name}\" already exists. Please enter a different + name." + applyConfirm: "Do you really want to apply the \"{name}\" backup to this device? + Existing settings of this device will be overwritten." + saveConfirm: "Save backup as {name}?" + deleteConfirm: "Delete the {name} backup?" + renameConfirm: "Rename this backup from \"{old}\" to \"{new}\"?" + noBackups: "No backups exist. You may backup your client settings on this server + by using \"Create new backup\"." + createdAt: "Created at: {date} {time}" + updatedAt: "Updated at: {date} {time}" + cannotLoad: "Loading failed" + invalidFile: "Invalid file format" +_registry: + scope: "Scope" + key: "Key" + keys: "Keys" + domain: "Domain" + createKey: "Create key" +_aboutMisskey: + about: "Calckey is a fork of Misskey made by ThatOneCalculator, which has been in + development since 2022." + contributors: "Main contributors" + allContributors: "All contributors" + source: "Source code" + translation: "Translate Calckey" + donate: "Donate to Calckey" + morePatrons: "We also appreciate the support of many other helpers not listed here. + Thank you! 🥰" + patrons: "Calckey patrons" +_nsfw: + respect: "Hide NSFW media" + ignore: "Don't hide NSFW media" + force: "Hide all media" +_mfm: + play: "Play MFM" + stop: "Stop MFM" + warn: "MFM may contain rapidly moving or flashy animations" + alwaysPlay: "Always autoplay all animated MFM" + cheatSheet: "MFM Cheatsheet" + intro: "MFM is a markup language used on Misskey, Calckey, Akkoma, and more that + can be used in many places. Here you can view a list of all available MFM syntax." + dummy: "Calckey expands the world of the Fediverse" + advanced: "Advanced MFM" + advancedDescription: "If disabled, only allows for basic markup unless animated MFM is playing" + mention: "Mention" + mentionDescription: "You can specify a user by using an At-Symbol and a username." + hashtag: "Hashtag" + hashtagDescription: "You can specify a hashtag using a number sign and text." + url: "URL" + urlDescription: "URLs can be displayed." + link: "Link" + linkDescription: "Specific parts of text can be displayed as a URL." + bold: "Bold" + boldDescription: "Highlights letters by making them thicker." + small: "Small" + smallDescription: "Displays content small and thin." + center: "Center" + centerDescription: "Displays content centered." + inlineCode: "Code (Inline)" + inlineCodeDescription: "Displays inline syntax highlighting for (program) code." + blockCode: "Code (Block)" + blockCodeDescription: "Displays syntax highlighting for multi-line (program) code + in a block." + inlineMath: "Math (Inline)" + inlineMathDescription: "Display math formulas (KaTeX) in-line" + blockMath: "Math (Block)" + blockMathDescription: "Display math formulas (KaTeX) in a block" + quote: "Quote" + quoteDescription: "Displays content as a quote." + emoji: "Custom Emoji" + emojiDescription: "By surrounding a custom emoji name with colons, custom emoji + can be displayed." + search: "Search" + searchDescription: "Displays a search box with pre-entered text." + flip: "Flip" + flipDescription: "Flips content horizontally or vertically." + jelly: "Animation (Jelly)" + jellyDescription: "Gives content a jelly-like animation." + tada: "Animation (Tada)" + tadaDescription: "Gives content a \"Tada!\"-like animation." + jump: "Animation (Jump)" + jumpDescription: "Gives content a jumping animation." + bounce: "Animation (Bounce)" + bounceDescription: "Gives content a bouncy animation." + shake: "Animation (Shake)" + shakeDescription: "Gives content a shaking animation." + twitch: "Animation (Twitch)" + twitchDescription: "Gives content a strongly twitching animation." + spin: "Animation (Spin)" + spinDescription: "Gives content a spinning animation." + x2: "Big" + x2Description: "Displays content bigger." + x3: "Very big" + x3Description: "Displays content even bigger." + x4: "Unbelievably big" + x4Description: "Displays content even bigger than bigger than big." + blur: "Blur" + blurDescription: "Blurs content. It will be displayed clearly when hovered over." + font: "Font" + fontDescription: "Sets the font to display content in." + rainbow: "Rainbow" + rainbowDescription: "Makes the content appear in rainbow colors." + sparkle: "Sparkle" + sparkleDescription: "Gives content a sparkling particle effect." + rotate: "Rotate" + rotateDescription: "Turns content by a specified angle." + fade: "Fade" + fadeDescription: "Fades content in and out." + position: "Position" + positionDescription: "Move content by a specified amount." + crop: "Crop" + cropDescription: "Crop content." + scale: "Scale" + scaleDescription: "Scale content by a specified amount." + foreground: "Foreground color" + foregroundDescription: "Change the foreground color of text." + background: "Background color" + backgroundDescription: "Change the background color of text." + plain: "Plain" + plainDescription: "Deactivates the effects of all MFM contained within this MFM + effect." +_instanceTicker: + none: "Never show" + remote: "Show for remote users" + always: "Always show" +_serverDisconnectedBehavior: + reload: "Automatically reload" + dialog: "Show warning dialog" + quiet: "Show unobtrusive warning" + nothing: "Do nothing" +_channel: + create: "Create channel" + edit: "Edit channel" + setBanner: "Set banner" + removeBanner: "Remove banner" + featured: "Trending" + owned: "Owned" + following: "Followed" + usersCount: "{n} Participants" + notesCount: "{n} Posts" + nameAndDescription: "Name and description" + nameOnly: "Name only" +_messaging: + dms: "Private" + groups: "Groups" +_menuDisplay: + sideFull: "Side" + sideIcon: "Side (Icons)" + top: "Top" + hide: "Hide" +_wordMute: + muteWords: "Muted words" + muteWordsDescription: "Separate with spaces for an AND condition or with line breaks + for an OR condition." + muteWordsDescription2: "Surround keywords with slashes to use regular expressions." + softDescription: "Hide posts that fulfil the set conditions from the timeline." + hardDescription: "Prevents posts fulfilling the set conditions from being added + to the timeline. In addition, these posts will not be added to the timeline even + if the conditions are changed." + soft: "Soft" + hard: "Hard" + mutedNotes: "Muted posts" +_instanceMute: + instanceMuteDescription: "This will mute any posts/boosts from the listed servers, + including those of users replying to a user from a muted server." + instanceMuteDescription2: "Separate with newlines" + title: "Hides posts from listed servers." + heading: "List of servers to be muted" +_theme: + explore: "Explore Themes" + install: "Install a theme" + manage: "Manage themes" + code: "Theme code" + description: "Description" + installed: "{name} has been installed" + installedThemes: "Installed themes" + builtinThemes: "Built-in themes" + alreadyInstalled: "This theme is already installed" + invalid: "The format of this theme is invalid" + make: "Make a theme" + base: "Base" + addConstant: "Add constant" + constant: "Constant" + defaultValue: "Default value" + color: "Color" + refProp: "Reference a property" + refConst: "Reference a constant" + key: "Key" + func: "Functions" + funcKind: "Function type" + argument: "Argument" + basedProp: "Referenced property" + alpha: "Opacity" + darken: "Darken" + lighten: "Lighten" + inputConstantName: "Enter a name for this constant" + importInfo: "If you enter theme code here, you can import it to the theme editor" + deleteConstantConfirm: "Do you really want to delete the constant {const}?" + keys: + accent: "Accent" + bg: "Background" + fg: "Text" + focus: "Focus" + indicator: "Indicator" + panel: "Panel" + shadow: "Shadow" + header: "Header" + navBg: "Sidebar background" + navFg: "Sidebar text" + navHoverFg: "Sidebar text (Hover)" + navActive: "Sidebar text (Active)" + navIndicator: "Sidebar indicator" + link: "Link" + hashtag: "Hashtag" + mention: "Mention" + mentionMe: "Mentions (Me)" + renote: "Boost" + modalBg: "Modal background" + divider: "Divider" + scrollbarHandle: "Scrollbar handle" + scrollbarHandleHover: "Scrollbar handle (Hover)" + dateLabelFg: "Date label text" + infoBg: "Information background" + infoFg: "Information text" + infoWarnBg: "Warning background" + infoWarnFg: "Warning text" + cwBg: "CW button background" + cwFg: "CW button text" + cwHoverBg: "CW button background (Hover)" + toastBg: "Notification background" + toastFg: "Notification text" + buttonBg: "Button background" + buttonHoverBg: "Button background (Hover)" + inputBorder: "Input field border" + listItemHoverBg: "List item background (Hover)" + driveFolderBg: "Drive folder background" + wallpaperOverlay: "Wallpaper overlay" + badge: "Badge" + messageBg: "Chat background" + accentDarken: "Accent (Darkened)" + accentLighten: "Accent (Lightened)" + fgHighlighted: "Highlighted Text" +_sfx: + note: "New post" + noteMy: "Own post" + notification: "Notifications" + chat: "Chat" + chatBg: "Chat (Background)" + antenna: "Antennas" + channel: "Channel notifications" +_ago: + future: "Future" + justNow: "Just now" + secondsAgo: "{n}s ago" + minutesAgo: "{n}m ago" + hoursAgo: "{n}h ago" + daysAgo: "{n}d ago" + weeksAgo: "{n}w ago" + monthsAgo: "{n}mo ago" + yearsAgo: "{n}y ago" +_time: + second: "Second(s)" + minute: "Minute(s)" + hour: "Hour(s)" + day: "Day(s)" +_filters: + fromUser: "From user" + withFile: "With file" + fromDomain: "From domain" + notesBefore: "Posts before" + notesAfter: "Posts after" + followingOnly: "Following only" + followersOnly: "Followers only" +_tutorial: + title: "How to use Calckey" + step1_1: "Welcome!" + step1_2: "Let's get you set up. You'll be up and running in no time!" + step2_1: "First, please fill out your profile." + step2_2: "Providing some information about who you are will make it easier for others + to tell if they want to see your posts or follow you." + step3_1: "Now it's time to follow some people!" + step3_2: "Your home and social timelines are based off of who you follow, so try + following a couple accounts to get started.\nClick the plus circle on the top + right of a profile to follow them." + step4_1: "Let's get you out there." + step4_2: "For your first post, some people like to make an {introduction} post or + a simple \"Hello world!\"" + step5_1: "Timelines, timelines everywhere!" + step5_2: "Your server has {timelines} different timelines enabled." + step5_3: "The Home {icon} timeline is where you can see posts from the accounts + you follow." + step5_4: "The Local {icon} timeline is where you can see posts from everyone else + on this server." + step5_5: "The Social {icon} timeline is a combination of the Home and Local timelines." + step5_6: "The Recommended {icon} timeline is where you can see posts from servers\ + \ the admins recommend." + step5_7: "The Global {icon} timeline is where you can see posts from every other\ + \ connected server." + step6_1: "So, what is this place?" + step6_2: "Well, you didn't just join Calckey. You joined a portal to the Fediverse, + an interconnected network of thousands of servers." + step6_3: "Each server works in different ways, and not all servers run Calckey. + This one does though! It's a bit complicated, but you'll get the hang of it in + no time." + step6_4: "Now go, explore, and have fun!" +_2fa: + alreadyRegistered: "You have already registered a 2-factor authentication device." + registerTOTP: "Register authenticator app" + step1: "First, install an authentication app (such as {a} or {b}) on your device." + step2: "Then, scan the QR code displayed on this screen." + step2Click: "Clicking on this QR code will allow you to register 2FA to your security key or phone authenticator app." + step2Url: "You can also enter this URL if you're using a desktop program:" + step3Title: "Enter an authentication code" + step3: "Enter the token provided by your app to finish setup." + step4: "From now on, any future login attempts will ask for such a login token." + securityKeyNotSupported: "Your browser does not support security keys." + registerTOTPBeforeKey: "Please set up an authenticator app to register a security or pass key." + securityKeyInfo: "Besides fingerprint or PIN authentication, you can also setup authentication via hardware security keys that support FIDO2 to further secure your account." + chromePasskeyNotSupported: "Chrome passkeys are currently not supported." + registerSecurityKey: "Register a security or pass key" + securityKeyName: "Enter a key name" + tapSecurityKey: "Please follow your browser to register the security or pass key" + removeKey: "Remove security key" + removeKeyConfirm: "Really delete the {name} key?" + whyTOTPOnlyRenew: "The authenticator app cannot be removed as long as a security key is registered." + renewTOTP: "Reconfigure authenticator app" + renewTOTPConfirm: "This will cause verification codes from your previous app to stop working" + renewTOTPOk: "Reconfigure" + renewTOTPCancel: "Cancel" +_permissions: + "read:account": "View your account information" + "write:account": "Edit your account information" + "read:blocks": "View your list of blocked users" + "write:blocks": "Edit your list of blocked users" + "read:drive": "Access your Drive files and folders" + "write:drive": "Edit or delete your Drive files and folders" + "read:favorites": "View your list of bookmarks" + "write:favorites": "Edit your list of bookmarks" + "read:following": "View information on who you follow" + "write:following": "Follow or unfollow other accounts" + "read:messaging": "View your chats" + "write:messaging": "Compose or delete chat messages" + "read:mutes": "View your list of muted users" + "write:mutes": "Edit your list of muted users" + "write:notes": "Compose or delete posts" + "read:notifications": "View your notifications" + "write:notifications": "Manage your notifications" + "read:reactions": "View your reactions" + "write:reactions": "Edit your reactions" + "write:votes": "Vote on a poll" + "read:pages": "View your page" + "write:pages": "Edit or delete your page" + "read:page-likes": "View your likes on page" + "write:page-likes": "Edit your likes on page" + "read:user-groups": "View your user groups" + "write:user-groups": "Edit or delete your user groups" + "read:channels": "View your channels" + "write:channels": "Edit your channels" + "read:gallery": "View your gallery" + "write:gallery": "Edit your gallery" + "read:gallery-likes": "View your list of liked gallery posts" + "write:gallery-likes": "Edit your list of liked gallery posts" +_auth: + shareAccess: "Would you like to authorize \"{name}\" to access this account?" + shareAccessAsk: "Are you sure you want to authorize this application to access your + account?" + permissionAsk: "This application requests the following permissions" + pleaseGoBack: "Please go back to the application" + callback: "Returning to the application" + denied: "Access denied" + copyAsk: "Please paste the following authorization code to the application" +_antennaSources: + all: "All posts" + homeTimeline: "Posts from followed users" + users: "Posts from specific users" + userList: "Posts from a specified list of users" + userGroup: "Posts from users in a specified group" + instances: "Posts from all users on an server" +_weekday: + sunday: "Sunday" + monday: "Monday" + tuesday: "Tuesday" + wednesday: "Wednesday" + thursday: "Thursday" + friday: "Friday" + saturday: "Saturday" +_widgets: + memo: "Sticky Notes" + notifications: "Notifications" + timeline: "Timeline" + calendar: "Calendar" + trends: "Trending" + clock: "Clock" + rss: "RSS Reader" + rssTicker: "RSS Ticker" + activity: "Activity" + photos: "Photos" + digitalClock: "Digital Clock" + unixClock: "UNIX Clock" + federation: "Federation" + instanceCloud: "Server Cloud" + postForm: "Posting Form" + slideshow: "Slideshow" + button: "Button" + onlineUsers: "Online Users" + jobQueue: "Job Queue" + serverMetric: "Server Metrics" + aiscript: "AiScript Console" + userList: "User List" + serverInfo: "Server Info" + _userList: + chooseList: "Select a list" + meiliStatus: "Server Status" + meiliSize: "Index size" + meiliIndexCount: "Indexed posts" + +_cw: + hide: "Hide" + show: "Show content" + chars: "{count} characters" + files: "{count} file(s)" +_poll: + noOnlyOneChoice: "At least two choices are needed" + choiceN: "Choice {n}" + noMore: "You cannot add more choices" + canMultipleVote: "Allow selecting multiple choices" + expiration: "End poll" + infinite: "Never" + at: "End at..." + after: "End after..." + deadlineDate: "End date" + deadlineTime: "Time" + duration: "Duration" + votesCount: "{n} votes" + totalVotes: "{n} votes in total" + vote: "Vote" + showResult: "View results" + voted: "Voted" + closed: "Ended" + remainingDays: "{d} day(s) {h} hour(s) remaining" + remainingHours: "{h} hour(s) {m} minute(s) remaining" + remainingMinutes: "{m} minute(s) {s} second(s) remaining" + remainingSeconds: "{s} second(s) remaining" +_visibility: + public: "Public" + publicDescription: "Your post will be visible for all users" + home: "Unlisted" + homeDescription: "Post to home timeline only" + followers: "Followers" + followersDescription: "Make visible to your followers only" + specified: "Direct" + specifiedDescription: "Make visible for specified users only" + localOnly: "Local only" + localOnlyDescription: "Not visible to remote users" +_postForm: + replyPlaceholder: "Reply to this post..." + quotePlaceholder: "Quote this post..." + channelPlaceholder: "Post to a channel..." + _placeholders: + a: "What are you up to?" + b: "What's happening around you?" + c: "What's on your mind?" + d: "What do you want to say?" + e: "Start writing..." + f: "Waiting for you to write..." +_profile: + name: "Name" + username: "Username" + description: "Bio" + youCanIncludeHashtags: "You can also include hashtags in your bio." + metadata: "Additional Information" + metadataEdit: "Edit additional Information" + metadataDescription: "Using these, you can display additional information fields + in your profile." + metadataLabel: "Label" + metadataContent: "Content" + changeAvatar: "Change avatar" + changeBanner: "Change banner" + locationDescription: "If you enter your city first, it will display your local time + to other users." +_exportOrImport: + allNotes: "All posts" + followingList: "Followed users" + muteList: "Muted users" + blockingList: "Blocked users" + userLists: "User lists" + excludeMutingUsers: "Exclude muted users" + excludeInactiveUsers: "Exclude inactive users" +_charts: + federation: "Federation" + apRequest: "Requests" + usersIncDec: "Difference in the number of users" + usersTotal: "Total number of users" + activeUsers: "Active users" + notesIncDec: "Difference in the number of posts" + localNotesIncDec: "Difference in the number of local posts" + remoteNotesIncDec: "Difference in the number of remote posts" + notesTotal: "Total number of posts" + filesIncDec: "Difference in the number of files" + filesTotal: "Total number of files" + storageUsageIncDec: "Difference in storage usage" + storageUsageTotal: "Total storage usage" +_instanceCharts: + requests: "Requests" + users: "Difference in the number of users" + usersTotal: "Cumulative number of users" + notes: "Difference in the number of posts" + notesTotal: "Cumulative number of posts" + ff: "Difference in the number of followed users / followers " + ffTotal: "Cumulative number of followed users / followers" + cacheSize: "Difference in cache size" + cacheSizeTotal: "Cumulative total cache size" + files: "Difference in the number of files" + filesTotal: "Cumulative number of files" +_timelines: + home: "Home" + local: "Local" + recommended: "Recommended" + social: "Social" + global: "Global" +_pages: + newPage: "Create a new Page" + editPage: "Edit this Page" + readPage: "Viewing this Page's source" + created: "Page successfully created" + updated: "Page successfully edited" + deleted: "Page successfully deleted" + pageSetting: "Page settings" + nameAlreadyExists: "The specified Page URL already exists" + invalidNameTitle: "The specified Page URL is invalid" + invalidNameText: "Make sure the Page title is not empty" + editThisPage: "Edit this Page" + viewSource: "View source" + viewPage: "View your Pages" + like: "Like" + unlike: "Remove like" + my: "My Pages" + liked: "Liked Pages" + featured: "Popular" + inspector: "Inspector" + contents: "Content" + content: "Page block" + variables: "Variables" + title: "Title" + url: "Page URL" + summary: "Page summary" + alignCenter: "Center elements" + hideTitleWhenPinned: "Hide Page title when pinned to profile" + font: "Font" + fontSerif: "Serif" + fontSansSerif: "Sans Serif" + eyeCatchingImageSet: "Set thumbnail" + eyeCatchingImageRemove: "Delete thumbnail" + chooseBlock: "Add a block" + selectType: "Select a type" + enterVariableName: "Enter a variable name" + variableNameIsAlreadyUsed: "This variable name is already in use" + contentBlocks: "Content" + inputBlocks: "Input" + specialBlocks: "Special" + blocks: + text: "Text" + textarea: "Text area" + section: "Section" + image: "Images" + button: "Button" + if: "If" + _if: + variable: "Variable" + post: "Posting form" + _post: + text: "Content" + attachCanvasImage: "Attach canvas image" + canvasId: "Canvas ID" + textInput: "Text input" + _textInput: + name: "Variable name" + text: "Title" + default: "Default value" + textareaInput: "Multiline text input" + _textareaInput: + name: "Variable name" + text: "Title" + default: "Default value" + numberInput: "Numeric input" + _numberInput: + name: "Variable name" + text: "Title" + default: "Default value" + canvas: "Canvas" + _canvas: + id: "Canvas ID" + width: "Width" + height: "Height" + note: "Embedded post" + _note: + id: "Post ID" + idDescription: "You can alternatively paste the post URL here." + detailed: "Detailed view" + switch: "Switch" + _switch: + name: "Variable name" + text: "Title" + default: "Default value" + counter: "Counter" + _counter: + name: "Variable name" + text: "Title" + inc: "Step" + _button: + text: "Title" + colored: "Colored" + action: "Behavior when the button is pressed" + _action: + dialog: "Show a dialog" + _dialog: + content: "Content" + resetRandom: "Reset the random seed" + pushEvent: "Send an event" + _pushEvent: + event: "Event name" + message: "Message to display when activated" + variable: "Variable to send" + no-variable: "None" + callAiScript: "Invoke AiScript" + _callAiScript: + functionName: "Function name" + radioButton: "Choice" + _radioButton: + name: "Variable name" + title: "Title" + values: "List of choices separated by line breaks" + default: "Default value" + script: + categories: + flow: "Flow control" + logical: "Logical operation" + operation: "Computation" + comparison: "Comparison" + random: "Random" + value: "Values" + fn: "Functions" + text: "Text operations" + convert: "Transformations" + list: "Lists" + blocks: + text: "Text" + multiLineText: "Text (multiline)" + textList: "Text list" + _textList: + info: "Separate each entry with a line break" + strLen: "Text length" + _strLen: + arg1: "Text" + strPick: "Extract string" + _strPick: + arg1: "Text" + arg2: "String location" + strReplace: "Replacement string" + _strReplace: + arg1: "Text" + arg2: "Text to be replaced" + arg3: "Replace with" + strReverse: "Flip text" + _strReverse: + arg1: "Text" + join: "Text concatenation" + _join: + arg1: "Lists" + arg2: "Separator" + add: "Add" + _add: + arg1: "A" + arg2: "B" + subtract: "Subtract" + _subtract: + arg1: "A" + arg2: "B" + multiply: "Multiply" + _multiply: + arg1: "A" + arg2: "B" + divide: "Divide" + _divide: + arg1: "A" + arg2: "B" + mod: "Remainder" + _mod: + arg1: "A" + arg2: "B" + round: "Decimal rounding" + _round: + arg1: "Number" + eq: "A and B are equal" + _eq: + arg1: "A" + arg2: "B" + notEq: "A and B are different" + _notEq: + arg1: "A" + arg2: "B" + and: "A AND B" + _and: + arg1: "A" + arg2: "B" + or: "A OR B" + _or: + arg1: "A" + arg2: "B" + lt: "< A is less than B" + _lt: + arg1: "A" + arg2: "B" + gt: "> A is larger than B" + _gt: + arg1: "A" + arg2: "B" + ltEq: "<= A is less than or equal to B" + _ltEq: + arg1: "A" + arg2: "B" + gtEq: ">= A is greater than or equal to B" + _gtEq: + arg1: "A" + arg2: "B" + if: "Branch" + _if: + arg1: "If" + arg2: "Then" + arg3: "Else" + not: "NOT" + _not: + arg1: "NOT" + random: "Random" + _random: + arg1: "Probability" + rannum: "Random number" + _rannum: + arg1: "Minimum value" + arg2: "Maximum value" + randomPick: "Randomly choose from list" + _randomPick: + arg1: "List" + dailyRandom: "Random (Changes once a day for each user)" + _dailyRandom: + arg1: "Probability" + dailyRannum: "Random number (Changes once a day for each user)" + _dailyRannum: + arg1: "Minimum value" + arg2: "Maximum value" + dailyRandomPick: "Randomly choose from a list (Changes once a day for each user)" + _dailyRandomPick: + arg1: "List" + seedRandom: "Random (with seed)" + _seedRandom: + arg1: "Seed" + arg2: "Probability" + seedRannum: "Random number (with seed)" + _seedRannum: + arg1: "Seed" + arg2: "Minimum value" + arg3: "Maximum value" + seedRandomPick: "Randomly choose from list (with seed)" + _seedRandomPick: + arg1: "Seed" + arg2: "List" + DRPWPM: "Randomly choose from weighted list (Changes once a day for each user)" + _DRPWPM: + arg1: "Text list" + pick: "Select from list" + _pick: + arg1: "List" + arg2: "Position" + listLen: "Get length of list" + _listLen: + arg1: "List" + number: "Number" + stringToNumber: "Text to number" + _stringToNumber: + arg1: "Text" + numberToString: "Number to text" + _numberToString: + arg1: "Number" + splitStrByLine: "Split text by line breaks" + _splitStrByLine: + arg1: "Text" + ref: "Variable" + aiScriptVar: "AiScript Variable" + fn: "Function" + _fn: + slots: "Slots" + slots-info: "Separate each slot with a line break" + arg1: "Output" + for: "for-Loop" + _for: + arg1: "Number of times to repeat" + arg2: "Action" + typeError: "Slot {slot} accepts values of type \"{expect}\", but the provided + value is of type \"{actual}\"!" + thereIsEmptySlot: "Slot {slot} is empty!" + types: + string: "Text" + number: "Number" + boolean: "Flag" + array: "List" + stringArray: "Text list" + emptySlot: "Empty slot" + enviromentVariables: "Environment variables" + pageVariables: "Page variables" + argVariables: "Input slots" +_relayStatus: + requesting: "Pending" + accepted: "Accepted" + rejected: "Rejected" +_notification: + fileUploaded: "File successfully uploaded" + youGotMention: "{name} mentioned you" + youGotReply: "{name} replied to you" + youGotQuote: "{name} quoted you" + youRenoted: "Boost from {name}" + youGotPoll: "{name} voted on your poll" + youGotMessagingMessageFromUser: "{name} sent you a chat message" + youGotMessagingMessageFromGroup: "A chat message was sent to the {name} group" + youWereFollowed: "followed you" + youReceivedFollowRequest: "You've received a follow request" + yourFollowRequestAccepted: "Your follow request was accepted" + youWereInvitedToGroup: "{userName} invited you to a group" + pollEnded: "Poll results have become available" + emptyPushNotificationMessage: "Push notifications have been updated" + reacted: "reacted to your post" + renoted: "boosted your post" + voted: "voted on your poll" + _types: + all: "All" + follow: "New followers" + mention: "Mentions" + reply: "Replies" + renote: "Boosts" + quote: "Quotes" + reaction: "Reactions" + pollVote: "Votes on polls" + pollEnded: "Polls ending" + receiveFollowRequest: "Received follow requests" + followRequestAccepted: "Accepted follow requests" + groupInvited: "Group invitations" + app: "Notifications from linked apps" + _actions: + followBack: "followed you back" + reply: "Reply" + renote: "Boosts" +_deck: + alwaysShowMainColumn: "Always show main column" + columnAlign: "Align columns" + addColumn: "Add column" + configureColumn: "Column settings" + swapLeft: "Swap with the left column" + swapRight: "Swap with the right column" + swapUp: "Swap with the above column" + swapDown: "Swap with the below column" + stackLeft: "Stack with the left column" + popRight: "Pop column to the right" + profile: "Workspace" + newProfile: "New workspace" + renameProfile: "Rename workspace" + deleteProfile: "Delete workspace" + nameAlreadyExists: "This workspace name already exists." + introduction: "Create the perfect interface for you by arranging columns freely!" + introduction2: "Click on the + on the right of the screen to add new colums whenever + you want." + widgetsIntroduction: "Please select \"Edit widgets\" in the column menu and add + a widget." + _columns: + main: "Main" + widgets: "Widgets" + notifications: "Notifications" + tl: "Timeline" + antenna: "Antenna" + list: "List" + channel: "Channel" + mentions: "Mentions" + direct: "Direct messages" +_experiments: + title: "Experiments" + enablePostEditing: "Enable post editing" + postEditingCaption: "Shows the option for users to edit their existing posts via\ + \ the post options menu, and allows post edits from other instances to be recieved." + enablePostImports: "Enable post imports" + postImportsCaption: "Allows users to import their posts from past Calckey,\ + \ Misskey, Mastodon, Akkoma, and Pleroma accounts. It may cause slowdowns during\ + \ load if your queue is bottlenecked." + +_dialog: + charactersExceeded: "Max characters exceeded! Current: {current}/Limit: {max}" + charactersBelow: "Not enough characters! Current: {current}/Limit: {min}" diff --git a/fe_calckey/frontend/locales/es-ES.yml b/fe_calckey/frontend/locales/es-ES.yml new file mode 100644 index 0000000..6d1d88f --- /dev/null +++ b/fe_calckey/frontend/locales/es-ES.yml @@ -0,0 +1,1929 @@ +_lang_: "Español" +headlineMisskey: "¡Un proyecto de código abierto y una plataforma de medios de comunicación\ + \ descentralizada que es gratis para siempre! \U0001F680" +introMisskey: "¡Bienvenido! ¡Calckey es un proyecto de código abierto, plataforma\ + \ descentralizado medios de comunicación social que es gratis para siempre! \U0001F680" +monthAndDay: "{day}/{month}" +search: "Buscar" +notifications: "Notificaciones" +username: "Nombre de usuario" +password: "Contraseña" +forgotPassword: "Olvidé mi Contraseña" +fetchingAsApObject: "Recuperando desde el Fediverso" +ok: "OK" +gotIt: "¡Lo tengo!" +cancel: "Cancelar" +enterUsername: "Introduce el nombre de usuario" +renotedBy: "Impulsado por {user}" +noNotes: "No hay publicaciones" +noNotifications: "No hay notificaciones" +instance: "Instancia" +settings: "Configuración" +basicSettings: "Configuración Básica" +otherSettings: "Configuración avanzada" +openInWindow: "Abrir en una ventana" +profile: "Perfil" +timeline: "Línea de tiempo" +noAccountDescription: "Este usuario no ha escrito su biografía aún." +login: "Iniciar sesión" +loggingIn: "Iniciando sesión" +logout: "Cerrar sesión" +signup: "Registrarse" +uploading: "Cargando..." +save: "Guardar" +users: "Usuarios" +addUser: "Agregar usuario" +favorite: "Añadir a favoritos" +favorites: "Favoritos" +unfavorite: "Quitar de favoritos" +favorited: "Añadido a favoritos." +alreadyFavorited: "Ya había sido añadido a favoritos." +cantFavorite: "No se puede añadir a favoritos." +pin: "Fijar al perfil" +unpin: "Desfijar" +copyContent: "Copiar contenido" +copyLink: "Copiar enlace" +delete: "Borrar" +deleteAndEdit: "Borrar y editar" +deleteAndEditConfirm: "¿Estás seguro de que quieres borrar esta publicación y editarla?\ + \ Perderás todas las reacciones, impulsos y respuestas." +addToList: "Agregar a lista" +sendMessage: "Enviar un mensaje" +copyUsername: "Copiar nombre de usuario" +searchUser: "Buscar un usuario" +reply: "Responder" +loadMore: "Ver más" +showMore: "Ver más" +showLess: "Cerrar" +youGotNewFollower: "te ha seguido" +receiveFollowRequest: "Recibiste una solicitud de seguimiento" +followRequestAccepted: "La solicitud de seguimiento fue aceptada" +mention: "Menciones" +mentions: "Menciones" +directNotes: "Mensajes Directos" +importAndExport: "Importar y Exportar" +import: "Importar" +export: "Exportar" +files: "Archivos" +download: "Descargar" +driveFileDeleteConfirm: "¿Desea borrar el archivo \"{name}\"? Las publicaciones que\ + \ tengan este archivo como adjunto serán eliminadas." +unfollowConfirm: "¿Desea dejar de seguir a {name}?" +exportRequested: "Se ha solicitado la exportación. Puede tomar un tiempo. Cuando termine\ + \ la exportación, se añadirá en el drive." +importRequested: "Se ha solicitado la importación. Puede tomar un tiempo." +lists: "Listas" +noLists: "No tiene listas" +note: "Publicación" +notes: "Publicaciones" +following: "Siguiendo" +followers: "Seguidores" +followsYou: "Te sigue" +createList: "Crear lista" +manageLists: "Administrar listas" +error: "Error" +somethingHappened: "Ocurrió un error" +retry: "Reintentar" +pageLoadError: "Error al cargar la página." +pageLoadErrorDescription: "Normalmente es debido a la red o al caché del navegador.\ + \ Por favor limpie el caché o intente más tarde." +serverIsDead: "No hay respuesta del servidor. Espere un momento y vuelva a intentarlo." +youShouldUpgradeClient: "Para ver esta página, por favor refrezca el navegador y utiliza\ + \ una versión más reciente del cliente." +enterListName: "Ingrese nombre de lista" +privacy: "Privacidad" +makeFollowManuallyApprove: "Aprobar manualmente las solicitudes de seguimiento" +defaultNoteVisibility: "Visibilidad por defecto" +follow: "Seguir" +followRequest: "Enviar solicitud de seguimiento" +followRequests: "Solicitudes de seguimiento" +unfollow: "Dejar de seguir" +followRequestPending: "Solicitudes de seguimiento pendiente" +enterEmoji: "Ingresar emojis" +renote: "Impulsar" +unrenote: "Quitar impulso" +renoted: "Impulsado." +cantRenote: "No se puede impulsar esta publicación." +cantReRenote: "No se puede impulsar un impulso." +quote: "Citar" +pinnedNote: "Publicación fijada" +pinned: "Fijar al perfil" +you: "Tú" +clickToShow: "Click para ver" +sensitive: "Marcado como sensible" +add: "Agregar" +reaction: "Reacción" +reactionSetting: "Reacciones para mostrar en el menú de reacciones" +reactionSettingDescription2: "Arrastre para reordenar, click para borrar, apriete\ + \ la tecla + para añadir." +rememberNoteVisibility: "Recordar la configuración de visibilidad de la publicación" +attachCancel: "Quitar adjunto" +markAsSensitive: "Marcar como sensible" +unmarkAsSensitive: "Desmarcar como sensible" +enterFileName: "Ingrese el nombre del archivo" +mute: "Silenciar" +unmute: "Dejar de silenciar" +block: "Bloquear" +unblock: "Dejar de bloquear" +suspend: "Suspender" +unsuspend: "Dejar de suspender" +blockConfirm: "¿Quiere bloquear esta cuenta?" +unblockConfirm: "¿Quiere dejar de bloquear esta cuenta?" +suspendConfirm: "¿Quiere suspender esta cuenta?" +unsuspendConfirm: "¿Quiere dejar de suspender esta cuenta?" +selectList: "Seleccione una lista" +selectAntenna: "Seleccionar antena" +selectWidget: "Seleccionar widget" +editWidgets: "Editar widgets" +editWidgetsExit: "Terminar edición" +customEmojis: "Emojis personalizados" +emoji: "Emoji" +emojis: "Emoji" +emojiName: "Nombre del emoji" +emojiUrl: "URL de la imágen del emoji" +addEmoji: "Agregar emoji" +settingGuide: "Configuración sugerida" +cacheRemoteFiles: "Mantener en cache los archivos remotos" +cacheRemoteFilesDescription: "Si desactiva esta configuración, Los archivos remotos\ + \ se cargarán desde el link directo sin usar la caché. Con eso se puede ahorrar\ + \ almacenamiento del servidor, pero eso aumentará el tráfico al no crear miniaturas." +flagAsBot: "Esta cuenta es un bot" +flagAsBotDescription: "En caso de que esta cuenta fuera usada por un programa, active\ + \ esta opción. Al hacerlo, esta opción servirá para otros desarrolladores para evitar\ + \ cadenas infinitas de reacciones, y ajustará los sistemas internos de Calckey para\ + \ que trate a esta cuenta como un bot." +flagAsCat: "Esta cuenta es un gato" +flagAsCatDescription: "Vas a tener orejas de gato y hablar como un gato!" +flagShowTimelineReplies: "Mostrar respuestas a las notas en la biografía" +flagShowTimelineRepliesDescription: "Cuando se marca, la línea de tiempo muestra respuestas\ + \ a otras publicaciones además de las publicaciones del usuario." +autoAcceptFollowed: "Aceptar automáticamente las solicitudes de seguimiento de los\ + \ usuarios que sigues" +addAccount: "Agregar Cuenta" +loginFailed: "Error al iniciar sesión" +showOnRemote: "Ver en una instancia remota" +general: "General" +wallpaper: "Fondo de pantalla" +setWallpaper: "Establecer fondo de pantalla" +removeWallpaper: "Quitar fondo de pantalla" +searchWith: "Buscar: {q}" +youHaveNoLists: "No tienes listas" +followConfirm: "¿Desea seguir a {name}?" +proxyAccount: "Cuenta proxy" +proxyAccountDescription: "Una cuenta proxy es una cuenta que actúa como un seguidor\ + \ remoto de un usuario bajo ciertas condiciones. Por ejemplo, cuando un usuario\ + \ añade un usuario remoto a una lista, si ningún usuario local sigue al usuario\ + \ agregado a la lista, la instancia no puede obtener su actividad. Así que la cuenta\ + \ proxy sigue al usuario añadido a la lista." +host: "Host" +selectUser: "Elegir usuario" +recipient: "Recipiente" +annotation: "Anotación" +federation: "Federación" +instances: "Instancia" +registeredAt: "Registrado en" +latestRequestSentAt: "Ultimo pedido enviado" +latestRequestReceivedAt: "Ultimo pedido recibido" +latestStatus: "Último status" +storageUsage: "Almacenamiento usado" +charts: "Chat" +perHour: "por hora" +perDay: "por día" +stopActivityDelivery: "Dejar de enviar actividades" +blockThisInstance: "Bloquear instancia" +operations: "Operaciones" +software: "Software" +version: "Versión" +metadata: "Metadatos" +monitor: "Monitor" +jobQueue: "Cola de trabajos" +cpuAndMemory: "CPU y Memoria" +network: "Red" +disk: "Disco" +instanceInfo: "información de la instancia" +statistics: "Estadísticas" +clearQueue: "Limpiar cola" +clearQueueConfirmTitle: "¿Desea limpiar la cola?" +clearQueueConfirmText: "Las publicaciones aún no entregadas no se federarán. Normalmente\ + \ no se necesita ejecutar esta operación." +clearCachedFiles: "Limpiar caché" +clearCachedFilesConfirm: "¿Desea borrar todos los archivos remotos cacheados?" +blockedInstances: "Instancias bloqueadas" +blockedInstancesDescription: "Seleccione los hosts de las instancias que desea bloquear,\ + \ separadas por una linea nueva. Las instancias bloqueadas no podrán comunicarse\ + \ con esta instancia." +muteAndBlock: "Silenciar y bloquear" +mutedUsers: "Usuarios silenciados" +blockedUsers: "Usuarios bloqueados" +noUsers: "No hay usuarios" +editProfile: "Editar perfil" +noteDeleteConfirm: "¿Desea borrar esta publicación?" +pinLimitExceeded: "Ya no se pueden fijar más publicaciones" +intro: "¡La instalación de Calckey ha terminado! Crea el usuario administrador." +done: "Terminado" +processing: "Procesando" +preview: "Vista previa" +default: "Predeterminado" +defaultValueIs: "Predeterminado" +noCustomEmojis: "No hay emojis personalizados" +noJobs: "No hay trabajos" +federating: "Federando" +blocked: "Bloqueando" +suspended: "Suspendido" +all: "Todo" +subscribing: "Suscribiendo" +publishing: "Publicando" +notResponding: "Sin respuestas" +instanceFollowing: "Siguiendo instancias" +instanceFollowers: "Seguidores de la instancia" +instanceUsers: "Usuarios de la instancia" +changePassword: "Cambiar contraseña" +security: "Seguridad" +retypedNotMatch: "No hay coincidencia." +currentPassword: "Contraseña actual" +newPassword: "Contraseña nueva" +newPasswordRetype: "Contraseña nueva (repetir)" +attachFile: "Añadir archivo" +more: "¡Más!" +featured: "Destacados" +usernameOrUserId: "Nombre o ID del usuario" +noSuchUser: "No se encuentra el usuario" +lookup: "Búsqueda" +announcements: "Anuncios" +imageUrl: "URL de la imágen" +remove: "Borrar" +removed: "Borrado" +removeAreYouSure: "¿Desea borrar \"{x}\"?" +deleteAreYouSure: "¿Desea borrar \"{x}\"?" +resetAreYouSure: "¿Desea reestablecer?" +saved: "Guardado" +messaging: "Chat" +upload: "Subir" +keepOriginalUploading: "Mantener la imagen original" +keepOriginalUploadingDescription: "Mantener la versión original al cargar imágenes.\ + \ Si está desactivado, el navegador generará imágenes para la publicación web en\ + \ el momento de recargar la página." +fromDrive: "Desde el drive" +fromUrl: "Desde la URL" +uploadFromUrl: "Subir desde una URL" +uploadFromUrlDescription: "URL del fichero que quieres subir" +uploadFromUrlRequested: "Subida solicitada" +uploadFromUrlMayTakeTime: "Subir el fichero puede tardar un tiempo." +explore: "Explorar" +messageRead: "Ya leído" +noMoreHistory: "El historial se ha acabado" +startMessaging: "Iniciar chat" +nUsersRead: "Leído por {n} personas" +agreeTo: "De acuerdo con {0}" +tos: "Términos de uso" +start: "Comenzar" +home: "Inicio" +remoteUserCaution: "La información del usuario remoto tal vez esta incompleta." +activity: "Actividad" +images: "Imágenes" +birthday: "Fecha de nacimiento" +yearsOld: "{age} años" +registeredDate: "Fecha de registro" +location: "Lugar" +theme: "Tema" +themeForLightMode: "Tema para usar en Modo Linterna" +themeForDarkMode: "Tema para usar en Modo Oscuro" +light: "Linterna" +dark: "Oscuro" +lightThemes: "Tema claro" +darkThemes: "Tema oscuro" +syncDeviceDarkMode: "Sincronice el Modo Oscuro con la configuración de su dispositivo" +drive: "Drive" +fileName: "Nombre de archivo" +selectFile: "Elegir archivo" +selectFiles: "Elegir archivos" +selectFolder: "Seleccione una carpeta" +selectFolders: "Seleccione carpetas" +renameFile: "Renombrar archivo" +folderName: "Nombre de la carpeta" +createFolder: "Crear carpeta" +renameFolder: "Renombrar carpeta" +deleteFolder: "Borrar carpeta" +addFile: "Agregar archivo" +emptyDrive: "El drive está vacío" +emptyFolder: "La carpeta está vacía" +unableToDelete: "No se puede borrar" +inputNewFileName: "Ingrese un nuevo nombre de archivo" +inputNewDescription: "Ingrese nueva descripción" +inputNewFolderName: "Ingrese un nuevo nombre de la carpeta" +circularReferenceFolder: "La carpeta de destino es una sub-carpeta de la carpeta que\ + \ quieres mover." +hasChildFilesOrFolders: "No se puede borrar esta carpeta. No está vacía." +copyUrl: "Copiar URL" +rename: "Renombrar" +avatar: "Avatar" +banner: "Banner" +nsfw: "Marcado como sensible" +whenServerDisconnected: "Cuando se pierda la conexión con el servidor" +disconnectedFromServer: "Desconectado del servidor" +reload: "Recargar" +doNothing: "No hacer nada" +reloadConfirm: "¿Desea recargar?" +watch: "Ver" +unwatch: "Dejar de ver" +accept: "Aceptar" +reject: "Rechazar" +normal: "Normal" +instanceName: "Nombre de la instancia" +instanceDescription: "Descripción de la instancia" +maintainerName: "Nombre del administrador" +maintainerEmail: "Correo del administrador" +tosUrl: "URL de los términos de uso" +thisYear: "Este año" +thisMonth: "Este mes" +today: "Hoy" +dayX: "Día {day}" +monthX: "Mes {month}" +yearX: "Año {year}" +pages: "Páginas" +integration: "Integraciones" +connectService: "Conectar" +disconnectService: "Desconectar" +enableLocalTimeline: "Habilitar linea de tiempo local" +enableGlobalTimeline: "Habilitar linea de tiempo global" +disablingTimelinesInfo: "Aunque se desactiven estas lineas de tiempo, por conveniencia\ + \ el administrador y los moderadores pueden seguir usándolos" +registration: "Registro" +enableRegistration: "Permitir nuevos registros" +invite: "Invitar" +driveCapacityPerLocalAccount: "Capacidad del drive por usuario local" +driveCapacityPerRemoteAccount: "Capacidad del drive por usuario remoto" +inMb: "En megabytes" +iconUrl: "URL de la imagen del avatar" +bannerUrl: "URL de la imagen del banner" +backgroundImageUrl: "URL de la imagen de fondo" +basicInfo: "Información básica" +pinnedUsers: "Usuarios fijados" +pinnedUsersDescription: "Describir los usuarios que quiere fijar en la página \"Descubrir\"\ + \ separados por una linea nueva" +pinnedPages: "Páginas fijadas" +pinnedPagesDescription: "Describa las rutas de las páginas que desea fijar a la página\ + \ principal de la instancia, separadas por lineas nuevas" +pinnedClipId: "Id del clip fijado" +pinnedNotes: "Publicación fijada" +hcaptcha: "hCaptcha" +enableHcaptcha: "Habilitar hCaptcha" +hcaptchaSiteKey: "Clave del sitio" +hcaptchaSecretKey: "Clave secreta" +recaptcha: "reCAPTCHA" +enableRecaptcha: "activar reCAPTCHA" +recaptchaSiteKey: "Clave del sitio" +recaptchaSecretKey: "Clave secreta" +avoidMultiCaptchaConfirm: "El uso de múltiples Captchas puede causar interferencia.\ + \ ¿Desea desactivar el otro Captcha? Puede dejar múltiples Captchas habilitadas\ + \ presionando cancelar." +antennas: "Antenas" +manageAntennas: "Administrar antenas" +name: "Nombre" +antennaSource: "Origen de la antena" +antennaKeywords: "Palabras clave para recibir" +antennaExcludeKeywords: "Palabras clave para excluir" +antennaKeywordsDescription: "Separar con espacios es una declaración AND, separar\ + \ con una linea nueva es una declaración OR" +notifyAntenna: "Notificar nueva publicación" +withFileAntenna: "Sólo publicaciones con archivos adjuntados" +enableServiceworker: "Activar ServiceWorker" +antennaUsersDescription: "Elegir nombres de usuarios separados por una linea nueva" +caseSensitive: "Distinguir mayúsculas de minúsculas" +withReplies: "Incluir respuestas" +connectedTo: "Estas cuentas están conectadas" +notesAndReplies: "Publicaciones y respuestas" +withFiles: "Adjuntos" +silence: "Silenciar" +silenceConfirm: "¿Desea silenciar al usuario?" +unsilence: "Dejar de silenciar" +unsilenceConfirm: "¿Desea dejar de silenciar al usuario?" +popularUsers: "Usuarios populares" +recentlyUpdatedUsers: "Usuarios activos recientemente" +recentlyRegisteredUsers: "Usuarios registrados recientemente" +recentlyDiscoveredUsers: "Usuarios descubiertos recientemente" +exploreUsersCount: "Hay {count} usuarios" +exploreFediverse: "Explorar fediverso" +popularTags: "Etiquetas populares" +userList: "Lista" +about: "Información" +aboutMisskey: "Sobre Calckey" +administrator: "Administrador" +token: "Token" +twoStepAuthentication: "Autenticación de dos factores" +moderator: "Moderador" +moderation: "Moderación" +nUsersMentioned: "{n} usuarios mencionados" +securityKey: "Clave de seguridad" +securityKeyName: "Nombre de la Clave" +registerSecurityKey: "Registrar clave de seguridad" +lastUsed: "Última vez usado" +unregister: "Cancelar registro" +passwordLessLogin: "Iniciar sesión sin contraseña" +resetPassword: "Resetear contraseña" +newPasswordIs: "La nueva contraseña es \"{password}\"" +reduceUiAnimation: "Reducir la animación de la UI" +share: "Compartir" +notFound: "No se encuentra" +notFoundDescription: "No se encontró la página correspondiente a la URL elegida" +uploadFolder: "Carpeta de subidas por defecto" +cacheClear: "Borrar caché" +markAsReadAllNotifications: "Marcar todas las notificaciones como leídas" +markAsReadAllUnreadNotes: "Marcar todas las publicaciones como leídas" +markAsReadAllTalkMessages: "Marcar todos los chats como leídos" +help: "Ayuda" +inputMessageHere: "Escribe el mensaje aquí" +close: "Cerrar" +group: "Grupo" +groups: "Grupos" +createGroup: "Crear grupo" +ownedGroups: "Tus" +joinedGroups: "Grupos a los que me uní" +invites: "Invitar" +groupName: "Nombre del grupo" +members: "Miembros" +transfer: "Transferir" +messagingWithUser: "Chatear con usuario" +messagingWithGroup: "Chatear en grupo" +title: "Título" +text: "Texto" +enable: "Activar" +next: "Siguiente" +retype: "Intentar de nuevo" +noteOf: "Publicaciones de {user}" +inviteToGroup: "Invitar al grupo" +quoteAttached: "Cita añadida" +quoteQuestion: "¿Quiere añadir una cita?" +noMessagesYet: "Aún no hay chat" +newMessageExists: "Tienes un mensaje nuevo" +onlyOneFileCanBeAttached: "Solo se puede añadir un archivo al mensaje" +signinRequired: "Iniciar sesión" +invitations: "Invitar" +invitationCode: "Código de invitación" +checking: "Comprobando" +available: "Disponible" +unavailable: "No disponible" +usernameInvalidFormat: "utiliza letras, números y/o -." +tooShort: "Demasiado corto" +tooLong: "Demasiado largo" +weakPassword: "Contraseña débil" +normalPassword: "Buena contraseña" +strongPassword: "Muy buena contraseña" +passwordMatched: "Correcto" +passwordNotMatched: "Las contraseñas no son las mismas" +signinWith: "Inicie sesión con {x}" +signinFailed: "Autenticación fallida. Asegúrate de haber usado el nombre de usuario\ + \ y contraseña correctos." +tapSecurityKey: "Toque la clave de seguridad" +or: "O" +language: "Idioma" +uiLanguage: "Idioma de visualización de la interfaz" +groupInvited: "Invitado al grupo" +aboutX: "Acerca de {x}" +useOsNativeEmojis: "Usa los emojis nativos de la plataforma" +disableDrawer: "No mostrar los menús en cajones" +youHaveNoGroups: "Sin grupos" +joinOrCreateGroup: "Obtenga una invitación para unirse al grupos o puede crear su\ + \ propio grupo." +noHistory: "No hay datos en el historial" +signinHistory: "Historial de ingresos" +disableAnimatedMfm: "Deshabilitar MFM que tiene animaciones" +doing: "Voy en camino" +category: "Categoría" +tags: "Etiqueta" +docSource: "Fuente de este documento" +createAccount: "Crear cuenta" +existingAccount: "Cuenta existente" +regenerate: "Regenerar" +fontSize: "Tamaño de la letra" +noFollowRequests: "No hay solicitudes de seguimiento" +openImageInNewTab: "Abrir imagen en nueva pestaña" +dashboard: "Panel de control" +local: "Local" +remote: "Remoto" +total: "Total" +weekOverWeekChanges: "Dif semanal" +dayOverDayChanges: "Dif diaria" +appearance: "Apariencia" +clientSettings: "Configuración del cliente" +accountSettings: "Ajustes de cuenta" +promotion: "Promovido" +promote: "Promover" +numberOfDays: "Cantidad de dias" +hideThisNote: "Ocultar esta publicación" +showFeaturedNotesInTimeline: "Mostrar publicaciones destacadas en la línea de tiempo" +objectStorage: "Almacenamiento de objetos" +useObjectStorage: "Usar almacenamiento de objetos" +objectStorageBaseUrl: "Base URL" +objectStorageBaseUrlDesc: "Prefijo de URL utilizado para construir URL para hacer\ + \ referencia a objetos (medios). Especifique su URL si está utilizando un CDN o\ + \ Proxy; de lo contrario, especifique la dirección a la que se puede acceder públicamente\ + \ de acuerdo con la guía de servicio que va a utilizar. i.g 'https://.s3.amazonaws.com'\ + \ para AWS S3 y 'https://storage.googleapis.com/' para GCS." +objectStorageBucket: "Bucket" +objectStorageBucketDesc: "Especifique el nombre del depósito utilizado en el servicio\ + \ configurado." +objectStoragePrefix: "Prefix" +objectStoragePrefixDesc: "Los archivos se almacenarán en el directorio de este prefijo." +objectStorageEndpoint: "Endpoint" +objectStorageEndpointDesc: "Deje esto en blanco si está utilizando AWS S3; de lo contrario,\ + \ especifique el punto final como '' o ': ' de acuerdo con la\ + \ guía de servicio que va a utilizar." +objectStorageRegion: "Region" +objectStorageRegionDesc: "Especifique una región como 'xx-east-1'. Si su servicio\ + \ no tiene distinción sobre regiones, déjelo en blanco o complete con 'us-east-1'." +objectStorageUseSSL: "Usar SSL" +objectStorageUseSSLDesc: "Desactive esto si no va a usar HTTPS para la conexión API" +objectStorageUseProxy: "Conectarse a través de Proxy" +objectStorageUseProxyDesc: "Desactive esto si no va a usar Proxy para la conexión\ + \ de Almacenamiento de objetos" +objectStorageSetPublicRead: "Seleccionar \"public-read\" al subir " +serverLogs: "Registros del servidor" +deleteAll: "Eliminar todos" +showFixedPostForm: "Mostrar el formulario de las entradas encima de la línea de tiempo" +newNoteRecived: "Tienes unas publicaciones nuevas" +sounds: "Sonidos" +listen: "Escuchar" +none: "Ninguna" +showInPage: "Mostrar en la página" +popout: "Popout" +volume: "Volumen" +masterVolume: "Volumen principal" +details: "Detalles" +chooseEmoji: "Elije un emoji" +unableToProcess: "La operación no se puede llevar a cabo" +recentUsed: "Usado recientemente" +install: "Instalación" +uninstall: "Desinstalar" +installedApps: "Aplicaciones Autorizadas" +nothing: "No hay nada que ver aqui" +installedDate: "Autorizado" +lastUsedDate: "Utilizado el" +state: "Estado" +sort: "Ordenar" +ascendingOrder: "Ascendente" +descendingOrder: "Descendente" +scratchpad: "Scratch pad" +scratchpadDescription: "Scratchpad proporciona un entorno experimental para AiScript.\ + \ Puede escribir, ejecutar y verificar los resultados que interactúan con Calckey." +output: "Salida" +script: "Script" +disablePagesScript: "Deshabilitar AiScript en Páginas" +updateRemoteUser: "Actualizar información de usuario remoto" +deleteAllFiles: "Borrar todos los archivos" +deleteAllFilesConfirm: "¿Desea borrar todos los archivos?" +removeAllFollowing: "Retener todos los siguientes" +removeAllFollowingDescription: "Cancelar todos los siguientes del servidor {host}.\ + \ Ejecutar en caso de que esta instancia haya dejado de existir." +userSuspended: "Este usuario ha sido suspendido." +userSilenced: "Este usuario ha sido silenciado." +yourAccountSuspendedTitle: "Esta cuenta ha sido suspendida" +yourAccountSuspendedDescription: "Esta cuenta ha sido suspendida debido a violaciones\ + \ de los términos de servicio del servidor y otras razones. Para más información,\ + \ póngase en contacto con el administrador. Por favor, no cree una nueva cuenta." +menu: "Menú" +divider: "Divisor" +addItem: "Agregar elemento" +relays: "Relés" +addRelay: "Agregar relé" +inboxUrl: "Inbox URL" +addedRelays: "Relés añadidos" +serviceworkerInfo: "Se necesita activar para usar las notificaciones push" +deletedNote: "Publicación eliminada" +invisibleNote: "Publicación oculta" +enableInfiniteScroll: "Activar scroll infinito" +visibility: "Visibilidad" +poll: "Encuesta" +useCw: "Esconder contenidos" +enablePlayer: "Abrir reproductor" +disablePlayer: "Cerrar reproductor" +expandTweet: "Expandir tweet" +themeEditor: "Editor de temas" +description: "Descripción" +describeFile: "Añade una descripción" +enterFileDescription: "Introducir un título" +author: "Autor" +leaveConfirm: "Hay modificaciones sin guardar. ¿Desea descartarlas?" +manage: "Administrar" +plugins: "Plugins" +preferencesBackups: "Respaldo de preferencias" +deck: "Deck" +undeck: "Quitar deck" +useBlurEffectForModal: "Usar efecto borroso en modales" +useFullReactionPicker: "Reacción" +width: "Ancho" +height: "Altura" +large: "Grande" +medium: "Mediano" +small: "Pequeño" +generateAccessToken: "Generar token de acceso" +permission: "Permisos" +enableAll: "Activar todo" +disableAll: "Desactivar todo" +tokenRequested: "Permiso de acceso a la cuenta" +pluginTokenRequestedDescription: "Este plugin podrá usar los permisos descritos aquí" +notificationType: "Tipo de notificación" +edit: "Editar" +emailServer: "Servidor de correo" +enableEmail: "Activar el envío de correos electrónicos" +emailConfigInfo: "Usar en caso de validación de correo electrónico y pedido de contraseña" +email: "Correo" +emailAddress: "Correo electrónico" +smtpConfig: "Configuración del servidor SMTP" +smtpHost: "Host" +smtpPort: "Puerto" +smtpUser: "Nombre de usuario" +smtpPass: "Contraseña" +emptyToDisableSmtpAuth: "Deje el nombre del usuario y la contraseña en blanco para\ + \ deshabilitar la autenticación SMTP" +smtpSecure: "Usar SSL/TLS implícito en la conexión SMTP" +smtpSecureInfo: "Apagar cuando se use STARTTLS" +testEmail: "Prueba de envío" +wordMute: "Silenciar palabras" +regexpError: "Error de la expresión regular" +regexpErrorDescription: "Ocurrió un error en la expresión regular en la linea {line}\ + \ de las palabras muteadas {tab}" +instanceMute: "Instancias silenciadas" +userSaysSomething: "{name} dijo algo" +makeActive: "Activar" +display: "Apariencia" +copy: "Copiar" +metrics: "Métricas" +overview: "Resumen" +logs: "Registros" +delayed: "atrasado" +database: "Base de datos" +channel: "Canal" +create: "Crear" +notificationSetting: "Ajustes de Notificaciones" +notificationSettingDesc: "Por favor elija el tipo de notificación a mostrar" +useGlobalSetting: "Usar ajustes globales" +useGlobalSettingDesc: "Al activarse, se usará la configuración de notificaciones de\ + \ la cuenta, al desactivarse se pueden hacer configuraciones particulares." +other: "Otro" +regenerateLoginToken: "Regenerar token de login" +regenerateLoginTokenDescription: "Regenerar el token usado internamente durante el\ + \ login. No siempre es necesario hacerlo. Al hacerlo de nuevo, se deslogueará en\ + \ todos los dispositivos." +setMultipleBySeparatingWithSpace: "Puedes añadir mas de uno, separado por espacios." +fileIdOrUrl: "Id del archivo o URL" +behavior: "Comportamiento" +sample: "Muestra" +abuseReports: "Reportes" +reportAbuse: "Reportar" +reportAbuseOf: "Reportar a {name}" +fillAbuseReportDescription: "Ingrese los detalles del reporte. Si hay una nota en\ + \ particular, ingrese la URL de esta." +abuseReported: "Se ha enviado el reporte. Muchas gracias." +reporter: "Reportador" +reporteeOrigin: "Reportar a" +reporterOrigin: "Origen del reporte" +forwardReport: "Transferir un informe a una instancia remota" +forwardReportIsAnonymous: "No puede ver su información de la instancia remota y aparecerá\ + \ como una cuenta anónima del sistema" +send: "Enviar" +abuseMarkAsResolved: "Marcar reporte como resuelto" +openInNewTab: "Abrir en una Nueva Pestaña" +openInSideView: "Abrir en una vista al costado" +defaultNavigationBehaviour: "Navegación por defecto" +editTheseSettingsMayBreakAccount: "Editar estas configuraciones puede dañar su cuenta." +instanceTicker: "Información de notas de la instancia" +waitingFor: "Esperando a {x}" +random: "Aleatorio" +system: "Sistema" +switchUi: "Cambiar interfaz de usuario" +desktop: "Escritorio" +clip: "Clip" +createNew: "Crear" +optional: "Opcional" +createNewClip: "Crear clip nuevo" +unclip: "Quitar clip" +confirmToUnclipAlreadyClippedNote: "Esta nota ya está incluida en el clip \"{name}\"\ + . ¿Quiere quitar la nota del clip?" +public: "Público" +i18nInfo: "Calckey está siendo traducido a varios idiomas gracias a voluntarios. Se\ + \ puede colaborar traduciendo en {link}" +manageAccessTokens: "Administrar tokens de acceso" +accountInfo: "Información de la Cuenta" +notesCount: "Cantidad de notas" +repliesCount: "Cantidad de respuestas hechas" +renotesCount: "Cantidad de renotas hechas" +repliedCount: "Cantidad de respuestas recibidas" +renotedCount: "Cantidad de renotas recibidas" +followingCount: "Cantidad de seguidos" +followersCount: "Cantidad de seguidores" +sentReactionsCount: "Cantidad de reacciones hechas" +receivedReactionsCount: "Cantidad de reacciones recibidas" +pollVotesCount: "Cantidad de votaciones hechas" +pollVotedCount: "Cantidad de votaciones recibidas" +yes: "Si" +no: "No" +driveFilesCount: "Cantidad de archivos en el drive" +driveUsage: "Uso del drive" +noCrawle: "Rechazar indexación del crawler" +noCrawleDescription: "Pedir a los motores de búsqueda que no indexen tu perfil, notas,\ + \ páginas, etc." +lockedAccountInfo: "A menos que configures la visibilidad de tus notas como \"Sólo\ + \ seguidores\", tus notas serán visibles para cualquiera, incluso si requieres que\ + \ los seguidores sean aprobados manualmente." +alwaysMarkSensitive: "Marcar los medios de comunicación como contenido sensible por\ + \ defecto" +loadRawImages: "Cargar las imágenes originales en lugar de mostrar las miniaturas" +disableShowingAnimatedImages: "No reproducir imágenes animadas" +verificationEmailSent: "Se le ha enviado un correo electrónico de confirmación. Por\ + \ favor, acceda al enlace proporcionado en el correo electrónico para completar\ + \ la configuración." +notSet: "Sin especificar" +emailVerified: "Su dirección de correo electrónico ha sido verificada." +noteFavoritesCount: "Número de notas favoritas" +pageLikesCount: "Número de favoritos en la página" +pageLikedCount: "Número de favoritos de su página" +contact: "Contacto" +useSystemFont: "Utilizar la tipografía por defecto del sistema" +clips: "Clip" +experimentalFeatures: "Características experimentales" +developer: "Desarrolladores" +makeExplorable: "Hacer visible la cuenta en \"Explorar\"" +makeExplorableDescription: "Si desactiva esta opción, su cuenta no aparecerá en la\ + \ sección \"Explorar\"." +showGapBetweenNotesInTimeline: "Mostrar un intervalo entre notas en la línea de tiempo" +duplicate: "Duplicar" +left: "Izquierda" +center: "Centrar" +wide: "Ancho" +narrow: "Estrecho" +reloadToApplySetting: "Esta configuración sólo se aplicará después de recargar la\ + \ página. ¿Recargar ahora?" +needReloadToApply: "Se requiere un reinicio para la aplicar los cambios" +showTitlebar: "Mostrar la barra de título" +clearCache: "Limpiar caché" +onlineUsersCount: "{n} usuarios en línea" +nUsers: "{n} Usuarios" +nNotes: "{n} Notas" +sendErrorReports: "Envíar informe de errores" +sendErrorReportsDescription: "Si habilita esta opción, los detalles de los errores\ + \ serán compartidos con Calckey cuando ocurra un problema, lo que ayudará a mejorar\ + \ la calidad de Calckey. \nEsto incluye información como la versión del sistema\ + \ operativo, el tipo de navegador que está utilizando y su historial en Calckey,\ + \ entre otros datos." +myTheme: "Mi Tema" +backgroundColor: "Fondo" +accentColor: "Acento" +textColor: "Texto" +saveAs: "Guardar como…" +advanced: "Avanzado" +value: "Valores" +createdAt: "Fecha de creación" +updatedAt: "Actualizado" +saveConfirm: "¿Guardar cambios?" +deleteConfirm: "¿Desea eliminarlo?" +invalidValue: "Este no es un valor válido." +registry: "Registro" +closeAccount: "Cerrar cuenta" +currentVersion: "Versión actual" +latestVersion: "Última versión" +youAreRunningUpToDateClient: "Está utilizando la versión más reciente de su cliente." +newVersionOfClientAvailable: "Hay una versión más nueva de su cliente disponible." +usageAmount: "Uso" +capacity: "Capacidad" +inUse: "Usado" +editCode: "Editar código" +apply: "Aplicar" +receiveAnnouncementFromInstance: "Recibir notificaciones de la instancia" +emailNotification: "Notificaciones por correo electrónico" +publish: "Publicar" +inChannelSearch: "Buscar en el canal" +useReactionPickerForContextMenu: "Haga clic con el botón derecho para abrir el menu\ + \ de reacciones" +typingUsers: "{users} está escribiendo" +jumpToSpecifiedDate: "Saltar a una fecha específica" +showingPastTimeline: "Mostrar líneas de tiempo antiguas" +clear: "Limpiar" +markAllAsRead: "Marcar todo como leído" +goBack: "Deseleccionar" +unlikeConfirm: "¿Quitar como favorito?" +fullView: "Vista completa" +quitFullView: "quitar vista completa" +addDescription: "Agregar descripción" +userPagePinTip: "Puede mantener sus notas visibles aquí seleccionando Pin en el menú\ + \ de notas individuales" +notSpecifiedMentionWarning: "Algunas menciones no están incluidas en el destino" +info: "Información" +userInfo: "Información del usuario" +unknown: "Desconocido" +onlineStatus: "En línea" +hideOnlineStatus: "mostrarse como desconectado" +hideOnlineStatusDescription: "Ocultar su estado en línea puede reducir la eficacia\ + \ de algunas funciones, como la búsqueda" +online: "En línea" +active: "Activo" +offline: "Sin conexión" +notRecommended: "obsoleto" +botProtection: "Protección contra bots" +instanceBlocking: "Instancias bloqueadas" +selectAccount: "Elija una cuenta" +switchAccount: "Cambiar de cuenta" +enabled: "Activado" +disabled: "Desactivado" +quickAction: "Acciones rápidas" +user: "Usuarios" +administration: "Administrar" +accounts: "Cuentas" +switch: "Cambiar" +noMaintainerInformationWarning: "No se ha establecido la información del administrador" +noBotProtectionWarning: "La protección contra los bots no está configurada" +configure: "Configurar" +postToGallery: "Crear una nueva publicación en la galería" +gallery: "Galería" +recentPosts: "Posts recientes" +popularPosts: "Más vistos" +shareWithNote: "Compartir con una nota" +ads: "Anuncios" +expiration: "Termina el" +memo: "Notas" +priority: "Prioridad" +high: "Alta" +middle: "Mediano" +low: "Baja" +emailNotConfiguredWarning: "No se ha configurado una dirección de correo electrónico." +ratio: "Proporción" +previewNoteText: "Mostrar vista preliminar" +customCss: "CSS personalizado" +customCssWarn: "Este ajuste sólo debe utilizarse si se sabe lo que hace. Introducir\ + \ valores inadecuados puede hacer que el cliente deje de funcionar con normalidad." +global: "Global" +squareAvatars: "Mostrar iconos cuadrados" +sent: "Enviar" +received: "Recibido" +searchResult: "Resultados de búsqueda" +hashtags: "Hashtag" +troubleshooting: "Solución de problemas" +useBlurEffect: "Utilizar efecto de desenfoque en la interfaz de usuario" +learnMore: "Ver más" +misskeyUpdated: "¡Calckey ha sido actualizado!" +whatIsNew: "Mostrar cambios" +translate: "Traducir" +translatedFrom: "Traducido de {x}" +accountDeletionInProgress: "La eliminación de la cuenta está en curso" +usernameInfo: "Un nombre que identifique su cuenta de otras en este servidor. Puede\ + \ utilizar el alfabeto (a~z, A~Z), dígitos (0~9) o guiones bajos (_). Los nombres\ + \ de usuario no se pueden cambiar posteriormente." +aiChanMode: "Modo Ai" +keepCw: "Mantener la advertencia de contenido" +pubSub: "Cuentas Pub/Sub" +lastCommunication: "Última comunicación" +resolved: "Resuelto" +unresolved: "Sin resolver" +breakFollow: "Dejar de seguir" +itsOn: "¡Está encendido!" +itsOff: "¡Está apagado!" +emailRequiredForSignup: "Se requere una dirección de correo electrónico para el registro\ + \ de la cuenta" +unread: "No leído" +filter: "Filtro" +controlPanel: "Panel de control" +manageAccounts: "Administrar cuenta" +makeReactionsPublic: "Hacer el historial de reacciones público" +makeReactionsPublicDescription: "Todas las reacciones que hayas hecho serán públicamente\ + \ visibles." +classic: "Clásico" +muteThread: "Ocultar hilo" +unmuteThread: "Mostrar hilo" +ffVisibility: "Visibilidad de seguidores y seguidos" +ffVisibilityDescription: "Puedes configurar quien puede ver a quienes sigues y quienes\ + \ te siguen" +continueThread: "Ver la continuación del hilo" +deleteAccountConfirm: "La cuenta será borrada. ¿Está seguro?" +incorrectPassword: "La contraseña es incorrecta" +voteConfirm: "¿Confirma su voto a {choice}?" +hide: "Ocultar" +leaveGroup: "Dejar el grupo" +leaveGroupConfirm: "¿Desea salir de {name}?" +useDrawerReactionPickerForMobile: "Mostrar panel de reacciones en móviles" +welcomeBackWithName: "Bienvenido otra vez, {name}" +clickToFinishEmailVerification: "Cliquée {ok} y verifique su correo" +overridedDeviceKind: "Tipo de dispositivo" +smartphone: "Teléfono smartphone" +tablet: "Tablet" +auto: "Automático" +themeColor: "Color del tema" +size: "Tamaño" +numberOfColumn: "Cantidad de columnas" +searchByGoogle: "Buscar" +instanceDefaultLightTheme: "Tema claro por defecto de la instancia" +instanceDefaultDarkTheme: "Tema oscuro por defecto de la instancia" +instanceDefaultThemeDescription: "Ingrese el código del tema en formato objeto" +mutePeriod: "Período de silenciamiento" +indefinitely: "Sin límite de tiempo" +tenMinutes: "10 minutos" +oneHour: "1 hora" +oneDay: "1 día" +oneWeek: "1 semana" +reflectMayTakeTime: "Puede pasar un tiempo hasta que se reflejen los cambios" +failedToFetchAccountInformation: "No se pudo obtener información de la cuenta" +rateLimitExceeded: "Se excedió el límite de peticiones" +cropImage: "Recortar imágen" +cropImageAsk: "¿Desea recortar la imagen?" +file: "Archivos" +recentNHours: "Últimas {n} horas" +recentNDays: "Últimos {n} días" +noEmailServerWarning: "No se ha configurado un servidor de correo electrónico." +thereIsUnresolvedAbuseReportWarning: "Hay reportes sin resolver" +recommended: "Recomendado" +check: "Verificar" +driveCapOverrideLabel: "Cambiar la capacidad de la unidad para este usuario" +driveCapOverrideCaption: "Restablecer la capacidad a su predeterminado ingresando\ + \ un valor de 0 o menos" +requireAdminForView: "Necesitas iniciar sesión como administrador para ver esto." +isSystemAccount: "Cuenta creada y operada automáticamente por el sistema" +typeToConfirm: "Ingrese {x} para confirmar" +deleteAccount: "Borrar cuenta" +document: "Documento" +numberOfPageCache: "Cantidad de páginas cacheadas" +numberOfPageCacheDescription: "Al aumentar el número mejora la conveniencia pero tambien\ + \ puede aumentar la carga y la memoria a usarse" +logoutConfirm: "¿Cerrar sesión?" +lastActiveDate: "Utilizado por última vez el" +statusbar: "Barra de estado" +pleaseSelect: "Selecciona una opción" +reverse: "Echar de un capirotazo" +colored: "Color" +refreshInterval: "Intervalo de actualización" +label: "Etiqueta" +type: "Tipo" +speed: "Velocidad" +slow: "Lento" +fast: "Rápido" +sensitiveMediaDetection: "Detección de contenido NSFW" +localOnly: "Solo local" +remoteOnly: "Sólo remoto" +failedToUpload: "La subida falló" +cannotUploadBecauseInappropriate: "Este archivo no se puede subir debido a que algunas\ + \ partes han sido detectadas comoNSFW." +cannotUploadBecauseNoFreeSpace: "La subida falló debido a falta de espacio libre en\ + \ la unidad del usuario." +beta: "Beta" +enableAutoSensitive: "Marcar automáticamente contenido NSFW" +enableAutoSensitiveDescription: "Permite la detección y marcado automático de contenido\ + \ NSFW usando 'Machine Learning' cuando sea posible. Incluso si esta opción está\ + \ desactivada, puede ser activado para toda la instancia." +activeEmailValidationDescription: "Habilita la validación estricta de direcciones\ + \ de correo electrónico, lo cual incluye la revisión de direcciones desechables\ + \ y si se puede comunicar con éstas. Cuando está deshabilitado, sólo el formato\ + \ de la dirección es validado." +navbar: "Barra de navegación" +shuffle: "Aleatorio" +account: "Cuentas" +move: "Mover" +_sensitiveMediaDetection: + description: "Reduce el esfuerzo de la moderación el el servidor a través del reconocimiento\ + \ automático de contenido NSFW usando 'Machine Learning'. Esto puede incrementar\ + \ ligeramente la carga en el servidor." + sensitivity: "Sensibilidad de detección" + sensitivityDescription: "Reducir la sensibilidad puede acarrear a varios falsos\ + \ positivos, mientras que incrementarla puede reducir las detecciones (falsos\ + \ negativos)." + setSensitiveFlagAutomatically: "Marcar como NSFW" + setSensitiveFlagAutomaticallyDescription: "Los resultados de la detección interna\ + \ pueden ser retenidos incluso si la opción está desactivada." + analyzeVideos: "Habilitar el análisis de videos" + analyzeVideosDescription: "Analizar videos en adición a las imágenes. Esto puede\ + \ incrementar ligeramente la carga del servidor." +_emailUnavailable: + used: "Ya fue usado" + format: "El formato de este correo electrónico no es válido" + disposable: "No se pueden utilizar direcciones de correo electrónico desechables" + mx: "Servidor de correo inválido" + smtp: "Servidor de correo no disponible" +_ffVisibility: + public: "Público" + followers: "Visible solo para seguidores" + private: "Privado" +_signup: + almostThere: "Ya falta poco" + emailAddressInfo: "Ingrese el correo electrónico que usa. Este no se hará público." + emailSent: "Se envió un correo de verificación a la dirección {email}. Acceda al\ + \ link enviado en el correo para completar el ingreso." +_accountDelete: + accountDelete: "Eliminar Cuenta" + mayTakeTime: "La eliminación de la cuenta es un proceso que precisa de carga. Puede\ + \ pasar un tiempo hasta que se complete si es mucho el contenido creado y los\ + \ archivos subidos." + sendEmail: "Cuando se termine de borrar la cuenta, se enviará un correo a la dirección\ + \ usada para el registro." + requestAccountDelete: "Pedir la eliminación de la cuenta." + started: "El proceso de eliminación ha comenzado." + inProgress: "La eliminación está en proceso." +_ad: + back: "Deseleccionar" + reduceFrequencyOfThisAd: "Mostrar menos este anuncio." +_forgotPassword: + enterEmail: "Ingrese el correo usado para registrar la cuenta. Se enviará un link\ + \ para resetear la contraseña." + ifNoEmail: "Si no utilizó un correo para crear la cuenta, contáctese con el administrador." + contactAdmin: "Esta instancia no admite el uso de direcciones de correo electrónico,\ + \ póngase en contacto con el administrador de la instancia para restablecer su\ + \ contraseña" +_gallery: + my: "Mi galería" + liked: "Publicaciones que me gustan" + like: "¡Muy bien!" + unlike: "Quitar me gusta" +_email: + _follow: + title: "te ha seguido" + _receiveFollowRequest: + title: "Has recibido una solicitud de seguimiento" +_plugin: + install: "Instalar plugins" + installWarn: "Por favor no instale plugins que no son de confianza" + manage: "Gestionar plugins" +_preferencesBackups: + list: "Respaldos creados" + saveNew: "Guardar nuevo respaldo" + loadFile: "Cargar desde archivo" + apply: "Aplicar a este dispositivo" + save: "Guardar cambios" + inputName: "Por favor, ingresa un nombre para este respaldo" + cannotSave: "Fallo al guardar" + nameAlreadyExists: "Un respaldo llamado \"{name}\" ya existe. Por favor ingresa\ + \ un nombre diferente" + applyConfirm: "¿Realmente quieres aplicar los cambios desde el archivo \"{name}\"\ + \ a este dispositivo? Las configuraciones existentes serán sobreescritas. " + saveConfirm: "¿Guardar respaldo como \"{name}\"?" + deleteConfirm: "¿Borrar el respaldo \"{name}\"?" + renameConfirm: "¿Renombrar este respaldo de \"{old}\" a \"{new}\"?" + noBackups: "No existen respaldos. Deberás respaldar las configuraciones del cliente\ + \ en este servidor usando \"Crear nuevo respaldo\"" + createdAt: "Creado: {date} {time}" + updatedAt: "Actualizado: {date} {time}" + cannotLoad: "La carga falló" + invalidFile: "Formato de archivo inválido" +_registry: + scope: "Alcance" + key: "Clave" + keys: "Clave" + domain: "Dominio" + createKey: "Crear una llave" +_aboutMisskey: + about: "Calckey es una bifurcación de Misskey creada por ThatOneCalculator, que\ + \ ha estado en desarrollo desde el 2022." + contributors: "Principales colaboradores" + allContributors: "Todos los colaboradores" + source: "Código fuente" + translation: "Traducir Calckey" + donate: "Donar a Calckey" + morePatrons: "También apreciamos el apoyo de muchos más que no están enlistados\ + \ aquí. ¡Gracias! \U0001F970" + patrons: "Mecenas de Calckey" +_nsfw: + respect: "Ocultar medios NSFW" + ignore: "No esconder medios NSFW " + force: "Ocultar todos los medios" +_mfm: + cheatSheet: "Hoja de referencia de MFM" + intro: "MFM es un lenguaje de marcado dedicado que se puede usar en varios lugares\ + \ dentro de Misskey, Calckey, Akkoma, y mucho más. Aquí puede ver una lista de\ + \ sintaxis disponibles en MFM." + dummy: "Calckey expande el mundo de la Fediverso" + mention: "Menciones" + mentionDescription: "El signo @ seguido de un nombre de usuario se puede utilizar\ + \ para notificar a un usuario en particular." + hashtag: "Hashtag" + hashtagDescription: "Puede especificar un hashtag con un numeral y el texto." + url: "URL" + urlDescription: "Se pueden mostrar las URL" + link: "Vínculo" + linkDescription: "Se pueden asociar partes de texto a la URL" + bold: "Negrita" + boldDescription: "Muestra el texto con las letras más gruesas" + small: "Pequeño" + smallDescription: "Muestra el texto más pequeño y delgado" + center: "Centrar" + centerDescription: "Muestra el texto centrado" + inlineCode: "Código (insertado)" + inlineCodeDescription: "Muestra el código de un programa resaltando su sintaxis" + blockCode: "Código (bloque)" + blockCodeDescription: "Código de resaltado de sintaxis, como programas de varias\ + \ líneas con bloques." + inlineMath: "Fórmula (insertado)" + inlineMathDescription: "Muestra fórmulas (KaTeX) insertadas" + blockMath: "Fórmula (bloque)" + blockMathDescription: "Muestra fórmulas (KaTeX) de varias líneas en un bloque" + quote: "Citar" + quoteDescription: "Muestra el contenido como una cita" + emoji: "Emojis personalizados" + emojiDescription: "Muestra los emojis personalizados encerrados entre dos puntos." + search: "Buscar" + searchDescription: "Muestra una caja de búsqueda con texto pre-escrito" + flip: "Echar de un capirotazo" + flipDescription: "Voltea el contenido hacia arriba / abajo o hacia la izquierda\ + \ / derecha." + jelly: "Animación (gelatina)" + jellyDescription: "Aplica un efecto de animación tipo gelatina" + tada: "Animación (tadá)" + tadaDescription: "Aplica un efecto de animación al estilo \"Tadá\"" + jump: "Animación (saltar)" + jumpDescription: "Aplica un efecto de animación tipo salto" + bounce: "Animación (rebotar)" + bounceDescription: "Aplica un efecto de animación tipo rebote" + shake: "Animación (temblor)" + shakeDescription: "Aplica un efecto de animación tipo temblor" + twitch: "Animación (sacudida)" + twitchDescription: "Aplica un efecto de animación tipo sacudida" + spin: "Animación (giro)" + spinDescription: "Aplica un efecto de animación tipo rotación" + x2: "Grande" + x2Description: "Muestra el contenido más grande" + x3: "Muy grande" + x3Description: "Muestra el contenido mucho más grande" + x4: "Totalmente grande" + x4Description: "Muestra el contenido totalmente grande" + blur: "Desenfoque" + blurDescription: "Para desenfocar el contenido. Se muestra claramente al colocar\ + \ el puntero encima." + font: "Fuente" + fontDescription: "Elegir la fuente del contenido" + rainbow: "Arcoíris" + rainbowDescription: "Muestra el contenido con los colores del arcoíris" + sparkle: "Parpadeante" + sparkleDescription: "Aplica un efecto de partículas parpadeantes" + rotate: "Rotar" + rotateDescription: "Rota el contenido a un ángulo especificado." + plain: "Plano" + plainDescription: "Desactiva los efectos de todo el contenido MFM con este efecto\ + \ MFM." + position: Posición +_instanceTicker: + none: "No mostrar" + remote: "Mostrar a usuarios remotos" + always: "Mostrar siempre" +_serverDisconnectedBehavior: + reload: "Recargar automáticamente" + dialog: "Mostrar diálogo de advertencia" + quiet: "Advertencia discreta" + nothing: Hacer nada +_channel: + create: "Crear canal" + edit: "Editar canal" + setBanner: "Elegir banner" + removeBanner: "Borrar banner" + featured: "Tendencias" + owned: "Dueño" + following: "Siguiendo" + usersCount: "{n} participantes" + notesCount: "{n} notas" + nameOnly: Nombre solamente + nameAndDescription: Nombre y descripción +_menuDisplay: + sideFull: "Horizontal" + sideIcon: "Horizontal (ícono)" + top: "Arriba" + hide: "Ocultar" +_wordMute: + muteWords: "Palabras que silenciar" + muteWordsDescription: "Separar con espacios indica una declaracion And, separar\ + \ con lineas nuevas indica una declaracion Or。" + muteWordsDescription2: "Encerrar las palabras clave entre numerales para usar expresiones\ + \ regulares" + softDescription: "Ocultar en la linea de tiempo las notas que cumplen las condiciones" + hardDescription: "Evitar que se agreguen a la linea de tiempo las notas que cumplen\ + \ las condiciones. Las notas no agregadas seguirán quitadas aunque cambien las\ + \ condiciones." + soft: "Suave" + hard: "Duro" + mutedNotes: "Notas silenciadas" +_instanceMute: + instanceMuteDescription: "Silencia todas las notas y reposts de la instancias seleccionadas,\ + \ incluyendo respuestas a los usuarios de las mismas" + instanceMuteDescription2: "Separar por líneas" + title: "Oculta las notas de las instancias listadas." + heading: "Instancias a silenciar" +_theme: + explore: "Explorar temas" + install: "Instalar tema" + manage: "Gestor de temas" + code: "Código del tema" + description: "Descripción" + installed: "{name} ha sido instalado" + installedThemes: "Temas instalados" + builtinThemes: "Temas integrados" + alreadyInstalled: "Este tema ya está instalado" + invalid: "El formato del tema no es válido" + make: "Crear tema" + base: "Base" + addConstant: "Agregar constante" + constant: "Constante" + defaultValue: "Valor predeterminado" + color: "Color" + refProp: "Hacer referencia a propiedad" + refConst: "Hacer referencia a constante" + key: "Clave" + func: "funciones" + funcKind: "Tipo de función" + argument: "Argumento" + basedProp: "Nombre de la propiedad referenciada" + alpha: "Opacidad" + darken: "Oscuridad" + lighten: "Brillo" + inputConstantName: "Por favor ingrese el nombre de la constante" + importInfo: "Pegando el código del tema aquí, puede importarlo al editor" + deleteConstantConfirm: "¿Desea borrar la constante {const}?" + keys: + accent: "Acento" + bg: "Fondo" + fg: "Texto" + focus: "Enfoque" + indicator: "Indicador" + panel: "Panel" + shadow: "Sombra" + header: "Cabezal" + navBg: "Fondo de la barra lateral" + navFg: "Texto de la barra lateral" + navHoverFg: "Texto de la barra lateral (hover)" + navActive: "Texto de la barra lateral (activo)" + navIndicator: "Indicador de la barra lateral" + link: "Vínculo" + hashtag: "Hashtag" + mention: "Menciones" + mentionMe: "Menciones (yo)" + renote: "Renotar" + modalBg: "Fondo modal" + divider: "Divisor" + scrollbarHandle: "Cuadro de la barra de desplazamiento" + scrollbarHandleHover: "Cuadro de la barra de desplazamiento (hover)" + dateLabelFg: "Texto de la etiqueta de fecha" + infoBg: "Fondo de información" + infoFg: "Texto de información" + infoWarnBg: "Fondo de advertencias" + infoWarnFg: "Texto de advertencias" + cwBg: "Fondo del botón CW" + cwFg: "Texto del botón CW" + cwHoverBg: "Fondo del botón CW (hover)" + toastBg: "Fondo de notificaciones" + toastFg: "Texto de notificaciones" + buttonBg: "Fondo de botón" + buttonHoverBg: "Fondo de botón (hover)" + inputBorder: "Borde de los campos de entrada" + listItemHoverBg: "Fondo de elemento de listas (hover)" + driveFolderBg: "Fondo de capeta del drive" + wallpaperOverlay: "Transparencia del fondo de pantalla" + badge: "Medalla" + messageBg: "Fondo de chat" + accentDarken: "Acento (oscuro)" + accentLighten: "Acento (claro)" + fgHighlighted: "Texto resaltado" +_sfx: + note: "Notas" + noteMy: "Nota (a mí mismo)" + notification: "Notificaciones" + chat: "Chat" + chatBg: "Chat (Fondo)" + antenna: "Antena receptora" + channel: "Notificaciones del canal" +_ago: + future: "Futuro" + justNow: "Recién ahora" + secondsAgo: "Hace {n} segundos" + minutesAgo: "Hace {n} minutos" + hoursAgo: "Hace {n} horas" + daysAgo: "Hace {n} días" + weeksAgo: "Hace {n} semanas" + monthsAgo: "Hace {n} meses" + yearsAgo: "Hace {n} años" +_time: + second: "Segundos" + minute: "Minutos" + hour: "Horas" + day: "Días" +_tutorial: + title: "Cómo usar Calckey" + step1_1: "¡Bienvenido!" + step1_2: "Vamos a configurarte. Estarás listo y funcionando en poco tiempo" + step2_1: "En primer lugar, rellena tu perfil" + step2_2: "Proporcionar algo de información sobre quién eres hará que sea más fácil\ + \ para los demás saber si quieren ver tus notas o seguirte." + step3_1: "¡Ahora es el momento de seguir a algunas personas!" + step3_2: "Tu página de inicio y tus líneas de tiempo sociales se basan en quién\ + \ sigues, así que intenta seguir un par de cuentas para empezar.\nHaz clic en\ + \ el círculo más en la parte superior derecha de un perfil para seguirlos." + step4_1: "Vamos a salir a la calle" + step4_2: "Para tu primer post, a algunas personas les gusta hacer un post de {introduction}\ + \ o un simple \"¡Hola mundo!\"" + step5_1: "¡Líneas de tiempo, líneas de tiempo por todas partes!" + step5_2: "Su instancia tiene {timelines} diferentes líneas de tiempo habilitadas" + step5_3: "La línea de tiempo Inicio {icon} es donde puedes ver las publicaciones\ + \ de tus seguidores." + step5_4: "La línea de tiempo Local {icon} es donde puedes ver las publicaciones\ + \ de todos los demás en esta instancia." + step5_5: "La línea de tiempo {icon} recomendada es donde puedes ver las publicaciones\ + \ de las instancias que los administradores recomiendan." + step5_6: "La línea de tiempo Social {icon} es donde puedes ver las publicaciones\ + \ de los amigos de tus seguidores." + step5_7: "La línea de tiempo Global {icon} es donde puedes ver las publicaciones\ + \ de todas las demás instancias conectadas." + step6_1: "Entonces, ¿qué es este lugar?" + step6_2: "Bueno, no sólo te has unido a Calckey. Te has unido a un portal del Fediverso,\ + \ una red interconectada de miles de servidores, llamada \"instancias\"" + step6_3: "Cada servidor funciona de forma diferente, y no todos los servidores ejecutan\ + \ Calckey. Sin embargo, ¡éste lo hace! Es un poco complicado, pero le cogerás\ + \ el tranquillo enseguida" + step6_4: "¡Ahora ve, explora y diviértete!" +_2fa: + alreadyRegistered: "Ya has completado la configuración." + registerTOTP: "Registrar dispositivo" + registerSecurityKey: "Registrar clave" + step1: "Primero, instale en su dispositivo la aplicación de autenticación {a} o\ + \ {b} u otra." + step2: "Luego, escanee con la aplicación el código QR mostrado en pantalla." + step2Url: "En una aplicación de escritorio se puede ingresar la siguiente URL:" + step3: "Para terminar, ingrese el token mostrado en la aplicación." + step4: "Ahora cuando inicie sesión, ingrese el mismo token" + securityKeyInfo: "Se puede configurar el inicio de sesión usando una clave de seguridad\ + \ de hardware que soporte FIDO2 o con un certificado de huella digital o con un\ + \ PIN" +_permissions: + "read:account": "Ver información de la cuenta" + "write:account": "Editar información de la cuenta" + "read:blocks": "Ver usuarios bloqueados" + "write:blocks": "Administrar usuarios bloqueados" + "read:drive": "Ver el drive" + "write:drive": "Administrar drive" + "read:favorites": "Ver favoritos" + "write:favorites": "Addministrar favoritos" + "read:following": "Ver información de seguidor" + "write:following": "Seguir o dejar de seguir" + "read:messaging": "Ver chat" + "write:messaging": "Administrar chat" + "read:mutes": "Ver usuarios silenciados" + "write:mutes": "Administrar usuarios silenciados" + "write:notes": "Crear/borrar notas" + "read:notifications": "Ver notificaciones" + "write:notifications": "Administrar notificaciones" + "read:reactions": "Ver reacciones" + "write:reactions": "Administrar reacciones" + "write:votes": "Votar" + "read:pages": "Ver páginas" + "write:pages": "Administrar páginas" + "read:page-likes": "Ver páginas que te gustan" + "write:page-likes": "Administrar páginas que te gustan" + "read:user-groups": "Ver grupos de usuarios" + "write:user-groups": "Administrar grupos de usuarios" + "read:channels": "Ver canal" + "write:channels": "Modificar canal" + "read:gallery": "Ver galería" + "write:gallery": "Editar galería" + "read:gallery-likes": "Ver favoritos de la galería" + "write:gallery-likes": "Editar favoritos de la galería" +_auth: + shareAccess: "¿Desea permitir el acceso a la cuenta \"{name}\"?" + shareAccessAsk: "¿Está seguro de que desea autorizar esta aplicación para acceder\ + \ a su cuenta?" + permissionAsk: "Esta aplicación requiere los siguientes permisos" + pleaseGoBack: "Por favor, vuelve a la aplicación" + callback: "Volviendo a la aplicación" + denied: "Acceso denegado" +_antennaSources: + all: "Todas las notas" + homeTimeline: "Notas de los usuarios que sigues" + users: "Notas de un usuario o varios" + userList: "Notas de los usuarios de una lista" + userGroup: "Notas de los usuarios de una grupo" +_weekday: + sunday: "Domingo" + monday: "Lunes" + tuesday: "Martes" + wednesday: "Miércoles" + thursday: "Jueves" + friday: "Viernes" + saturday: "Sábado" +_widgets: + memo: "Nota adhesiva" + notifications: "Notificaciones" + timeline: "Linea de tiempo" + calendar: "Calendario" + trends: "Tendencias" + clock: "Reloj" + rss: "Lector RSS" + rssTicker: "Ticker-RSS" + activity: "Actividad" + photos: "Fotos" + digitalClock: "Reloj digital" + unixClock: "Reloj UNIX" + federation: "Federación" + instanceCloud: "Nube de palabras de la instancia" + postForm: "Formulario" + slideshow: "Diapositivas" + button: "Botón" + onlineUsers: "Usuarios en linea" + jobQueue: "Cola de trabajos" + serverMetric: "Estadísticas del servidor" + aiscript: "Consola de AiScript" + aichan: "indigo" + userList: Lista Usuarios + _userList: + chooseList: Seleccione una lista +_cw: + hide: "Ocultar" + show: "Ver más" + chars: "{count} caracteres" + files: "{count} archivos" +_poll: + noOnlyOneChoice: "Se necesitan al menos 2 opciones" + choiceN: "Opción {n}" + noMore: "No se pueden agregar más" + canMultipleVote: "Permitir más de una respuesta" + expiration: "Termina el" + infinite: "Sin límite de tiempo" + at: "Elegir fecha y hora" + after: "Elegir lapso de tiempo" + deadlineDate: "Fecha de fin" + deadlineTime: "Horas" + duration: "Duración" + votesCount: "{n} votos" + totalVotes: "Total {n} votos" + vote: "Votar" + showResult: "Ver resultado" + voted: "Votado" + closed: "Cerrada" + remainingDays: "Quedan {d} días y {h} horas para que finalice" + remainingHours: "Quedan {h} horas y {m} minutos para que finalice" + remainingMinutes: "Quedan {m} minutos y {s} segundos para que finalice" + remainingSeconds: "Quedan {s} segundos para que finalice" +_visibility: + public: "Público" + publicDescription: "Visible para todos los usuarios" + home: "Inicio" + homeDescription: "Visible sólo en la linea de tiempo de inicio" + followers: "Seguidores" + followersDescription: "Visible sólo para tus seguidores" + specified: "Mensaje directo" + specifiedDescription: "Visible sólo para los usuarios elegidos" + localOnly: "Solo local" + localOnlyDescription: "Oculto para usuarios remotos" +_postForm: + replyPlaceholder: "Responder a esta nota" + quotePlaceholder: "Citar esta nota" + channelPlaceholder: "Postear en el canal" + _placeholders: + a: "¿Qué haces?" + b: "¿Te pasó algo?" + c: "¿Qué estás pensando?" + d: "¿Algo que quieras decir?" + e: "Escribe aquí" + f: "Esperando a que escribas algo..." +_profile: + name: "Nombre" + username: "Nombre de usuario" + description: "Descripción" + youCanIncludeHashtags: "Puedes añadir hashtags" + metadata: "información adicional" + metadataEdit: "Editar información adicional" + metadataDescription: "Muestra la información adicional en el perfil" + metadataLabel: "Etiqueta" + metadataContent: "Contenido" + changeAvatar: "Cambiar avatar" + changeBanner: "Cambiar banner" + locationDescription: Si ingresas tu ciudad primero, el tiempo local tuyo será visible + para otros usuarios. +_exportOrImport: + allNotes: "Todas las notas" + followingList: "Siguiendo" + muteList: "Silenciados" + blockingList: "Bloqueados" + userLists: "Listas" + excludeMutingUsers: "Excluir usuarios silenciados" + excludeInactiveUsers: "Excluir usuarios inactivos" +_charts: + federation: "Federación" + apRequest: "Pedidos" + usersIncDec: "Variación de usuarios" + usersTotal: "Total de usuarios" + activeUsers: "Cantidad de usuarios activos" + notesIncDec: "Variación de la cantidad de notas" + localNotesIncDec: "Variación de la cantidad de notas locales" + remoteNotesIncDec: "Variación de la cantidad de notas remotas" + notesTotal: "Total de notas" + filesIncDec: "Variación de cantidad de archivos" + filesTotal: "Total de archivos" + storageUsageIncDec: "Variación de uso del almacenamiento" + storageUsageTotal: "Total de uso del almacenamiento" +_instanceCharts: + requests: "Pedidos" + users: "Variación de usuarios" + usersTotal: "Total acumulado de usuarios" + notes: "Variación de la cantidad de notas" + notesTotal: "Total acumulado de la cantidad de notas" + ff: "Variación de cantidad de seguidos/seguidores" + ffTotal: "Total acumulado de cantidad de seguidos/seguidores" + cacheSize: "Variación del tamaño de la caché" + cacheSizeTotal: "Total acumulado del tamaño de la caché" + files: "Variación de cantidad de archivos" + filesTotal: "Total acumulado de cantidad de archivos" +_timelines: + home: "Inicio" + local: "Local" + social: "Social" + global: "Global" + recommended: Recomendado +_pages: + newPage: "Crear página" + editPage: "Editar página" + readPage: "Viendo la fuente" + created: "La página fue creada" + updated: "La página fue actualizada" + deleted: "La página borrada" + pageSetting: "Configurar página" + nameAlreadyExists: "La URL de la página especificada ya existe" + invalidNameTitle: "URL inválida" + invalidNameText: "Verifique que no tenga espacios en blanco" + editThisPage: "Editar esta página" + viewSource: "Ver la fuente" + viewPage: "Ver página" + like: "Me gusta" + unlike: "Quitar me gusta" + my: "Mis páginas" + liked: "Páginas que me gustan" + featured: "Popular" + inspector: "Inspector" + contents: "Contenido" + content: "Bloque de página" + variables: "Variables" + title: "Título" + url: "URL de la página" + summary: "Resumen de la página" + alignCenter: "Centrar" + hideTitleWhenPinned: "Ocultar el título de la página al fijarse" + font: "Fuente" + fontSerif: "Serif" + fontSansSerif: "Sans Serif" + eyeCatchingImageSet: "Elegir imagen llamativa" + eyeCatchingImageRemove: "Borrar imagen llamativa" + chooseBlock: "Agregar bloque" + selectType: "Elegir tipo" + enterVariableName: "Ingrese el nombre de la variable" + variableNameIsAlreadyUsed: "El nombre de la variable ya está en uso" + contentBlocks: "Contenido" + inputBlocks: "Entrada" + specialBlocks: "Especial" + blocks: + text: "Texto" + textarea: "Área de texto" + section: "Sección" + image: "Imagen" + button: "Botón" + if: "si" + _if: + variable: "Variable" + post: "Formulario" + _post: + text: "Contenido" + attachCanvasImage: "Nota con lienzo como imagen" + canvasId: "Lienzo ID" + textInput: "Entrada de texto" + _textInput: + name: "Nombre de variable" + text: "Título" + default: "Valor predeterminado" + textareaInput: "Entrada de texto en múltiples lineas" + _textareaInput: + name: "Nombre de variable" + text: "Título" + default: "Valor predeterminado" + numberInput: "Entrada numérica" + _numberInput: + name: "Nombre de variable" + text: "Título" + default: "Valor predeterminado" + canvas: "Lienzo" + _canvas: + id: "Lienzo ID" + width: "Ancho" + height: "Altura" + note: "Nota embebida" + _note: + id: "Id de la nota" + idDescription: "Pega la URL de la nota para configurarla" + detailed: "Ver Detalles" + switch: "Interruptor" + _switch: + name: "Nombre de variable" + text: "Título" + default: "Valor predeterminado" + counter: "Contador" + _counter: + name: "Nombre de variable" + text: "Título" + inc: "Aumentar cantidad" + _button: + text: "Título" + colored: "Color" + action: "Acción al presionar el botón" + _action: + dialog: "Mostrar cuadro de diálogo" + _dialog: + content: "Contenido" + resetRandom: "Resetear número aleatorio" + pushEvent: "Enviar evento" + _pushEvent: + event: "Nombre del evento" + message: "Mensaje mostrado al apretar" + variable: "Variable a enviar" + no-variable: "Ninguna" + callAiScript: "Invocar AiScript" + _callAiScript: + functionName: "Nombre de la función" + radioButton: "Botón de opción" + _radioButton: + name: "Nombre de variable" + title: "Título" + values: "Opciones separadas por una nueva linea" + default: "Valor predeterminado" + script: + categories: + flow: "Control de flujo" + logical: "Operación lógica" + operation: "Cálculo" + comparison: "Comparar" + random: "Aleatorio" + value: "Valores" + fn: "funciones" + text: "Manejo de texto" + convert: "Conversion" + list: "Listas" + blocks: + text: "Texto" + multiLineText: "Texto (multilinea)" + textList: "Lista de texto" + _textList: + info: "Separe cada texto con una linea nueva" + strLen: "Largo del texto" + _strLen: + arg1: "Texto" + strPick: "Extraer caracteres" + _strPick: + arg1: "Texto" + arg2: "Posición del caracter" + strReplace: "Sustituir texto" + _strReplace: + arg1: "Texto" + arg2: "Texto a reemplazar" + arg3: "Texto reemplazado" + strReverse: "Invertir texto" + _strReverse: + arg1: "Texto" + join: "Concatenar texto" + _join: + arg1: "Listas" + arg2: "Separador" + add: "Suma" + _add: + arg1: "A" + arg2: "B" + subtract: "Resta" + _subtract: + arg1: "A" + arg2: "B" + multiply: "Multiplicación" + _multiply: + arg1: "A" + arg2: "B" + divide: "División" + _divide: + arg1: "A" + arg2: "B" + mod: "Resto" + _mod: + arg1: "A" + arg2: "B" + round: "Redondear decimales" + _round: + arg1: "Número" + eq: "A y B son iguales" + _eq: + arg1: "A" + arg2: "B" + notEq: "A y B son distintos" + _notEq: + arg1: "A" + arg2: "B" + and: "A y B" + _and: + arg1: "A" + arg2: "B" + or: "A o B" + _or: + arg1: "A" + arg2: "B" + lt: "< A es menor que B" + _lt: + arg1: "A" + arg2: "B" + gt: "> A es mayor que B" + _gt: + arg1: "A" + arg2: "B" + ltEq: "<= A es menor o igual que B" + _ltEq: + arg1: "A" + arg2: "B" + gtEq: ">= A es mayor o igual que B" + _gtEq: + arg1: "A" + arg2: "B" + if: "Si" + _if: + arg1: "si" + arg2: "Entonces" + arg3: "Si no" + not: "Negación" + _not: + arg1: "Negación" + random: "Aleatorio" + _random: + arg1: "probabilidad" + rannum: "Número aleatorio" + _rannum: + arg1: "Mínimo" + arg2: "Máximo" + randomPick: "Elegir aleatoriamente de la lista" + _randomPick: + arg1: "Listas" + dailyRandom: "Aleatorio (Diariamente para cada usuario)" + _dailyRandom: + arg1: "probabilidad" + dailyRannum: "Número aleatorio (Diariamente para cada usuario)" + _dailyRannum: + arg1: "Mínimo" + arg2: "Máximo" + dailyRandomPick: "Elegir aleatoriamente de la lista (Diariamente para cada usuario)" + _dailyRandomPick: + arg1: "Listas" + seedRandom: "Aleatorio (semilla)" + _seedRandom: + arg1: "Semilla" + arg2: "probabilidad" + seedRannum: "Número aleatorio (semilla)" + _seedRannum: + arg1: "Semilla" + arg2: "Mínimo" + arg3: "Máximo" + seedRandomPick: "Elegir aleatoriamente de la lista (semilla)" + _seedRandomPick: + arg1: "Semilla" + arg2: "Listas" + DRPWPM: "Elegir aleatoriamente de la lista ponderada (Diariamente para cada\ + \ usuario)" + _DRPWPM: + arg1: "Lista de texto" + pick: "Elegir de la lista" + _pick: + arg1: "Listas" + arg2: "Posición" + listLen: "Obtener largo de la lista" + _listLen: + arg1: "Listas" + number: "Número" + stringToNumber: "De texto a número" + _stringToNumber: + arg1: "Texto" + numberToString: "De número a texto" + _numberToString: + arg1: "Número" + splitStrByLine: "Separar texto en lineas" + _splitStrByLine: + arg1: "Texto" + ref: "Variables" + aiScriptVar: "Variable de AiScript" + fn: "funciones" + _fn: + slots: "Slots" + slots-info: "Separe cada uno de los slots con una linea nueva" + arg1: "Salida" + for: "Repetir" + _for: + arg1: "Cantidad de repeticiones" + arg2: "Acción" + typeError: "El slot {slot} acepta el tipo {expect} pero fue ingresado el tipo\ + \ {actual}" + thereIsEmptySlot: "El slot {slot} está vacío" + types: + string: "Texto" + number: "Número" + boolean: "Booleano" + array: "Listas" + stringArray: "Lista de texto" + emptySlot: "Slot vacío" + enviromentVariables: "Variables de entorno" + pageVariables: "Items de la página" + argVariables: "Slot de entrada" +_relayStatus: + requesting: "Pendiente" + accepted: "Aceptar" + rejected: "Rechazada" +_notification: + fileUploaded: "Archivo subido" + youGotMention: "Mención de {name}" + youGotReply: "Respuesta de {name}" + youGotQuote: "Citado por {name}" + youRenoted: "Renotado por {name}" + youGotPoll: "Encuestado por {name}" + youGotMessagingMessageFromUser: "{name} comenzó un chat contigo" + youGotMessagingMessageFromGroup: "Tienes un chat de {name}" + youWereFollowed: "te ha seguido" + youReceivedFollowRequest: "Has mandado una solicitud de seguimiento" + yourFollowRequestAccepted: "Tu solicitud de seguimiento fue aceptada" + youWereInvitedToGroup: "Invitado al grupo" + pollEnded: "Estan disponibles los resultados de la encuesta" + emptyPushNotificationMessage: "Se han actualizado las notificaciones push" + _types: + all: "Todo" + follow: "Siguiendo" + mention: "Menciones" + reply: "Respuestas" + renote: "Renotar" + quote: "Citar" + reaction: "Reacción" + pollVote: "Votado en la encuesta" + pollEnded: "La encuesta terminó" + receiveFollowRequest: "Recibió una solicitud de seguimiento" + followRequestAccepted: "El seguimiento fue aceptado" + groupInvited: "Invitado al grupo" + app: "Notificaciones desde aplicaciones" + _actions: + followBack: "Te sigue de vuelta" + reply: "Responder" + renote: "Renotar" +_deck: + alwaysShowMainColumn: "Siempre mostrar la columna principal" + columnAlign: "Alinear columnas" + addColumn: "Agregar columna" + configureColumn: "Ajustes de columna" + swapLeft: "Mover a la izquierda" + swapRight: "Mover a la derecha" + swapUp: "Mover arriba" + swapDown: "Mover abajo" + stackLeft: "Apilar a la izquierda" + popRight: "Sacar a la derecha" + profile: "Perfil" + newProfile: "Nuevo perfil" + deleteProfile: "Eliminar perfil" + introduction: "¡Crea la interfaz perfecta para tí organizando las columnas libremente!" + introduction2: "Presiona en la + de la derecha de la pantalla para añadir nuevas\ + \ columnas donde quieras." + widgetsIntroduction: "Por favor selecciona \"Editar Widgets\" en el menú columna\ + \ y agrega un widget." + _columns: + main: "Principal" + widgets: "Widgets" + notifications: "Notificaciones" + tl: "Linea de tiempo" + antenna: "Antenas" + list: "Listas" + mentions: "Menciones" + direct: "Mensaje directo" +manageGroups: Administrar grupos +replayTutorial: Repetir Tutorial +privateMode: Modo privado +addInstance: Añadir una instancia +renoteMute: Silenciar impulsos +renoteUnmute: Dejar de silenciar impulsos +flagSpeakAsCat: Habla como un gato +selectInstance: Selectiona una instancia +flagSpeakAsCatDescription: Tu publicación se "nyanified" cuando esté en modo gato +allowedInstances: Instancias en la lista blanca +breakFollowConfirm: ¿Estás seguro de que quieres eliminar el seguidor? +subscribePushNotification: Habilitar notificaciones +unsubscribePushNotification: Desactivar notificaciones +pushNotificationAlreadySubscribed: Las notificaciones ya están activados +pushNotificationNotSupported: Su navegador o instancia no admite notificaciones +moveAccount: ¡Mover cuenta! +moveFrom: Mueve a esta cuenta de una cuenta antigua +moveFromLabel: 'La cuenta que estás moviendo de:' +moveAccountDescription: '' +license: Licencia +noThankYou: No gracias +userSaysSomethingReason: '{name} dijo {reason}' +hiddenTags: Etiquetas Ocultas +noInstances: No hay instancias +accountMoved: 'Usuario ha movido a una cuenta nueva:' +caption: Auto Subtítulos +showAds: Mostrar Anuncios +enterSendsMessage: Presione "RETORNO" en los mensajes para enviar el mensaje (para + apagarlo es Ctrl + RETORNO) +recommendedInstances: Instancias Recomendadas +instanceSecurity: Seguridad de la instancia +seperateRenoteQuote: Separar impulsados y Citar botones +_messaging: + groups: Grupos + dms: Privado +pushNotification: Notificaciones +apps: Aplicaciones +migration: Migración +silenced: Silenciado +deleted: Eliminado +edited: 'Editado a las {date} {time}' +editNote: Editar nota +silenceThisInstance: Silenciar esta instancia +findOtherInstance: Buscar otro servidor +userSaysSomethingReasonRenote: '{name} impulsó una publicación que contiene {reason]' diff --git a/fe_calckey/frontend/locales/fi.yml b/fe_calckey/frontend/locales/fi.yml new file mode 100644 index 0000000..9646231 --- /dev/null +++ b/fe_calckey/frontend/locales/fi.yml @@ -0,0 +1,970 @@ +_lang_: "Suomi" +username: Käyttäjänimi +fetchingAsApObject: Hae Fedeversestä +gotIt: Selvä! +cancel: Peruuta +enterUsername: Anna käyttäjänimi +renotedBy: Buustannut {user} +noNotes: Ei lähetyksiä +noNotifications: Ei ilmoituksia +instance: Instanssi +settings: Asetukset +basicSettings: Perusasetukset +otherSettings: Muut asetukset +openInWindow: Avaa ikkunaan +profile: Profiili +timeline: Aikajana +noAccountDescription: Käyttäjä ei ole vielä kirjoittanut kuvaustaan vielä. +login: Kirjaudu sisään +loggingIn: Kirjautuu sisään +logout: Kirjaudu ulos +uploading: Tallentaa ylös... +save: Tallenna +favorites: Kirjanmerkit +unfavorite: Poista kirjanmerkeistä +favorited: Lisätty kirjanmerkkeihin. +alreadyFavorited: Lisätty jo kirjanmerkkeihin. +cantFavorite: Ei voitu lisätä kirjanmerkkeihin. +pin: Kiinnitä profiiliin +unpin: Irroita profiilista +delete: Poista +forgotPassword: Unohtunut salasana +search: Etsi +notifications: Ilmoitukset +password: Salasana +ok: OK +noThankYou: Ei kiitos +signup: Rekisteröidy +users: Käyttäjät +addUser: Lisää käyttäjä +addInstance: Lisää instanssi +favorite: Lisää kirjanmerkkeihin +copyContent: Kopioi sisältö +deleteAndEdit: Poista ja muokkaa +copyLink: Kopioi linkki +makeFollowManuallyApprove: Seuraajapyyntö vaatii hyväksymistä +follow: Seuraa +pinned: Kiinnitä profiiliin +followRequestPending: Seuraajapyyntö odottaa +you: Sinä +unrenote: Peruuta buustaus +reaction: Reaktiot +reactionSettingDescription2: Vedä uudelleenjärjestelläksesi, napsauta poistaaksesi, + paina "+" lisätäksesi. +attachCancel: Poista liite +enterFileName: Anna tiedostonimi +mute: Hiljennä +unmute: Poista hiljennys +headlineMisskey: Avoimen lähdekoodin, hajautettu sosiaalisen median alusta, joka on + ikuisesti ilmainen! 🚀 +monthAndDay: '{day}/{month}' +deleteAndEditConfirm: Oletko varma, että haluat poistaa tämän lähetyksen ja muokata + sitä? Menetät kaikki reaktiot, buustaukset ja vastaukset lähetyksestäsi. +addToList: Lisää listaan +sendMessage: Lähetä viesti +reply: Vastaa +loadMore: Lataa enemmän +showMore: Näytä enemmän +receiveFollowRequest: Seuraajapyyntö vastaanotettu +followRequestAccepted: Seuraajapyyntö hyväksytty +mentions: Maininnat +importAndExport: Tuo/Vie Tietosisältö +import: Tuo +export: Vie +files: Tiedostot +download: Lataa +unfollowConfirm: Oletko varma, ettet halua seurata enää käyttäjää {name}? +noLists: Sinulla ei ole listoja +note: Viesti +notes: Viestit +following: Seuraa +createList: Luo lista +manageLists: Hallitse listoja +error: Virhe +somethingHappened: On tapahtunut virhe +retry: Yritä uudelleen +pageLoadError: Virhe ladattaessa sivua. +serverIsDead: Tämä palvelin ei vastaa. Yritä hetken kuluttua uudelleen. +youShouldUpgradeClient: Nähdäksesi tämän sivun, virkistä päivittääksesi asiakasohjelmasi. +privacy: Tietosuoja +defaultNoteVisibility: Oletusnäkyvyys +followRequest: Seuraajapyyntö +followRequests: Seuraajapyynnöt +unfollow: Poista seuraaminen +enterEmoji: Syötä emoji +renote: Buustaa +renoted: Buustattu. +cantRenote: Tätä lähetystä ei voi buustata. +cantReRenote: Buustausta ei voi buustata. +quote: Lainaus +pinnedNote: Lukittu lähetys +clickToShow: Napsauta nähdäksesi +sensitive: Herkkää sisältöä (NSFW) +add: Lisää +enableEmojiReactions: Ota käyttöön emoji-reaktiot +showEmojisInReactionNotifications: Näytä emojit reaktioilmoituksissa +reactionSetting: Reaktiot näytettäväksi reaktiovalitsimessa +rememberNoteVisibility: Muista lähetyksen näkyvyysasetukset +markAsSensitive: Merkitse herkäksi sisällöksi (NSFW) +unmarkAsSensitive: Poista merkintä herkkää sisältöä (NSFW) +renoteMute: Hiljennä buustit +renoteUnmute: Poista buustien hiljennys +block: Estä +unblock: Poista esto +unsuspend: Poista keskeytys +suspend: Keskeytys +blockConfirm: Oletko varma, että haluat estää tämän tilin? +unblockConfirm: Oletko varma, että haluat poistaa tämän tilin eston? +selectAntenna: Valitse antenni +selectWidget: Valitse vimpain +editWidgets: Muokkaa vimpaimia +editWidgetsExit: Valmis +emoji: Emoji +emojis: Emojit +emojiName: Emojin nimi +emojiUrl: Emojin URL-linkki +cacheRemoteFiles: Taltioi etätiedostot välimuistiin +flagAsBot: Merkitse tili botiksi +flagAsBotDescription: Ota tämä vaihtoehto käyttöön, jos tätä tiliä ohjaa ohjelma. + Jos se on käytössä, se toimii lippuna muille kehittäjille, jotta estetään loputtomat + vuorovaikutusketjut muiden bottien kanssa ja säädetään Calckeyn sisäiset järjestelmät + käsittelemään tätä tiliä botina. +flagAsCat: Oletko kissa? 🐱 +flagAsCatDescription: Saat kissan korvat ja puhut kuin kissa! +flagSpeakAsCat: Puhu kuin kissa +flagShowTimelineReplies: Näytä vastaukset aikajanalla +addAccount: Lisää tili +loginFailed: Kirjautuminen epäonnistui +showOnRemote: Katsele etäinstanssilla +general: Yleistä +accountMoved: 'Käyttäjä on muuttanut uuteen tiliin:' +wallpaper: Taustakuva +setWallpaper: Aseta taustakuva +searchWith: 'Etsi: {q}' +youHaveNoLists: Sinulla ei ole listoja +followConfirm: Oletko varma, että haluat seurata käyttäjää {name}? +host: Isäntä +selectUser: Valitse käyttäjä +annotation: Kommentit +registeredAt: Rekisteröity +latestRequestReceivedAt: Viimeisin pyyntö vastaanotettu +latestRequestSentAt: Viimeisin pyyntö lähetetty +storageUsage: Tallennustilan käyttö +charts: Kaaviot +stopActivityDelivery: Lopeta toimintojen lähettäminen +blockThisInstance: Estä tämä instanssi +operations: Toiminnot +metadata: Metatieto +monitor: Seuranta +jobQueue: Työjono +cpuAndMemory: Prosessori ja muisti +network: Verkko +disk: Levy +clearCachedFiles: Tyhjennä välimuisti +clearCachedFilesConfirm: Oletko varma, että haluat tyhjentää kaikki välimuistiin tallennetut + etätiedostot? +blockedInstances: Estetyt instanssit +hiddenTags: Piilotetut asiatunnisteet +mention: Maininta +copyUsername: Kopioi käyttäjänimi +searchUser: Etsi käyttäjää +showLess: Sulje +youGotNewFollower: seurasi sinua +directNotes: Yksityisviestit +driveFileDeleteConfirm: Oletko varma, että haluat poistaa tiedoston " {name}"? Se + poistetaan kaikista viesteistä, jotka sisältävät sen liitetiedostona. +importRequested: Olet pyytänyt viemistä. Tämä voi viedä hetken. +exportRequested: Olet pyytänyt tuomista. Tämä voi viedä hetken. Se lisätään asemaan + kun tuonti valmistuu. +lists: Listat +followers: Seuraajat +followsYou: Seuraa sinua +pageLoadErrorDescription: Tämä yleensä johtuu verkkovirheistä tai selaimen välimuistista. + Kokeile tyhjentämällä välimuisti ja yritä sitten hetken kuluttua uudelleen. +enterListName: Anna listalle nimi +instanceInfo: Instanssin tiedot +clearQueue: Tyhjennä jono +suspendConfirm: Oletko varma, että haluat keskeyttää tämän tilin? +unsuspendConfirm: Oletko varma, että haluat poistaa tämän tilin keskeytyksen? +selectList: Valitse lista +customEmojis: Kustomoitu Emoji +addEmoji: Lisää +settingGuide: Suositellut asetukset +cacheRemoteFilesDescription: Kun tämä asetus ei ole käytössä, etätiedostot on ladattu + suoraan etäinstanssilta. Asetuksen poistaminen käytöstä vähentää tallennustilan + käyttöä, mutta lisää verkkoliikennettä kun pienoiskuvat eivät muodostu. +flagSpeakAsCatDescription: Lähetyksesi nyanifioidaan, kun olet kissatilassa +flagShowTimelineRepliesDescription: Näyttää käyttäjien vastaukset muiden käyttäjien + lähetyksiin aikajanalla, jos se on päällä. +autoAcceptFollowed: Automaattisesti hyväksy seuraamispyynnöt käyttäjiltä, joita seuraat +perHour: Tunnissa +removeWallpaper: Poista taustakuva +recipient: Vastaanottaja(t) +federation: Federaatio +software: Ohjelmisto +proxyAccount: Proxy-tili +proxyAccountDescription: Välitystili (Proxy-tili) on tili, joka toimii käyttäjien + etäseuraajana tietyin edellytyksin. Kun käyttäjä esimerkiksi lisää etäkäyttäjän + luetteloon, etäkäyttäjän toimintaa ei toimiteta instanssiin, jos yksikään paikallinen + käyttäjä ei seuraa kyseistä käyttäjää, joten välitystili seuraa sen sijaan. +latestStatus: Viimeisin tila +selectInstance: Valitse instanssi +instances: Instanssit +perDay: Päivässä +version: Versio +statistics: Tilastot +clearQueueConfirmTitle: Oletko varma, että haluat tyhjentää jonon? +introMisskey: Tervetuloa! Calckey on avoimen lähdekoodin, hajautettu sosiaalisen median + alusta, joka on ikuisesti ilmainen! 🚀 +clearQueueConfirmText: Mitkään välittämättömät lähetykset, jotka ovat jonossa, eivät + federoidu. Yleensä tätä toimintoa ei tarvita. +blockedInstancesDescription: Lista instanssien isäntänimistä, jotka haluat estää. + Listatut instanssit eivät kykene kommunikoimaan enää tämän instanssin kanssa. +security: Turvallisuus +retypedNotMatch: Syöte ei kelpaa. +fromDrive: Asemasta +keepOriginalUploading: Säilytä alkuperäinen kuva +uploadFromUrlDescription: Tiedoston URL, jonka haluat ylösladata +themeForLightMode: Teema vaaleassa tilassa +theme: Teemat +themeForDarkMode: Teema tummassa tilassa +drive: Asema +darkThemes: Tummat teemat +copyUrl: Kopioi URL-linkki +rename: Uudelleennimeä +maintainerName: Ylläpitäjä +maintainerEmail: Ylläpitäjän sähköposti +tosUrl: Palvelun ehdot URL-linkki +thisYear: Vuosi +backgroundImageUrl: Taustakuvan URL-linkki +basicInfo: Perustiedot +pinnedPagesDescription: Kirjoita niiden sivujen polut, jotka haluat liittää tämän + instanssin yläsivulle rivinvaihdoin erotettuna. +hcaptchaSiteKey: Sivuston avain +hcaptchaSecretKey: Salausavain +silencedInstances: Hiljennetyt instanssit +muteAndBlock: Hiljennykset ja estetyt +mutedUsers: Hiljennetyt käyttäjät +blockedUsers: Estetyt käyttäjät +noUsers: Ei yhtään käyttäjää +noInstances: Ei yhtään instanssia +editProfile: Muokkaa profiilia +noteDeleteConfirm: Oletko varma, että haluat poistaa tämän viestin? +pinLimitExceeded: Et voi kiinnittää enempää viestejä +intro: Calckey -asennus valmis! Ole hyvä ja luo admin-käyttäjä. +done: Valmis +processing: Suorittaa +preview: Esikatselu +default: Oletus +defaultValueIs: 'Oletus: {value}' +noCustomEmojis: Ei emojia +noJobs: Ei töitä +federating: Federoi +blocked: Estetty +silenced: Hiljennetty +suspended: Keskeytetty +all: Kaikki +publishing: Julkaisee +subscribing: Tilaa +notResponding: Ei vastaa +instanceFollowing: Seuraa instanssia +instanceFollowers: Instanssin seuraajat +instanceUsers: Instanssin käyttäjät +changePassword: Muuta salasana +newPasswordRetype: Uudelleensyötä uusi salasana +more: Lisää! +featured: Esillä +usernameOrUserId: Käyttäjänimi tai käyttäjä id +noSuchUser: Käyttäjää ei löydy +lookup: Hae +announcements: Tiedoitteet +imageUrl: Kuva URL-linkki +removed: Onnistuneesti poistettu +removeAreYouSure: Oletko varma, että haluat poistaa " {x}"? +resetAreYouSure: Haluatko nollata? +saved: Tallennettu +messaging: Juttele +upload: Lataa ylös +fromUrl: URL:stä +uploadFromUrl: Ylöslataa URL:stä +uploadFromUrlRequested: Ylöslataus pyydetty +uploadFromUrlMayTakeTime: Voi viedä hetki, kun ylöslataus on valmis. +explore: Tutustu +messageRead: Lue +noMoreHistory: Ei lisää historiaa +startMessaging: Aloita uusi juttelu +manageGroups: Hallitse ryhmiä +nUsersRead: lukenut {n} +agreeTo: Hyväksyn {0} +tos: Palvelun ehdot +start: Aloita +home: Koti +remoteUserCaution: Etäkäyttäjän tiedot saattavat olla puutteellisia. +light: Vaalea +dark: Tumma +lightThemes: Vaaleat teemat +syncDeviceDarkMode: Synkronoi tumma tila laitteen asetuksen mukaan +fileName: Tiedostonimi +selectFile: Valitse tiedosto +selectFiles: Valitse tiedostot +selectFolder: Valitse kansio +selectFolders: Valitse kansiot +renameFile: Uudelleennimeä tiedosto +folderName: Kansionimi +createFolder: Luo kansio +renameFolder: Uudelleennimeä kansio +deleteFolder: Poista kansio +addFile: Lisää tiedosto +emptyDrive: Asemasi on tyhjä +emptyFolder: Tämä kansio on tyhjä +unableToDelete: Ei voitu poistaa +inputNewFileName: Syötä uusi tiedostonimi +inputNewDescription: Syötä uusi kuvateksti +inputNewFolderName: Syötä uusi kansionimi +hasChildFilesOrFolders: Koska kansio ei ole tyhjä, sitä ei voi poistaa. +avatar: Kuvake +banner: Banneri +nsfw: Herkkää sisältöä (NSFW) +whenServerDisconnected: Kun yhteys palvelimeen menetetään +disconnectedFromServer: Yhteys palvelimeen katkennut +reload: Päivitä +doNothing: Hylkää +reloadConfirm: Haluaisitko päivittää aikajanan? +unwatch: Lopeta katselu +watch: Katsele +accept: Hyväksy +reject: Hylkää +normal: Normaali +instanceName: Instanssin nimi +thisMonth: Kuukausi +today: Tänään +monthX: '{month}' +connectService: Yhdistä +disconnectService: Katkaise yhteys +enableLocalTimeline: Ota käyttöön paikallinen aikajana +enableGlobalTimeline: Ota käyttöön globaali aikajana +enableRecommendedTimeline: Ota käyttöön suositellut -aikajana +registration: Rekisteröinti +enableRegistration: Ota käyttöön uuden käyttäjän rekisteröinti +driveCapacityPerLocalAccount: Aseman kapasiteetti paikallista käyttäjää kohti +driveCapacityPerRemoteAccount: Aseman kapasiteetti etäkäyttäjää kohti +inMb: megatavuissa +bannerUrl: Bannerikuvan URL-linkki +pinnedUsers: Kiinnitetyt käyttäjät +pinnedPages: Kiinnitetyt sivut +pinnedClipId: Kiinnitettävän leikkeen ID +enableHcaptcha: Ota käyttöön hCaptcha-tunnistus +recaptcha: CAPTCHA uudelleen +enableRecaptcha: Ota käyttöön CAPTCHA uudelleen +recaptchaSiteKey: Sivuston avain +recaptchaSecretKey: Salausavain +silenceThisInstance: Hiljennä tämä instanssi +silencedInstancesDescription: Lista isäntänimistä, joka haluat hiljentää. Tilejä listassa + kohdellaan "hiljennettynä", ne voivat tehdä seuraajapyyntöjä ja eivät voi tehdä + mainintoja paikallistileistä jossei seurattu. Tämä ei vaikuta estettyihin instansseihin. +hiddenTagsDescription: 'Listaa aihetunnisteet (ilman #-merkkiä) aihetunnisteet, jotka + haluat piilottaa trendaavista ja Tutustu-osiosta. Piilotetut aihetunnisteet ovat + kuitenkin löydettävissä muilla keinoilla. Estetyt instanssit eivät vaikuta, vaikka + listattu tähän.' +currentPassword: Nykyinen salasana +newPassword: Uusi salasana +attachFile: Liitetyt tiedostot +keepOriginalUploadingDescription: Tallentaa alkuperäisen kuvan sellaisenaan. Jos kytketty + päältä, webissä näytettävä versio luodaan ylöslatauksen yhteydessä. +remove: Poista +circularReferenceFolder: Kohdekansio on kansion alikansio, jonka haluat siirtää. +deleteAreYouSure: Oletko varma, että haluat poistaa kokonaan" {x}"? +yearsOld: '{age} vuotias' +activity: Aktiivisuus +images: Kuvat +birthday: Syntymäpäivä +registeredDate: Liittynyt +location: Sijainti +disablingTimelinesInfo: Järjestelmänvalvojilla ja moderaattoreilla on aina pääsy kaikille + aikajanoille, vaikka olisikin poistettu käytöstä. +dayX: '{day}' +yearX: '{year}' +pages: Sivut +integration: Integraatiot +instanceDescription: Instanssin kuvaus +invite: Kutsu +iconUrl: Ikoni URL-linkki +pinnedUsersDescription: Listaa käyttäjänimet eroteltuna rivivaihdoin kiinnittääksesi + ne "Tutustu" välilehteen. +pinnedNotes: Kiinnitetyt viestit +hcaptcha: hCaptcha-tunnistus +antennaSource: Antennin lähde +invitationCode: Kutsukoodi +checking: Tarkistetaan... +passwordNotMatched: Ei vastaa +doing: Käsittelee... +category: Kategoria +tags: Tagit +disableAnimatedMfm: Poista MFM -animaatiot käytöstä +openImageInNewTab: Avaa kuvat uuteen välilehteen +dashboard: Kojelauta +local: Paikallinen +remote: Etä +total: Yhteensä +weekOverWeekChanges: Muutokset viime viikkoon +objectStorageRegion: Alue +popout: Ulosvedettävä +volume: Äänenvoimakkuus +masterVolume: Master äänenvoimakkuus +details: Yksityiskohdat +chooseEmoji: Valitse emoji +descendingOrder: Laskevasti +scratchpad: Raaputusalusta +output: Ulostulo +invisibleNote: Näkymätön viesti +enableInfiniteScroll: Lataa enemmän automaattisesti +visibility: Näkyvyys +useCw: Piilota sisältö +poll: Kysely +enablePlayer: Avaa videotoistimeen +enterFileDescription: Syötä tiedostokuvaus +author: Kirjoittaja +manage: Hallinta +description: Kuvaus +describeFile: Lisää tiedostokuvaus +height: Korkeus +large: Suuri +medium: Keskikokoinen +small: Pieni +other: Muu +create: Luo +regenerateLoginTokenDescription: Luo uudelleen kirjautumisen aikana sisäisesti käytettävän + tunnuksen. Normaalisti tämä toiminto ei ole tarpeen. Jos tunniste luodaan uudelleen, + kaikki laitteet kirjautuvat ulos. +setMultipleBySeparatingWithSpace: Erottele useat merkinnät välilyönneillä. +fileIdOrUrl: Tiedosto ID tai URL-linkki +behavior: Käytös +instanceTicker: Viestejä koskevat instanssitiedot +waitingFor: Odottaa {x} +random: Satunnainen +system: Järjestelmä +switchUi: Ulkoasu +createNew: Luo uusi +followersCount: Seuraajien määrä +renotedCount: Saatujen buustausten määrä +followingCount: Seurattujen tilien määrä +notSet: Ei asetettu +nUsers: '{n} Käyttäjää' +nNotes: '{n} Viestiä' +sendErrorReports: Lähetä virheraportteja +backgroundColor: Taustaväri +accentColor: Korostusväri +textColor: Tekstin väri +advanced: Edistynyt +saveAs: Tallenna nimellä... +invalidValue: Epäkelpo arvo. +registry: Rekisteri +closeAccount: Sulje tili +currentVersion: Nykyinen versio +capacity: Kapasiteetti +clear: Palaa +_theme: + explore: Tutustu teemoihin +silenceConfirm: Oletko varma, että haluat hiljentää tämän käyttäjän? +notesAndReplies: Viestit ja vastaukset +withFiles: Tiedostot sisältyvät +silence: Hiljennä +popularTags: Suositut tagit +userList: Listat +about: Tietoja +aboutMisskey: Tietoja Calckeystä +exploreFediverse: Tutustu fediverseen +recentlyUpdatedUsers: Vastikään lisätyt käyttäjät +recentlyRegisteredUsers: Uudet liittyneet jäyttäjät +recentlyDiscoveredUsers: Vastikään löydetyt käyttäjät +exploreUsersCount: Täällä on {count} käyttäjää +share: Jaa +moderation: Sisällön valvonta +nUsersMentioned: Mainittu {n} käyttäjältä +securityKey: Turva-avain +securityKeyName: Avainnimi +registerSecurityKey: Rekisteröi turva-avain +lastUsed: Viimeksi käytetty +unregister: Poista rekisteröinti +passwordLessLogin: Salasanaton sisäänkirjautuminen +cacheClear: Tyhjennä välimuisti +markAsReadAllNotifications: Merkitse kaikki ilmoitukset luetuksi +markAsReadAllUnreadNotes: Merkitse kaikki viestit luetuiksi +uploadFolder: Oletuskansio ylöslatauksille +createGroup: Luo ryhmä +group: Ryhmä +groups: Ryhmät +ownedGroups: Omistetut ryhmät +help: Apua +inputMessageHere: Syötä viesti tähän +close: Sulje +joinedGroups: Liittyneet ryhmät +invites: Kutsut +groupName: Ryhmänimi +members: Jäsenet +language: Kieli +signinHistory: Kirjautumishistoria +docSource: Tämän dokumentin lähde +createAccount: Luo tili +existingAccount: Olemassa oleva tili +promotion: Edistetty +promote: Edistää +numberOfDays: Päivien määrä +accountSettings: Tilin asetukset +objectStorage: Objektitallennus +useObjectStorage: Käytä objektitallennusta +objectStorageBaseUrl: Perus URL-linkki +objectStorageBaseUrlDesc: "Viitteenä käytetty URL-linkki. Määritä CDN:n tai välityspalvelimen\ + \ URL-linkki, jos käytät kumpaakin.\nKäytä S3:lle 'https://.s3.amazonaws.com'\ + \ ja GCS:lle tai vastaaville palveluille 'https://storage.googleapis.com/'\ + \ jne." +objectStorageBucket: Kauha +newNoteRecived: Uusia viestejä +smtpPort: Portti +instanceMute: Instanssin mykistys +repliesCount: Lähetettyjen vastausten määrä +updatedAt: Päivitetty +notFound: Ei löydy +useOsNativeEmojis: Käytä käyttöjärjestelmän natiivi-Emojia +joinOrCreateGroup: Tule kutsutuksi ryhmään tai luo oma ryhmä. +text: Teksti +usernameInvalidFormat: Käytä isoja ja pieniä kirjaimia, numeroita ja erikoismerkkejä. +unsilenceConfirm: Oletko varma, että haluat poistaa käyttäjän hiljennyksen? +popularUsers: Suositut käyttäjät +moderator: Moderaattori +twoStepAuthentication: Kaksivaiheinen tunnistus +notFoundDescription: URL-linkkiin liittyvää sivua ei löytynyt. +antennaKeywords: Kuunneltavat avainsanat +antennaExcludeKeywords: Poislasketut avainsanat +antennaKeywordsDescription: Erottele välilyönneillä AND-ehtoa varten tai rivinvaihdolla + OR-ehtoa varten. +notifyAntenna: Ilmoita uusista viesteistä +withFileAntenna: Vain viestit tiedoston kanssa +enableServiceworker: Ota käyttöön Push-notifikaatiot selaimessasi +antennaUsersDescription: Luettele yksi käyttäjänimi rivi kohti +antennaInstancesDescription: Luettele yksi instanssi riviä kohti +caseSensitive: Isot ja pienet kirjaimet +withReplies: Sisällytä vastaukset +connectedTo: Seuraavat tili(t) on yhdistetty +unsilence: Poista hiljennys +administrator: Järjestelmänvalvoja +token: Merkki +resetPassword: Resetoi salasana +reduceUiAnimation: Vähennä käyttöliittymän animaatioita +transfer: Siirrä +messagingWithUser: Yksityisjuttelu +title: Otsikko +enable: Ota käyttöön +next: Seuraava +retype: Syötä uudelleen +noteOf: Lähettänyt {user} +inviteToGroup: Kutsu ryhmään +quoteAttached: Lainaus +quoteQuestion: Liitä lainauksena? +noMessagesYet: Ei vielä viestejä +newMessageExists: Uusia viestejä +onlyOneFileCanBeAttached: Voit liittää vain yhden tiedoston viestiin +signinRequired: Ole hyvä ja rekisteröidy tai kirjaudu sisään jatkaaksesi +invitations: Kutsut +available: Saatavilla +unavailable: Ei saatavissa +tooShort: Liian lyhyt +tooLong: Liian pitkä +weakPassword: Heikko salasana +normalPassword: Kohtalainen salasana +strongPassword: Vahva salasana +passwordMatched: Vastaa +signinWith: Kirjaudu sisään {x} +signinFailed: Ei voitu kirjautua sisään. Annettu käyttäjänimi tai salasana virheellinen. +tapSecurityKey: Napsauta turva-avaintasi +or: Tai +uiLanguage: Anna käyttöliittymän kieli +groupInvited: Sinut on kutsuttu ryhmään +aboutX: Tietoja {x} +disableDrawer: Älä käytä laatikkotyyppisiä valikoita +youHaveNoGroups: Sinulla ei ole ryhmiä +noHistory: Ei historiaa saatavilla +regenerate: Uudelleenluo +fontSize: Kirjasinkoko +dayOverDayChanges: Muutokset eiliseen +clientSettings: Asiakkaan asetukset +hideThisNote: Piilota tämä viesti +showFeaturedNotesInTimeline: Näytä esillä olevat viestit aikajanalla +objectStorageBucketDesc: Määritä palveluntarjoajasi käyttämä kauhan nimi. +objectStoragePrefix: Etuliite +objectStorageEndpoint: Päätepiste +objectStorageRegionDesc: Määritä alue, kuten "xx-east-1". Jos palvelusi ei tee eroa + alueiden välillä, jätä tämä kohta tyhjäksi tai kirjoita "us-east-1". +objectStorageUseSSL: Käytä SSL-salausta +objectStorageUseSSLDesc: Poista tämä käytöstä, jos et aio käyttää HTTPS:ää API-yhteyksissä +objectStorageUseProxy: Yhdistä välityspalvelimen kautta +objectStorageUseProxyDesc: Poista tämä käytöstä, jos et aio käyttää välityspalvelinta + API-yhteyksiä varten +objectStorageSetPublicRead: Aseta "public-read" ylöslataukseen +serverLogs: Palvelimen lokit +deleteAll: Poista kaikki +showFixedPostForm: Näytä viesti-ikkuna aikajanan yläpuolella +sounds: Äänet +listen: Kuuntele +none: Ei mitään +showInPage: Näytä sivulla +recentUsed: Vastikään käytetty +install: Asenna +uninstall: Poista asennus +installedApps: Hyväksytyt sovellukset +nothing: Ei nähtävää täällä +state: Tila +sort: Järjestä +ascendingOrder: Nousevasti +scratchpadDescription: Raaputusalusta tarjoaa ympäristön AiScript-kokeiluja varten. + Voit kirjoittaa, suorittaa ja tarkistaa sen tulokset vuorovaikutuksessa siinä olevan + Calckeyn kanssa. +script: Skripti +disablePagesScript: Poista AiScript käytöstä sivuilla +updateRemoteUser: Päivitä etäkäyttäjän tiedot +deleteAllFiles: Poista kaikki tiedostot +deleteAllFilesConfirm: Oletko varma, että haluat poistaa kaikki tiedostot? +removeAllFollowing: Poista seuraaminen kaikista seuratuista käyttäjistä +removeAllFollowingDescription: Tämän suorittaminen poistaa kaikki {host}:n tilit. + Suorita tämä, jos instanssia ei esimerkiksi enää ole olemassa. +userSuspended: Tämä käyttäjä on hyllytetty. +userSilenced: Tämä käyttäjä on hiljennetty. +yourAccountSuspendedTitle: Tämä tili on hyllytetty +yourAccountSuspendedDescription: Tämä tili on hyllytetty palvelimen palveluehtojen + tai vastaavien rikkomisen vuoksi. Ota yhteyttä ylläpitäjään, jos haluat tietää tarkemman + syyn. Älä luo uutta tiliä. +menu: Valikko +divider: Jakaja +addItem: Lisää kohde +relays: Releet +addRelay: Lisää rele +inboxUrl: Saavuneen postin URL +addedRelays: Lisätyt releet +serviceworkerInfo: Pitää ottaa käyttöön Push-notifikaatioissa. +deletedNote: Poistetut viestit +disablePlayer: Sulje videotoistin +expandTweet: Laajenna twiittiä +themeEditor: Teemaeditori +leaveConfirm: Tallentamattomia muutoksia olemassa. Hylätäänkö ne? +plugins: Liitännäiset +preferencesBackups: Asetusten varmuuskopiot +deck: Kansi +undeck: Jätä kansi +useBlurEffectForModal: Käytä blur-efektiä modaaleissa +useFullReactionPicker: Käytä täysikokoista reaktiovalitsinta +width: Leveys +generateAccessToken: Luo käyttöoikeustunniste +enableAll: Ota käyttöön kaikki +disableAll: Poista käytöstä kaikki +tokenRequested: Myönnä oikeus tiliin +notificationType: Ilmoituksen tyyppi +edit: Muokkaa +emailServer: Sähköpostipalvelin +enableEmail: Ota sähköpostin jakelu käyttöön +emailConfigInfo: Käytetään vahvistamaan sähköpostiosoitteesi rekisteröitymisen yhteydessä + tai jos unohdat salasanasi +email: Sähköposti +smtpHost: Isäntä +smtpUser: Käyttäjänimi +smtpPass: Salasana +emptyToDisableSmtpAuth: Jätä käyttäjänimi ja salasana tyhjäksi ohittaaksesi SMTP verifioinnin +smtpSecureInfo: Kytke tämä päältä kun käytät STARTTLS +testEmail: Kokeile email-lähetystä +wordMute: Sanan hiljennys +regexpError: Säännöllinen lausekevirhe +userSaysSomething: '{name} sanoi jotakin' +userSaysSomethingReason: '{name} sanoi {reason}' +makeActive: Aktivoi +display: Näyttö +copy: Kopioi +metrics: Mittarit +overview: Yleiskatsaus +logs: Lokit +delayed: Viivästynyt +database: Tietokanta +channel: Kanavat +notificationSetting: Ilmoitusasetukset +notificationSettingDesc: Valitse näytettävät ilmoitustyypit. +useGlobalSetting: Käytä globaaleja asetuksia +regenerateLoginToken: Luo kirjautumistunniste uudelleen +sample: Näyte +abuseReports: Raportit +reportAbuse: Raportti +reportAbuseOf: Raportti {name} +fillAbuseReportDescription: Täytä tätä raporttia koskevat tiedot. Jos se koskee tiettyä + viestiä, ilmoita sen URL-linkki. +abuseReported: Raporttisi on lähetetty. Kiitoksia paljon. +reporter: Raportoija +reporteeOrigin: Ilmoittajan alkuperä +reporterOrigin: Raportoijan alkuperä +forwardReport: Välitä raportti etäinstanssille +forwardReportIsAnonymous: Tilisi sijasta anonyymi järjestelmätili näytetään toimittajana + etäinstanssissa. +send: Lähetä +abuseMarkAsResolved: Merkitse raportti ratkaistuksi +openInNewTab: Avaa uuteen välilehteen +openInSideView: Avaa sivunäkymään +defaultNavigationBehaviour: Navigoinnin oletuskäyttäytyminen +editTheseSettingsMayBreakAccount: Näiden asetusten muuttaminen voi vahingoittaa tiliäsi. +desktop: Työpöytä +clip: Leike +optional: Vaihtoehtoinen +createNewClip: Luo uusi leike +unclip: Poista leike +confirmToUnclipAlreadyClippedNote: Tämä viesti on jo osa "{name}"-leikettä. Haluatko + sen sijaan poistaa sen tästä leikkeestä? +manageAccessTokens: Hallitse käyttöoikeuskoodeja +accountInfo: Tilin tiedot +notesCount: Viestien määrä +renotesCount: Lähetettyjen buustausten määrä +repliedCount: Saatujen vastausten määrä +sentReactionsCount: Lähetettyjen reaktioiden määrä +receivedReactionsCount: Saatujen reaktioiden määrä +pollVotesCount: Lähetettyjen kyselyäänien määrä +pollVotedCount: Saatujen kyselyäänien määrä +yes: Kyllä +no: Ei +driveFilesCount: Tiedostojen määrä asemalla +driveUsage: Aseman tilankäyttö +noCrawle: Hylkää hakukoneindeksointi +noCrawleDescription: Pyydä hakukoneita olemaan indeksoimatta profiilisivuasi, viestejäsi, + sivujasi jne. +alwaysMarkSensitive: Merkitse oletusarvoisesti herkäksi sisällöksi (NSFW) +loadRawImages: Alkuperäisten kuvien lataaminen pikkukuvien näyttämisen sijaan +disableShowingAnimatedImages: Älä näytä animoituja kuvia +verificationEmailSent: Vahvistussähköposti on lähetetty. Seuraa mukana olevaa linkkiä + suorittaaksesi vahvistuksen loppuun. +emailVerified: Sähköposti on vahvistettu +noteFavoritesCount: Kirjanmerkittyjen viestien määrä +pageLikedCount: Saatujen Sivu-tykkäysten määrä +pageLikesCount: Sivut-tykkäysten määrä +contact: Yhteystieto +useSystemFont: Käytä järjestelmän oletuskirjasinta +clips: Leikkeet +experimentalFeatures: Kokeiluluontoiset ominaisuudet +developer: Kehittäjä +makeExplorable: Tee tili näkyväksi osiossa "Tutustu" +makeExplorableDescription: Jos otat tämän pois käytöstä, tilisi ei näy "Tutustu"-osiossa. +showGapBetweenNotesInTimeline: Näytä väli viestien välissä aikajanalla +duplicate: Monista +left: Vasen +center: Keskellä +wide: Leveä +narrow: Kapea +reloadToApplySetting: Asetus otetaan käyttöön vain uudelleenladattaessa. Ladataanko + uudelleen nyt? +showTitlebar: Näytä otsikkorivi +clearCache: Tyhjennä välimuisti +onlineUsersCount: '{n} käyttäjää online-tilassa' +myTheme: Minun teemani +value: Arvo +saveConfirm: Tallenna muutokset? +deleteConfirm: Poistetaanko tosiaan? +latestVersion: Uusin versio +newVersionOfClientAvailable: Asiakasohjelmiston uudempi versio saatavilla. +usageAmount: Käyttö +inUse: Käytetty +editCode: Muokkaa koodia +apply: Käytä +receiveAnnouncementFromInstance: Vastaanota ilmoituksia tästä instanssista +emailNotification: Sähköposti-ilmoitukset +publish: Julkaise +inChannelSearch: Etsi kanavalta +useReactionPickerForContextMenu: Avaa reaktiovalitsin napsauttamalla oikeaa +typingUsers: '{users} kirjoittaa' +jumpToSpecifiedDate: Hyppää tiettyyn päivään +markAllAsRead: Merkitse kaikki luetuksi +goBack: Takaisin +unlikeConfirm: Poistatko todella tykkäyksesi? +fullView: Täysi koko +quitFullView: Poistu täydestä koosta +addDescription: Lisää kuvaus +markAsReadAllTalkMessages: Merkitse kaikki yksityisviestit luetuiksi +appearance: Ulkonäkö +messagingWithGroup: Ryhmäjuttelu +newPasswordIs: Uusi salasana on "{password}" +noFollowRequests: Sinulla ei ole odottavia seuraajapyyntöjä +objectStoragePrefixDesc: Tiedostot tallennetaan hakemistoihin tällä etuliitteellä. +objectStorageEndpointDesc: Jätä tämä tyhjäksi, jos käytät AWS S3:a. Muuten määritä + päätepisteeksi '' tai ':' käyttämästäsi palvelusta riippuen. +unableToProcess: Toimenpidettä ei voida suorittaa loppuun +installedDate: Hyväksynyt +lastUsedDate: Viimeksi käytetty +pluginTokenRequestedDescription: Tämä litännäinen voi käyttää tässä asetettuja käyttöoikeuksia. +permission: Oikeudet +smtpConfig: Lähtevän sähköpostin palvelimen (SMTP) asetukset +regexpErrorDescription: 'Säännöllisessä lausekkeessa tapahtui virhe rivillä {line} + sanan {tab} sanan mykistäminen rivillä {line}:' +emailAddress: Sähköpostiosoite +smtpSecure: Käytä implisiittistä SSL/TLS:ää SMTP-yhteyksissä +useGlobalSettingDesc: Jos se on päällä, käytetään tilisi ilmoitusasetuksia. Jos se + on pois päältä, voit tehdä yksilöllisiä asetuksia. +public: Julkinen +i18nInfo: Vapaaehtoiset kääntävät Calckeyta eri kielille. Voit auttaa osoitteessa + {link}. +lockedAccountInfo: Ellet aseta postauksen näkyvyydeksi "Vain seuraajille", postauksesi + näkyvät kaikille, vaikka vaatisitkin seuraajilta manuaalista hyväksyntää. +sendErrorReportsDescription: "Kun tämä on päällä, yksityiskohtaiset virhetiedot jaetaan\ + \ Calckeyn kanssa ongelman ilmetessä, mikä auttaa parantamaan Calckeyn laatua.\n\ + Näihin tietoihin sisältyy esimerkiksi käyttöjärjestelmäversio, käyttämäsi selain,\ + \ toimintasi Calckeyssä jne." +createdAt: Luotu +youAreRunningUpToDateClient: Käytössäsi on asiakasohjelman uusin versio. +needReloadToApply: Uudelleenlataus vaaditaan, jotta tämä näkyy. +showingPastTimeline: Näytetään parhaillaan vanhaa aikajanaa +userPagePinTip: Voit näyttää viestit täällä valitsemalla yksittäisten viestien valikosta + "Kiinnitä profiiliin". +notSpecifiedMentionWarning: Tämä viesti sisältää mainintoja käyttäjistä, joita ei + ole mainittu vastaanottajina +name: Nimi +allowedInstances: Sallitut (whitelisted) instanssit +hashtags: Aihetunnisteet +troubleshooting: Vianetsintä +received: Vastaanotettu +searchResult: Hakutulokset +filter: Suodatin +antennas: Antennit +noMaintainerInformationWarning: Ylläpitäjän tietoja ei ole konfiguroitu. +controlPanel: Hallintapaneeli +manageAccounts: Hallitse tilejä +makeReactionsPublic: Aseta reaktiohistoria julkiseksi +unread: Lukematon +deleted: Poistettu +editNote: Muokkaa viestiä +edited: 'Muokattu klo {date} {time}' +avoidMultiCaptchaConfirm: Useiden Captcha-järjestelmien käyttö voi aiheuttaa häiriöitä + niiden välillä. Haluatko poistaa käytöstä muut tällä hetkellä käytössä olevat Captcha-järjestelmät? + Jos haluat, että ne pysyvät käytössä, paina peruutusnäppäintä. +manageAntennas: Hallitse antenneja +info: Tietoja +userInfo: Käyttäjätiedot +unknown: Tuntematon +onlineStatus: Online-tila +hideOnlineStatus: Piilota Online-tila +hideOnlineStatusDescription: Online-tilasi piilottaminen vähentää joidenkin toimintojen, + kuten haun, käyttömukavuutta. +online: Online +active: Aktiivinen +offline: Offline +botProtection: Botti-suojaus +instanceBlocking: Federaatio Esto/Hiljennys +enabled: Otettu käyttöön +quickAction: Pikatoiminnot +user: Käyttäjä +accounts: Tilit +switch: Vaihda +noBotProtectionWarning: Botti-suojausta ei ole konfiguroitu. +configure: Konfiguroi +postToGallery: Luo uusi galleriaviesti +gallery: Galleria +recentPosts: Viimeaikaiset sivut +popularPosts: Suositut sivut +ads: Mainokset +expiration: Aikaraja +memo: Muistio +priority: Prioriteetti +high: Korkea +middle: Keskitaso +low: Alhainen +emailNotConfiguredWarning: Sähköpostiosoitetta ei ole asetettu. +ratio: Suhde +secureMode: Suojattu moodi (Valtuutettu nouto) +instanceSecurity: Instanssiturvallisuus +allowedInstancesDescription: Federaatiota varten sallitulle listalle (whitelisted) + otettavien instanssien isännät, kukin erotettuna uudella rivillä (sovelletaan vain + yksityisessä tilassa). +previewNoteText: Näytä esikatselu +customCss: Kustomoitu CSS +customCssWarn: Tätä asetusta tulisi käyttää vain, jos tiedät, mitä se tekee. Vääränlaisten + arvojen syöttäminen voi aiheuttaa sen, että asiakasohjelma lakkaa toimimasta normaalisti. +recommended: Suositeltu +squareAvatars: Näytä neliön malliset kuvakkeet +seperateRenoteQuote: Erilliset buustaa ja lainaa -napit +sent: Lähetetty +useBlurEffect: Käytä blur-efektejä käyttöliittymässä +misskeyUpdated: Calckey on päivitetty! +whatIsNew: Näytä muutokset +translate: Käännä +translatedFrom: Käännetty kielestä {x} +accountDeletionInProgress: Tilin poistaminen on parhaillaan menossa +usernameInfo: Nimi, joka erottaa tilisi muista tällä palvelimella olevista tileistä. Voit + käyttää aakkosia (a~z, A~Z), numeroita (0~9) tai alaviivoja (_). Käyttäjätunnuksia + ei voi muuttaa myöhemmin. +aiChanMode: Ai-chan klassisessa käyttöliittymässä +keepCw: Pidä sisältövaroitukset +pubSub: Pub/Sub tilit +lastCommunication: Viimeisin kommunikaatio +unresolved: Ratkaisematon +breakFollow: Poista seuraaja +breakFollowConfirm: Oletko varma, että haluat poistaa seuraajan? +itsOn: Otettu käyttöön +itsOff: Poistettu käytöstä +emailRequiredForSignup: Vaadi sähköpostiosoitetta sisäänkirjautumiseen +makeReactionsPublicDescription: Tämä laittaa viimeisimmät reaktiosi julkisesti näkyväksi. +classic: Klassinen +muteThread: Mykistä lanka +unmuteThread: Poista langan mykistys +ffVisibility: Seurataan/Seurattavien näkyvyys +notRecommended: Ei suositeltu +disabled: Poistettu käytöstä +selectAccount: Valitse tili +switchAccount: Vaihda tili +administration: Hallinta +shareWithNote: Jaa viestin kanssa +secureModeInfo: Kun pyydät muista instansseista, älä lähetä takaisin ilman todisteita. +privateMode: Yksityinen moodi +privateModeInfo: Kun tämä on käytössä, vain sallittujen (whitelisted) luetteloon merkityt + instanssit voivat liittyä instansseihisi. Kaikki viestit piilotetaan yleisöltä. +global: Globaali +resolved: Ratkaistu +learnMore: Opi lisää +continueThread: Jatka lankaa +file: Tiedosto +cropImageAsk: Haluatko rajata tätä kuvaa? +recentNHours: Viimeiset {n} tuntia +rateLimitExceeded: Nopeusraja ylittynyt +cropImage: Rajaa kuvaa +socialTimeline: Sosiaalinen aikajana +themeColor: Instanssi Ticker Väri +check: Tarkista +ffVisibilityDescription: Antaa sinun konfiguroida, kuka voi nähdä ketä seuraat ja + kuka seuraa sinua. +homeTimeline: Koti aikajana +size: Koko +showLocalPosts: 'Näytä paikalliset viestit:' +oneDay: Päivä +instanceDefaultDarkTheme: Instanssikattava tumma oletusteema +recentNDays: Viimeiset {n} päivää +reflectMayTakeTime: Voi kestää jonkin aikaa, ennen kuin tämä näkyy. +failedToFetchAccountInformation: Ei voitu hakea tietoja +requireAdminForView: Sinun tulee kirjautua järjestelmänvalvojana nähdäksesi tämän. +driveCapOverrideCaption: Resetoi oletusarvoon syöttämällä arvo 0 tai alempi. +isSystemAccount: Järjestelmän luoma ja automaattisesti käyttämä tili. +userSaysSomethingReasonReply: '{name} vastasi viestiin sisältäen {reason}' +userSaysSomethingReasonRenote: '{name} buustasi viestiin sisältäen {reason}' +voteConfirm: Vahvista äänesi vaihtoehdolle "{choice}"? +hide: Piilota +leaveGroup: Poistu ryhmästä +leaveGroupConfirm: Oletko varma, että haluat poistua ryhmästä "{name}"? +welcomeBackWithName: Tervetuloa takaisin, {name} +clickToFinishEmailVerification: Klikkaa [{ok}] viimeistelläksesi sähköpostivahvistuksen. +overridedDeviceKind: Laitetyyppi +tablet: Tabletti +numberOfColumn: Sarakkeiden määrä +searchByGoogle: Etsi +mutePeriod: Vaiennuksen kesto +indefinitely: Pysyvästi +tenMinutes: 10 minuuttia +oneHour: Tunti +thereIsUnresolvedAbuseReportWarning: On ratkaisemattomia raportteja. +driveCapOverrideLabel: Muuta aseman kapasiteetti tälle käyttäjälle +userSaysSomethingReasonQuote: '{name} lainasi viestiä sisältäen {reason}' +deleteAccountConfirm: Tämä peruuttamattomasti poistaa tilisi. Jatketaanko? +incorrectPassword: Väärä salasana. +useDrawerReactionPickerForMobile: Näytä reaktiovalitsin mobiilissa laatikkomallisena +smartphone: Älypuhelin +auto: Automaattinen +oneWeek: Viikko +instanceDefaultLightTheme: Instanssin kattava vaalea oletusteema +instanceDefaultThemeDescription: Anna teemakoodi objektiformaatille. +noEmailServerWarning: Sähköpostipalvelinta ei konfiguroituna. diff --git a/fe_calckey/frontend/locales/fr-FR.yml b/fe_calckey/frontend/locales/fr-FR.yml new file mode 100644 index 0000000..5a61870 --- /dev/null +++ b/fe_calckey/frontend/locales/fr-FR.yml @@ -0,0 +1,2040 @@ +_lang_: "Français" +headlineMisskey: "Réseau relié par des notes" +introMisskey: "Bienvenue ! Calckey est un service de microblogage décentralisé, libre\ + \ et ouvert.\nÉcrivez des « notes » et partagez ce qui se passe à l’instant présent,\ + \ autour de vous avec les autres \U0001F4E1\nLa fonction « réactions », vous permet\ + \ également d’ajouter une réaction rapide aux notes des autres utilisateur·rice·s\ + \ \U0001F44D\nExplorons un nouveau monde \U0001F680" +monthAndDay: "{day}/{month}" +search: "Rechercher" +notifications: "Notifications" +username: "Nom d’utilisateur·rice" +password: "Mot de passe" +forgotPassword: "Mot de passe oublié" +fetchingAsApObject: "Récupération depuis le fédiverse" +ok: "OK" +gotIt: "J’ai compris !" +cancel: "Annuler" +enterUsername: "Entrer un nom d’utilisateur·rice" +renotedBy: "Renoté par {user}" +noNotes: "Aucune note" +noNotifications: "Aucune notification" +instance: "Instance" +settings: "Paramètres" +basicSettings: "Paramètres généraux" +otherSettings: "Paramètres avancés" +openInWindow: "Ouvrir dans une nouvelle fenêtre" +profile: "Profil" +timeline: "Fil" +noAccountDescription: "L’utilisateur·rice n’a pas encore renseigné de biographie de\ + \ présentation sur son profil." +login: "Se connecter" +loggingIn: "Connexion en cours" +logout: "Se déconnecter" +signup: "S’inscrire" +uploading: "Envoi en cours" +save: "Enregistrer" +users: "Utilisateur·rice·s" +addUser: "Ajouter un·e utilisateur·rice" +favorite: "Ajouter aux favoris" +favorites: "Favoris" +unfavorite: "Retirer des favoris" +favorited: "Ajouté à mes favoris" +alreadyFavorited: "Déjà ajouté aux favoris." +cantFavorite: "Impossible d'ajouter aux favoris." +pin: "Épingler sur le profil" +unpin: "Désépingler" +copyContent: "Copier le contenu" +copyLink: "Copier le lien" +delete: "Supprimer" +deleteAndEdit: "Supprimer et réécrire" +deleteAndEditConfirm: "Êtes-vous sûr·e de vouloir supprimer cette note et la reformuler\ + \ ? Vous perdrez toutes les réactions, renotes et réponses y afférentes." +addToList: "Ajouter à une liste" +sendMessage: "Envoyer un message" +copyUsername: "Copier le nom d’utilisateur·rice" +searchUser: "Chercher un·e utilisateur·rice" +reply: "Répondre" +loadMore: "Afficher plus …" +showMore: "Afficher plus …" +showLess: "Fermer" +youGotNewFollower: "Vous suit" +receiveFollowRequest: "Demande d’abonnement reçue" +followRequestAccepted: "La demande d’abonnement a été acceptée" +mention: "Mentionner" +mentions: "Mentions" +directNotes: "Notes directes" +importAndExport: "Import et export" +import: "Importer" +export: "Exporter" +files: "Fichiers" +download: "Télécharger" +driveFileDeleteConfirm: "Êtes-vous sûr·e de vouloir supprimer le fichier \"{name}\"\ + \ ? Il sera retiré de toutes ses notes liées." +unfollowConfirm: "Désirez-vous vous désabonner de {name} ?" +exportRequested: "Vous avez demandé une exportation. L’opération pourrait prendre\ + \ un peu de temps. Une terminée, le fichier résultant sera ajouté au Drive." +importRequested: "Vous avez initié un import. Cela pourrait prendre un peu de temps." +lists: "Listes" +noLists: "Vous n’avez aucune liste" +note: "Post" +notes: "Posts" +following: "Abonnements" +followers: "Abonné·e·s" +followsYou: "Vous suit" +createList: "Créer une liste" +manageLists: "Gérer les listes" +error: "Erreur" +somethingHappened: "Une erreur est survenue" +retry: "Réessayer" +pageLoadError: "Le chargement de la page a échoué." +pageLoadErrorDescription: "Cela est généralement causé par le cache du navigateur\ + \ ou par un problème réseau. Veuillez vider votre cache ou attendre un peu et réessayer." +serverIsDead: "Le serveur ne répond pas. Patientez quelques instants puis essayez\ + \ à nouveau." +youShouldUpgradeClient: "Si la page ne s'affiche pas correctement, rechargez-la pour\ + \ mettre votre client à jour." +enterListName: "Nom de la liste" +privacy: "Confidentialité" +makeFollowManuallyApprove: "Accepter manuellement les demandes d’abonnement" +defaultNoteVisibility: "Visibilité des notes par défaut" +follow: "S’abonner" +followRequest: "Demande d’abonnement" +followRequests: "Demandes d’abonnement" +unfollow: "Se désabonner" +followRequestPending: "Demande d'abonnement en attente de confirmation" +enterEmoji: "Insérer un émoji" +renote: "Renoter" +unrenote: "Annuler la Renote" +renoted: "Renoté." +cantRenote: "Ce message ne peut pas être renoté." +cantReRenote: "Impossible de renoter une Renote." +quote: "Citer" +pinnedNote: "Note épinglée" +pinned: "Épingler sur le profil" +you: "Vous" +clickToShow: "Cliquer pour afficher" +sensitive: "Contenu sensible" +add: "Ajouter" +reaction: "Réactions" +reactionSetting: "Réactions à afficher dans le sélecteur de réactions" +reactionSettingDescription2: "Déplacer pour réorganiser, cliquer pour effacer, utiliser\ + \ « + » pour ajouter." +rememberNoteVisibility: "Activer l'option \" se souvenir de la visibilité des notes\ + \ \" vous permet de réutiliser automatiquement la visibilité utilisée lors de la\ + \ publication de votre note précédente." +attachCancel: "Supprimer le fichier attaché" +markAsSensitive: "Marquer comme sensible" +unmarkAsSensitive: "Supprimer le marquage comme sensible" +enterFileName: "Entrer le nom du fichier" +mute: "Masquer" +unmute: "Ne plus masquer" +block: "Bloquer" +unblock: "Débloquer" +suspend: "Suspendre" +unsuspend: "Annuler la suspension" +blockConfirm: "Êtes-vous sûr·e de vouloir bloquer ce compte ?" +unblockConfirm: "Êtes-vous sûr·e de vouloir débloquer ce compte ?" +suspendConfirm: "Êtes-vous sûr·e de vouloir suspendre ce compte ?" +unsuspendConfirm: "Êtes-vous sûr·e de vouloir annuler la suspension de ce compte ?" +selectList: "Sélectionner une liste" +selectAntenna: "Sélectionner une antenne" +selectWidget: "Sélectionner un widget" +editWidgets: "Modifier les widgets" +editWidgetsExit: "Valider les modifications" +customEmojis: "Émojis personnalisés" +emoji: "Émoji" +emojis: "Émoji" +emojiName: "Nom de l’émoji" +emojiUrl: "URL de l’émoji" +addEmoji: "Ajouter un émoji" +settingGuide: "Configuration proposée" +cacheRemoteFiles: "Mise en cache des fichiers distants" +cacheRemoteFilesDescription: "Lorsque cette option est désactivée, les fichiers distants\ + \ sont chargés directement depuis l’instance distante. La désactiver diminuera certes\ + \ l’utilisation de l’espace de stockage local mais augmentera le trafic réseau puisque\ + \ les miniatures ne seront plus générées." +flagAsBot: "Ce compte est un robot" +flagAsBotDescription: "Si ce compte est géré de manière automatisée, choisissez cette\ + \ option. Si elle est activée, elle agira comme un marqueur pour les autres développeurs\ + \ afin d'éviter des chaînes d'interaction sans fin avec d'autres robots et d'ajuster\ + \ les systèmes internes de Calckey pour traiter ce compte comme un robot." +flagAsCat: "Ce compte est un chat" +flagAsCatDescription: "Activer l'option \" Je suis un chat \" pour ce compte." +flagShowTimelineReplies: "Afficher les réponses dans le fil" +autoAcceptFollowed: "Accepter automatiquement les demandes d’abonnement venant d’utilisateur·rice·s\ + \ que vous suivez" +addAccount: "Ajouter un compte" +loginFailed: "Échec de la connexion" +showOnRemote: "Voir sur l’instance distante" +general: "Général" +wallpaper: "Fond d’écran" +setWallpaper: "Définir le fond d’écran" +removeWallpaper: "Supprimer le fond d’écran" +searchWith: "Recherche : {q}" +youHaveNoLists: "Vous n’avez aucune liste" +followConfirm: "Êtes-vous sûr·e de vouloir suivre {name} ?" +proxyAccount: "Compte proxy" +proxyAccountDescription: "Un compte proxy se comporte, dans certaines conditions,\ + \ comme un·e abonné·e distant·e pour les utilisateurs d'autres instances. Par exemple,\ + \ quand un·e utilisateur·rice ajoute un·e utilisateur·rice distant·e à une liste,\ + \ ses notes ne seront pas visibles sur l'instance si personne ne suit cet·te utilisateur·rice.\ + \ Le compte proxy va donc suivre cet·te utilisateur·rice pour que ses notes soient\ + \ acheminées." +host: "Serveur distant" +selectUser: "Sélectionner un·e utilisateur·rice" +recipient: "Destinataire" +annotation: "Commentaires" +federation: "Fédération" +instances: "Instance" +registeredAt: "Premier contact le" +latestRequestSentAt: "Dernière requête envoyée" +latestRequestReceivedAt: "Dernière requête reçue" +latestStatus: "Dernier statut" +storageUsage: "Stockage utilisé" +charts: "Graphiques" +perHour: "par heure" +perDay: "par jour" +stopActivityDelivery: "Arrêter l’envoi de l’activité" +blockThisInstance: "Bloquer cette instance" +operations: "Opérations" +software: "Logiciel" +version: "Version" +metadata: "Métadonnées" +monitor: "Contrôle" +jobQueue: "File d’attente" +cpuAndMemory: "Processeur et mémoire" +network: "Réseau" +disk: "Disque" +instanceInfo: "Informations sur l’instance" +statistics: "Statistiques" +clearQueue: "Vider la file d’attente" +clearQueueConfirmTitle: "Êtes-vous sûr·e de vouloir vider la file d’attente ?" +clearQueueConfirmText: "Les notes non distribuées ne seront pas délivrées. Normalement,\ + \ vous n'avez pas besoin d'effectuer cette opération." +clearCachedFiles: "Vider le cache" +clearCachedFilesConfirm: "Êtes-vous sûr·e de vouloir vider tout le cache de fichiers\ + \ distants ?" +blockedInstances: "Instances bloquées" +blockedInstancesDescription: "Listez les instances que vous désirez bloquer, une par\ + \ ligne. Ces instances ne seront plus en capacité d'interagir avec votre instance." +muteAndBlock: "Masqué·e·s / Bloqué·e·s" +mutedUsers: "Utilisateur·rice·s en sourdine" +blockedUsers: "Utilisateur·rice·s bloqué·e·s" +noUsers: "Il n’y a pas d’utilisateur·rice·s" +editProfile: "Modifier votre profil" +noteDeleteConfirm: "Êtes-vous sûr·e de vouloir supprimer cette note ?" +pinLimitExceeded: "Vous ne pouvez plus épingler d’autres notes." +intro: "L’installation de Calckey est terminée ! Veuillez créer un compte administrateur." +done: "Terminé" +processing: "Traitement en cours" +preview: "Aperçu" +default: "Par défaut" +noCustomEmojis: "Il n'y a pas d’émoji" +noJobs: "Il n’y a aucune tâche planifiée" +federating: "En cours de fédération" +blocked: "Bloqué·e" +suspended: "Suspendu·e" +all: "Tous" +subscribing: "Abonné" +publishing: "Publié" +notResponding: "Ne répond pas" +instanceFollowing: "Abonnements de l'instance" +instanceFollowers: "Abonné·e·s de l’instance" +instanceUsers: "Utilisateur·rice·s de cette l’instance" +changePassword: "Modifier votre mot de passe" +security: "Sécurité" +retypedNotMatch: "Les saisies ne correspondent pas." +currentPassword: "Mot de passe actuel" +newPassword: "Nouveau mot de passe" +newPasswordRetype: "Répéter le nouveau mot de passe" +attachFile: "Joindre un fichier" +more: "Plus !" +featured: "Tendances" +usernameOrUserId: "Nom d’utilisateur·rice ou ID utilisateur" +noSuchUser: "Utilisateur·rice non trouvé·e" +lookup: "Recherche" +announcements: "Annonces" +imageUrl: "URL de l’image" +remove: "Supprimer" +removed: "Supprimé" +removeAreYouSure: "Êtes-vous sûr·e de vouloir supprimer「{x}」?" +deleteAreYouSure: "Êtes-vous sûr·e de vouloir supprimer「{x}」?" +resetAreYouSure: "Voulez-vous réinitialiser ?" +saved: "Enregistré" +messaging: "Discuter" +upload: "Téléverser" +keepOriginalUploading: "Garder l’image d’origine" +fromDrive: "Depuis le Drive" +fromUrl: "Depuis une URL" +uploadFromUrl: "Téléverser via une URL" +uploadFromUrlDescription: "URL du fichier que vous souhaitez téléverser" +uploadFromUrlRequested: "Téléversement demandé" +uploadFromUrlMayTakeTime: "Le téléversement de votre fichier peut prendre un certain\ + \ temps." +explore: "Découvrir" +messageRead: "Lu" +noMoreHistory: "Il n’y a plus d’historique" +startMessaging: "Commencer à discuter" +nUsersRead: "Lu par {n} personnes" +agreeTo: "J’accepte {0}" +tos: "les conditions d’utilisation" +start: "Commencer" +home: "Principal" +remoteUserCaution: "Les informations de ce compte risqueraient d’être incomplètes\ + \ du fait que l’utilisateur·rice provient d’une instance distante." +activity: "Activité" +images: "Images" +birthday: "Date de naissance" +yearsOld: "{age} ans" +registeredDate: "Inscrit le" +location: "Localisation" +theme: "Thème" +themeForLightMode: "Thème à utiliser en Mode Clair" +themeForDarkMode: "Thème à utiliser en Mode Sombre" +light: "Clair" +dark: "Sombre" +lightThemes: "Thèmes clairs" +darkThemes: "Thèmes sombres" +syncDeviceDarkMode: "Utiliser le mode sombre de votre appareil" +drive: "Drive" +fileName: "Nom du fichier" +selectFile: "Choisir le fichier" +selectFiles: "Choisir les fichiers" +selectFolder: "Sélectionnez un dossier" +selectFolders: "Sélectionnez des dossiers" +renameFile: "Renommer le fichier" +folderName: "Nom du dossier" +createFolder: "Créer un dossier" +renameFolder: "Renommer le dossier" +deleteFolder: "Supprimer le dossier" +addFile: "Ajouter un fichier" +emptyDrive: "Le Drive est vide" +emptyFolder: "Le dossier est vide" +unableToDelete: "Suppression impossible" +inputNewFileName: "Entrez un nouveau nom de fichier" +inputNewDescription: "Veuillez entrer une nouvelle description" +inputNewFolderName: "Entrez un nouveau nom de dossier" +circularReferenceFolder: "Le dossier de destination est un sous-dossier du dossier\ + \ que vous souhaitez déplacer." +hasChildFilesOrFolders: "Impossible de supprimer ce dossier car il n'est pas vide." +copyUrl: "Copier l’URL" +rename: "Renommer" +avatar: "Avatar" +banner: "Bannière" +nsfw: "Contenu sensible" +whenServerDisconnected: "Lorsque la connexion au serveur est perdue" +disconnectedFromServer: "Déconnecté·e du serveur" +reload: "Rafraîchir" +doNothing: "Ignorer" +reloadConfirm: "Voulez-vous recharger?" +watch: "Surveiller" +unwatch: "Ne plus surveiller" +accept: "Autoriser" +reject: "Refuser" +normal: "Normal" +instanceName: "Nom de l’instance" +instanceDescription: "Description de l’instance" +maintainerName: "L’administrateur·rice" +maintainerEmail: "Email de l’administrateur·rice" +tosUrl: "URL des conditions d’utilisation" +thisYear: "Cette année" +thisMonth: "Ce mois-ci" +today: "Aujourd’hui" +dayX: "{day}" +monthX: "{month}" +yearX: "{year}" +pages: "Pages" +integration: "Intégrations" +connectService: "Connexion" +disconnectService: "Déconnexion" +enableLocalTimeline: "Activer le fil local" +enableGlobalTimeline: "Activer le fil global" +disablingTimelinesInfo: "Même si vous désactivez ces fils, les administrateur·rice·s\ + \ et les modérateur·rice·s pourront toujours y accéder." +registration: "S’inscrire" +enableRegistration: "Autoriser les nouvelles inscriptions" +invite: "Inviter" +driveCapacityPerLocalAccount: "Volume du Drive par utilisateur local" +driveCapacityPerRemoteAccount: "Volume du Drive par utilisateur distant" +inMb: "en mégaoctets" +iconUrl: "URL de l'icône" +bannerUrl: "URL de l’image de la bannière" +backgroundImageUrl: "URL de l'image d'arrière-plan" +basicInfo: "Informations basiques" +pinnedUsers: "Utilisateur·rice épinglé·e" +pinnedUsersDescription: "Listez les utilisateur·rice·s que vous souhaitez voir épinglé·e·s\ + \ sur la page \"Découvrir\", un·e par ligne." +pinnedPages: "Pages épinglées" +pinnedPagesDescription: "Inscrivez le chemin des pages que vous souhaitez épingler\ + \ en haut de la page de l'instance. Séparez les pages d'un retour à la ligne." +pinnedClipId: "Identifiant du clip épinglé" +pinnedNotes: "Note épinglée" +hcaptcha: "hCaptcha" +enableHcaptcha: "Activer hCaptcha" +hcaptchaSiteKey: "Clé du site" +hcaptchaSecretKey: "Clé secrète" +recaptcha: "reCAPTCHA" +enableRecaptcha: "Activer reCAPTCHA" +recaptchaSiteKey: "Clé du site" +recaptchaSecretKey: "Clé secrète" +avoidMultiCaptchaConfirm: "L’utilisation de plusieurs Captchas peut provoquer des\ + \ interférences. Souhaitez-vous désactiver l’autre Captcha ? Vous pouvez laisser\ + \ plusieurs Captcha activés en appuyant sur Annuler." +antennas: "Antennes" +manageAntennas: "Gestion des antennes" +name: "Nom" +antennaSource: "Source de l’antenne" +antennaKeywords: "Mots clés à recevoir" +antennaExcludeKeywords: "Mots clés à exclure" +antennaKeywordsDescription: "Séparer avec des espaces pour la condition AND. Séparer\ + \ avec un saut de ligne pour une condition OR." +notifyAntenna: "Je souhaite recevoir les notifications des nouvelles notes" +withFileAntenna: "Notes ayant des attachements uniquement" +enableServiceworker: "Activer ServiceWorker" +antennaUsersDescription: "Saisissez un seul nom d’utilisateur·rice par ligne" +caseSensitive: "Sensible à la casse" +withReplies: "Inclure les réponses" +connectedTo: "Vous êtes connectés aux services suivants" +notesAndReplies: "Notes et Réponses" +withFiles: "Avec fichiers joints" +silence: "Mettre en sourdine" +silenceConfirm: "Êtes-vous sûr·e de vouloir mettre l’utilisateur·rice en sourdine\ + \ ?" +unsilence: "Annuler la sourdine" +unsilenceConfirm: "Êtes-vous sûr·e de vouloir annuler la mise en sourdine de cet·te\ + \ utilisateur·rice ?" +popularUsers: "Utilisateur·rice·s populaires" +recentlyUpdatedUsers: "Utilisateur·rice·s actif·ve·s récemment" +recentlyRegisteredUsers: "Utilisateur·rice·s récemment inscrit·e·s" +recentlyDiscoveredUsers: "Utilisateur·rice·s récemment découvert·e·s" +exploreUsersCount: "Il y a {count} utilisateur·rice·s" +exploreFediverse: "Explorer le Fediverse" +popularTags: "Mots-clés populaires" +userList: "Listes" +about: "Informations" +aboutMisskey: "À propos de Calckey" +administrator: "Administrateur" +token: "Jeton" +twoStepAuthentication: "Authentification à deux facteurs" +moderator: "Modérateur·rice·s" +nUsersMentioned: "{n} utilisateur·rice·s mentionné·e·s" +securityKey: "Clé de sécurité" +securityKeyName: "Nom de la clé" +registerSecurityKey: "Enregistrer une clé de sécurité" +lastUsed: "Dernier utilisé" +unregister: "Se désinscrire" +passwordLessLogin: "Se connecter sans mot de passe" +resetPassword: "Réinitialiser le mot de passe" +newPasswordIs: "Votre nouveau mot de passe est \"{password}\"" +reduceUiAnimation: "Réduire les animations dans l’interface" +share: "Partager" +notFound: "Non trouvé" +notFoundDescription: "Aucune page ne correspond à l’URL spécifiée." +uploadFolder: "Emplacement de téléversement par défaut" +cacheClear: "Vider le cache" +markAsReadAllNotifications: "Marquer toutes les notifications comme lues" +markAsReadAllUnreadNotes: "Marquer toutes les notes comme lues" +markAsReadAllTalkMessages: "Marquer toutes les discussions comme lues" +help: "Aide" +inputMessageHere: "Écrivez votre message ici" +close: "Fermer" +group: "Groupe" +groups: "Groupes" +createGroup: "Créer un groupe" +ownedGroups: "Mes groupes" +joinedGroups: "Groupes rejoints" +invites: "Invitations" +groupName: "Nom du groupe" +members: "Membres" +transfer: "Transférer" +messagingWithUser: "Discuter avec un·e autre utilisateur·rice" +messagingWithGroup: "Discuter avec un groupe" +title: "Titre" +text: "Texte" +enable: "Activer" +next: "Suivant" +retype: "Confirmation" +noteOf: "Notes de {user}" +inviteToGroup: "Inviter dans un groupe" +quoteAttached: "Avec citation" +quoteQuestion: "Souhaitez-vous ajouter une citation ?" +noMessagesYet: "Pas encore de discussion" +newMessageExists: "Vous avez un nouveau message" +onlyOneFileCanBeAttached: "Vous ne pouvez joindre qu’un seul fichier au message" +signinRequired: "Veuillez vous connecter" +invitations: "Invitations" +invitationCode: "Code d’invitation" +checking: "Vérification en cours..." +available: "Disponible" +unavailable: "Non disponible" +usernameInvalidFormat: "Le nom d'utilisateur peut contenir uniquement des lettres\ + \ (minuscules et/ou majuscules), des chiffres et des _" +tooShort: "Trop court" +tooLong: "Trop long" +weakPassword: "Mot de passe faible" +normalPassword: "Mot de passe acceptable" +strongPassword: "Mot de passe fort" +passwordMatched: "Les mots de passe correspondent" +passwordNotMatched: "Les mots de passe ne correspondent pas" +signinWith: "Se connecter avec {x}" +signinFailed: "Échec d’authentification. Veuillez vérifier que votre nom d’utilisateur\ + \ et mot de passe sont corrects." +tapSecurityKey: "Appuyez sur votre clé de sécurité" +or: "OU" +language: "Langue" +uiLanguage: "Langue d’affichage de l’interface" +groupInvited: "Invité au groupe" +aboutX: "À propos de {x}" +useOsNativeEmojis: "Utiliser les émojis natifs du système" +youHaveNoGroups: "Vous n’avez aucun groupe" +joinOrCreateGroup: "Vous pouvez être invité·e à rejoindre des groupes existants ou\ + \ créer votre propre nouveau groupe." +noHistory: "Pas d'historique" +signinHistory: "Historique de connexion" +disableAnimatedMfm: "Désactiver MFM ayant des animations" +doing: "En cours..." +category: "Catégorie" +tags: "Étiquettes" +docSource: "Source de ce document" +createAccount: "Créer un compte" +existingAccount: "Compte existant" +regenerate: "Générer à nouveau" +fontSize: "Taille de la police" +noFollowRequests: "Vous n’avez aucune demande d’abonnement en attente" +openImageInNewTab: "Ouvrir les images dans un nouvel onglet" +dashboard: "Tableau de bord" +local: "Local" +remote: "Distant" +total: "Total" +weekOverWeekChanges: "Hebdomadaire" +dayOverDayChanges: "Journalier" +appearance: "Apparence" +clientSettings: "Paramètres du client" +accountSettings: "Paramètres du compte" +promotion: "Promu" +promote: "Promouvoir" +numberOfDays: "Nombre de jours" +hideThisNote: "Masquer cette note" +showFeaturedNotesInTimeline: "Afficher les notes des Tendances dans le fil d'actualité" +objectStorage: "Stockage d'objets" +useObjectStorage: "Utiliser le stockage d'objets" +objectStorageBaseUrl: "Base URL" +objectStorageBaseUrlDesc: "Préfixe d’URL utilisé pour construire l’URL vers le référencement\ + \ d’objet (média). Spécifiez son URL si vous utilisez un CDN ou un proxy, sinon\ + \ spécifiez l’adresse accessible au public selon le guide de service que vous allez\ + \ utiliser. P.ex. 'https://.s3.amazonaws.com' pour AWS S3 et 'https://storage.googleapis.com/'\ + \ pour GCS." +objectStorageBucket: "Bucket" +objectStorageBucketDesc: "Veuillez spécifier le nom du compartiment utilisé sur le\ + \ service configuré." +objectStoragePrefix: "Prefix" +objectStoragePrefixDesc: "Les fichiers seront stockés sous le répertoire de ce préfixe." +objectStorageEndpoint: "Endpoint" +objectStorageEndpointDesc: "Laissez ce champ vide si vous utilisez AWS S3, sinon spécifiez\ + \ le point de terminaison comme '' ou ': ' selon le guide de service\ + \ que vous allez utiliser." +objectStorageRegion: "Région" +objectStorageRegionDesc: "Spécifiez une région comme 'xx-east-1'. Si votre service\ + \ ne fait pas de distinction entre les régions, laissez-le vide ou remplissez 'us-east-1'." +objectStorageUseSSL: "Utiliser SSL" +objectStorageUseSSLDesc: "Désactivez cette option si vous n'utilisez pas HTTPS pour\ + \ la connexion API" +objectStorageUseProxy: "Se connecter via proxy" +objectStorageUseProxyDesc: "Désactivez cette option si vous n'utilisez pas de proxy\ + \ pour la connexion API" +objectStorageSetPublicRead: "Régler sur « public » lors de l'envoi" +serverLogs: "Journal du serveur" +deleteAll: "Supprimer tout" +showFixedPostForm: "Afficher le formulaire de publication en haut du fil d'actualité" +newNoteRecived: "Voir les nouvelles notes" +sounds: "Sons" +listen: "Écouter" +none: "Rien" +showInPage: "Afficher dans la page" +popout: "Fenêtre contextuelle" +volume: "Volume" +masterVolume: "Volume principal" +details: "Détails" +chooseEmoji: "Choisissez un émoji" +unableToProcess: "L’opération n’a pas pu être complétée." +recentUsed: "Utilisé récemment" +install: "Installation" +uninstall: "Désinstaller" +installedApps: "Applications installées" +nothing: "Il n'y a rien à voir ici" +installedDate: "Date d'installation" +lastUsedDate: "Dernière utilisation" +state: "État" +sort: "Trier" +ascendingOrder: "Ascendant" +descendingOrder: "Descendant" +scratchpad: "ScratchPad" +scratchpadDescription: "ScratchPad fournit un environnement expérimental pour AiScript.\ + \ Vous pouvez vérifier la rédaction de votre code, sa bonne exécution et le résultat\ + \ de son interaction avec Calckey." +output: "Sortie" +script: "Script" +disablePagesScript: "Désactiver AiScript sur les Pages" +updateRemoteUser: "Mettre à jour les informations de l’utilisateur·rice distant·e" +deleteAllFiles: "Supprimer tous les fichiers" +deleteAllFilesConfirm: "Êtes-vous sûr·e de vouloir supprimer tous les fichiers ?" +removeAllFollowing: "Retenir tous les abonnements" +removeAllFollowingDescription: "Se désabonner de tous les comptes de {host}. Veuillez\ + \ lancer cette action uniquement si l’instance n’existe plus." +userSuspended: "Cet·te utilisateur·rice a été suspendu·e." +userSilenced: "Cette utilisateur·trice a été mis·e en sourdine." +yourAccountSuspendedTitle: "Ce compte est suspendu" +yourAccountSuspendedDescription: "Ce compte est suspendu car vous avez enfreint les\ + \ conditions d'utilisation de l'instance, ou pour un motif similaire. Si vous souhaitez\ + \ connaître en détail les raisons de cette suspension, renseignez-vous auprès de\ + \ l'administrateur·rice de votre instance. Merci de ne pas créer de nouveau compte." +menu: "Menu" +divider: "Séparateur" +addItem: "Ajouter un élément" +relays: "Relais" +addRelay: "Ajouter un relais" +inboxUrl: "Inbox URL" +addedRelays: "Relais ajoutés" +serviceworkerInfo: "Devrait être activé pour les notifications push." +deletedNote: "Note supprimée" +invisibleNote: "Note invisible" +enableInfiniteScroll: "Activer le défilement infini" +visibility: "Visibilité" +poll: "Sondage" +useCw: "Masquer le contenu" +enablePlayer: "Ouvrir dans le lecteur vidéo" +disablePlayer: "Fermer le lecteur vidéo" +expandTweet: "Étendre le tweet" +themeEditor: "Éditeur de thèmes" +description: "Description" +describeFile: "Ajouter une description d'image" +enterFileDescription: "Saisissez une description" +author: "Auteur·rice" +leaveConfirm: "Vous avez des modifications non-sauvegardées. Voulez-vous les ignorer\ + \ ?" +manage: "Gestion" +plugins: "Extensions" +deck: "Deck" +undeck: "Quitter le deck" +useBlurEffectForModal: "Utiliser un effet de flou pour les modals" +useFullReactionPicker: "Utiliser l'intégralité du panneau de réactions" +width: "Largeur" +height: "Hauteur" +large: "Grand" +medium: "Moyen" +small: "Petit" +generateAccessToken: "Générer un jeton d'accès" +permission: "Autorisations" +enableAll: "Tout activer" +disableAll: "Tout désactiver" +tokenRequested: "Autoriser l'accès au compte" +pluginTokenRequestedDescription: "Ce plugin pourra utiliser les autorisations définies\ + \ ici." +notificationType: "Type de notifications" +edit: "Editer" +emailServer: "Serveur mail" +enableEmail: "Activer la distribution de courriel" +emailConfigInfo: "Utilisé pour confirmer votre adresse de courriel et la réinitialisation\ + \ de votre mot de passe en cas d’oubli." +email: "E-mail " +emailAddress: "Adresses e-mail" +smtpConfig: "Paramètres du serveur SMTP" +smtpHost: "Serveur distant" +smtpPort: "Port" +smtpUser: "Nom d’utilisateur·rice" +smtpPass: "Mot de passe" +emptyToDisableSmtpAuth: "Laisser le nom d’utilisateur et le mot de passe vides pour\ + \ désactiver la vérification SMTP" +smtpSecure: "Utiliser SSL/TLS implicitement dans les connexions SMTP" +smtpSecureInfo: "Désactiver cette option lorsque STARTTLS est utilisé" +testEmail: "Tester la distribution de courriel" +wordMute: "Filtre de mots" +regexpError: "Erreur d’expression régulière" +instanceMute: "Instance en sourdine" +userSaysSomething: "{name} a dit quelque chose" +makeActive: "Activer" +display: "Affichage" +copy: "Copier" +metrics: "Métriques" +overview: "Aperçu" +logs: "Journaux" +delayed: "en retard" +database: "Base de données" +channel: "Canaux" +create: "Créer" +notificationSetting: "Paramètres des notifications " +notificationSettingDesc: "Sélectionnez le type de notification à afficher" +useGlobalSetting: "Utiliser paramètre général" +useGlobalSettingDesc: "S'il est activé, les paramètres de notification de votre compte\ + \ seront utilisés. S'il est désactivé, des configurations individuelles peuvent\ + \ être effectuées." +other: "Autre" +regenerateLoginToken: "Régénérer le jeton de connexion" +regenerateLoginTokenDescription: "Générer un nouveau jeton d'authentification. Cette\ + \ opération ne devrait pas être nécessaire ; lors de la génération d'un nouveau\ + \ jeton, tous les appareils seront déconnectés. " +setMultipleBySeparatingWithSpace: "Vous pouvez en définir plusieurs, en les séparant\ + \ par des espaces." +fileIdOrUrl: "ID du fichier ou URL" +behavior: "Comportement" +sample: "Exemple" +abuseReports: "Signalements" +reportAbuse: "Signaler" +reportAbuseOf: "Signaler {name}" +fillAbuseReportDescription: "Veuillez expliquer les raisons du signalement. S'il s'agit\ + \ d'une note précise, veuillez en donner le lien." +abuseReported: "Le rapport est envoyé. Merci." +reporter: "Signalé par" +reporteeOrigin: "Origine du signalement" +reporterOrigin: "Signalé par" +forwardReport: "Transférer le signalement à l’instance distante" +send: "Envoyer" +abuseMarkAsResolved: "Marquer le signalement comme résolu" +openInNewTab: "Ouvrir dans un nouvel onglet" +openInSideView: "Ouvrir en vue latérale" +defaultNavigationBehaviour: "Navigation par défaut" +editTheseSettingsMayBreakAccount: "La modification de ces paramètres peut endommager\ + \ votre compte." +instanceTicker: "Nom de l'instance d'origine des notes" +waitingFor: "En attente de {x}" +random: "Aléatoire" +system: "Système" +switchUi: "Modifier l'interface utilisateur" +desktop: "Bureau" +clip: "Clip" +createNew: "Créer nouveau" +optional: "Facultatif" +createNewClip: "Créer un nouveau clip" +public: "Public" +i18nInfo: "Calckey est traduit dans différentes langues par des bénévoles. Vous pouvez\ + \ contribuer à {link}." +manageAccessTokens: "Gérer les jetons d'accès" +accountInfo: " Informations du compte " +notesCount: "Nombre de notes" +repliesCount: "Nombre de réponses envoyées" +renotesCount: "Nombre de notes que vous avez renotées" +repliedCount: "Nombre de réponses reçues" +renotedCount: "Nombre de vos notes renotées" +followingCount: "Nombre de comptes suivis" +followersCount: "Nombre d'abonnés" +sentReactionsCount: "Nombre de réactions envoyées" +receivedReactionsCount: "Nombre de réactions reçues" +pollVotesCount: "Nombre de votes envoyés" +pollVotedCount: "Nombre de votes reçus" +yes: "Oui" +no: "Non" +driveFilesCount: "Nombre de fichiers dans le Drive" +driveUsage: "Utilisation du Drive" +noCrawle: "Refuser l'indexation par les robots" +noCrawleDescription: "Demandez aux moteurs de recherche de ne pas indexer votre page\ + \ de profil, vos notes, vos pages, etc." +lockedAccountInfo: "À moins que vous ne définissiez la visibilité de votre note sur\ + \ \"Abonné-e-s\", vos notes sont visibles par tous, même si vous exigez que les\ + \ demandes d'abonnement soient approuvées manuellement." +alwaysMarkSensitive: "Marquer les médias comme contenu sensible par défaut" +loadRawImages: "Affichage complet des images jointes au lieu des vignettes" +disableShowingAnimatedImages: "Désactiver l'animation des images" +verificationEmailSent: "Un e-mail de vérification a été envoyé. Veuillez accéder au\ + \ lien pour compléter la vérification." +notSet: "Non défini" +emailVerified: "Votre adresse e-mail a été vérifiée." +noteFavoritesCount: "Nombre de notes dans les favoris" +pageLikesCount: "Nombre de pages aimées" +pageLikedCount: "Nombre de vos pages aimées" +contact: "Contact" +useSystemFont: "Utiliser la police par défaut du système" +clips: "Clips" +experimentalFeatures: "Fonctionnalités expérimentales" +developer: "Développeur" +makeExplorable: "Rendre le compte visible sur la page \"Découvrir\"." +makeExplorableDescription: "Si vous désactivez cette option, votre compte n'apparaîtra\ + \ pas sur la page \"Découvrir\"." +showGapBetweenNotesInTimeline: "Afficher un écart entre les notes sur la Timeline" +duplicate: "Duliquer" +left: "Gauche" +center: "Centrer" +wide: "Large" +narrow: "Condensé" +reloadToApplySetting: "Vos paramètres seront appliqués lorsque vous rechargerez la\ + \ page. Souhaitez-vous recharger ?" +needReloadToApply: "Ce paramètre s'appliquera après un rechargement." +showTitlebar: "Afficher la barre de titre" +clearCache: "Vider le cache" +onlineUsersCount: "{n} utilisateur(s) en ligne" +nUsers: "{n} utilisateur·rice·s" +nNotes: "{n} Notes" +sendErrorReports: "Envoyer les rapports d’erreur" +sendErrorReportsDescription: "Si vous activez l'envoi des rapports d'erreur, vous\ + \ contribuerez à améliorer la qualité de Calckey grâce au partage d'informations\ + \ détaillées sur les erreurs lorsqu'un problème survient.\nCela inclut des informations\ + \ telles que la version de votre système d'exploitation, le type de navigateur que\ + \ vous utilisez, votre historique d'activité, etc." +myTheme: "Mes thèmes" +backgroundColor: "Arrière-plan" +accentColor: "Accentuation" +textColor: "Texte" +saveAs: "Enregistrer sous ..." +advanced: "Avancé" +value: "Valeur" +createdAt: "Date de création" +updatedAt: "Mis à jour le" +saveConfirm: "Voulez-vous sauvegarder les modifications?" +deleteConfirm: "Confirmez-vous la suppression?" +invalidValue: "Cette valeur est invalide." +registry: "Registre" +closeAccount: "Fermer le compte" +currentVersion: "Version actuelle" +latestVersion: "Dernière version " +youAreRunningUpToDateClient: "Votre client est à jour." +newVersionOfClientAvailable: "Une nouvelle version de votre client est disponible." +usageAmount: "Utilisation" +capacity: "Capacité " +inUse: "utilisé" +editCode: "Modifier le code" +apply: "Appliquer" +receiveAnnouncementFromInstance: "Recevoir les messages d'information de l'instance" +emailNotification: "Notifications par mail" +publish: "Public" +inChannelSearch: "Chercher dans le canal" +useReactionPickerForContextMenu: "Clic-droit pour ouvrir le panneau de réactions" +typingUsers: "{users} est en train d'écrire" +jumpToSpecifiedDate: "Se rendre à la date" +showingPastTimeline: "Un fil ancien est affiché" +clear: "Effacer" +markAllAsRead: "Tout marquer comme lu" +goBack: "Retour" +unlikeConfirm: "Êtes-vous sûr·e de ne plus vouloir aimer cette publication ?" +fullView: "Plein écran" +quitFullView: "Quitter le plein écran" +addDescription: "Ajouter une description" +userPagePinTip: "Vous pouvez afficher des notes ici en sélectionnant l'option « Épingler\ + \ au profil » dans le menu de chaque note." +notSpecifiedMentionWarning: "Vous avez mentionné des utilisateur·rice·s qui ne font\ + \ pas partie de la liste des destinataires" +info: "Informations" +userInfo: "Informations sur l'utilisateur" +unknown: "Inconnu" +onlineStatus: "Statut" +hideOnlineStatus: "Se rendre invisible" +hideOnlineStatusDescription: "Rendre votre statut invisible peut diminuer les performances\ + \ de certaines fonctionnalités, telles que la Recherche." +online: "En ligne" +active: "Actif·ve" +offline: "Hors ligne" +notRecommended: "Déconseillé" +botProtection: "Protection contre les bots" +instanceBlocking: "Instances bloquées/mise en sourdine" +selectAccount: "Sélectionner un compte" +switchAccount: "Changer de compte" +enabled: "Activé" +disabled: "Désactivé" +quickAction: "Actions rapides" +user: "Utilisateur·rice·s" +administration: "Gestion" +accounts: "Comptes" +switch: "Remplacer" +noMaintainerInformationWarning: "Informations administrateur non configurées." +noBotProtectionWarning: "La protection contre les bots n'est pas configurée." +configure: "Configurer" +postToGallery: "Publier dans la galerie" +gallery: "Galerie" +recentPosts: "Les plus récentes" +popularPosts: "Les plus consultées" +shareWithNote: "Partager dans une note" +ads: "Publicité" +expiration: "Échéance" +memo: "Pense-bête" +priority: "Priorité" +high: "Haute" +middle: "Moyen" +low: "Basse" +emailNotConfiguredWarning: "Vous n'avez pas configuré d'adresse e-mail." +ratio: "Ratio" +previewNoteText: "Voir l'aperçu" +customCss: "CSS personnalisé" +customCssWarn: "Utilisez cette fonctionnalité uniquement si vous savez exactement\ + \ ce que vous faites. Une configuration inadaptée peut empêcher le client de s'exécuter\ + \ normalement." +global: "Global" +squareAvatars: "Avatars carrés" +sent: "Envoyer" +received: "Reçu" +searchResult: "Résultats de la recherche" +hashtags: "Hashtags" +troubleshooting: "Résolution de problèmes" +useBlurEffect: "Utiliser des effets de flou dans l'interface" +learnMore: "Plus d'informations" +misskeyUpdated: "Calckey a été mis à jour !" +whatIsNew: "Voir les derniers changements" +translate: "Traduire" +translatedFrom: "Traduit depuis {x}" +accountDeletionInProgress: "La suppression de votre compte est en cours" +usernameInfo: "C'est un nom qui identifie votre compte sur l'instance de manière unique.\ + \ Vous pouvez utiliser des lettres de l'alphabet (minuscules et majuscules), des\ + \ chiffres (de 0 à 9), ou bien le tiret « _ ». Vous ne pourrez pas modifier votre\ + \ nom d'utilisateur·rice par la suite." +aiChanMode: "Mode Ai" +keepCw: "Garder le CW" +pubSub: "Comptes Pub/Sub" +lastCommunication: "Dernière communication" +resolved: "Résolu" +unresolved: "En attente" +breakFollow: "Ne plus suivre" +itsOn: "Activé" +itsOff: "Désactivé" +emailRequiredForSignup: "Une adresse e-mail est nécessaire pour créer un compte" +unread: "Non lu" +filter: "Filtre" +controlPanel: "Panneau de contrôle" +manageAccounts: "Gérer les comptes" +makeReactionsPublic: "Rendre les réactions publiques" +makeReactionsPublicDescription: "Ceci rendra la liste de toutes vos réactions données\ + \ publique." +classic: "Classique" +muteThread: "Masquer cette discussion" +unmuteThread: "Ne plus masquer le fil" +ffVisibility: "Visibilité des abonnés/abonnements" +ffVisibilityDescription: "Permet de configurer qui peut voir les personnes que tu\ + \ suis et les personnes qui te suivent." +continueThread: "Afficher la suite du fil" +deleteAccountConfirm: "Votre compte sera supprimé. Êtes vous certain ?" +incorrectPassword: "Le mot de passe est incorrect." +voteConfirm: "Confirmez-vous votre vote pour « {choice} » ?" +hide: "Masquer" +leaveGroup: "Quitter le groupe" +leaveGroupConfirm: "Êtes vous sûr de vouloir quitter \"{name}\" ?" +useDrawerReactionPickerForMobile: "Afficher le sélecteur de réactions en tant que\ + \ panneau sur mobile" +welcomeBackWithName: "Heureux de vous revoir, {name}" +clickToFinishEmailVerification: "Veuillez cliquer sur [{ok}] afin de compléter la\ + \ vérification par courriel." +overridedDeviceKind: "Type d’appareil" +smartphone: "Smartphone" +tablet: "Tablette" +auto: "Automatique" +themeColor: "Couleur du thème" +size: "Taille" +numberOfColumn: "Nombre de colonnes" +searchByGoogle: "Google" +instanceDefaultLightTheme: "Thème clair par défaut sur toute l’instance" +instanceDefaultDarkTheme: "Thème sombre par défaut sur toute l’instance" +instanceDefaultThemeDescription: "Saisissez le code du thème en format objet." +mutePeriod: "Durée de mise en sourdine" +indefinitely: "Illimité" +tenMinutes: "10 minutes" +oneHour: "1 heure" +oneDay: "1 jour" +oneWeek: "1 semaine" +rateLimitExceeded: "Limite de taux dépassée" +cropImage: "Recadrer l'image" +cropImageAsk: "Voulez-vous recadrer cette image ?" +file: "Fichiers" +reverse: "Inverser" +colored: "Coloré" +label: "Étiquette" +localOnly: "Local seulement" +account: "Comptes" +_emailUnavailable: + used: "Non disponible" + format: "Le format de cette adresse de courriel est invalide" + disposable: "Les adresses e-mail jetables ne peuvent pas être utilisées" + mx: "Ce serveur de courriels est invalide" + smtp: "Ce serveur de courriels ne répond pas" +_ffVisibility: + public: "Public" + followers: "Visible uniquement pour les abonné·e·s" + private: "Privé" +_signup: + almostThere: "Bientôt fini" + emailAddressInfo: "Insérez votre adresse e-mail." + emailSent: "Un courriel de confirmation vient d'être envoyé à l'adresse que vous\ + \ avez renseignée ({email}). Cliquez sur le lien contenu dans le message pour\ + \ terminer la création de votre compte." +_accountDelete: + accountDelete: "Supprimer le compte" + mayTakeTime: "La suppression de compte nécessitant beaucoup de ressources, l'exécution\ + \ du processus peut prendre du temps, en fonction de la quantité de contenus que\ + \ vous avez créés et du nombre de fichiers que vous avez téléversés." + sendEmail: "Une fois la suppression de votre compte effectuée, un courriel sera\ + \ envoyé à l'adresse que vous aviez enregistrée." + requestAccountDelete: "Demander la suppression de votre compte" + started: "La procédure de suppression a commencé." + inProgress: "Suppression en cours" +_ad: + back: "Retour" + reduceFrequencyOfThisAd: "Voir cette publicité moins souvent" +_forgotPassword: + enterEmail: "Entrez ici l'adresse e-mail que vous avez enregistrée pour votre compte.\ + \ Un lien vous permettant de réinitialiser votre mot de passe sera envoyé à cette\ + \ adresse." + ifNoEmail: "Si vous n'avez pas enregistré d'adresse e-mail, merci de contacter l'administrateur·rice\ + \ de votre instance." + contactAdmin: "Cette instance ne permettant pas l'utilisation d'adresses e-mail,\ + \ prenez contact avec l'administrateur·rice pour procéder à la réinitialisation\ + \ de votre mot de passe." +_gallery: + my: "Mes publications" + liked: " Publications que j'ai aimées" + like: "J'aime" + unlike: "Je n’aime pas" +_email: + _follow: + title: "Vous suit" + _receiveFollowRequest: + title: "Vous avez reçu une demande de suivi" +_plugin: + install: "Installation de plugin" + installWarn: "N’installez que des extensions provenant de sources de confiance." + manage: "Gestion des plugins" +_registry: + scope: "Portée" + key: "Clé " + keys: "Clé " + domain: "Domaine" + createKey: "Créer une clé" +_aboutMisskey: + about: "Misskey est un logiciel libre et ouvert, développé par syuilo depuis 2014." + contributors: "Principaux contributeurs" + allContributors: "Tous les contributeurs" + source: "Code source" + translation: "Traduire Calckey" + donate: "Soutenir Calckey" + morePatrons: "Nous apprécions vraiment le soutien de nombreuses autres personnes\ + \ non mentionnées ici. Merci à toutes et à tous ! \U0001F970" + patrons: "Contributeurs" +_nsfw: + respect: "Cacher les médias marqués comme contenu sensible" + ignore: "Afficher les médias sensibles" + force: "Cacher tous les médias" +_mfm: + cheatSheet: "Antisèche MFM" + intro: "MFM est un langage Markdown spécifique utilisable ici et là dans Calckey.\ + \ Vous pouvez vérifier ici les structures utilisables avec MFM." + dummy: "La Fédiverse s'agrandit avec Calckey" + mention: "Mentionner" + mentionDescription: "Vous pouvez afficher un utilisateur spécifique en indiquant\ + \ une arobase suivie d'un nom d'utilisateur" + hashtag: "Hashtags" + hashtagDescription: "Vous pouvez afficher un mot-dièse en utilisant un croisillon\ + \ et du texte" + url: "URL" + urlDescription: "L'adresse web peut être affichée." + link: "Lien" + linkDescription: "Une partie précise d'une phrase peut être liée à l'adresse web." + bold: "Gras" + boldDescription: "Il est possible de mettre le texte en exergue en le mettant en\ + \ gras." + small: "Diminuer l'emphase" + smallDescription: "Le contenu peut être affiché en petit et fin." + center: "Centrer" + centerDescription: "Le contenu peut être centré" + inlineCode: "Code (inline)" + inlineCodeDescription: "Coloration syntaxique des lignes de code." + blockCode: "Bloc de code" + blockCodeDescription: "Coloration syntaxique des lignes de code pour les blocs multi-lignes." + inlineMath: "Formule mathématique (inline)" + inlineMathDescription: "Afficher les formules mathématiques (KaTeX)." + blockMath: "Formule mathématique (bloc)" + blockMathDescription: "Afficher les formules mathématiques (KaTeX) multi-lignes\ + \ dans un bloc." + quote: "Citer" + quoteDescription: "Affiche le contenu sous forme de citation." + emoji: "Émojis personnalisés" + emojiDescription: "Entourez le nom de l'émoji personnalisé de deux points pour l'afficher." + search: "Rechercher" + searchDescription: "Affiche une boîte de recherche avec du texte pré-saisi." + flip: "Inverser" + flipDescription: "Rotation verticale ou horizontale du contenu" + jelly: "Animation (Gelée)" + jellyDescription: "Donne une animation d'étirement." + tada: "Animation (Tada)" + tadaDescription: "Donne une animation qui donne une impression de \"Tada !\"" + jump: "Animation (Saut)" + jumpDescription: "Donne une animation qui saute." + bounce: "Animation (Rebond)" + bounceDescription: "Donne une animation de rebondissement." + shake: "Animation (Secousse)" + shakeDescription: "Donne une animation tremblante." + twitch: "Animation (Tremblement)" + twitchDescription: "Donne une animation de tremblement intense." + spin: "Animation (Rotation)" + spinDescription: "Donne une animation de rotation." + x2: "Grand" + x2Description: "Afficher le contenu en grand." + x3: "Très grand" + x3Description: "Afficher le contenu en très grand." + x4: "Plus grand" + x4Description: "Afficher le contenu en plus grand." + blur: "Flou" + blurDescription: "Le contenu peut être flouté ; il sera visible en le survolant\ + \ avec le curseur." + font: "Police de caractères" + fontDescription: "Il est possible de choisir la police." + rainbow: "Arc-en-ciel" + rainbowDescription: "Permet d'afficher le contenu en couleurs arc-en-ciel." + sparkle: "Paillettes" + sparkleDescription: "Ajoute un effet scintillant au contenu." + rotate: "Pivoter" + fade: "Apparaître/Disparaître" + fadeDescription: "Fait apparaître et disparaître le contenu." + plainDescription: Désactiver les effets de tous les MFM contenus dans cet effet + MFM. + rotateDescription: Pivoter le contenu d'un angle spécifique. + position: Position +_instanceTicker: + none: "Cacher " + remote: "Montrer pour les utilisateur·ice·s distant·e·s" + always: "Toujours afficher" +_serverDisconnectedBehavior: + reload: "Rechargement automatique" + dialog: "Ouvrir une boîte de dialogue pour l'avertissement" + quiet: "Afficher un avertissement discret" + nothing: Ne rien faire +_channel: + create: "Créer un canal" + edit: "Éditer le canal" + setBanner: "Sélectionner la bannière" + removeBanner: "Supprimer la bannière" + featured: "Tendances" + owned: "Mes canaux" + following: "Abonné·e" + usersCount: "{n} Participant·e·s" + notesCount: "{n} Notes" + nameAndDescription: Nom et description +_menuDisplay: + sideFull: "Latéral" + sideIcon: "Latéral (icônes)" + top: "Haut de page" + hide: "Masquer" +_wordMute: + muteWords: "Mots à filtrer" + muteWordsDescription: "Séparer avec des espaces pour la condition AND. Séparer avec\ + \ un saut de ligne pour une condition OR." + muteWordsDescription2: "Pour utiliser des expressions régulières (regex), mettez\ + \ les mots-clés entre barres obliques." + softDescription: "Masquez les notes de votre fil selon les paramètres que vous définissez." + hardDescription: "Empêchez votre fil de charger les notes selon les paramètres que\ + \ vous définissez. Cette action est irréversible : si vous modifiez ces paramètres\ + \ plus tard, les notes précédemment filtrées ne seront pas récupérées." + soft: "Doux" + hard: "Strict" + mutedNotes: "Notes filtrées" +_instanceMute: + instanceMuteDescription2: "Séparer avec de nouvelles lignes" + title: "Masque les notes venant des instances listées." + heading: "Instances à mettre en sourdine" + instanceMuteDescription: Ceci va masquer toute publication ou partage des instances + listées, incluant celles des personnes répondant à des personnes des instances + masquées. +_theme: + explore: "Explorer les thèmes" + install: "Installer un thème" + manage: "Gestion des thèmes" + code: "Code du thème" + description: "Description" + installed: "{name} a été installé" + installedThemes: "Thèmes installés" + builtinThemes: "Thèmes intégrés" + alreadyInstalled: "Ce thème est déjà installé" + invalid: "Le format du thème n'est pas valide" + make: "Créer un thème" + base: "Base" + addConstant: "Ajouter une constante" + constant: "Constante" + defaultValue: "Valeur par défaut" + color: "Couleur" + refProp: "Appeler une propriété" + refConst: "Appeler une constante" + key: "Clé " + func: "Fonction" + funcKind: "Type de fonction" + argument: "Argument" + basedProp: "Nom de la propriété référencée" + alpha: "Transparence" + darken: "Sombre" + lighten: "Clair" + inputConstantName: "Insérez un nom de constante" + importInfo: "Vous pouvez importer un thème vers l’éditeur de thèmes en saisissant\ + \ son code ici." + deleteConstantConfirm: "Êtes-vous sûr·e de vouloir supprimer la constante {const}\ + \ ?" + keys: + accent: "Accentuation" + bg: "Arrière-plan" + fg: "Texte" + focus: "Mise au point" + indicator: "Indicateur" + panel: "Panneau" + shadow: "Ombre" + header: "Entête" + navBg: "Fond de la barre latérale" + navFg: "Texte de la barre latérale" + navHoverFg: "Texte de la barre latérale (survolé)" + navActive: "Texte de la barre latérale (actif)" + navIndicator: "Indicateur de barre latérale" + link: "Lien" + hashtag: "Hashtags" + mention: "Mentionner" + mentionMe: "Mentions (Moi)" + renote: "Renoter" + modalBg: "Modal d'arrière-plan" + divider: "Séparateur" + scrollbarHandle: "Poignée de la barre de navigation" + scrollbarHandleHover: "Poignée de la barre de navigation (survolée)" + dateLabelFg: "Texte de l'étiquette de la date" + infoBg: "Arrière-plan pour les informations" + infoFg: "Texte d'information" + infoWarnBg: "Arrière-plan des avertissements" + infoWarnFg: "Texte d’avertissement" + cwBg: "Arrière-plan du CW" + cwFg: "Texte du bouton CW" + cwHoverBg: "Arrière-plan du bouton CW (survolé)" + toastBg: "Arrière-plan de la bulle de notification" + toastFg: "Texte de la bulle de notification" + buttonBg: "Arrière-plan du bouton" + buttonHoverBg: "Arrière-plan du bouton (survolé)" + inputBorder: "Cadre de la zone de texte" + listItemHoverBg: "Arrière-plan d'item de liste (survolé)" + driveFolderBg: "Arrière-plan du dossier de disque" + wallpaperOverlay: "Superposition de fond d'écran" + badge: "Badge" + messageBg: "Arrière plan de la discussion" + accentDarken: "Plus sombre" + accentLighten: "Plus clair" + fgHighlighted: "Texte mis en évidence" +_sfx: + note: "Nouvelle note" + noteMy: "Ma note" + notification: "Notifications" + chat: "Discuter" + chatBg: "Discussion (arrière-plan)" + antenna: "Réception de l’antenne" + channel: "Notifications de canal" +_ago: + future: "Futur" + justNow: "à l’instant" + secondsAgo: "Il y a {n}s" + minutesAgo: "Il y a {n}min" + hoursAgo: "Il y a {n} heures" + daysAgo: "Il y a {n} jours" + weeksAgo: "Il y a {n} semaines" + monthsAgo: "Il y a {n} mois" + yearsAgo: "Il y a {n} ans" +_time: + second: "s" + minute: "min" + hour: "h" + day: "j" +_tutorial: + title: "Comment utiliser Calckey" + step1_1: "Bienvenue!" + step1_2: "On va vous installer. Vous serez opérationnel en un rien de temps" + step2_1: "Tout d'abord, remplissez votre profil" + step2_2: "En fournissant quelques informations sur qui vous êtes, il sera plus facile\ + \ pour les autres de savoir s'ils veulent voir vos notes ou vous suivre." + step3_1: "Maintenant il est temps de suivre des gens !" + step3_2: "Votre page d'accueil et vos timelines sociales sont basées sur les personnes\ + \ que vous suivez, alors essayez de suivre quelques comptes pour commencer.\n\ + Cliquez sur le cercle plus en haut à droite d'un profil pour le suivre." + step4_1: "On y va." + step4_2: "Pour votre premier post, certaines personnes aiment faire un post {introduction}\ + \ ou un simple post 'Hello world'." + step5_1: "Lignes de temps, lignes de temps partout !" + step5_2: "Votre instance a {timelines} différentes chronologies activées !" + step5_3: "La timeline Home {icon} est l'endroit où vous pouvez voir les publications\ + \ de vos followers." + step5_4: "La timeline locale {icon} est l'endroit où vous pouvez voir les messages\ + \ de tout le monde sur cette instance." + step5_5: "La chronologie {icon} sociale est l'endroit où vous pouvez voir uniquement\ + \ les publications des comptes que vous suivez." + step5_6: "La chronologie {icon} recommandée est l'endroit où vous pouvez voir les\ + \ publications des instances recommandées par les administrateurs." + step5_7: "La timeline globale {icon} est l'endroit où vous pouvez voir les messages\ + \ de toutes les autres instances connectées." + step6_1: "Alors quel est cet endroit ?" + step6_2: "Eh bien, vous ne venez pas de rejoindre Calckey. Vous avez rejoint un\ + \ portail vers le Fediverse, un réseau interconnecté de milliers de serveurs,\ + \ appelés \"instances\"." + step6_3: "Chaque serveur fonctionne différemment, et tous les serveurs n'utilisent\ + \ pas Calckey. Cependant, celui-ci le fait ! C'est un peu délicat, mais vous aurez\ + \ le coup de main en un rien de temps." + step6_4: "Maintenant, allez-y, explorez et amusez-vous !" +_2fa: + alreadyRegistered: "Configuration déjà achevée." + registerTOTP: "Ajouter un nouvel appareil" + registerSecurityKey: "Enregistrer une clef" + step1: "Tout d'abord, installez une application d'authentification, telle que {a}\ + \ ou {b}, sur votre appareil." + step2: "Ensuite, scannez le code QR affiché sur l’écran." + step2Url: "Vous pouvez également saisir cette URL si vous utilisez un programme\ + \ de bureau :" + step3: "Entrez le jeton affiché sur votre application pour compléter la configuration." + step4: "À partir de maintenant, ce même jeton vous sera demandé à chacune de vos\ + \ connexions." + securityKeyInfo: "Vous pouvez configurer l'authentification WebAuthN pour sécuriser\ + \ davantage le processus de connexion grâce à une clé de sécurité matérielle qui\ + \ prend en charge FIDO2, ou bien en configurant l'authentification par empreinte\ + \ digitale ou par code PIN sur votre appareil." +_permissions: + "read:account": "Afficher les informations du compte" + "write:account": "Mettre à jour les informations de votre compte" + "read:blocks": "Voir les comptes bloqués" + "write:blocks": "Gérer les comptes bloqués" + "read:drive": "Parcourir le Drive" + "write:drive": "Écrire sur le Drive" + "read:favorites": "Afficher les favoris" + "write:favorites": "Gérer les favoris" + "read:following": "Voir les informations de vos abonnements" + "write:following": "Abonnements/Se désabonner" + "read:messaging": "Voir vos discussions" + "write:messaging": "Gérer les discussions" + "read:mutes": "Voir les comptes masqués" + "write:mutes": "Gérer les comptes masqués" + "write:notes": "Créer / supprimer des notes" + "read:notifications": "Afficher les notifications" + "write:notifications": "Gérer vos notifications" + "read:reactions": "Lire les réactions" + "write:reactions": "Gérer vos réactions" + "write:votes": "Voter" + "read:pages": "Voir vos pages" + "write:pages": "Gérer les pages" + "read:page-likes": "Voir les mentions « J'aime » des pages" + "write:page-likes": "Gérer les mentions « J'aime » sur les pages" + "read:user-groups": "Voir les groupes d'utilisateur·rice·s" + "write:user-groups": "Éditer les groupes des utilisateur·rice·s" + "read:channels": "Lire les canaux" + "write:channels": "Gérer les canaux" + "read:gallery": "Voir la galerie" + "write:gallery": "Éditer la galerie" + "read:gallery-likes": "Voir les mentions « J'aime » dans la galerie" + "write:gallery-likes": "Gérer les mentions « J'aime » dans la galerie" +_auth: + shareAccess: "Autoriser \"{name}\" à accéder à votre compte ?" + shareAccessAsk: "Voulez-vous vraiment autoriser cette application à accéder à votre\ + \ compte?" + permissionAsk: "Cette application nécessite les autorisations suivantes :" + pleaseGoBack: "Veuillez retourner à l’application" + callback: "Retour vers l’application" + denied: "Accès refusé" + copyAsk: Veuillez coller le code d’autorisation à l'application +_antennaSources: + all: "Toutes les notes" + homeTimeline: "Notes venant des utilisateur·rice·s auxquel·les je suis abonné" + users: "Notes venant de la part d’utilisateur·rice·s précis" + userList: "Notes venant d’une liste spécifique" + userGroup: "Notes venant d’utilisateur·rice·s du groupe spécifié" +_weekday: + sunday: "Dimanche" + monday: "Lundi" + tuesday: "Mardi" + wednesday: "Mercredi" + thursday: "Jeudi" + friday: "Vendredi" + saturday: "Samedi" +_widgets: + memo: "Note collante" + notifications: "Notifications" + timeline: "Fil" + calendar: "Calendrier" + trends: "Tendances" + clock: "Horloge" + rss: "Lecteur de flux RSS" + activity: "Activité" + photos: "Photos" + digitalClock: "Horloge numérique" + federation: "Fédération" + postForm: "Formulaire de publication" + slideshow: "Diaporama" + button: "Bouton" + onlineUsers: "Utilisateurs en ligne" + jobQueue: "File d’attente" + serverMetric: "Statistiques du serveur" + aiscript: "Console AiScript" + aichan: "Ai" + userList: Liste d'utilisateurs + _userList: + chooseList: Sélectionner une liste + unixClock: Horloge UNIX +_cw: + hide: "Masquer" + show: "Afficher plus …" + chars: "{count} caractères" + files: "{count} fichiers" +_poll: + noOnlyOneChoice: "Au moins 2 réponses nécéssaires" + choiceN: "Choix {n}" + noMore: "Vous ne pouvez pas en ajouter davantage" + canMultipleVote: "Autoriser le multi-choix" + expiration: "Fin du sondage" + infinite: "Illimité" + at: "Choisir une date" + after: "Choisir la durée" + deadlineDate: "Date de fin" + deadlineTime: "Heure de fin" + duration: "Durée" + votesCount: "{n} votes" + totalVotes: "{n} votes au total" + vote: "Voter" + showResult: "Voir résultats" + voted: "Déjà voté" + closed: "Terminé" + remainingDays: "{d} jours, {h} heures restantes" + remainingHours: "{h} heures et {m} minutes restantes" + remainingMinutes: "{m} minutes et {s} secondes restantes" + remainingSeconds: "{s} secondes restantes" +_visibility: + public: "Public" + publicDescription: "Publier à tou·te·s les utilisateur·rice·s" + home: "Principal" + homeDescription: "Publier sur le fil principal uniquement" + followers: "Abonné·e·s" + followersDescription: "Publier à vos abonné·e·s uniquement" + specified: "Direct" + specifiedDescription: "Publier uniquement aux utilisateur·rice·s mentionné·e·s" + localOnly: "Local seulement" + localOnlyDescription: "Caché pour les utilisateurs distant" +_postForm: + replyPlaceholder: "Répondre à cette note ..." + quotePlaceholder: "Citez cette note ..." + channelPlaceholder: "Publier vers le canal" + _placeholders: + a: "Quoi de neuf ?" + b: "Il s'est passé quelque chose ?" + c: "Qu’avez-vous en tête ?" + d: "Désirez-vous publier quelques mots ?" + e: "Écrivez ici" + f: "En attente de vos écrits ..." +_profile: + name: "Nom" + username: "Nom d’utilisateur·rice" + description: "À propos de moi" + youCanIncludeHashtags: "Vous pouvez également inclure des hashtags." + metadata: "Informations supplémentaires" + metadataEdit: "Éditer les informations supplémentaires" + metadataDescription: "Vous pouvez afficher jusqu'à quatre informations supplémentaires\ + \ dans votre profil." + metadataLabel: "Étiquette" + metadataContent: "Contenu" + changeAvatar: "Changer l'image de profil" + changeBanner: "Changer de bannière" + locationDescription: Si vous entrez votre ville en premier, votre heure locale sera + affiché aux autres utilisateurs. +_exportOrImport: + allNotes: "Toutes les notes" + followingList: "Abonnements" + muteList: "Comptes masqués" + blockingList: "Comptes bloqués" + userLists: "Listes" + excludeMutingUsers: "Exclure les utilisateur·rice·s mis en sourdine" + excludeInactiveUsers: "Exclure les utilisateur·rice·s inactifs" +_charts: + federation: "Fédération" + apRequest: "Requêtes" + usersIncDec: "Variation du nombre d'utilisateur·rice·s" + usersTotal: "Nombre des utilisateur·rice·s au total" + activeUsers: "Nombre d'utilisateurices actif·ve·s" + notesIncDec: "Variation du nombre des notes" + localNotesIncDec: "Variation du nombre de notes locales" + remoteNotesIncDec: "Variation du nombre de notes distantes" + notesTotal: "Nombre total des notes" + filesIncDec: "Variation du nombre de fichiers" + filesTotal: "Nombre total de fichiers" + storageUsageIncDec: "Variation de l'utilisation du stockage" + storageUsageTotal: "Utilisation totale du stockage" +_instanceCharts: + requests: "Requêtes" + users: "Variation du nombre d'utilisateur·rice·s" + usersTotal: "Total cumulé du nombre d'utilisateur·rice·s" + notes: "Variation du nombre de notes" + notesTotal: "Nombre total cumulé des notes" + ff: "Variation des abonné·e·s / abonnements" + ffTotal: "Total cumulé du nombre d'abonné·e·s / abonnements" + cacheSize: "Variation de la taille du cache" + cacheSizeTotal: "Total cumulé de la taille du cache" + files: "Variation du nombre de fichiers" + filesTotal: "Total cumulé du nombre de fichiers" +_timelines: + home: "Principal" + local: "Local" + social: "Social" + global: "Global" + recommended: Recommandée +_pages: + newPage: "Créer une page" + editPage: "Modifier une page" + readPage: "Affichage de la source en cours" + created: "La page a été créée !" + updated: "La page a été mise à jour !" + deleted: "La page a été supprimée" + pageSetting: "Paramètres de la Page" + nameAlreadyExists: "L'URL de page spécifiée existe déjà" + invalidNameTitle: "L'URL de page spécifiée n’est pas valide" + invalidNameText: "Assurez-vous qu’il n’est pas vide" + editThisPage: "Éditer cette page" + viewSource: "Afficher la source" + viewPage: "Afficher la page" + like: "Favori" + unlike: "Je n’aime pas" + my: "Mes pages" + liked: "Pages favorites" + featured: "Populaire" + inspector: "Inspecteur" + contents: "Contenu" + content: "Bloc de page" + variables: "Variables" + title: "Titre" + url: "URL de la page" + summary: "Résumé de page" + alignCenter: "Centrée" + hideTitleWhenPinned: "Masquer le titre de la page lorsque celle-ci est épinglée\ + \ au profil" + font: "Police de caractères" + fontSerif: "Serif" + fontSansSerif: "Sans Serif" + eyeCatchingImageSet: "Définir une image attractive" + eyeCatchingImageRemove: "Supprimer l'image attractive" + chooseBlock: "Ajouter un bloc" + selectType: "Choisir un type" + enterVariableName: "Veuillez entrer un nom pour votre variable" + variableNameIsAlreadyUsed: "Ce nom de variable est déjà utilisé" + contentBlocks: "Contenu" + inputBlocks: "Blocs d'entrée" + specialBlocks: "Spécial" + blocks: + text: "Texte" + textarea: "Zone de texte" + section: "Section" + image: "Images" + button: "Bouton" + if: "Si" + _if: + variable: "Variables" + post: "Formulaire de publication" + _post: + text: "Contenu" + attachCanvasImage: "Publier avec Toile comme image" + canvasId: "Toile ID" + textInput: "Entrée textuelle" + _textInput: + name: "Nom de la variable" + text: "Titre" + default: "Valeur par défaut" + textareaInput: "Entrée textuelle multi-ligne" + _textareaInput: + name: "Nom de la variable" + text: "Titre" + default: "Valeur par défaut" + numberInput: "Entrée numérique" + _numberInput: + name: "Nom de la variable" + text: "Titre" + default: "Valeur par défaut" + canvas: "Toile" + _canvas: + id: "Toile ID" + width: "Largeur" + height: "Hauteur" + note: "Note intégrée" + _note: + id: "Identifiant de la note" + idDescription: "Pour configurer la note, vous pouvez aussi coller ici l'URL\ + \ correspondante." + detailed: "Afficher les détails" + switch: "Interrupteur" + _switch: + name: "Nom de la variable" + text: "Titre" + default: "Valeur par défaut" + counter: "Compteur" + _counter: + name: "Nom de la variable" + text: "Titre" + inc: "Augmenter de" + _button: + text: "Titre" + colored: "Coloré" + action: "Opération à effectuer lorsque le bouton est pressé" + _action: + dialog: "Afficher une fenêtre de dialogue" + _dialog: + content: "Contenu" + resetRandom: "Réinitialiser un nombre aléatoire" + pushEvent: "Envoyer un évènement" + _pushEvent: + event: "Nom de l’évènement" + message: "Message à afficher lorsqu’il est activé" + variable: "Variable à envoyer" + no-variable: "Rien" + callAiScript: "Appeler AiScript" + _callAiScript: + functionName: "Nom de la fonction" + radioButton: "Choix" + _radioButton: + name: "Nom de la variable" + title: "Titre" + values: "Liste des choix (un par ligne)" + default: "Valeur par défaut" + script: + categories: + flow: "Contrôle" + logical: "Opération logique" + operation: "Calculer" + comparison: "Comparer" + random: "Aléatoire" + value: "Valeur" + fn: "Fonction" + text: "Manipulation de texte" + convert: "Convertir" + list: "Listes" + blocks: + text: "Texte" + multiLineText: "Texte (multi-ligne)" + textList: "Liste de texte" + _textList: + info: "Veuillez séparer chaque entrée avec un saut de ligne" + strLen: "Longueur du texte" + _strLen: + arg1: "Texte" + strPick: "Extraire un caractère" + _strPick: + arg1: "Texte" + arg2: "Position du joueur" + strReplace: "Remplacement de texte" + _strReplace: + arg1: "Texte" + arg2: "Avant le remplacement" + arg3: "Après le remplacement" + strReverse: "Inverser le texte" + _strReverse: + arg1: "Texte" + join: "Concaténer du texte" + _join: + arg1: "Listes" + arg2: "Séparateur" + add: "Ajouter" + _add: + arg1: "A" + arg2: "B" + subtract: "Soustraire" + _subtract: + arg1: "A" + arg2: "B" + multiply: "Multiplier par" + _multiply: + arg1: "A" + arg2: "B" + divide: "Diviser par" + _divide: + arg1: "A" + arg2: "B" + mod: "Reste" + _mod: + arg1: "A" + arg2: "B" + round: "Arrondir les décimales" + _round: + arg1: "Numérique" + eq: "A et B sont égaux" + _eq: + arg1: "A" + arg2: "B" + notEq: "A et B sont différents" + _notEq: + arg1: "A" + arg2: "B" + and: "A et B" + _and: + arg1: "A" + arg2: "B" + or: "A ou B" + _or: + arg1: "A" + arg2: "B" + lt: "A est inférieur à B" + _lt: + arg1: "A" + arg2: "B" + gt: "A est supérieur à B" + _gt: + arg1: "A" + arg2: "B" + ltEq: "A est inférieur ou égal à B" + _ltEq: + arg1: "A" + arg2: "B" + gtEq: "A est supérieur ou égal à B" + _gtEq: + arg1: "A" + arg2: "B" + if: "Branche" + _if: + arg1: "Si" + arg2: "Si" + arg3: "Sinon" + not: "Nier" + _not: + arg1: "Nier" + random: "Aléatoire" + _random: + arg1: "Probabilité" + rannum: "Nombre aléatoire" + _rannum: + arg1: "Minimum" + arg2: "Maximum" + randomPick: "Sélectionner au hasard dans la liste" + _randomPick: + arg1: "Listes" + dailyRandom: "Aléatoire (Quotidien pour chaque utilisateur)" + _dailyRandom: + arg1: "Probabilité" + dailyRannum: "Numéros aléatoires (Quotidien pour chaque utilisateur)" + _dailyRannum: + arg1: "Minimum" + arg2: "Maximum" + dailyRandomPick: "Sélectionné au hasard dans la liste (Quotidien pour chaque\ + \ utilisateur)" + _dailyRandomPick: + arg1: "Listes" + seedRandom: "Aléatoire (graine)" + _seedRandom: + arg1: "Graine" + arg2: "Probabilité" + seedRannum: "Nombre aléatoire (Graine)" + _seedRannum: + arg1: "Graine" + arg2: "Minimum" + arg3: "Maximum" + seedRandomPick: "Sélectionné au hasard dans la liste (graine)" + _seedRandomPick: + arg1: "Graine" + arg2: "Listes" + DRPWPM: "Sélectionné au hasard dans une liste de probabilités (Quotidien pour\ + \ chaque utilisateur)" + _DRPWPM: + arg1: "Liste de texte" + pick: "Sélectionner dans la liste" + _pick: + arg1: "Listes" + arg2: "Position" + listLen: "Longueur de la liste" + _listLen: + arg1: "Listes" + number: "Numérique" + stringToNumber: "Convertir du texte en numérique" + _stringToNumber: + arg1: "Texte" + numberToString: "Convertir du numérique en texte" + _numberToString: + arg1: "Numérique" + splitStrByLine: "Séparer le texte par des sauts de lignes" + _splitStrByLine: + arg1: "Texte" + ref: "Variables" + aiScriptVar: "Variable d'AiScript" + fn: "Fonction" + _fn: + slots: "Slots" + slots-info: "Veuillez insérer un seul slot par ligne" + arg1: "Sortie" + for: "Répéter" + _for: + arg1: "Compter" + arg2: "Action" + typeError: "Le slot {slot} accepte \"{expect}\" mais a \"{actual}\" !" + thereIsEmptySlot: "Slot {slot} est vide !" + types: + string: "Texte" + number: "Numérique" + boolean: "Marqueur" + array: "Listes" + stringArray: "Liste de texte" + emptySlot: "Slot vide" + enviromentVariables: "Variables d'environnement" + pageVariables: "Élément de page" + argVariables: "Entrée slot" +_relayStatus: + requesting: "En attente" + accepted: "Accepté" + rejected: "Refusée" +_notification: + fileUploaded: "Le fichier a été téléversé !" + youGotMention: "{name} vous a mentionné" + youGotReply: "Réponse de {name}" + youGotQuote: "Cité·e par {name}" + youRenoted: "{name} vous a Renoté" + youGotPoll: "{name} a participé à votre sondage" + youGotMessagingMessageFromUser: "{name} vous envoyé un message" + youGotMessagingMessageFromGroup: "Un message a été envoyé au groupe {name}" + youWereFollowed: "Vous suit" + youReceivedFollowRequest: "Vous avez reçu une demande d’abonnement" + yourFollowRequestAccepted: "Votre demande d’abonnement a été accepté" + youWereInvitedToGroup: "Invité·e au groupe" + pollEnded: "Les résultats du sondage sont disponibles" + emptyPushNotificationMessage: "Les notifications push ont été mises à jour" + _types: + all: "Toutes" + follow: "Nouvel·le abonné·e" + mention: "Mentions" + reply: "Réponses" + renote: "Renotes" + quote: "Citations" + reaction: "Réactions" + pollVote: "Votes dans des sondages" + receiveFollowRequest: "Demande d'abonnement reçue" + followRequestAccepted: "Demande d'abonnement acceptée" + groupInvited: "Invitation à un groupe" + app: "Notifications provenant des apps" + pollEnded: Fin du sondage + _actions: + followBack: "Suivre" + reply: "Répondre" + renote: "Renoter" +_deck: + alwaysShowMainColumn: "Toujours afficher la colonne principale" + columnAlign: "Aligner les colonnes" + addColumn: "Ajouter une colonne" + swapLeft: "Déplacer à gauche" + swapRight: "Déplacer à droite" + swapUp: "Déplacer vers le haut" + swapDown: "Déplacer vers le bas" + stackLeft: "Empiler à gauche" + popRight: "Extraire à droite" + profile: "Profil" + _columns: + main: "Principale" + widgets: "Widgets" + notifications: "Notifications" + tl: "Fil" + antenna: "Antennes" + list: "Listes" + mentions: "Mentions" + direct: "Direct" + introduction: Créer l'interface parfaite pour vous en arrangeant les colonnes librement + ! + introduction2: Cliquer sur le + sur la droite de l'écran pour ajouter de nouvelles + colonnes à tout moment. +keepOriginalUploadingDescription: Enregistrer l'image originale telle quelle. Si désactivé, + une version à afficher sur le web sera générée au chargement. +manageGroups: Gérer les groupes +moderation: Modération +disableDrawer: Ne pas utiliser des menus à tiroir +preferencesBackups: Sauvegarde des préférences +confirmToUnclipAlreadyClippedNote: Ce message fait déjà partie du clip "{name}". Voudriez-vous + plutôt le supprimer du clip ? +instanceSecurity: Sécurité de l'instance +recommended: Recommandé +recentNDays: Les derniers {n} jours +recentNHours: Les dernières {n} heures +check: Vérifier +thereIsUnresolvedAbuseReportWarning: Il y a des signalements non résolus. +numberOfPageCacheDescription: Augmenter ce nombre augmentera le confort des utilisateur⋅rice⋅s + mais augmentera la charge de travail du serveur, plus de mémoire sera utilisée. +logoutConfirm: Confirmer la déconnexion ? +lastActiveDate: Dernière utilisation le +cannotUploadBecauseNoFreeSpace: Mise en ligne échouée faute de place sur le Drive. +remoteOnly: Distant seulement +showUpdates: Afficher une fenêtre en sur-impression quand Calckey se met à jour +recommendedInstances: Instances recommandées +caption: Description automatique +migration: Migration +showAdminUpdates: Indiquer qu'une nouvelle version de Calckey est disponible (admin + seulement) +replayTutorial: Relancer le tutoriel +moveTo: Migrer le compte courant vers un nouveau compte +moveFromDescription: Ceci va configurer un alias pour votre ancien compte afin que + vous puissiez migrer de cet ancien compte à l'actuel. Faites ceci AVANT de migrer + de votre ancien compte. Merci d'entrer la mention de l'ancien compte sous ce format + @personne@instance.com +_sensitiveMediaDetection: + sensitivityDescription: Réduire la sensibilité conduira à moins de mauvaises détections + (faux positifs) alors que l'augmenter mènera à moins de détection manquées (faux + négatifs). + analyzeVideosDescription: Analyser les vidéos en plus des images. Cela augmentera + légèrement la charge du serveur. + setSensitiveFlagAutomatically: Marquer comme sensible (NSFW) + sensitivity: Sensibilité de la détection + analyzeVideos: Activer l'analyse des vidéos + setSensitiveFlagAutomaticallyDescription: Les résultats de la détection interne + seront conservés même si cette option est désactivée. + description: Réduit potentiellement l'effort de la modération du serveur en reconnaissant + automatiquement les médias sensibles (NSFW) via de l'intelligence artificielle. + Cela va augmenter légèrement la charge du serveur. +_messaging: + dms: Privé + groups: Groupes +cannotUploadBecauseExceedsFileSizeLimit: Le fichier n'a pas pu être chargé car il + dépasse la taille maximum autorisée. +moveAccountDescription: Ce processus est irréversible. Soyez sûr⋅e que vous avez préparé + un alias pour ce compte sur votre nouveau compte avant de migrer. Merci d'entrer + la mention du compte formaté comme ceci @personne@instance.com +moveAccount: Déplacer le compte ! +seperateRenoteQuote: Séparer les renotes et les boutons de citation +failedToFetchAccountInformation: Impossible de récupérer les informations de compte +noEmailServerWarning: Serveur mail non configuré. +deleteAccount: Supprimer le compte +document: Documentation +numberOfPageCache: Nombre de pages mise en cache +fast: Rapide +failedToUpload: Mise en ligne échouée +enableAutoSensitiveDescription: Permet la détection automatique des médias sensibles + (NSFW) via une intelligence artificielle, quand c'est possible. Même si cette option + est désactivée, elle peut être enclenchée au niveau de l'instance. +activeEmailValidationDescription: Active une vérification plus poussée des adresses + e-mail, ce qui inclut de vérifier la présence d’e-mail jetables et s'il est possible + de communiquer avec ces adresses. Si désactivé, seul le format de l’e-mail est vérifié. +adminCustomCssWarn: Ce paramètre ne devrait être utilisé que si vous savez ce qu'il + fait. Entrer des valeurs impropres pourraient empêcher les clients de TOUT LE MONDE + de fonctionner. Assurez-vous que votre CSS fonctionne correctement en l'essayant + dans vos paramètres utilisateur. +swipeOnDesktop: Permettre le style de glissement de fenêtre de mobile sur PC +moveFromLabel: 'Compte depuis lequel vous migrez :' +migrationConfirm: "Êtes-vous absolument certain⋅e que vous voulez migrer votre compte\ + \ vers {account} ? Une fois fait, vous ne pourrez pas revenir en arrière, et vous\ + \ ne pourrez plus utiliser le compte actuel normalement à nouveau.\nAussi, assurez-vous\ + \ d'avoir configuré le compte actuel comme le compte depuis lequel vous migrez." +_preferencesBackups: + updatedAt: 'Mis à jour le : {date} {time}' + cannotLoad: Le chargement a échoué + invalidFile: Format de fichier invalide + saveConfirm: Enregistrer la sauvegarde sous le nom {name} ? + deleteConfirm: Supprimer la sauvegarde {name} ? + nameAlreadyExists: Une sauvegarde nommée "{name}" existe déjà. Merci d'entrer un + autre nom. + applyConfirm: Voulez-vous vraiment appliquer la sauvegarde "{name} à cet appareil + ? Les réglages existants de cet appareil seront écrasés. + noBackups: Aucune sauvegarde n'existe. Vous pouvez sauvegarder les paramètres de + votre client sur ce serveur en utilisant "Créer une nouvelle sauvegarde". + createdAt: 'Crée le : {date} {time}' + renameConfirm: Renommer la sauvegarde "{old}" en "{new}" ? + list: Sauvegardes créées + saveNew: Faire une nouvelle sauvegarde + loadFile: Charger depuis le fichier + apply: Appliquer à l'appareil + save: Enregistrer les changements + inputName: Merci d'entrer un nom pour cette sauvegarde + cannotSave: La sauvegarde a échoué +privateMode: Mode privé +privateModeInfo: Si activé, seules les instances autorisées peuvent fédérer avec votre + instance. Toutes les publications seront masquées de la visibilité publique. +allowedInstances: Instances autorisées +driveCapOverrideLabel: Changer la capacité du drive pour cet utilisateur +driveCapOverrideCaption: Réinitialiser la capacité à la valeur par défaut en entrant + 0 ou moins. +pleaseSelect: Sélectionner une option +customMOTD: Message du jour personnalisé (Message d'écran de démarrage) +refreshInterval: 'Intervalle de mise à jour ' +type: Type +speed: Vitesse +slow: Lent +move: Déplacer +showAds: Afficher les annonces +enterSendsMessage: Appuyer sur Entrée pendant la rédaction pour envoyer le message + (sinon Ctrl+Entrée) +allowedInstancesDescription: Hôtes des instances autorisées pour la fédération, chacun + séparé par une nouvelle ligne (s'applique uniquement en mode privé). +enableAutoSensitive: Marquage automatique du contenu sensible (NSFW) +regexpErrorDescription: "Il y a eu une erreur dans l'expression régulière à la ligne\ + \ {line} de votre {tab} des mots masqués :" +forwardReportIsAnonymous: À la place de votre compte, un compte système anonyme sera + affiché comme rapporteur à l'instance distante. +noThankYou: Non merci +addInstance: Ajouter une instance +renoteMute: Mettre en silence les renotes +flagSpeakAsCat: Parler comme un chat +flagSpeakAsCatDescription: Vos messages seront nyanifiés en mode chat +hiddenTags: Hashtags cachés +hiddenTagsDescription: "Lister les hashtags (sans le #) que vous souhaitez cacher\ + \ de tendances et explorer. Les hashtags cachés sont toujours découvrables par d'autres\ + \ moyens. Les instances bloqués ne sont pas ne sont pas affectés, même si ils sont\ + \ présent dans cette liste." +antennaInstancesDescription: Lister un hôte d'instance par ligne +userSaysSomethingReason: '{name} a dit {reason}' +breakFollowConfirm: Êtes vous sur de vouloir retirer l'abonné ? +recommendedInstancesDescription: Instances recommandées séparées par une nouvelle + ligne pour apparaître dans la timeline recommandée. Ne PAS ajouter `https://`, SEULEMENT + le domaine. +sendPushNotificationReadMessage: Supprimer les notifications push une fois que les + notifications ou messages concernés ont été lus +sendPushNotificationReadMessageCaption: Une notification contenant le texte "{emptyPushNotificationMessage}" + sera affichée pendant un court instant. Cela peut augmenter la consommation de batterie + de votre appareil. +splash: Écran d’Accueil +pushNotificationNotSupported: Votre navigateur ou instance ne supporte pas les notifications + push +customMOTDDescription: Messages personnalisé pour le message du jour (sur l'écran + d’accueil), séparés par des retours à la ligne, affichés au hasard à chaque (re)chargement + de page. +customSplashIcons: Icônes de l'écran d’accueil personnalisées (urls) +customSplashIconsDescription: URLs pour les icônes personnalisées de l'écran d’accueil, + séparés par des retours à la ligne, qui seront affichées aléatoirement à chaque + (re)chargement de page. Assurez-vous que les images sont sur des URL statiques, + de préférence toutes de taille 192x192. +updateAvailable: Une mise à jour est peut-être disponible ! +accountMoved: "L'utilisateur a migré vers un nouveau compte :" +enableEmojiReactions: Activer les réactions par émojis +showEmojisInReactionNotifications: Montrer les émojis dans les notifications de réactions +renoteUnmute: Notifier les renotes +selectInstance: Choisir une instance +noInstances: Il n'y a aucune instance +showLocalPosts: 'Montrer les notes locales dans :' +homeTimeline: Timeline d'Accueil +socialTimeline: Timeline Sociale +requireAdminForView: Vous avez besoin d'un compte d'administration pour voir cela. +isSystemAccount: Un compte créé et géré automatiquement par le système. +typeToConfirm: Entrer {x} pour confirmer +statusbar: Barre d'état +sensitiveMediaDetection: Détection des médias sensibles (NSFW) +cannotUploadBecauseInappropriate: Ce fichier n'a pas pu être mis en ligne, car il + a été détecté comme potentiellement sensible (NSFW). +beta: Beta +navbar: Barre de navigation +shuffle: Mélanger +pushNotification: Notifications push +subscribePushNotification: Activer les notifications push +unsubscribePushNotification: Désactiver les notifications push +pushNotificationAlreadySubscribed: Notifications push déjà activées +logoImageUrl: URL de l'image du logo +moveToLabel: 'Compte vers lequel vous migrez :' +moveFrom: Migrer vers ce compte depuis un ancien compte +defaultReaction: Émoji de réaction par défaut pour les notes entrantes et sortantes +license: Licence +indexPosts: Indexer les Notes +indexNotice: Indexation en cours. Cela prendra certainement du temps, veuillez ne + pas redémarrer votre serveur pour au moins une heure. +customKaTeXMacro: Macros KaTeX personnalisées +enableCustomKaTeXMacro: Activer les macros KaTeX personnalisées +noteId: ID de note +customKaTeXMacroDescription: "Définissez des macros pour écrire des expressions mathématiques\ + \ simplement ! La notation se conforme aux définitions de commandes LaTeX et s'écrit\ + \ \\newcommand{\\name}{content} ou \\newcommand{\\name}[number of arguments]{content}.\ + \ Par exemple, \\newcommand{\\add}[2]{#1 + #2} étendra \\add{3}{foo} en 3 + foo.\ + \ Les accolades entourant le nom de la macro peuvent être changés pour des parenthèses\ + \ ou des crochets. Cela affectera les types de parenthèses utilisées pour les arguments.\ + \ Une (et une seule) macro peut être définie par ligne, et vous ne pouvez pas couper\ + \ la ligne au milieu d'une définition. Les lignes invalides sont simplement ignorées.\ + \ Seulement de simples fonctions de substitution de chaines sont supportées; la\ + \ syntaxe avancée, telle que la ramification conditionnelle, ne peut pas être utilisée\ + \ ici." +enableRecommendedTimeline: Activer la chronologie recommandée +silenceThisInstance: Ne plus montrer cet instance +silencedInstances: Instances silencieuses +silenced: Silencieux +deleted: Effacé +editNote: Modifier note +edited: 'Modifié à {date} {time}' +flagShowTimelineRepliesDescription: Si activé, affiche dans le fil les réponses des + personnes aux publications des autres. +_experiments: + alpha: Alpha + beta: Beta + enablePostEditing: Autoriser l'édition de note + title: Expérimentations +findOtherInstance: Trouver un autre serveur +userSaysSomethingReasonQuote: '{name} a cité une note contenant {reason}' +signupsDisabled: Les inscriptions sur ce serveur sont actuellement désactivés, mais + vous pouvez toujours vous inscrire sur un autre serveur ! Si vous avez un code d'invitation + pour ce serveur, entrez-le ci-dessous s'il vous plait. +apps: Applications +userSaysSomethingReasonReply: '{noms} a répondu à une note contenant {raison}' +defaultValueIs: 'défaut : {valeur}' diff --git a/fe_calckey/frontend/locales/id-ID.yml b/fe_calckey/frontend/locales/id-ID.yml new file mode 100644 index 0000000..17bebe9 --- /dev/null +++ b/fe_calckey/frontend/locales/id-ID.yml @@ -0,0 +1,1792 @@ +_lang_: "Bahasa Indonesia" +headlineMisskey: "Jaringan terhubung melalui catatan" +introMisskey: "Selamat datang! Calckey adalah perangkat mikroblog tercatu bersifat\ + \ sumber terbuka.\nMulailah menuliskan catatan, bagikan peristiwa terkini, serta\ + \ ceritakan segala tentangmu.\U0001F4E1\nTunjukkan juga reaksimu pada catatan pengguna\ + \ lain.\U0001F44D\nMari jelajahi dunia baru\U0001F680" +monthAndDay: "{day} {month}" +search: "Penelusuran" +notifications: "Pemberitahuan" +username: "Nama Pengguna" +password: "Kata sandi" +forgotPassword: "Lupa Kata Sandi" +fetchingAsApObject: "Mengambil data dari Fediverse" +ok: "OK" +gotIt: "Saya mengerti" +cancel: "Batalkan" +enterUsername: "Masukkan nama pengguna" +renotedBy: "direnote oleh {user}" +noNotes: "Tidak ada catatan" +noNotifications: "Tidak ada pemberitahuan" +instance: "Instansi" +settings: "Pengaturan" +basicSettings: "Pengaturan umum" +otherSettings: "Pengaturan lainnya" +openInWindow: "Buka di jendela" +profile: "Profil" +timeline: "Linimasa" +noAccountDescription: "Pengguna ini belum menulis bio" +login: "Masuk" +loggingIn: "Sedang masuk" +logout: "Keluar" +signup: "Daftar" +uploading: "Sedang mengunggah" +save: "Simpan" +users: "Pengguna" +addUser: "Tambah pengguna" +favorite: "Favorit" +favorites: "Favorit" +unfavorite: "Hapus favorit" +favorited: "Ditambahkan ke favorit" +alreadyFavorited: "Telah ditambahkan ke favorit" +cantFavorite: "Tidak dapat menambahkan ke favorit" +pin: "Sematkan ke profil" +unpin: "Lepas sematan dari profil" +copyContent: "Salin konten" +copyLink: "Salin tautan" +delete: "Hapus" +deleteAndEdit: "Hapus dan sunting" +deleteAndEditConfirm: "Apakah kamu yakin ingin menghapus note ini dan menyuntingnya?\ + \ Kamu akan kehilangan semua reaksi, renote dan balasan di note ini." +addToList: "Tambahkan ke daftar" +sendMessage: "Kirim pesan" +copyUsername: "Salin nama pengguna" +searchUser: "Cari pengguna" +reply: "Balas" +loadMore: "Selebihnya" +showMore: "Selebihnya" +showLess: "Tutup" +youGotNewFollower: "Mengikuti kamu" +receiveFollowRequest: "Ingin mengikuti kamu" +followRequestAccepted: "Permintaan mengikuti telah disetujui" +mention: "Sebut" +mentions: "Sebutan" +directNotes: "Catatan langsung" +importAndExport: "Impor & Ekspor" +import: "Impor" +export: "Ekspor" +files: "Berkas" +download: "Unduh" +driveFileDeleteConfirm: "Hapus {name}? Catatan dengan berkas terkait juga akan terhapus." +unfollowConfirm: "Berhenti mengikuti {name}?" +exportRequested: "Kamu telah meminta ekspor. Ini akan memakan waktu sesaat. Setelah\ + \ ekspor selesai, berkas yang dihasilkan akan ditambahkan ke Drive" +importRequested: "Kamu telah meminta impor. Ini akan memakan waktu sesaat." +lists: "Daftar" +noLists: "Kamu tidak memiliki daftar apapun" +note: "Catat" +notes: "Catatan" +following: "Ikuti" +followers: "Pengikut" +followsYou: "Mengikuti kamu" +createList: "Buat daftar" +manageLists: "Sunting daftar" +error: "Galat" +somethingHappened: "Terjadi kesalahan" +retry: "Coba lagi" +pageLoadError: "Gagal memuat halaman." +pageLoadErrorDescription: "Umumnya disebabkan jaringan atau tembolok perambah. Cobalah\ + \ bersihkan tembolok peramban lalu tunggu sesaat sebelum mencoba kembali." +serverIsDead: "Tidak ada respon dari peladen. Mohon tunggu dan coba beberapa saat\ + \ lagi." +youShouldUpgradeClient: "Untuk melihat halaman ini, mohon muat ulang untuk memutakhirkan\ + \ klienmu." +enterListName: "Masukkan nama daftar" +privacy: "Privasi" +makeFollowManuallyApprove: "Permintaan mengikuti membutuhkan persetujuan" +defaultNoteVisibility: "Privasi bawaan catatan" +follow: "Ikuti" +followRequest: "Permintaan mengikuti" +followRequests: "Permintaan mengikuti" +unfollow: "Berhenti mengikuti" +followRequestPending: "Permintaan mengikuti yang menunggu" +enterEmoji: "Masukkan emoji" +renote: "Renote" +unrenote: "Hapus renote" +renoted: "Telah direnote" +cantRenote: "Postingan ini tidak dapat direnote" +cantReRenote: "Renote tidak dapat direnote" +quote: "Kutip" +pinnedNote: "Catatan yang disematkan" +pinned: "Sematkan ke profil" +you: "Kamu" +clickToShow: "Klik untuk melihat" +sensitive: "Konten sensitif" +add: "Tambahkan" +reaction: "Reaksi" +reactionSetting: "Reaksi untuk dimunculkan di bilah reaksi" +reactionSettingDescription2: "Geser untuk memindah urutkan, klik untuk menghapus,\ + \ tekan \"+\" untuk menambahkan" +rememberNoteVisibility: "Ingat pengaturan visibilitas catatan" +attachCancel: "Hapus lampiran" +markAsSensitive: "Tandai sebagai konten sensitif" +unmarkAsSensitive: "Hapus tanda konten sensitif" +enterFileName: "Masukkan nama berkas" +mute: "Bisukan" +unmute: "Hapus bisukan" +block: "Blokir" +unblock: "Buka blokir" +suspend: "Bekukan" +unsuspend: "Buka pembekuan" +blockConfirm: "Apakah kamu yakin ingin memblokir akun ini?" +unblockConfirm: "Apakah kamu yakin ingin membuka blokir akun ini?" +suspendConfirm: "Apakah kamu yakin ingin membekukan akun ini?" +unsuspendConfirm: "Apakah kamu yakin ingin membuka pembekuan akun ini?" +selectList: "Pilih daftar" +selectAntenna: "Pilih Antena" +selectWidget: "Pilih gawit" +editWidgets: "Sunting gawit" +editWidgetsExit: "Selesai" +customEmojis: "Emoji kustom" +emoji: "Emoji" +emojis: "Emoji" +emojiName: "Nama emoji" +emojiUrl: "URL Emoji" +addEmoji: "Tambahkan emoji" +settingGuide: "Pengaturan rekomendasi" +cacheRemoteFiles: "Tembolokkan berkas remote" +cacheRemoteFilesDescription: "Ketika pengaturan ini dinonaktifkan, berkas luar akan\ + \ dimuat langsung dari instansi luar. Menonaktifkan ini akan mengurangi penggunaan\ + \ penyimpanan, namun dapat menyebabkan meningkatkan lalu lintas bandwidth, karena\ + \ thumbnail tidak dihasilkan." +flagAsBot: "Atur akun ini sebagai Bot" +flagAsBotDescription: "Jika akun ini dikendalikan oleh program, tetapkanlah opsi ini.\ + \ Jika diaktifkan, ini akan berfungsi sebagai tanda bagi pengembang lain untuk mencegah\ + \ interaksi berantai dengan bot lain dan menyesuaikan sistem internal Calckey untuk\ + \ memperlakukan akun ini sebagai bot." +flagAsCat: "Atur akun ini sebagai kucing" +flagAsCatDescription: "Nyalakan tanda ini untuk menandai akun ini sebagai kucing." +flagShowTimelineReplies: "Tampilkan balasan di linimasa" +flagShowTimelineRepliesDescription: "Menampilkan balasan pengguna dari note pengguna\ + \ lain di linimasa apabila dinyalakan." +autoAcceptFollowed: "Setujui otomatis permintaan mengikuti dari pengguna yang kamu\ + \ ikuti" +addAccount: "Tambahkan akun" +loginFailed: "Gagal untuk masuk" +showOnRemote: "Lihat profil asli" +general: "Umum" +wallpaper: "Wallpaper" +setWallpaper: "Atur wallpaper" +removeWallpaper: "Hapus wallpaper" +searchWith: "Cari: {q}" +youHaveNoLists: "Kamu tidak memiliki daftar apapun" +followConfirm: "Apakah kamu yakin ingin mengikuti {name}?" +proxyAccount: "Akun proksi" +proxyAccountDescription: "Akun proksi merupakan sebuah akun yang bertindak sebagai\ + \ pengikut luar untuk pengguna dalam kondisi tertentu. Sebagai contoh, ketika pengguna\ + \ menambahkan seorang pengguna luar ke dalam daftar, aktivitas dari pengguna luar\ + \ tidak akan disampaikan ke instansi apabila tidak ada pengguna lokal yang mengikuti\ + \ pengguna tersebut, dengan begitu akun proksilah yang akan mengikutinya." +host: "Host" +selectUser: "Pilih pengguna" +recipient: "Penerima" +annotation: "Keterangan konten" +federation: "Federasi" +instances: "Instansi" +registeredAt: "Terdaftar" +latestRequestSentAt: "Permintaan terakhir dikirim pada" +latestRequestReceivedAt: "Permintaan terakhir diterima pada" +latestStatus: "Status terakhir" +storageUsage: "Penggunaan penyimpanan" +charts: "Grafik" +perHour: "per Jam" +perDay: "per Hari" +stopActivityDelivery: "Berhenti mengirim aktivitas" +blockThisInstance: "Blokir instansi ini" +operations: "Tindakan" +software: "Perangkat lunak" +version: "Versi" +metadata: "Metadata" +monitor: "Pantau" +jobQueue: "Antrian kerja" +cpuAndMemory: "CPU dan Memori" +network: "Jaringan" +disk: "Diska" +instanceInfo: "Informasi Instansi" +statistics: "Statistik" +clearQueue: "Bersihkan antrian" +clearQueueConfirmTitle: "Apakah kamu yakin ingin membersihkan antrian?" +clearQueueConfirmText: "Seluruh sisa catatan yang tidak tersampaikan di dalam antrian\ + \ tidak akan difederasi. Biasanya operasi ini TIDAK dibutuhkan." +clearCachedFiles: "Hapus tembolok" +clearCachedFilesConfirm: "Apakah kamu yakin ingin menghapus seluruh tembolok berkas\ + \ remote?" +blockedInstances: "Instansi terblokir" +blockedInstancesDescription: "Daftar nama host dari instansi yang diperlukan untuk\ + \ diblokir. Instansi yang didaftarkan tidak akan dapat berkomunikasi dengan instansi\ + \ ini." +muteAndBlock: "Bisukan / Blokir" +mutedUsers: "Pengguna yang dibisukan" +blockedUsers: "Pengguna yang diblokir" +noUsers: "Tidak ada pengguna" +editProfile: "Sunting profil" +noteDeleteConfirm: "Apakah kamu yakin ingin menghapus catatan ini?" +pinLimitExceeded: "Kamu tidak dapat menyematkan catatan lagi" +intro: "Instalasi Calckey telah selesai! Mohon untuk membuat pengguna admin." +done: "Selesai" +processing: "Memproses" +preview: "Pratinjau" +default: "Bawaan" +noCustomEmojis: "Tidak ada emoji kustom" +noJobs: "Tidak ada kerja" +federating: "memfederasi" +blocked: "Diblokir" +suspended: "Diberhentikan" +all: "Semua" +subscribing: "Berlangganan" +publishing: "Sedang menyiarkan langsung" +notResponding: "Tidak ada respon" +instanceFollowing: "Mengikuti instance" +instanceFollowers: "Pengikut instance" +instanceUsers: "Pengguna pada instance ini" +changePassword: "Ubah kata sandi" +security: "Keamanan" +retypedNotMatch: "Input tidak sama" +currentPassword: "Kata sandi saat ini" +newPassword: "Kata sandi baru" +newPasswordRetype: "Ulangi kata sandi baru" +attachFile: "Lampirkan berkas" +more: "Lagi !" +featured: "Sorotan" +usernameOrUserId: "Nama pengguna atau User ID" +noSuchUser: "Pengguna tidak ditemukan" +lookup: "Mencari" +announcements: "Pengumuman" +imageUrl: "URL Gambar" +remove: "Hapus" +removed: "Telah dihapus" +removeAreYouSure: "Apakah kamu yakin ingin menghapus \"{x}\"?" +deleteAreYouSure: "Apakah kamu yakin ingin menghapus \"{x}\"?" +resetAreYouSure: "Yakin mau atur ulang?" +saved: "Telah disimpan" +messaging: "Pesan" +upload: "Unggah" +keepOriginalUploading: "Simpan gambar asli" +keepOriginalUploadingDescription: "Simpan gambar yang diunggah sebagaimana gambar\ + \ aslinya. Bila dimatikan, versi tampilan web akan dihasilkan pada saat diunggah." +fromDrive: "Dari Drive" +fromUrl: "Dari URL" +uploadFromUrl: "Unggah dari URL" +uploadFromUrlDescription: "URL berkas yang ingin kamu unggah" +uploadFromUrlRequested: "Pengunggahan telah diminta" +uploadFromUrlMayTakeTime: "Membutuhkan beberapa waktu hingga pengunggahan selesai" +explore: "Jelajahi" +messageRead: "Telah dibaca" +noMoreHistory: "Tidak ada sejarah lagi" +startMessaging: "Mulai mengirim pesan" +nUsersRead: "Dibaca oleh {n}" +agreeTo: "Saya setuju kepada {0}" +tos: "Syarat dan ketentuan" +start: "Mulai" +home: "Beranda" +remoteUserCaution: "Informasi ini mungkin tidak mutakhir, karena pengguna ini berasal\ + \ dari instansi luar." +activity: "Aktivitas" +images: "Gambar" +birthday: "Tanggal lahir" +yearsOld: "{age} tahun" +registeredDate: "Bergabung pada" +location: "Lokasi" +theme: "Tema" +themeForLightMode: "Tema untuk Mode Terang" +themeForDarkMode: "Tema untuk Mode Gelap" +light: "Terang" +dark: "Gelap" +lightThemes: "Tema Terang" +darkThemes: "Tema gelap" +syncDeviceDarkMode: "Sinkronkan mode gelap dengan pengaturan perangkat" +drive: "Drive" +fileName: "Nama berkas" +selectFile: "Pilih berkas" +selectFiles: "Pilih berkas" +selectFolder: "Pilih folder" +selectFolders: "Pilih folder" +renameFile: "Ubah nama berkas" +folderName: "Nama folder" +createFolder: "Buat folder" +renameFolder: "Ubah nama folder" +deleteFolder: "Hapus folder" +addFile: "Tambahkan berkas" +emptyDrive: "Drive kosong" +emptyFolder: "Folder kosong" +unableToDelete: "Tidak dapat menghapus" +inputNewFileName: "Masukkan nama berkas yang baru" +inputNewDescription: "Masukkan keterangan disini" +inputNewFolderName: "Masukkan nama folder yang baru" +circularReferenceFolder: "Folder tujuan adalah subfolder dari folder yang ingin kamu\ + \ pindahkan." +hasChildFilesOrFolders: "Karena folder ini tidak kosong, maka tidak dapat dihapus." +copyUrl: "Salin tautan" +rename: "Ubah nama" +avatar: "Avatar" +banner: "Banner" +nsfw: "Konten sensitif" +whenServerDisconnected: "Ketika kehilangan koneksi dengan peladen" +disconnectedFromServer: "Terputus koneksi dari peladen" +reload: "Muat ulang" +doNothing: "Abaikan" +reloadConfirm: "Apakah kamu ingin memuat ulang linimasa?" +watch: "Tonton" +unwatch: "Batal tonton" +accept: "Terima" +reject: "Tolak" +normal: "Normal" +instanceName: "Nama instance" +instanceDescription: "Tentang instance" +maintainerName: "Pengelola" +maintainerEmail: "Surel pengelola" +tosUrl: "URL Syarat dan Ketentuan" +thisYear: "Tahun ini" +thisMonth: "Bulan ini" +today: "Hari ini" +dayX: "{day}" +monthX: "{month}" +yearX: "{year}" +pages: "Halaman" +integration: "Integrasi" +connectService: "Sambungkan" +disconnectService: "Putuskan" +enableLocalTimeline: "Nyalakan linimasa lokal" +enableGlobalTimeline: "Nyalakan linimasa global" +disablingTimelinesInfo: "Admin dan Moderator akan selalu memiliki akses ke semua linimasa\ + \ meskipun linimasa tersebut tidak diaktifkan." +registration: "Pendaftaran" +enableRegistration: "Nyalakan pendaftaran pengguna baru" +invite: "Undang" +driveCapacityPerLocalAccount: "Kapasitas drive per pengguna lokal" +driveCapacityPerRemoteAccount: "Kapasitas drive per pengguna remote" +inMb: "dalam Megabytes" +iconUrl: "URL Gambar ikon" +bannerUrl: "URL Banner" +backgroundImageUrl: "URL Gambar latar" +basicInfo: "Informasi Umum" +pinnedUsers: "Pengguna yang disematkan" +pinnedUsersDescription: "Tuliskan satu nama pengguna dalam satu baris. Pengguna yang\ + \ dituliskan disini akan disematkan dalam bilah \"Jelajahi\"." +pinnedPages: "Halaman yang disematkan" +pinnedPagesDescription: "Masukkan tautan dari halaman yang kamu ingin sematkan ke\ + \ halaman utama dari instansi ini, dipisah dengan membuat baris baru." +pinnedClipId: "ID dari klip yang disematkan" +pinnedNotes: "Catatan yang disematkan" +hcaptcha: "hCaptcha" +enableHcaptcha: "Nyalakan hCaptcha" +hcaptchaSiteKey: "Site Key" +hcaptchaSecretKey: "Secret Key" +recaptcha: "reCAPTCHA" +enableRecaptcha: "Nyalakan reCAPTCHA" +recaptchaSiteKey: "Site key" +recaptchaSecretKey: "Secret Key" +avoidMultiCaptchaConfirm: "Menggunakan banyak Captcha dapat menyebabkan gangguan.\ + \ Apakah kamu ingin untuk menonaktifkan Captcha yang lain? Kamu dapat membiarkan\ + \ fitur ini tetap aktif dengan menekan tombol batal." +antennas: "Antena" +manageAntennas: "Pengelola Antena" +name: "Nama" +antennaSource: "Sumber Antenna" +antennaKeywords: "Kata kunci yang diterima" +antennaExcludeKeywords: "Kata kunci yang dikecualikan" +antennaKeywordsDescription: "Pisahkan dengan spasi untuk kondisi AND. Pisahkan dengan\ + \ baris baru untuk kondisi OR." +notifyAntenna: "Beritahu untuk catatan baru" +withFileAntenna: "Hanya tampilkan catatan dengan berkas yang dilampirkan" +enableServiceworker: "Aktifkan ServiceWorker" +antennaUsersDescription: "Tuliskan satu nama pengguna per baris" +caseSensitive: "Peka huruf besar dan huruf kecil" +withReplies: "Termasuk balasan" +connectedTo: "Akun yang mengikuti telah terhubung" +notesAndReplies: "Catatan dan balasan" +withFiles: "Media" +silence: "Bungkam" +silenceConfirm: "Apakah kamu yakin ingin membungkam pengguna ini?" +unsilence: "Hapus bungkam" +unsilenceConfirm: "Apakah kamu ingin untuk batal membungkam pengguna ini?" +popularUsers: "Pengguna populer" +recentlyUpdatedUsers: "Pengguna dengan aktivitas terkini" +recentlyRegisteredUsers: "Pengguna baru saja bergabung" +recentlyDiscoveredUsers: "Pengguna baru saja dilihat" +exploreUsersCount: "Terdapat {count} pengguna" +exploreFediverse: "Jelajahi Fediverse" +popularTags: "Tag populer" +userList: "Daftar" +about: "Informasi" +aboutMisskey: "Tentang Calckey" +administrator: "Admin" +token: "Token" +twoStepAuthentication: "Otentikasi dua faktor" +moderator: "Moderator" +nUsersMentioned: "{n} pengguna disebut" +securityKey: "Kunci keamanan" +securityKeyName: "Nama kunci" +registerSecurityKey: "Daftarkan kunci keamanan" +lastUsed: "Terakhir digunakan" +unregister: "Batalkan pendaftaran" +passwordLessLogin: "Setel login tanpa kata sandi" +resetPassword: "Atur ulang kata sandi" +newPasswordIs: "Kata sandi baru adalah \"{password}\"" +reduceUiAnimation: "Kurangi animasi antarmuka" +share: "Bagikan" +notFound: "Tidak dapat ditemukan" +notFoundDescription: "Tidak ada halaman sesuai dengan URL yang ditentukan." +uploadFolder: "Lokasi unggah folder bawaan" +cacheClear: "Bersihkan tembolok" +markAsReadAllNotifications: "Tandai semua pemberitahuan telah dibaca" +markAsReadAllUnreadNotes: "Tandai semua catatan telah dibaca" +markAsReadAllTalkMessages: "Tandai semua pesan telah dibaca" +help: "Bantuan" +inputMessageHere: "Ketik pesan disini" +close: "Tutup" +group: "Grup" +groups: "Grup" +createGroup: "Buat grup" +ownedGroups: "Grup yang dimiliki" +joinedGroups: "Grup yang diikuti" +invites: "Undang" +groupName: "Nama grup" +members: "Anggota" +transfer: "Transfer" +messagingWithUser: "Obrolan dengan pengguna lain" +messagingWithGroup: "Obrolan di dalam grup" +title: "Judul" +text: "Teks" +enable: "Aktifkan" +next: "Selanjutnya" +retype: "Masukkan ulang" +noteOf: "Catatan milik {user}" +inviteToGroup: "Undang ke grup" +quoteAttached: "Dikutip" +quoteQuestion: "Apakah kamu ingin menambahkan kutipan?" +noMessagesYet: "Tidak ada pesan" +newMessageExists: "Kamu mendapatkan pesan baru" +onlyOneFileCanBeAttached: "Kamu hanya dapat melampirkan satu berkas ke dalam pesan" +signinRequired: "Silahkan login" +invitations: "Undang" +invitationCode: "Kode undangan" +checking: "Memeriksa" +available: "Tersedia" +unavailable: "Tidak tersedia" +usernameInvalidFormat: "Hanya dapat menerima karakter a-z, A-Z dan angka 0-9." +tooShort: "Terlalu pendek" +tooLong: "Terlalu panjang" +weakPassword: "Kata sandi lemah" +normalPassword: "Kata sandi baik" +strongPassword: "Kata sandi kuat" +passwordMatched: "Kata sandi sama" +passwordNotMatched: "Kata sandi tidak sama" +signinWith: "Masuk dengan {x}" +signinFailed: "Tidak dapat masuk. Nama pengguna atau kata sandi yang kamu masukkan\ + \ salah." +tapSecurityKey: "Ketuk kunci keamanan kamu" +or: "atau" +language: "Bahasa" +uiLanguage: "Bahasa antarmuka pengguna" +groupInvited: "Telah diundang ke grup" +aboutX: "Tentang {x}" +useOsNativeEmojis: "Gunakan Emoji bawaan sistem operasi" +disableDrawer: "Jangan gunakan menu bergaya laci" +youHaveNoGroups: "Kamu tidak memiliki grup" +joinOrCreateGroup: "Bergabunglah dengan grup atau kamu dapat membuat grupmu sendiri." +noHistory: "Tidak ada riwayat" +signinHistory: "Riwayat masuk" +disableAnimatedMfm: "Nonaktifkan MFM dengan animasi" +doing: "Sedang berkerja..." +category: "Kategori" +tags: "Tandai" +docSource: "Sumber dari dokumen ini" +createAccount: "Buat akun" +existingAccount: "Akun yang ada" +regenerate: "Buat ulang" +fontSize: "Ukuran huruf" +noFollowRequests: "Kamu tidak memiliki permintaan mengikuti yang menunggu" +openImageInNewTab: "Buka gambar di tab baru" +dashboard: "Dasbor" +local: "Lokal" +remote: "Remote" +total: "Jumlah" +weekOverWeekChanges: "Mingguan" +dayOverDayChanges: "Harian" +appearance: "Tampilan" +clientSettings: "Pengaturan Klien" +accountSettings: "Pengaturan Akun" +promotion: "Promosi" +promote: "Promosikan" +numberOfDays: "Jumlah hari" +hideThisNote: "Sembunyikan catatan ini" +showFeaturedNotesInTimeline: "Tampilkan catatan yang diunggulkan di linimasa" +objectStorage: "Object Storage" +useObjectStorage: "Gunakan object storage" +objectStorageBaseUrl: "Base URL" +objectStorageBaseUrlDesc: "Prefix URL digunakan untuk mengkonstruksi URL ke object\ + \ (media) referencing. Tentukan URL jika kamu menggunakan CDN atau Proxy, jika tidak\ + \ tentukan alamat yang dapat diakses secara publik sesuai dengan panduan dari layanan\ + \ yang akan kamu gunakan, contohnya. 'https://.s3.amazonaws.com' untuk AWS\ + \ S3, dan 'https://storage.googleapis.com/' untuk GCS." +objectStorageBucket: "Bucket" +objectStorageBucketDesc: "Mohon tentukan nama bucket yang digunakan pada layanan yang\ + \ telah dikonfigurasi." +objectStoragePrefix: "Prefix" +objectStoragePrefixDesc: "Berkas tidak akan disimpan dalam direktori dari prefix ini." +objectStorageEndpoint: "Endpoint" +objectStorageEndpointDesc: "Kosongkan bagian ini jika kamu menggunakan AWS S3, jika\ + \ tidak tentukan endpoint sebagai '' atau ':' sesuai dengan panduan\ + \ dari layanan yang akan kamu gunakan." +objectStorageRegion: "Region" +objectStorageRegionDesc: "Tentukan region seperti 'xx-east-1'. Jika layanan kamu tidak\ + \ memiliki perbedaan mengenai region, kosongkan saja atau isi dengan 'us-east-1'." +objectStorageUseSSL: "Gunakan SSL" +objectStorageUseSSLDesc: "Matikan ini jika kamu tidak akan menggunakan HTTPS untuk\ + \ koneksi API" +objectStorageUseProxy: "Hubungkan melalui Proxy" +objectStorageUseProxyDesc: "Matikan ini jika kamu tidak akan menggunakan Proxy untuk\ + \ koneksi ObjectStorage" +objectStorageSetPublicRead: "Setel \"public-read\" disaat mengunggah" +serverLogs: "Log Peladen" +deleteAll: "Hapus semua" +showFixedPostForm: "Tampilkan form posting di atas linimasa." +newNoteRecived: "Kamu mendapat catatan baru" +sounds: "Bunyi" +listen: "Dengarkan" +none: "Tidak ada" +showInPage: "Tampilkan di halaman" +popout: "Pop-out" +volume: "Volume" +masterVolume: "Master volume" +details: "Selengkapnya" +chooseEmoji: "Pilih emoji" +unableToProcess: "Operasi tersebut tidak dapat diselesaikan." +recentUsed: "Baru saja digunakan" +install: "Pasang" +uninstall: "Copot pemasangan" +installedApps: "Aplikasi yang diijinkan" +nothing: "Tidak ada sama sekali disini" +installedDate: "Diijinkan" +lastUsedDate: "Terakhir digunakan" +state: "Kondisi" +sort: "Urutkan" +ascendingOrder: "Urutkan naik" +descendingOrder: "Urutkan menurun" +scratchpad: "Scratchpad" +scratchpadDescription: "Scratchpad menyediakan lingkungan eksperimen untuk AiScript.\ + \ Kamu bisa menulis, mengeksuksi, serta mengecek hasil yang berinteraksi dengan\ + \ Calckey." +output: "Keluaran" +script: "Script" +disablePagesScript: "Nonaktifkan script pada halaman" +updateRemoteUser: "Perbaharui informasi pengguna luar" +deleteAllFiles: "Hapus semua berkas" +deleteAllFilesConfirm: "Apakah kamu yakin ingin menghapus semua berkas?" +removeAllFollowing: "Tahan semua mengikuti" +removeAllFollowingDescription: "Batal mengikuti semua akun dari {host}. Mohon jalankan\ + \ ini ketika instansi sudah tidak ada lagi." +userSuspended: "Pengguna ini telah dibekukan." +userSilenced: "Pengguna ini telah dibungkam." +yourAccountSuspendedTitle: "Akun ini dibekukan" +yourAccountSuspendedDescription: "Akun ini dibekukan karena melanggar ketentuan penggunaan\ + \ layanan peladen atau semacamnya. Hubungi admin apabila ingin tahu alasan lebih\ + \ lanjut. Mohon untuk tidak membuat akun baru." +menu: "Menu" +divider: "Pembagi" +addItem: "Tambahkan item" +relays: "Relay" +addRelay: "Tambahkan relay" +inboxUrl: "URL Kotak masuk" +addedRelays: "Relay yang ditambahkan" +serviceworkerInfo: "Harus diaktifkan untuk pemberitahuan push." +deletedNote: "Catatan yang dihapus" +invisibleNote: "Catatan yang disembunyikan" +enableInfiniteScroll: "Aktifkan gulir tak terbatas" +visibility: "Visibilitas" +poll: "Angket" +useCw: "Sembunyikan konten" +enablePlayer: "Buka pemutar video" +disablePlayer: "Tutup pemutar video" +expandTweet: "Perluas utas" +themeEditor: "Penyunting tema" +description: "Deskripsi" +describeFile: "Tambahkan keterangan" +enterFileDescription: "Masukkan keterangan" +author: "Pembuat" +leaveConfirm: "Ada perubahan yang belum disimpan. Apakah kamu ingin membuangnya?" +manage: "Manajemen" +plugins: "Plugin" +deck: "Dek" +undeck: "Keluar dari dek" +useBlurEffectForModal: "Gunakan efek buram untuk modal" +useFullReactionPicker: "Gunakan pemilih reaksi ukuran penuh" +width: "Lebar" +height: "Tinggi" +large: "Besar" +medium: "Sedang" +small: "Kecil" +generateAccessToken: "Buat access token" +permission: "Izin" +enableAll: "Aktifkan semua" +disableAll: "Nonaktifkan semua" +tokenRequested: "Berikan ijin akses ke akun" +pluginTokenRequestedDescription: "Plugin ini dapat menggunakan setelan ijin disini." +notificationType: "Jenis pemberitahuan" +edit: "Sunting" +emailServer: "Peladen surel" +enableEmail: "Nyalakan distribusi surel" +emailConfigInfo: "Digunakan untuk mengonfirmasi surel kamu disaat mendaftar dan lupa\ + \ kata sandi" +email: "Surel" +emailAddress: "Alamat surel" +smtpConfig: "Konfigurasi peladen SMTP" +smtpHost: "Host" +smtpPort: "Port" +smtpUser: "Nama Pengguna" +smtpPass: "Kata sandi" +emptyToDisableSmtpAuth: "Kosongkan nama pengguna dan kata sandi untuk menonaktifkan\ + \ verifikasi SMTP" +smtpSecure: "Gunakan SSL/TLS implisit untuk koneksi SMTP" +smtpSecureInfo: "Matikan ini ketika menggunakan STARTTLS" +testEmail: "Tes pengiriman surel" +wordMute: "Bisukan kata" +regexpError: "Kesalahan ekspresi reguler" +regexpErrorDescription: "Galat terjadi pada baris {line} ekspresi reguler dari {tab}\ + \ kata yang dibisukan:" +instanceMute: "Bisuka instansi" +userSaysSomething: "{name} mengatakan sesuatu" +makeActive: "Aktifkan" +display: "Tampilkan" +copy: "Salin" +metrics: "Metrik" +overview: "Ikhtisar" +logs: "Log" +delayed: "Terlambat" +database: "Basis data" +channel: "Kanal" +create: "Buat" +notificationSetting: "Pengaturan Pemberitahuan" +notificationSettingDesc: "Pilih tipe pemberitahuan untuk ditampilkan" +useGlobalSetting: "Gunakan setelan global" +useGlobalSettingDesc: "Jika dinyalakan, setelan pemberitahuan akun kamu akan digunakan.\ + \ Jika dimatikan, konfigurasi secara individu dapat dibuat." +other: "Lainnya" +regenerateLoginToken: "Perbarui token login" +regenerateLoginTokenDescription: "Perbarui token yang digunakan secara internal saat\ + \ login. Normalnya aksi ini tidak diperlukan. Jika diperbarui, semua perangkat akan\ + \ dilogout." +setMultipleBySeparatingWithSpace: "Kamu dapat menyetel banyak dengan memisahkannya\ + \ menggunakan spasi." +fileIdOrUrl: "File-ID atau URL" +behavior: "Perilaku" +sample: "Contoh" +abuseReports: "Laporkan" +reportAbuse: "Laporkan" +reportAbuseOf: "Laporkan {name}" +fillAbuseReportDescription: "Mohon isi rincian laporan. Jika laporan ini mengenai\ + \ catatan yang spesifik, mohon lampirkan serta URL catatan tersebut." +abuseReported: "Laporan kamu telah dikirimkan. Terima kasih." +reporter: "Pelapor" +reporteeOrigin: "Yang dilaporkan" +reporterOrigin: "Pelapor" +forwardReport: "Teruskan laporan ke instansi luar" +forwardReportIsAnonymous: "Untuk melindungi privasi akun kamu, akun anonim dari sistem\ + \ akan digunakan sebagai pelapor pada instansi luar." +send: "Kirim" +abuseMarkAsResolved: "Tandai laporan sebagai selesai" +openInNewTab: "Buka di tab baru" +openInSideView: "Buka di tampilan samping" +defaultNavigationBehaviour: "Navigasi bawaan" +editTheseSettingsMayBreakAccount: "Menyunting pengaturan ini memiliki kemungkinan\ + \ untuk merusak akun kamu." +instanceTicker: "Informasi pengguna pada instansi" +waitingFor: "Menunggu untuk {x}" +random: "Acak" +system: "Sistem" +switchUi: "Ubah UI" +desktop: "Desktop" +clip: "Klip" +createNew: "Buat baru" +optional: "Opsional" +createNewClip: "Buat klip baru" +unclip: "Batalkan klip" +confirmToUnclipAlreadyClippedNote: "Catatan ini sudah disertakan di klip \"{name}\"\ + . Yakin ingin membatalkan catatan dari klip ini?" +public: "Publik" +i18nInfo: "Calckey diterjemahkan ke dalam banyak bahasa oleh sukarelawan. Kamu dapat\ + \ ikut membantu di {link}." +manageAccessTokens: "Kelola access token" +accountInfo: "Informasi akun" +notesCount: "Jumlah catatan" +repliesCount: "Jumlah balasan terkirim" +renotesCount: "Jumlah renote terkirim" +repliedCount: "Jumlah balasan diterima" +renotedCount: "Jumlah renote diterima" +followingCount: "Jumlah akun yang diikuti" +followersCount: "Jumlah pengikut" +sentReactionsCount: "Jumlah reaksi yang terkirim" +receivedReactionsCount: "Jumlah reaksi yang diterima" +pollVotesCount: "Jumlah suara yang terkirim" +pollVotedCount: "Jumlah suara yang diterima dalam angket" +yes: "Iya" +no: "Tidak" +driveFilesCount: "Jumlah berkas drive" +driveUsage: "Penggunaan ruang penyimpanan drive" +noCrawle: "Tolak pengindeksan crawler" +noCrawleDescription: "Meminta mesin pencari untuk tidak mengindeks halaman profil\ + \ kamu, catatan, Halaman, dll." +lockedAccountInfo: "Kecuali kamu menyetel visibilitas catatan milikmu ke \"Hanya pengikut\"\ + , catatan milikmu akan dapat dilihat oleh siapa saja, bahkan jika kamu memerlukan\ + \ pengikut untuk disetujui secara manual." +alwaysMarkSensitive: "Tandai media dalam catatan sebagai media sensitif" +loadRawImages: "Tampilkan lampiran gambar secara penuh daripada thumbnail" +disableShowingAnimatedImages: "Jangan mainkan gambar bergerak" +verificationEmailSent: "Surel verifikasi telah dikirimkan. Mohon akses tautan yang\ + \ telah disertakan untuk menyelesaikan verifikasi." +notSet: "Tidak disetel" +emailVerified: "Surel telah diverifikasi" +noteFavoritesCount: "Jumlah catatan yang difavoritkan" +pageLikesCount: "Jumlah suka yang diterima Halaman" +pageLikedCount: "Jumlah Halaman yang disukai" +contact: "Kontak" +useSystemFont: "Gunakan font bawaan sistem operasi" +clips: "Klip" +experimentalFeatures: "Fitur eksperimental" +developer: "Pengembang" +makeExplorable: "Buat akun tampil di \"Jelajahi\"" +makeExplorableDescription: "Jika kamu mematikan ini, akun kamu tidak akan muncul di\ + \ bagian \"Jelajahi:" +showGapBetweenNotesInTimeline: "Tampilkan jarak diantara catatan pada linimasa" +duplicate: "Duplikat" +left: "Kiri" +center: "Tengah" +wide: "Lebar" +narrow: "Sempit" +reloadToApplySetting: "Pengaturan ini akan diterapkan saat memuat halaman kembali.\ + \ Apakah kamu ingin memuat halaman kembali sekarang?" +needReloadToApply: "Pengaturan ini hanya akan diterapkan setelah memuat ulang halaman." +showTitlebar: "Tampilkan bilah judul" +clearCache: "Hapus tembolok" +onlineUsersCount: "{n} orang sedang daring" +nUsers: "{n} Pengguna" +nNotes: "{n} Catatan" +sendErrorReports: "Kirim laporan kesalahan" +sendErrorReportsDescription: "Ketika dinyalakan, informasi kesalahan rinci akan dibagikan\ + \ dengan Calckey ketika masalah terjadi, hal ini untuk membantu kualitas Calckey.\ + \ Fitur ini memungkinkan memuat informasi seperti sistem operasi yang kamu gunakan\ + \ dan versinya, aplikasi peramban yang kamu gunakan, riwayat aktivitas kamu, dll." +myTheme: "Tema saya" +backgroundColor: "Latar Belakang" +accentColor: "Aksen" +textColor: "Teks" +saveAs: "Simpan sebagai…" +advanced: "Tingkat lanjut" +value: "Nilai" +createdAt: "Dibuat pada" +updatedAt: "Diperbarui pada" +saveConfirm: "Simpan perubahan?" +deleteConfirm: "Yakin hapus?" +invalidValue: "Nilai tidak valid." +registry: "Registri" +closeAccount: "Tutup akun" +currentVersion: "Versi saat ini" +latestVersion: "Versi terkini" +youAreRunningUpToDateClient: "Kamu menggunakan versi terkini dari klienmu." +newVersionOfClientAvailable: "Versi terbaru dari klien kamu telah tersedia." +usageAmount: "Penggunaan" +capacity: "Kapasitas" +inUse: "Digunakan" +editCode: "Sunting kode" +apply: "Terapkan" +receiveAnnouncementFromInstance: "Terima pemberitahuan surel dari instansi ini" +emailNotification: "Pemberitahuan surel" +publish: "Terbitkan" +inChannelSearch: "Cari di kanal" +useReactionPickerForContextMenu: "Buka pemilih reaksi dengan klik-kanan" +typingUsers: "{users} sedang mengetik" +jumpToSpecifiedDate: "Loncat ke tanggal spesifik" +showingPastTimeline: "Sedang menampilkan linimasa lama" +clear: "Bersihkan" +markAllAsRead: "Tandai semua telah dibaca" +goBack: "Kembali" +unlikeConfirm: "Yakin ingin hapus sukamu?" +fullView: "Tampilan penuh" +quitFullView: "Keluar tampilan penuh" +addDescription: "Tambahkan deskripsi" +userPagePinTip: "Kamu dapat membuat catatan untuk ditampilkan disini dengan memilih\ + \ \"Sematkan ke profil\" dari menu pada catatan individu." +notSpecifiedMentionWarning: "Catatan ini mengandung sebutan dari pengguna yang tidak\ + \ dimuat sebagai penerima" +info: "Informasi" +userInfo: "Informasi pengguna" +unknown: "Tidak diketahui" +onlineStatus: "Status daring" +hideOnlineStatus: "Sembunyikan status daring" +hideOnlineStatusDescription: "Menyembunyikan status daring kamu umengurangi kenyamanan\ + \ untuk beberapa fungsi seperti contohnya pencarian." +online: "Daring" +active: "Aktif" +offline: "Luring" +notRecommended: "Tidak disarankan" +botProtection: "Perlindungan Bot" +instanceBlocking: "Instansi yang diblokir" +selectAccount: "Pilih akun" +switchAccount: "Ganti akun" +enabled: "Aktif" +disabled: "Nonaktif" +quickAction: "Aksi cepat" +user: "Pengguna" +administration: "Manajemen" +accounts: "Akun" +switch: "Beralih" +noMaintainerInformationWarning: "Informasi pengelola belum disetel." +noBotProtectionWarning: "Proteksi bot belum disetel." +configure: "Setel" +postToGallery: "Posting ke galeri" +gallery: "Galeri" +recentPosts: "Postingan terbaru" +popularPosts: "Postingan populer" +shareWithNote: "Bagikan dengan catatan" +ads: "Iklan" +expiration: "Batas akhir" +memo: "Memo" +priority: "Prioritas" +high: "Tinggi" +middle: "Sedang" +low: "Rendah" +emailNotConfiguredWarning: "Alamat surel tidak disetel." +ratio: "Rasio" +previewNoteText: "Tampilkan pratinjau" +customCss: "Custom CSS" +customCssWarn: "Pengaturan ini seharusnya digunakan jika kamu tahu cara kerjanya.\ + \ Memasukkan nilai yang tidak tepat dapat menyebabkan klien tidak berfungsi semestinya." +global: "Global" +squareAvatars: "Tampilkan avatar sebagai persegi" +sent: "Kirim" +received: "Diterima" +searchResult: "Hasil Penelusuran" +hashtags: "Tagar" +troubleshooting: "Penyelesaian Masalah" +useBlurEffect: "Gunakan efek blur pada antarmuka" +learnMore: "Pelajari lebih lanjut" +misskeyUpdated: "Calckey telah dimutakhirkan!" +whatIsNew: "Lihat perubahan pemutakhiran" +translate: "Terjemahkan" +translatedFrom: "Terjemahkan dari {x}" +accountDeletionInProgress: "Penghapusan akun sedang dalam proses" +usernameInfo: "Nama yang mengidentifikasikan akun kamu dari yang lain pada peladen\ + \ ini. Kamu dapat menggunakan alfabet (a~z, A~Z), digit (0~9) atau garis bawah (_).\ + \ Username tidak dapat diubah setelahnya." +aiChanMode: "Mode Ai" +keepCw: "Biarkan Peringatan Konten" +pubSub: "Akun Pub/Sub" +lastCommunication: "Komunikasi terakhir" +resolved: "Selesai" +unresolved: "Belum selesai" +breakFollow: "Batalkan mengikuti" +itsOn: "Aktif" +itsOff: "Nonaktif" +emailRequiredForSignup: "Membutuhkan alamat surel untuk mendaftar" +unread: "Belum dibaca" +filter: "Saring" +controlPanel: "Panel kendali" +manageAccounts: "Kelola Akun" +makeReactionsPublic: "Tampilkan riwayat reaksi ke publik" +makeReactionsPublicDescription: "Pengaturan ini akan membuat daftar dari semua reaksi\ + \ masa lalu kamu ditampilkan secara publik." +classic: "Klasik" +muteThread: "Bisukan thread" +unmuteThread: "Suarakan thread" +ffVisibility: "Visibilitas Mengikuti/Pengikut" +ffVisibilityDescription: "Mengatur siapa yang dapat melihat pengikutmu dan yang kamu\ + \ ikuti." +continueThread: "Lihat lanjutan thread" +deleteAccountConfirm: "Akun akan dihapus. Apakah kamu yakin?" +incorrectPassword: "Kata sandi salah." +voteConfirm: "Konfirmasi suara kamu untuk ({choice})?" +hide: "Sembunyikan" +leaveGroup: "Keluar grup" +leaveGroupConfirm: "Apakah kamu yakin untuk keluar dari \"{name}\"?" +useDrawerReactionPickerForMobile: "Tampilkan bilah reaksi sebagai laci di ponsel" +welcomeBackWithName: "Selamat datang kembali, {name}." +clickToFinishEmailVerification: "Mohon klik [{ok}] untuk menyelesaikan verifikasi\ + \ email." +overridedDeviceKind: "Tipe perangkat" +smartphone: "Ponsel" +tablet: "Tablet" +auto: "Otomatis" +themeColor: "Warna Tema" +size: "Ukuran" +numberOfColumn: "Jumlah per kolom" +searchByGoogle: "Penelusuran" +instanceDefaultLightTheme: "Bawaan instan tema terang" +instanceDefaultDarkTheme: "Bawaan instan tema gelap" +instanceDefaultThemeDescription: "Masukkan kode tema di format obyek." +mutePeriod: "Batas waktu bisu" +indefinitely: "Selamanya" +tenMinutes: "10 Menit" +oneHour: "1 Jam" +oneDay: "1 Hari" +oneWeek: "1 Bulan" +reflectMayTakeTime: "Mungkin perlu beberapa saat untuk dicerminkan." +failedToFetchAccountInformation: "Gagal untuk mendapatkan informasi akun" +rateLimitExceeded: "Batas sudah terlampaui" +cropImage: "potong gambar" +cropImageAsk: "Ingin memotong gambar?" +file: "Berkas" +reverse: "Balik" +colored: "Diwarnai" +label: "Label" +localOnly: "Hanya lokal" +account: "Akun" +_emailUnavailable: + used: "Alamat surel ini telah digunakan" + format: "Format tidak valid." + disposable: "Alamat surel temporer tidak dapat digunakan" + mx: "Peladen alamat surel ini tidak valid" + smtp: "Peladen alamat surel ini tidak merespon" +_ffVisibility: + public: "Terbitkan" + followers: "Tampil untuk pengikut saja" + private: "Tersembunyi" +_signup: + almostThere: "Hampir selesai" + emailAddressInfo: "Mohon masukkan alamat surel kamu." + emailSent: "Konfirmasi surel telah dikirimkan ke alamat surel kamu ({email}). Mohon\ + \ klik tautan yang tercantum di dalamnya untuk menyelesaikan pembuatan akun." +_accountDelete: + accountDelete: "Hapus akun" + mayTakeTime: "Karena penghapusan akun merupakan proses yang berat dan intensif,\ + \ kemungkinan dapat membutuhkan waktu untuk menyelesaikan tergantung daripada\ + \ berapa banyak konten yang kamu buat dan berapa banyak berkas yang telah kamu\ + \ unggah." + sendEmail: "Setelah penghapusan akun selesai, pemberitahuan akan dikirimkan ke alamat\ + \ surel yang terdaftarkan pada akun ini." + requestAccountDelete: "Minta penghapusan akun" + started: "Penghapusan telah dimulai" + inProgress: "Penghapusan sedang dalam proses" +_ad: + back: "Kembali" + reduceFrequencyOfThisAd: "Tampilkan iklan ini lebih sedikit" +_forgotPassword: + enterEmail: "Masukkan alamat surel yang kamu gunakan pada saat mendaftar. Sebuah\ + \ tautan untuk mengatur ulang kata sandi kamu akan dikirimkan ke alamat surel\ + \ tersebut." + ifNoEmail: "Apabila kamu tidak menggunakan surel pada saat pendaftaran, mohon hubungi\ + \ admin segera." + contactAdmin: "Instansi ini tidak mendukung menggunakan alamat surel, mohon kontak\ + \ admin untuk mengatur ulang password kamu." +_gallery: + my: "Postingan saya" + liked: "Postingan yang disukai" + like: "Suka" + unlike: "Hapus suka" +_email: + _follow: + title: "Mengikuti kamu" + _receiveFollowRequest: + title: "Kamu menerima permintaan mengikuti" +_plugin: + install: "Memasang plugin" + installWarn: "Mohon jangan memasang plugin yang tidak dapat dipercayai." + manage: "Manajemen plugin" +_registry: + scope: "Lingkup" + key: "Kunci" + keys: "Kunci" + domain: "Domain" + createKey: "Buat kunci" +_aboutMisskey: + about: "Calckey adalah perangkat lunak sumber terbuka yang sedang dikembangkan oleh\ + \ syuilo sejak 2014." + contributors: "Kontributor utama" + allContributors: "Seluruh kontributor" + source: "Sumber kode" + translation: "Terjemahkan Calckey" + donate: "Donasi ke Calckey" + morePatrons: "Kami sangat mengapresiasi dukungan dari banyak penolong lain yang\ + \ tidak tercantum disini. Terima kasih! \U0001F970" + patrons: "Pendukung" +_nsfw: + respect: "Sembunyikan media NSFW" + ignore: "Jangan sembunyikan media NSFW" + force: "Sembunyikan semua media" +_mfm: + cheatSheet: "Contekan MFM" + intro: "MFM adalah Calckey-exclusive Markup Language yang dapat digunakan di banyak\ + \ tempat. Berikut kamu bisa melihat daftar dari syntax MFM yang ada." + dummy: "Calckey membentangkan dunia Fediverse" + mention: "Sebut" + mentionDescription: "Kamu dapat menentukan pengguna tertentu dengan menggunakan\ + \ simbol-At dan nama engguna mereka." + hashtag: "Tagar" + hashtagDescription: "Kamu dapat menentukan tagar dengan menggunakan angka dan teks." + url: "URL" + urlDescription: "URL dapat ditampilkan." + link: "Tautan" + linkDescription: "Bagian tertentu dari teks dapat ditampilka sebagai URL." + bold: "Tebal" + boldDescription: "Sorot tulisan dengan membuatnya tebal." + small: "Kecil" + smallDescription: "Tampilkan konten kecil dan tipis." + center: "Tengah" + centerDescription: "Tampilkan konten di tengah." + inlineCode: "Kode (Dalam baris)" + inlineCodeDescription: "Menampilkan sorotan sintaks dalam baris untuk kode(program-)." + blockCode: "Kode (Blok)" + blockCodeDescription: "Menampilkan sorotan sintaks untuk kode(program-) multi baris\ + \ dalam sebuah blok." + inlineMath: "Matematika (Dalam baris)" + inlineMathDescription: "Menampilkan formula matematika (KaTeX) dalam baris." + blockMath: "Matematika (Blok)" + blockMathDescription: "Menampilkan formula matematika (KaTeX) multibaris dalam sebuah\ + \ blok." + quote: "Kutip" + quoteDescription: "Menampilkan konten sebagai kutipan." + emoji: "Emoji kustom" + emojiDescription: "Emoji kustom dapat ditampilkan dengan mengurung nama emoji kustom\ + \ menggunakan tanda titik dua." + search: "Penelusuran" + searchDescription: "Menampilkan kotak pencarian dengan teks yang sudah dimasukkan." + flip: "Balik" + flipDescription: "Balikkan konten secara horizontal atau vertikal." + jelly: "Animasi (Jelly)" + jellyDescription: "Menerapkan animasi seperti jelly" + tada: "Animasi (Tada)" + tadaDescription: "Menerapkan animasi seperti \"Kejutan!\"." + jump: "Animasi (Loncat)" + jumpDescription: "Menerapkan animasi melompat." + bounce: "Animasi (Melambung)" + bounceDescription: "Menerapkan animasi melambung." + shake: "Animasi (Goyang)" + shakeDescription: "Menerapkan animasi bergoyang." + twitch: "Animasi (Cubit)" + twitchDescription: "Terapkan animasi cubit yang kuat." + spin: "Animasi (Putar)" + spinDescription: "Terapkan animasi putar." + x2: "Besar" + x2Description: "Tampilkan konten menjadi besar." + x3: "Lebih besar" + x3Description: "Tampilkan konten menjadi lebih besar." + x4: "Sangat besar" + x4Description: "Tampilka konten menjadi sangat besar." + blur: "Buram" + blurDescription: "Konten dapat diburamkan dengan efek ini. Konten dapat ditampilkan\ + \ dengan jelas dengan melayangkan kursor tetikus di atasnya." + font: "Font" + fontDescription: "Setel font yang ditampilkan untuk konten." + rainbow: "Pelangi" + rainbowDescription: "Membuat konten muncul dalam warna pelangi." + sparkle: "Kelap-kelip" + sparkleDescription: "Memberikan konten efek partikel kelap-kelip." + rotate: "Putar" + rotateDescription: "Putar konten sesuai sudut yang ditentukan." +_instanceTicker: + none: "Jangan tampilkan" + remote: "Tampilkan untuk pengguna luar" + always: "Selalu tampilkan" +_serverDisconnectedBehavior: + reload: "Muat ulang otomatis" + dialog: "Tampilkan dialog peringatan" + quiet: "Tampilkan peringatan tidak mengganggu" +_channel: + create: "Buat saluran" + edit: "Sunting saluran" + setBanner: "Setel banner" + removeBanner: "Hapus banner" + featured: "Tren" + owned: "Dimiliki" + following: "Mengikuti" + usersCount: "{n} Partisipan" + notesCount: "terdapat {n} catatan" +_menuDisplay: + sideFull: "Horisontal" + sideIcon: "Horisontal (Ikon)" + top: "Atas" + hide: "Sembunyikan" +_wordMute: + muteWords: "Kata yang dibisukan" + muteWordsDescription: "Pisahkan dengan spasi untuk kondisi AND. Pisahkan dengan\ + \ baris baru untuk kondisi OR." + muteWordsDescription2: "Kurung kata kunci dengan garis miring untuk menggunakan\ + \ regular expressions." + softDescription: "Sembunyikan catatan yang memenuhi aturan kondisi dari linimasa." + hardDescription: "Cegah catatan memenuhi aturan kondisi dari ditambahkan ke linimasa.\ + \ Dengan tambahan, catatan berikut tidak akan ditambahkan ke linimasa meskipun\ + \ jika kondisi tersebut diubah." + soft: "Lembut" + hard: "Keras" + mutedNotes: "Catatan yang dibisukan" +_instanceMute: + instanceMuteDescription: "Pengaturan ini akan membisukan note/renote apa saja dari\ + \ instansi yang terdaftar, termasuk pengguna yang membalas pengguna lain dalam\ + \ instansi yang dibisukan." + instanceMuteDescription2: "Pisah dengan baris baru" + title: "Sembunyikan note dari instansi terdaftar." + heading: "Daftar instansi yang akan dibisukan" +_theme: + explore: "Jelajahi tema" + install: "Pasang tema" + manage: "Manajer tema" + code: "Kode tema" + description: "Deskripsi" + installed: "{name} telah dipasang" + installedThemes: "Tema yang dipasang" + builtinThemes: "Tema bawaan" + alreadyInstalled: "Tema telah dipasang" + invalid: "Format tema tidak valid" + make: "Buat tema" + base: "Dasar" + addConstant: "Tambah konstanta" + constant: "Konstanta" + defaultValue: "Nilai bawaan" + color: "Warna" + refProp: "Referensikan properti" + refConst: "Referensikan konstanta" + key: "Kunci" + func: "Fungsi" + funcKind: "Tipe fungsi" + argument: "Argumen" + basedProp: "Mereferensikan properti" + alpha: "Opasitas" + darken: "Mengelamkan" + lighten: "Menerangkan" + inputConstantName: "Masukkan nama untuk konstanta" + importInfo: "Jika kamu memasukkan kode tema disini, kamu dapat mengimpornya ke penyunting\ + \ tema" + deleteConstantConfirm: "apakah kamu ingin menghapus konstanta {const}?" + keys: + accent: "Aksen" + bg: "Latar belakang" + fg: "Teks" + focus: "Fokus" + indicator: "Indikator" + panel: "Panel" + shadow: "Bayangan" + header: "Header" + navBg: "Latar belakang bilah samping" + navFg: "Teks bilah samping" + navHoverFg: "Teks bilah samping (Mengambang)" + navActive: "Teks bilah samping (Aktif)" + navIndicator: "Indikator bilah samping" + link: "Tautan" + hashtag: "Tagar" + mention: "Sebut" + mentionMe: "Sebutan (saya)" + renote: "Renote" + modalBg: "Latar belakang modal" + divider: "Pembagi" + scrollbarHandle: "Pegangan bilah gulir" + scrollbarHandleHover: "Pegangan bilah gulir (Mengambang)" + dateLabelFg: "Teks label tanggal" + infoBg: "Latar belakang informasi" + infoFg: "Teks informasi" + infoWarnBg: "Latar belakang peringatan" + infoWarnFg: "Teks peringatan" + cwBg: "Latar belakang tombol Sembunyikan Konten" + cwFg: "Teks tombol Sembunyikan Konten" + cwHoverBg: "Latar belakang tombol Sembunyikan Konten (Mengambang)" + toastBg: "Latar belakang pemberitahuan" + toastFg: "Teks pemberitahuan" + buttonBg: "Latar belakang tombol" + buttonHoverBg: "Latar belakang tombol (Mengambang)" + inputBorder: "Batas bidang masukan" + listItemHoverBg: "Latar belakang daftar item (Mengambang)" + driveFolderBg: "Latar belakang folder drive" + wallpaperOverlay: "Lapisan wallpaper" + badge: "Lencana" + messageBg: "Latar belakang obrolan" + accentDarken: "Aksen (Gelap)" + accentLighten: "Aksen (Terang)" + fgHighlighted: "Teks yang disorot" +_sfx: + note: "Catatan" + noteMy: "Catatan (Saya)" + notification: "Pemberitahuan" + chat: "Pesan" + chatBg: "Obrolan (Latar Belakang)" + antenna: "Penerimaan Antenna" + channel: "Pemberitahuan saluran" +_ago: + future: "Masa depan" + justNow: "Baru saja" + secondsAgo: "{n} detik lalu" + minutesAgo: "{n} menit lalu" + hoursAgo: "{n} jam lalu" + daysAgo: "{n} hari lalu" + weeksAgo: "{n} minggu lalu" + monthsAgo: "{n} bulan lalu" + yearsAgo: "{n} tahun lalu" +_time: + second: "detik" + minute: "menit" + hour: "jam" + day: "hari" +_tutorial: + title: "Cara menggunakan Calckey" + step1_1: "Selamat datang!" + step1_2: "Halaman ini disebut \"linimasa\". Halaman ini menampilkan \"catatan\"\ + \ yang diurutkan secara kronologis dari orang-orang yang kamu \"ikuti\"." + step1_3: "Linimasa kamu kosong, karena kamu belum mencatat catatan apapun atau mengikuti\ + \ siapapun." + step2_1: "Selesaikan menyetel profilmu sebelum menulis sebuah catatan atau mengikuti\ + \ seseorang." + step2_2: "Menyediakan beberapa informasi tentang siapa kamu akan membuat orang lain\ + \ mudah untuk mengikutimu kembali." + step3_1: "Sekarang saatnya mengikuti beberapa orang!" + step3_2: "Langkah selanjutnya adalah membuat catatan. Kamu bisa lakukan ini dengan\ + \ mengklik ikon pensil pada layar kamu." + step3_3: "Isilah di dalam modal dan tekan tombol pada atas kanan untuk memcatat\ + \ catatan kamu." + step3_4: "Bingung tidak berpikiran untuk mengatakan sesuatu? Coba saja \"baru aja\ + \ ikutan bikin akun misskey punyaku\"!" + step4_1: "Selesai mencatat catatan pertamamu?" + step4_2: "Horee! Sekarang catatan pertamamu sudah ditampilkan di linimasa milikmu." + step5_1: "Sekarang, mari mencoba untuk membuat linimasamu lebih hidup dengan mengikuti\ + \ orang lain." + step5_2: "{featured} akan memperlihatkan catatan yang sedang tren saat ini untuk\ + \ kamu. {explore} akan membantumu untuk mencari pengguna yang sedang tren juga\ + \ saat ini. Coba ikuti seseorang yang kamu suka!" + step5_3: "Untuk mengikuti pengguna lain, klik pada ikon mereka dan tekan tombol\ + \ follow pada profil mereka." + step5_4: "Jika pengguna lain memiliki ikon gembok di sebelah nama mereka, maka pengguna\ + \ rersebut harus menyetujui permintaan mengikuti dari kamu secara manual." + step6_1: "Sekarang kamu dapat melihat catatan pengguna lain pada linimasamu." + step6_2: "Kamu juga bisa memberikan \"reaksi\" ke catatan orang lain untuk merespon\ + \ dengan cepat." + step6_3: "Untuk memberikan \"reaksi\", tekan tanda \"+\" pada catatan pengguna lain\ + \ dan pilih emoji yang kamu suka untuk memberikan reaksimu kepada mereka." + step7_1: "Yay, Selamat! Kamu sudah menyelesaikan tutorial dasar Calckey." + step7_2: "Jika kamu ingin mempelajari lebih lanjut tentang Calckey, cobalah berkunjung\ + \ ke bagian {help}." + step7_3: "Semoga berhasil dan bersenang-senanglah! \U0001F680" +_2fa: + alreadyRegistered: "Kamu telah mendaftarkan perangkat otentikasi dua faktor." + registerTOTP: "Daftarkan perangkat baru" + registerSecurityKey: "Daftarkan kunci keamanan baru" + step1: "Pertama, pasang aplikasi otentikasi (seperti {a} atau {b}) di perangkat\ + \ kamu." + step2: "Lalu, pindai kode QR yang ada di layar." + step2Url: "Di aplikasi desktop, masukkan URL berikut:" + step3: "Masukkan token yang telah disediakan oleh aplikasimu untuk menyelesaikan\ + \ pemasangan." + step4: "Mulai sekarang, upaya login apapun akan meminta token login dari aplikasi\ + \ otentikasi kamu." + securityKeyInfo: "Kamu dapat memasang otentikasi WebAuthN untuk mengamankan proses\ + \ login lebih lanjut dengan tidak hanya perangkat keras kunci keamanan yang mendukung\ + \ FIDO2, namun juga sidik jari atau otentikasi PIN pada perangkatmu." +_permissions: + "read:account": "Lihat informasi akun" + "write:account": "Sunting informasi akun" + "read:blocks": "Lihat daftar orang yang diblokir" + "write:blocks": "Sunting daftar orang yang diblokir" + "read:drive": "Akses berkas dan folder drive" + "write:drive": "Sunting atau hapus berkas dan folder drive" + "read:favorites": "Lihat daftar favorit" + "write:favorites": "Sunting daftar favorit" + "read:following": "Lihat informasi mengikuti" + "write:following": "Ikuti atau Stop Ikuti akun lain" + "read:messaging": "Lihat obrolan" + "write:messaging": "Buat atau hapus obrolan" + "read:mutes": "Lihat daftar orang yang dibisukan" + "write:mutes": "Sunting daftar orang yang dibisukan" + "write:notes": "Buat atau hapus catatan" + "read:notifications": "Lihat pemberitahuan" + "write:notifications": "Sunting pemberitahuan" + "read:reactions": "Lihat reaksi" + "write:reactions": "Sunting reaksi" + "write:votes": "Beri suara" + "read:pages": "Lihat halaman" + "write:pages": "Sunting atau hapus halaman" + "read:page-likes": "Lihat suka pada halaman" + "write:page-likes": "Sunting suka pada Halaman" + "read:user-groups": "Lihat grup pengguna" + "write:user-groups": "Sunting atau hapus grup pengguna" + "read:channels": "Lihat saluran" + "write:channels": "Sunting saluran" + "read:gallery": "Lihat galeri" + "write:gallery": "Sunting galeri" + "read:gallery-likes": "Lihat daftar postingan galeri yang disukai" + "write:gallery-likes": "Sunting daftar postingan galeri yang disukai" +_auth: + shareAccess: "Apakah kamu ingin mengijinkan \"{name}\" untuk mengakses akun ini?" + shareAccessAsk: "Apakah kamu ingin mengijinkan aplikasi ini untuk mengakses akun\ + \ kamu?" + permissionAsk: "Aplikasi ini membutuhkan beberapa ijin, yaitu:" + pleaseGoBack: "Mohon kembali ke aplikasi kamu" + callback: "Mengembalikan kamu ke aplikasi" + denied: "Akses ditolak" +_antennaSources: + all: "Semua catatan" + homeTimeline: "Catatan dari pengguna yang diikuti" + users: "Catatan dari pengguna tertentu" + userList: "Catatan dari daftar tertentu" + userGroup: "Catatan dari pengguna dalam grup yang ditentukan" +_weekday: + sunday: "Minggu" + monday: "Senin" + tuesday: "Selasa" + wednesday: "Rabu" + thursday: "Kamis" + friday: "Jumat" + saturday: "Sabtu" +_widgets: + memo: "Catatan memo" + notifications: "Pemberitahuan" + timeline: "Linimasa" + calendar: "Kalender" + trends: "Tren" + clock: "Jam" + rss: "Pembaca RSS" + activity: "Aktivitas" + photos: "Foto" + digitalClock: "Jam digital" + federation: "Federasi" + postForm: "Buat catatan" + slideshow: "Slideshow" + button: "Tombol" + onlineUsers: "Pengguna online" + jobQueue: "Antrian kerja" + serverMetric: "Statistik peladen" + aiscript: "Konsol AiScript" + aichan: "Ai" +_cw: + hide: "Sembunyikan" + show: "Lihat konten" + chars: "{count} karakter" + files: "{count} berkas" +_poll: + noOnlyOneChoice: "Dibutuhkan sedikitnya dua pilihan" + choiceN: "Pilihan {n}" + noMore: "Kamu tidak dapat menambahkan pilihan lagi" + canMultipleVote: "Bolehkan memilih banyak" + expiration: "Batas akhir" + infinite: "Selamanya" + at: "Berakhir pada..." + after: "Berakhir setelah..." + deadlineDate: "Tanggal batas akhir" + deadlineTime: "jam" + duration: "Durasi" + votesCount: "{n} suara" + totalVotes: "Total {n} suara" + vote: "Beri suara" + showResult: "Lihat hasil" + voted: "Telah memilih" + closed: "Telah berakhir" + remainingDays: "Berakhir dalam {d} hari {h} jam" + remainingHours: "Berakhir dalam {h} jam {m} menit" + remainingMinutes: "Berakhir dalam {m} menit {s} detik" + remainingSeconds: "Berakhir dalam {s} detik" +_visibility: + public: "Publik" + publicDescription: "Catat ke linimasa global" + home: "Beranda" + homeDescription: "Catat ke linimasa beranda saja" + followers: "Pengikut" + followersDescription: "Catat ke pengikut saja" + specified: "Langsung" + specifiedDescription: "Catat ke pengguna yang ditentukan saja" + localOnly: "Hanya lokal" + localOnlyDescription: "Hanya dapat dilihat di instansi lokal" +_postForm: + replyPlaceholder: "Balas ke catatan ini..." + quotePlaceholder: "Kutip catatan ini..." + channelPlaceholder: "Posting ke kanal" + _placeholders: + a: "Sedang apa kamu saat ini?" + b: "Apa yang terjadi di sekitarmu?" + c: "Apa yang sedang kamu pikirkan?" + d: "Yang ingin kamu sampaikan?" + e: "Tuliskan yang kamu ingin sampaikan..." + f: "Menunggu kamu untuk menulis...." +_profile: + name: "Nama" + username: "Nama Pengguna" + description: "Bio" + youCanIncludeHashtags: "Kamu juga dapat menambahkan tagar ke dalam bio." + metadata: "Informasi tambahan" + metadataEdit: "Sunting informasi tambahan" + metadataDescription: "Kamu dapat menampilkan hingga 4 bagian informasi tambahan\ + \ ke dalam profilmu." + metadataLabel: "Label" + metadataContent: "Isi" + changeAvatar: "Ubah avatar" + changeBanner: "Ubah header" +_exportOrImport: + allNotes: "Semua catatan" + followingList: "Ikuti" + muteList: "Bisukan" + blockingList: "Blokir" + userLists: "Daftar" + excludeMutingUsers: "Kecualikan pengguna yang dibisukan" + excludeInactiveUsers: "Kecualikan pengguna tidak aktif" +_charts: + federation: "Federasi" + apRequest: "Permintaan" + usersIncDec: "Perbedaan dalam # pengguna" + usersTotal: "Jumlah # pengguna" + activeUsers: "Pengguna aktif" + notesIncDec: "Perbedaan # dalam catatan" + localNotesIncDec: "Perbedaan # dalam catatan lokal" + remoteNotesIncDec: "Perbedaan # dalam catatan luar" + notesTotal: "Total # catatan" + filesIncDec: "Perbedaan # dalam berkas" + filesTotal: "Jumlah # berkas" + storageUsageIncDec: "Perbedaan dalam penggunaan penyimpanan" + storageUsageTotal: "Jumlah penggunaan penyimpanan" +_instanceCharts: + requests: "Permintaan" + users: "Perbedaan dalam # pengguna" + usersTotal: "Jumlah # pengguna kumulatif" + notes: "Perbedaan # dalam catatan" + notesTotal: "Jumlah # catatan kumulatif" + ff: "Perbedaan jumlah # dalam pengikut" + ffTotal: "Jumlah # pengikut kumulatif" + cacheSize: "Perbedaan dalam ukuran tembolok" + cacheSizeTotal: "Total ukuran tembolok kumulatif" + files: "Perbedaan dalam # berkas" + filesTotal: "Jumlah # berkas kumulatif" +_timelines: + home: "Beranda" + local: "Lokal" + social: "Sosial" + global: "Global" +_pages: + newPage: "Buat halaman baru" + editPage: "Sunting halaman" + readPage: "Lihat sumber kode aktif" + created: "Halaman berhasil dibuat" + updated: "Halaman berhasil diperbaharui!" + deleted: "Halaman telah dihapus" + pageSetting: "Pengaturan Halaman" + nameAlreadyExists: "URL Halaman yang ditentukan sudah ada" + invalidNameTitle: "URL Halaman yang ditentukan tidak valid" + invalidNameText: "Cek apabila Halaman tidak kosong" + editThisPage: "Sunting Halaman ini" + viewSource: "Lihat sumber" + viewPage: "Lihat Halaman" + like: "Suka" + unlike: "Hapus suka" + my: "Halaman saya" + liked: "Halaman yang disukai" + featured: "Populer" + inspector: "Inspektor" + contents: "Konten" + content: "Blokir Halaman" + variables: "Variabel" + title: "Judul" + url: "URL Halaman" + summary: "Ringkasan Halaman" + alignCenter: "Tengah" + hideTitleWhenPinned: "Sembunyikan judul halaman saat disematkan ke profil" + font: "Font" + fontSerif: "Serif" + fontSansSerif: "Sans-serif" + eyeCatchingImageSet: "Setel gambar yang menarik" + eyeCatchingImageRemove: "Hapus gambar yang menarik" + chooseBlock: "Tambahkan blokir" + selectType: "Pilih jenis" + enterVariableName: "Mohon masukkan nama untuk variabel kamu" + variableNameIsAlreadyUsed: "Nama ini sudah digunakan oleh variabel lain" + contentBlocks: "Konten" + inputBlocks: "Masukan" + specialBlocks: "Khusus" + blocks: + text: "Teks" + textarea: "Area teks" + section: "Bagian" + image: "Gambar" + button: "Tombol" + if: "Jika" + _if: + variable: "Variabel" + post: "Buat catatan" + _post: + text: "Isi" + attachCanvasImage: "Posting dengan kanvas sebagai gambar" + canvasId: "ID Kanvas" + textInput: "Masukan teks" + _textInput: + name: "Nama variabel" + text: "Judul" + default: "Nilai bawaan" + textareaInput: "Masukan teks multibaris" + _textareaInput: + name: "Nama variabel" + text: "Judul" + default: "Nilai bawaan" + numberInput: "Masukan angka" + _numberInput: + name: "Nama variabel" + text: "Judul" + default: "Nilai bawaan" + canvas: "Kanvas" + _canvas: + id: "ID Kanvas" + width: "Lebar" + height: "Tinggi" + note: "Catatan yang ditanam" + _note: + id: "ID Catatan" + idDescription: "Kamu dapat menyetel ini dengan menempelkan tautan URL Catatan." + detailed: "Tampilan rincian" + switch: "Beralih" + _switch: + name: "Nama variabel" + text: "Judul" + default: "Nilai bawaan" + counter: "Penghitung" + _counter: + name: "Nama variabel" + text: "Judul" + inc: "Meningkat dengan" + _button: + text: "Judul" + colored: "Diwarnai" + action: "Operasi akan dimulai ketika tombol ditekan" + _action: + dialog: "Tampilkan dialog" + _dialog: + content: "Isi" + resetRandom: "Atur ulang benih acak" + pushEvent: "Kirim event" + _pushEvent: + event: "Nama event" + message: "Pesan yang tampil ketika diaktifkan" + variable: "Variable untuk kirim" + no-variable: "Tidak ada" + callAiScript: "Panggil AiScript" + _callAiScript: + functionName: "Nama fungsi" + radioButton: "Pilihan" + _radioButton: + name: "Nama variabel" + title: "Judul" + values: "Daftar pilihan (dipisahkan dengan garis baru)" + default: "Nilai bawaan" + script: + categories: + flow: "Arus kendali" + logical: "Operasi logis" + operation: "Menghitung" + comparison: "Membandingkan" + random: "Acak" + value: "Nilai" + fn: "Fungsi" + text: "Operasi teks" + convert: "Mengubah" + list: "Daftar" + blocks: + text: "Teks" + multiLineText: "Teks (multibaris)" + textList: "Daftar teks" + _textList: + info: "Pisahkan setiap entri dengan baris baru" + strLen: "Panjang teks" + _strLen: + arg1: "Teks" + strPick: "Ekstrak karakter" + _strPick: + arg1: "Teks" + arg2: "Lokasi karakter" + strReplace: "Penggantian teks" + _strReplace: + arg1: "Teks" + arg2: "Teks yang akan diganti" + arg3: "Diganti dengan" + strReverse: "Balikkan teks" + _strReverse: + arg1: "Teks" + join: "Rangkaian teks" + _join: + arg1: "Daftar" + arg2: "Pemisah" + add: "Tambah" + _add: + arg1: "A" + arg2: "B" + subtract: "Kurangi" + _subtract: + arg1: "A" + arg2: "B" + multiply: "Kali" + _multiply: + arg1: "A" + arg2: "B" + divide: "Bagi" + _divide: + arg1: "A" + arg2: "B" + mod: "Sisa" + _mod: + arg1: "A" + arg2: "B" + round: "Bulat desimal" + _round: + arg1: "Angka" + eq: "A dan B adalah sama" + _eq: + arg1: "A" + arg2: "B" + notEq: "A dan B adalah berbeda" + _notEq: + arg1: "A" + arg2: "B" + and: "A DAN B" + _and: + arg1: "A" + arg2: "B" + or: "A ATAU B" + _or: + arg1: "A" + arg2: "B" + lt: "< A ikurang dari B" + _lt: + arg1: "A" + arg2: "B" + gt: "> A lebih dari B" + _gt: + arg1: "A" + arg2: "B" + ltEq: "<= A kurang dari sama dengan B" + _ltEq: + arg1: "A" + arg2: "B" + gtEq: ">= A lebih dari sama dengan B" + _gtEq: + arg1: "A" + arg2: "B" + if: "Cabang" + _if: + arg1: "Jika" + arg2: "Jika benar" + arg3: "Jika salah" + not: "BUKAN" + _not: + arg1: "NOT" + random: "Acak" + _random: + arg1: "Probabilitas" + rannum: "Angka acak" + _rannum: + arg1: "Nilai minimum" + arg2: "Nilai maksimum" + randomPick: "Pilih secara acak dari daftar" + _randomPick: + arg1: "Daftar" + dailyRandom: "Acak (bertahan sehari)" + _dailyRandom: + arg1: "Probabilitas" + dailyRannum: "Angka acak (bertahan sehari)" + _dailyRannum: + arg1: "Nilai minimum" + arg2: "Nilai maksimum" + dailyRandomPick: "Pilih secara acak dari daftar (bertahan sehari)" + _dailyRandomPick: + arg1: "Daftar" + seedRandom: "Acak (dengan seed)" + _seedRandom: + arg1: "Seed" + arg2: "Probabilitas" + seedRannum: "Angka acak (dengan seed)" + _seedRannum: + arg1: "Seed" + arg2: "Nilai minimum" + arg3: "Nilai maksimum" + seedRandomPick: "Pilih secara acak dari daftar (dengan seed)" + _seedRandomPick: + arg1: "Seed" + arg2: "Daftar" + DRPWPM: "Pilih secara acak dari daftar berbobot (bertahan sehari)" + _DRPWPM: + arg1: "Daftar teks" + pick: "Pilih dari daftar" + _pick: + arg1: "Daftar" + arg2: "Posisi" + listLen: "Dapatkan panjangnya dari daftar" + _listLen: + arg1: "Daftar" + number: "Angka" + stringToNumber: "Teks ke angka" + _stringToNumber: + arg1: "Teks" + numberToString: "Angka ke teks" + _numberToString: + arg1: "Angka" + splitStrByLine: "Pisahkan teks dengan baris baru" + _splitStrByLine: + arg1: "Teks" + ref: "Variabel" + aiScriptVar: "Variabel AiScript" + fn: "Fungsi" + _fn: + slots: "Slot" + slots-info: "Pisahkan setiap slot dengan baris baru" + arg1: "Keluaran" + for: "Ulangi" + _for: + arg1: "Jumlah angka untuk diulangi" + arg2: "Aksi" + typeError: "Slot {slot} menerima tipe \"{expect}\", sayangnya nilai yang disediakan\ + \ adalah \"{actual}\"!" + thereIsEmptySlot: "Slot {slot} kosong!" + types: + string: "Teks" + number: "Angka" + boolean: "Markah" + array: "Daftar" + stringArray: "Daftar teks" + emptySlot: "Slot kosong" + enviromentVariables: "Variabel Lingkungan" + pageVariables: "Elemen halaman" + argVariables: "Masukan slot" +_relayStatus: + requesting: "Menunggu" + accepted: "Disetujui" + rejected: "Ditolak" +_notification: + fileUploaded: "Berkas telah berhasil diunggah" + youGotMention: "{name} meyebut kamu" + youGotReply: "{name} membalas kamu" + youGotQuote: "{name} mengutip kamu" + youRenoted: "{name} me-renote kamu" + youGotPoll: "{name} memilih di angket kamu" + youGotMessagingMessageFromUser: "{name} mengirimi kamu pesan" + youGotMessagingMessageFromGroup: "Sebuah pesan telah dikirim ke grup {name}" + youWereFollowed: "Mengikuti kamu" + youReceivedFollowRequest: "Kamu menerima permintaan mengikuti" + yourFollowRequestAccepted: "Permintaan mengikuti kamu telah diterima" + youWereInvitedToGroup: "Telah diundang ke grup" + pollEnded: "Hasil Kuesioner telah keluar" + emptyPushNotificationMessage: "Pembaruan notifikasi dorong" + _types: + all: "Semua" + follow: "Ikuti" + mention: "Sebut" + reply: "Balasan" + renote: "Renote" + quote: "Kutip" + reaction: "Reaksi" + pollVote: "Memilih di angket" + pollEnded: "Jajak pendapat berakhir" + receiveFollowRequest: "Permintaan mengikuti diterima" + followRequestAccepted: "Permintaan mengikuti disetujui" + groupInvited: "Diundang ke grup" + app: "Pemberitahuan dari aplikasi" + _actions: + followBack: "Ikuti Kembali" + reply: "Balas" + renote: "Renote" +_deck: + alwaysShowMainColumn: "Selalu tampilkan kolom utama" + columnAlign: "Luruskan kolom" + addColumn: "Tambahkan kolom" + swapLeft: "Pindah ke kiri" + swapRight: "Pindah ke kanan" + swapUp: "Pindah ke atas" + swapDown: "Pindah ke bawah" + stackLeft: "Tumpukkan di kolom kiri" + popRight: "Keluarkan di kanan" + profile: "Profil" + _columns: + main: "Utama" + widgets: "Widget" + notifications: "Pemberitahuan" + tl: "Linimasa" + antenna: "Antena" + list: "Daftar" + mentions: "Sebutan" + direct: "Langsung" diff --git a/fe_calckey/frontend/locales/index.d.ts b/fe_calckey/frontend/locales/index.d.ts new file mode 100644 index 0000000..fe3edb4 --- /dev/null +++ b/fe_calckey/frontend/locales/index.d.ts @@ -0,0 +1,3 @@ +declare const locales: { [lang: string]: any }; + +export = locales; diff --git a/fe_calckey/frontend/locales/index.js b/fe_calckey/frontend/locales/index.js new file mode 100644 index 0000000..62e55e7 --- /dev/null +++ b/fe_calckey/frontend/locales/index.js @@ -0,0 +1,91 @@ +/** + * Languages Loader + */ + +const fs = require("fs"); +const yaml = require("js-yaml"); +const languages = []; +const languages_custom = []; + +const merge = (...args) => + args.reduce( + (a, c) => ({ + ...a, + ...c, + ...Object.entries(a) + .filter(([k]) => c && typeof c[k] === "object") + .reduce((a, [k, v]) => ((a[k] = merge(v, c[k])), a), {}), + }), + {}, + ); + +fs.readdirSync(__dirname).forEach((file) => { + if (file.includes(".yml")) { + file = file.slice(0, file.indexOf(".")); + languages.push(file); + } +}); + +fs.readdirSync(__dirname + "/../custom/locales").forEach((file) => { + if (file.includes(".yml")) { + file = file.slice(0, file.indexOf(".")); + languages_custom.push(file); + } +}); + +const primaries = { + en: "US", + ja: "JP", + zh: "CN", +}; + +// 何故か文字列にバックスペース文字が混入することがあり、YAMLが壊れるので取り除く +const clean = (text) => + text.replace(new RegExp(String.fromCodePoint(0x08), "g"), ""); + +const locales = languages.reduce( + (a, c) => ( + (a[c] = + yaml.load(clean(fs.readFileSync(`${__dirname}/${c}.yml`, "utf-8"))) || + {}), + a + ), + {}, +); +const locales_custom = languages_custom.reduce( + (a, c) => ( + (a[c] = + yaml.load( + clean( + fs.readFileSync(`${__dirname}/../custom/locales/${c}.yml`, "utf-8"), + ), + ) || {}), + a + ), + {}, +); +Object.assign(locales, locales_custom); + +module.exports = Object.entries(locales).reduce( + (a, [k, v]) => ( + (a[k] = (() => { + const [lang] = k.split("-"); + switch (k) { + case "ja-JP": + return v; + case "ja-KS": + case "en-US": + return merge(locales["ja-JP"], v); + default: + return merge( + locales["ja-JP"], + locales["en-US"], + locales[`${lang}-${primaries[lang]}`] || {}, + v, + ); + } + })()), + a + ), + {}, +); diff --git a/fe_calckey/frontend/locales/it-IT.yml b/fe_calckey/frontend/locales/it-IT.yml new file mode 100644 index 0000000..bdf7cab --- /dev/null +++ b/fe_calckey/frontend/locales/it-IT.yml @@ -0,0 +1,1563 @@ +_lang_: "Italiano" +headlineMisskey: "Rete collegata tramite note" +introMisskey: "Benvenut@! Calckey è un servizio di microblogging decentralizzato, + libero e aperto. \nScrivi \"note\" per condividere ciò che sta succedendo adesso + o per dire a tutti qualcosa di te. 📡\nGrazie alla funzione \"reazioni\" puoi anche + mandare reazioni rapide alle note delle altre persone del Fediverso. 👍\nEsplora + un nuovo mondo! 🚀" +monthAndDay: "{day}/{month}" +search: "Cerca" +notifications: "Notifiche" +username: "Nome utente" +password: "Password" +forgotPassword: "Hai dimenticato la tua password?" +fetchingAsApObject: "Recuperando dal Fediverso" +ok: "OK" +gotIt: "Ho capito!" +cancel: "Annulla" +enterUsername: "Inserisci un nome utente" +renotedBy: "Rinotato da {user}" +noNotes: "Nessuna nota!" +noNotifications: "Nessuna notifica" +instance: "Istanza" +settings: "Impostazioni" +basicSettings: "Impostazioni generali" +otherSettings: "Altre impostazioni" +openInWindow: "Apri in una finestra" +profile: "Profilo" +timeline: "Timeline" +noAccountDescription: "L'utente non ha ancora scritto niente nella biografia di profilo." +login: "Accedi" +loggingIn: "Accesso in corso..." +logout: "Esci" +signup: "Iscriviti" +uploading: "Caricamento..." +save: "Salva" +users: "Utenti" +addUser: "Aggiungi utente" +favorite: "Aggiungi ai preferiti" +favorites: "Preferiti" +unfavorite: "Rimuovi nota dai preferiti" +favorited: "Aggiunta ai tuoi preferiti." +alreadyFavorited: "Già tra i tuoi preferiti." +cantFavorite: "Impossibile aggiungere la nota ai preferiti." +pin: "Fissa sul profilo" +unpin: "Non fissare sul profilo" +copyContent: "Copia il contenuto" +copyLink: "Copia il link" +delete: "Elimina" +deleteAndEdit: "Elimina e modifica" +deleteAndEditConfirm: "Vuoi davvero cancellare questa nota e scriverla di nuovo? Verrano + eliminate anche tutte le reazioni, Rinote e risposte collegate." +addToList: "Aggiungi alla lista" +sendMessage: "Invia messaggio" +copyUsername: "Copia nome utente" +searchUser: "Cerca utente" +reply: "Rispondi" +loadMore: "Mostra di più" +showMore: "Mostra di più" +showLess: "Chiudi" +youGotNewFollower: "Ha iniziato a seguirti" +receiveFollowRequest: "Hai ricevuto una richiesta di follow" +followRequestAccepted: "Richiesta di follow accettata" +mention: "Menzioni" +mentions: "Menzioni" +directNotes: "Note dirette" +importAndExport: "Importa ed esporta" +import: "Importa" +export: "Esporta" +files: "Allegati" +download: "Scarica" +driveFileDeleteConfirm: "Vuoi davvero eliminare il file「{name}? Anche gli allegati + verranno eliminati." +unfollowConfirm: "Vuoi davvero smettere di seguire {name}?" +exportRequested: "Hai richiesto un'esportazione, e potrebbe volerci tempo. Quando + sarà compiuta, il file verrà aggiunto direttamente al Drive." +importRequested: "Hai richiesto un'importazione. Può volerci tempo. " +lists: "Liste" +noLists: "Nessuna lista" +note: "Nota" +notes: "Note" +following: "Follows" +followers: "Followers" +followsYou: "Ti segue" +createList: "Aggiungi una nuova lista" +manageLists: "Gestisci liste" +error: "Errore" +somethingHappened: "Si è verificato un problema" +retry: "Riprova" +pageLoadError: "Caricamento pagina non riuscito. " +pageLoadErrorDescription: "Questo viene normalmente causato dalla rete o dalla cache + del browser. Si prega di pulire la cache, o di attendere e riprovare più tardi." +serverIsDead: "Il server non risponde. Si prega di attendere e riprovare più tardi." +youShouldUpgradeClient: "Per visualizzare la pagina è necessario aggiornare il client + alla nuova versione e ricaricare." +enterListName: "Nome della lista" +privacy: "Privacy" +makeFollowManuallyApprove: "Richiedi di approvare i follower manualmente" +defaultNoteVisibility: "Privacy predefinita delle note" +follow: "Segui" +followRequest: "Richiesta di follow" +followRequests: "Richieste di follow" +unfollow: "Smetti di seguire" +followRequestPending: "La richiesta di follow deve essere approvata" +enterEmoji: "Inserisci emoji" +renote: "Rinota" +unrenote: "Annulla rinota" +renoted: "Rinotato!" +cantRenote: "È impossibile rinotare questa nota." +cantReRenote: "È impossibile rinotare una Rinota." +quote: "Cita" +pinnedNote: "Nota fissata" +pinned: "Fissa sul profilo" +you: "Tu" +clickToShow: "Clicca per visualizzare" +sensitive: "Contenuto sensibile" +add: "Aggiungi" +reaction: "Reazione" +reactionSetting: "Reazioni visualizzate sul pannello" +reactionSettingDescription2: "Trascina per riorganizzare, clicca per cancellare, usa + il pulsante \"+\" per aggiungere." +rememberNoteVisibility: "Ricordare le impostazioni di visibilità delle note" +attachCancel: "Rimuovi allegato" +markAsSensitive: "Segna come sensibile" +unmarkAsSensitive: "Segna come non sensibile" +enterFileName: "Nome del file" +mute: "Silenzia" +unmute: "Riattiva" +block: "Blocca" +unblock: "Sblocca" +suspend: "Sospendi" +unsuspend: "Annulla la sospensione dell'account" +blockConfirm: "Vuoi davvero bloccare l'account?" +unblockConfirm: "Vuoi davvero sbloccare l'account?" +suspendConfirm: "Vuoi davvero sospendere questo account?" +unsuspendConfirm: "Vuoi annullare la sospensione dell'account?" +selectList: "Seleziona una lista" +selectAntenna: "Scegli un'antenna" +selectWidget: "Seleziona widget" +editWidgets: "Modifica i widget" +editWidgetsExit: "Modifica fine" +customEmojis: "Emoji personalizzati" +emoji: "Emoji" +emojis: "Emoji" +emojiName: "Nome dell'emoji" +emojiUrl: "URL dell'emoji" +addEmoji: "Aggiungi un emoji" +settingGuide: "Configurazione suggerita" +cacheRemoteFiles: "Memorizzazione nella cache dei file remoti" +cacheRemoteFilesDescription: "Disabilitando questa opzione, i file remoti verranno + linkati direttamente senza essere memorizzati nella cache. Sarà possibile risparmiare + spazio di archiviazione sul server, ma il traffico aumenterà in quanto non verranno + generate anteprime." +flagAsBot: "Io sono un robot" +flagAsBotDescription: "Se l'account esegue principalmente operazioni automatiche, + attiva quest'opzione. Quando attivata, opera come un segnalatore per gli altri sviluppatori + allo scopo di prevenire catene d’interazione senza fine con altri bot, e di adeguare + i sistemi interni di Calckey perché trattino questo account come un bot." +flagAsCat: "Io sono un gatto" +flagAsCatDescription: "Abilita l'opzione \"Io sono un gatto\" per l'account." +autoAcceptFollowed: "Accetta automaticamente le richieste di follow da utenti che + già segui" +addAccount: "Aggiungi account" +loginFailed: "Accesso non riuscito" +showOnRemote: "Sfoglia sull'istanza remota" +general: "Generali" +wallpaper: "Sfondo" +setWallpaper: "Imposta sfondo" +removeWallpaper: "Elimina lo sfondo" +searchWith: "Cerca: {q}" +youHaveNoLists: "Non hai ancora creato nessuna lista" +followConfirm: "Sei sicur@ di voler seguire {name}?" +proxyAccount: "Account proxy" +proxyAccountDescription: "Un account proxy è un account che funziona da follower remoto + per gli utenti sotto certe condizioni. Ad esempio, quando un utente aggiunge un + utente remoto alla lista, dato che se nessun utente locale segue quell'utente le + sue attività non verranno distribuite, al suo posto lo seguirà un account proxy." +host: "Server remoto" +selectUser: "Seleziona utente" +recipient: "Destinatario" +annotation: "Descrizione" +federation: "Federazione" +instances: "Istanza" +registeredAt: "Registrato presso" +latestRequestSentAt: "Ultima richiesta inviata" +latestRequestReceivedAt: "Ultima richiesta ricevuta" +latestStatus: "Ultimo stato" +storageUsage: "Volume di dischi" +charts: "Grafici" +perHour: "All'ora" +perDay: "al giorno" +stopActivityDelivery: "Interrompi la distribuzione di attività" +blockThisInstance: "Blocca l'istanza" +operations: "Operazioni" +software: "Software" +version: "Versione" +metadata: "Metadato" +monitor: "Monitorare" +jobQueue: "Coda di lavoro" +cpuAndMemory: "CPU e Memoria" +network: "Rete" +disk: "Disco" +instanceInfo: "Informazioni sull'istanza" +statistics: "Statistiche" +clearQueue: "Svuota coda" +clearQueueConfirmTitle: "Vuoi davvero svuotare la coda?" +clearQueueConfirmText: "Le note ancora non distribuite non verranno rilasciate. Solitamente, + non è necessario eseguire questa operazione." +clearCachedFiles: "Svuota cache" +clearCachedFilesConfirm: "Vuoi davvero svuotare la cache da tutti i file remoti?" +blockedInstances: "Istanze bloccate" +blockedInstancesDescription: "Elenca le istanze che vuoi bloccare, una per riga. Esse + non potranno più interagire con la tua istanza." +muteAndBlock: "Silenziati / Bloccati" +mutedUsers: "Account silenziati" +blockedUsers: "Account bloccati" +noUsers: "Nessun utente trovato" +editProfile: "Modifica profilo" +noteDeleteConfirm: "Eliminare questo Nota?" +pinLimitExceeded: "Non puoi fissare altre note " +intro: "L'installazione di Calckey è finita! Si prega di creare un account amministratore." +done: "Fine" +processing: "In elaborazione" +preview: "Anteprima" +default: "Predefinito" +noCustomEmojis: "Nessun emoji" +noJobs: "Nessun lavoro" +federating: "Federando" +blocked: "Bloccato" +suspended: "Sospes@" +all: "Tutti" +subscribing: "Iscrivendo" +publishing: "Pubblicando" +notResponding: "Nessuna risposta" +instanceFollowing: "Seguiti dall'istanza" +instanceFollowers: "Followers dell'istanza" +instanceUsers: "Utenti dell'istanza" +changePassword: "Aggiorna Password" +security: "Sicurezza" +retypedNotMatch: "Le password non corrispondono." +currentPassword: "Password attuale" +newPassword: "Nuova Password" +newPasswordRetype: "Conferma password" +attachFile: "Allega file" +more: "Altri!" +featured: "Tendenze" +usernameOrUserId: "Nome utente o ID utente" +noSuchUser: "Nessun utente trovato" +lookup: "Cercare" +announcements: "Annunci" +imageUrl: "URL dell'immagine" +remove: "Elimina" +removed: "Il tuo Tweet è stato eliminato" +removeAreYouSure: "Eliminare \"{x}\"?" +deleteAreYouSure: "Eliminare \"{x}\"?" +resetAreYouSure: "Reimposta" +saved: "Salvato" +messaging: "Messaggi" +upload: "Carica" +fromDrive: "Dal Drive" +fromUrl: "Dall'URL" +uploadFromUrl: "Incolla URL immagine" +uploadFromUrlDescription: "URL del file che vuoi caricare" +uploadFromUrlRequested: "Caricamento richiesto" +uploadFromUrlMayTakeTime: "Il caricamento del file può richiedere tempo." +explore: "Esplora" +messageRead: "Visualizzato" +noMoreHistory: "Non c'è più cronologia da visualizzare" +startMessaging: "Nuovo messaggio" +nUsersRead: "Letto da {n} persone" +agreeTo: "Sono d'accordo con {0}" +tos: "Termini di servizio" +start: "Inizia!" +home: "Home" +remoteUserCaution: "Può darsi che le informazioni siano incomplete perché questo è + un utente remoto." +activity: "Attività" +images: "Immagini" +birthday: "Compleanno" +yearsOld: "{age}Anni" +registeredDate: "Iscrizione a.." +location: "Posizione" +theme: "Tema" +themeForLightMode: "Tema da utilizzare per il modo chiaro" +themeForDarkMode: "Tema da utilizzare per il modo scuro" +light: "Chiaro" +dark: "Scuro" +lightThemes: "Tema Chiaro" +darkThemes: "Tema Scuro" +syncDeviceDarkMode: "Sincronizza il tema scuro con le impostazioni del dispositivo" +drive: "Drive" +fileName: "Nome dell'allegato" +selectFile: "Scelta allegato" +selectFiles: "Scelta allegato" +selectFolder: "Seleziona cartella" +selectFolders: "Seleziona cartella" +renameFile: "Rinomina file" +folderName: "Nome della cartella" +createFolder: "Nuova cartella" +renameFolder: "Rinominare cartella" +deleteFolder: "Elimina cartella" +addFile: "Allega" +emptyDrive: "Il Drive è vuoto" +emptyFolder: "La cartella è vuota" +unableToDelete: "Eliminazione impossibile" +inputNewFileName: "Inserisci nome del nuovo file" +inputNewDescription: "Inserisci una nuova descrizione" +inputNewFolderName: "Inserisci nome della nuova cartella" +circularReferenceFolder: "La cartella di destinazione è una sottocartella della cartella + che vuoi spostare." +hasChildFilesOrFolders: "Impossibile eliminare la cartella perché non è vuota" +copyUrl: "Copia URL" +rename: "Modifica nome" +avatar: "Foto del profilo" +banner: "Intestazione" +nsfw: "Contenuti sensibili" +whenServerDisconnected: "Quando la connessione col server è persa" +disconnectedFromServer: "Disconness@ dal server" +reload: "Ricarica" +doNothing: "Nessun'azione" +reloadConfirm: "Vuoi ricaricare?" +watch: "Osserva" +unwatch: "Smetti di Osserva" +accept: "Accetta" +reject: "Rifiuta" +normal: "Normale" +instanceName: "Nome dell'istanza" +instanceDescription: "Descrizione dell'istanza" +maintainerName: "Nome dell'Amministratore" +maintainerEmail: "Indirizzo e-mail dell'Amministratore" +tosUrl: "Termini di servizio URL" +thisYear: "Anno" +thisMonth: "Mese" +today: "Oggi" +dayX: "{day}" +monthX: "{month}" +yearX: "{year}" +pages: "Pagine" +integration: "App collegate" +connectService: "Connessione" +disconnectService: "Disconnessione " +enableLocalTimeline: "Abilita Timeline locale" +enableGlobalTimeline: "Abilita Timeline federata" +disablingTimelinesInfo: "Anche se disabiliti queste timeline, gli amministratori e + i moderatori potranno sempre accederci." +registration: "Iscriviti" +enableRegistration: "Permettere nuove registrazioni" +invite: "Invita" +driveCapacityPerLocalAccount: "Volume del Drive per utente locale" +driveCapacityPerRemoteAccount: "Volume del Drive per utente remoto" +inMb: "in Megabytes" +iconUrl: "URL di icona (favicon, ecc.)" +bannerUrl: "URL dell'immagine d'intestazione" +backgroundImageUrl: "URL dello sfondo" +basicInfo: "Informazioni fondamentali" +pinnedUsers: "Utenti in evidenza" +pinnedUsersDescription: "Elenca gli/le utenti che vuoi fissare in cima alla pagina + \"Esplora\", un@ per riga." +pinnedPages: "Pagine in evidenza" +pinnedPagesDescription: "Specifica il percorso delle pagine che vuoi fissare in cima + alla pagina dell'istanza. Una pagina per riga." +pinnedClipId: "ID della clip in evidenza" +pinnedNotes: "Nota fissata" +hcaptcha: "hCaptcha" +enableHcaptcha: "Abilita hCaptcha" +hcaptchaSiteKey: "Chiave del sito" +hcaptchaSecretKey: "Chiave segreta" +recaptcha: "reCAPTCHA" +enableRecaptcha: "Abilita reCAPTCHA" +recaptchaSiteKey: "Chiave del sito" +recaptchaSecretKey: "Chiave segreta" +avoidMultiCaptchaConfirm: "Utilizzare diversi Captcha può causare interferenze. Vuoi + disattivare l'altro Captcha? Puoi lasciare diversi Captcha attivi premendo \"Cancella\"\ + ." +antennas: "Antenne" +manageAntennas: "Gestore delle antenne" +name: "Nome" +antennaSource: "Fonte dell'antenna" +antennaKeywords: "Parole chiavi da ricevere" +antennaExcludeKeywords: "Parole chiavi da escludere" +antennaKeywordsDescription: "Separare con uno spazio indica la condizione \"E\". Separare + con un'interruzzione riga indica la condizione \"O\"." +notifyAntenna: "Invia notifiche delle nuove note" +withFileAntenna: "Solo note con file in allegato" +enableServiceworker: "Abilita ServiceWorker" +antennaUsersDescription: "Inserisci solo un nome utente per riga" +caseSensitive: "Sensibile alla distinzione tra maiuscole e minuscole" +withReplies: "Includere le risposte" +connectedTo: "Sei conness@ agli account qui sotto:" +notesAndReplies: "Note e risposte" +withFiles: "Con file in allegato" +silence: "Silenzia" +silenceConfirm: "Vuoi davvero silenziare l'utente?" +unsilence: "Riattiva" +unsilenceConfirm: "Vuoi davvero riattivare l'utente?" +popularUsers: "Utenti popolari" +recentlyUpdatedUsers: "Utenti attivi di recente" +recentlyRegisteredUsers: "Utenti registrati di recente" +recentlyDiscoveredUsers: "Utenti scoperti di recente" +exploreUsersCount: "Ci sono {count} utenti" +exploreFediverse: "Esplora il Fediverso" +popularTags: "Tag di tendenza" +userList: "Liste" +about: "Informazioni" +aboutMisskey: "Informazioni di Calckey" +administrator: "Amministratore" +token: "Token" +twoStepAuthentication: "Autenticazione a due fattori" +moderator: "Moderatore" +nUsersMentioned: "{n} utenti menzionatə" +securityKey: "Chiave di sicurezza" +securityKeyName: "Nome della chiave" +registerSecurityKey: "Registra una chiave di sicurezza" +lastUsed: "Ultima attività" +unregister: "Annulla l'iscrizione" +passwordLessLogin: "Accedi senza password" +resetPassword: "Reimposta password" +newPasswordIs: "La tua nuova password è「{password}」" +reduceUiAnimation: "Ridurre le animazioni dell'interfaccia" +share: "Condividi" +notFound: "Non trovato" +notFoundDescription: "Nessuna pagina corrisponde all'URL indicata." +uploadFolder: "Destinazione caricamento predefinita" +cacheClear: "Svuota cache" +markAsReadAllNotifications: "Segna tutte le notifiche come lette" +markAsReadAllUnreadNotes: "Segna tutte le note come lette" +markAsReadAllTalkMessages: "Segna tutte le chat come lette" +help: "Guida" +inputMessageHere: "Scrivi messaggio qui" +close: "Chiudi" +group: "Gruppo" +groups: "Gruppi" +createGroup: "Nuovo gruppo" +ownedGroups: "I miei gruppi" +joinedGroups: "Gruppi a cui mi sono unit@" +invites: "Inviti" +groupName: "Nome del gruppo" +members: "Membri" +transfer: "Trasferisci" +messagingWithUser: "Iniziare una chat con un altr@ utente" +messagingWithGroup: "Chattare in gruppo" +title: "Titolo" +text: "Testo" +enable: "Abilita" +next: "Avanti" +retype: "Conferma" +noteOf: "Note di {user}" +inviteToGroup: "Invitare al gruppo" +quoteAttached: "Citazione allegata" +quoteQuestion: "Vuoi aggiungere una citazione?" +noMessagesYet: "Ancora nessuna chat" +newMessageExists: "Hai ricevuto un nuovo messaggio" +onlyOneFileCanBeAttached: "È possibile allegare al messaggio soltanto uno file" +signinRequired: "Devi essere registrat@ nel tuo account" +invitations: "Invita" +invitationCode: "Codice di invito" +checking: "Confermando" +available: "Consigliati" +unavailable: "Il nome utente è già in uso" +usernameInvalidFormat: "Il nome utente può contenere solo lettere, numeri e '_'" +tooShort: "Troppo breve" +tooLong: "Troppo lungo" +weakPassword: "Password debole" +normalPassword: "Password buona" +strongPassword: "Password forte" +passwordMatched: "Corretta" +passwordNotMatched: "Le password non corrispondono." +signinWith: "Accedi con {x}" +signinFailed: "Autenticazione non riuscita. Controlla la tua password e nome utente." +tapSecurityKey: "Premi la chiave di sicurezza" +or: "oppure" +language: "Lingua" +uiLanguage: "Lingua di visualizzazione dell'interfaccia" +groupInvited: "Invitat@ al gruppo" +aboutX: "Informazioni su {x}" +useOsNativeEmojis: "Usare le emoji native del sistema operativo" +disableDrawer: "Non mostrare il menù sul drawer" +youHaveNoGroups: "Nessun gruppo" +joinOrCreateGroup: "Puoi creare il tuo gruppo o essere invitat@ a gruppi che già esistono." +noHistory: "Nessuna cronologia" +signinHistory: "Cronologia di accesso all'account" +disableAnimatedMfm: "Disabilità i MFM animati" +doing: "In corso..." +category: "Categoria" +tags: "Tag" +docSource: "Sorgente della scheda" +createAccount: "Crea il tuo account" +existingAccount: "Account esistente" +regenerate: "Generare di nuovo" +fontSize: "Dimensione carattere" +noFollowRequests: "Non hai alcuna richiesta di follow" +openImageInNewTab: "Aprire immagini in una nuova scheda" +dashboard: "Pannello di controllo" +local: "Locale" +remote: "Remoto" +total: "Totale" +weekOverWeekChanges: "Settimanale" +dayOverDayChanges: "Giornaliero" +appearance: "Aspetto" +clientSettings: "Impostazioni client" +accountSettings: "Impostazioni account" +promotion: "Promossa" +promote: "Pubblicizza" +numberOfDays: "Numero di giorni" +hideThisNote: "Nasconda la nota" +showFeaturedNotesInTimeline: "Mostrare le note di tendenza nella tua timeline" +objectStorage: "Stoccaggio oggetti" +useObjectStorage: "Utilizza stoccaggio oggetti" +objectStorageBaseUrl: "Base URL" +objectStorageBaseUrlDesc: "URL di riferimento. In caso di utilizzo di proxy o CDN + l'URL è 'https://.s3.amazonaws.com' per S3, 'https://storage.googleapis.com/' + per GCS eccetera. " +objectStorageBucket: "Bucket" +objectStorageBucketDesc: "Specificare il nome del bucket utilizzato dal provider." +objectStoragePrefix: "Prefix" +objectStoragePrefixDesc: "I file saranno conservati sotto la directory di questo prefisso." +objectStorageEndpoint: "Endpoint" +objectStorageEndpointDesc: "Lasciare vuoto se si sta utilizzando S3. In caso contrario + si prega di specificare l'endpoint come '' oppure ':' a seconda + del servizio utilizzato." +objectStorageRegion: "Region" +objectStorageRegionDesc: "Specificate una regione, quale 'xx-east-1'. Se il servizio + in utilizzo non distingue tra regioni, lasciate vuoto o inserite 'us-east-1'." +objectStorageUseSSL: "Usare SSL" +objectStorageUseSSLDesc: "Disabilita quest'opzione se non utilizzi HTTPS per le connessioni + API." +objectStorageUseProxy: "Usa proxy" +objectStorageUseProxyDesc: "Disabilita quest'opzione se non usi proxy per la connessione + API." +objectStorageSetPublicRead: "Imposta \"visibilità pubblica\" al momento di caricare" +serverLogs: "Log del server" +deleteAll: "Cancella cronologia" +showFixedPostForm: "Visualizzare la finestra di pubblicazione in cima alla timeline" +newNoteRecived: "Vedi le nuove note" +sounds: "Impostazioni suoni" +listen: "Ascolta" +none: "Niente" +showInPage: "Visualizza in pagina" +popout: "Finestra pop-out" +volume: "Volume" +masterVolume: "Volume principale" +details: "Dettagli" +chooseEmoji: "Scegli emoji" +unableToProcess: "Impossibile compiere l'operazione" +recentUsed: "Usato di recente" +install: "Installa" +uninstall: "Disinstalla" +installedApps: "Applicazioni installate" +nothing: "Niente da visualizzare" +installedDate: "Data installazione" +lastUsedDate: "Data di ultimo uso" +state: "Stato" +sort: "Ordina per" +ascendingOrder: "Ascendente" +descendingOrder: "Discendente" +scratchpad: "ScratchPad" +scratchpadDescription: "Lo Scratchpad offre un ambiente per esperimenti di AiScript. + È possibile scrivere, eseguire e confermare i risultati dell'interazione del codice + con Calckey." +output: "Uscita" +script: "Script" +disablePagesScript: "Disabilita AiScript nelle pagine" +updateRemoteUser: "Aggiornare le informazioni di utente remot@" +deleteAllFiles: "Elimina tutti i file" +deleteAllFilesConfirm: "Vuoi davvero eliminare tutti i file?" +removeAllFollowing: "Cancella tutti i follows" +removeAllFollowingDescription: "Cancella tutti i follows del server {host}. Per favore, + esegui se, ad esempio, l'istanza non esiste più." +userSuspended: "L'utente è sospes@." +userSilenced: "L'utente è silenziat@." +yourAccountSuspendedTitle: "Questo account è sospeso." +yourAccountSuspendedDescription: "Questo account è stato sospeso a causa di una violazione + dei termini di servizio del server. Contattare l'amministrazione per i dettagli. + Si prega di non creare un nuovo account." +menu: "Menù" +divider: "Linea di separazione" +addItem: "Aggiungi elemento" +relays: "Ripetitori" +addRelay: "Aggiungi ripetitore" +inboxUrl: "Inbox URL" +addedRelays: "Ripetitori configurati" +serviceworkerInfo: "Deve essere abilitato per le notifiche push. " +deletedNote: "Nota eliminata" +invisibleNote: "Nota invisibile" +enableInfiniteScroll: "Abilita scorrimento infinito" +visibility: "Visibilità" +poll: "Sondaggio" +useCw: "Nascondere media" +enablePlayer: "Apri in lettore video" +disablePlayer: "Chiudi lettore video" +expandTweet: "Espandi tweet" +themeEditor: "Editor di temi" +description: "Descrizione" +describeFile: "Aggiungi una descrizione d'immagine" +enterFileDescription: "Inserisci descrizione" +author: "Autore" +leaveConfirm: "Ci sono delle modifiche ancora non salvate. Vuoi cancellarle?" +manage: "Gestione" +plugins: "Estensioni" +deck: "Deck" +undeck: "Esci dal deck" +useBlurEffectForModal: "Utilizza effetto sfocatura per i modali" +useFullReactionPicker: "Usa la totalità del pannello di reazioni" +width: "Larghezza" +height: "Altezza" +large: "Grande" +medium: "Predefinito" +small: "Piccolo" +generateAccessToken: "Genera token di accesso" +permission: "Autorizzazioni " +enableAll: "Abilita tutto" +disableAll: "Disabilita tutto" +tokenRequested: "Autorizza accesso all'account" +pluginTokenRequestedDescription: "Il plugin potrà utilizzare le autorizzazioni impostate + qui." +notificationType: "Tipo di notifiche" +edit: "Modifica" +emailServer: "Server email" +enableEmail: "Abilita consegna email" +emailConfigInfo: "Utilizzato per verificare il tuo indirizzo di posta elettronica + e per reimpostare la tua password" +email: "Email" +emailAddress: "Indirizzo di posta elettronica" +smtpConfig: "Impostazioni del server SMTP" +smtpHost: "Server remoto" +smtpPort: "Porta" +smtpUser: "Nome utente" +smtpPass: "Password" +emptyToDisableSmtpAuth: "Lasciare il nome utente e la password vuoti per disabilitare + la verifica SMTP" +smtpSecure: "Usare la porta SSL/TLS implicito per le connessioni SMTP" +smtpSecureInfo: "Disabilitare quando è attivo STARTTLS." +testEmail: "Testare la consegna di posta elettronica" +wordMute: "Filtri parole" +instanceMute: "Silenzia l'istanza" +userSaysSomething: "{name} ha detto qualcosa" +makeActive: "Attiva" +display: "Visualizza" +copy: "Copia" +metrics: "Statistiche" +overview: "Anteprima" +logs: "Log" +delayed: "Ritardo" +database: "Base di dati" +channel: "Canale" +create: "Crea" +notificationSetting: "Impostazioni notifiche" +notificationSettingDesc: "Seleziona il tipo di notifiche da visualizzare." +useGlobalSetting: "Usa impostazioni generali" +useGlobalSettingDesc: "Se abilitato, le impostazioni notifiche dell'account verranno + utilizzate. Se disabilitato, si possono definire diverse singole impostazioni." +other: "Avanzate" +regenerateLoginToken: "Genera di nuovo un token di connessione" +regenerateLoginTokenDescription: "Genera un nuovo token di autenticazione. Solitamente + questa operazione non è necessaria: quando si genera un nuovo token, tutti i dispositivi + vanno disconnessi." +setMultipleBySeparatingWithSpace: "È possibile creare multiple voci separate da spazi." +fileIdOrUrl: "ID o URL del file" +behavior: "Comportamento" +sample: "Esempio" +abuseReports: "Segnalazioni" +reportAbuse: "Segnalazioni" +reportAbuseOf: "Segnala {name}" +fillAbuseReportDescription: "Si prega di spiegare il motivo della segnalazione. Se + riguarda una nota precisa, si prega di collegare anche l'URL della nota." +abuseReported: "La segnalazione è stata inviata. Grazie." +reporter: "il corrispondente" +reporteeOrigin: "Origine del segnalato" +reporterOrigin: "Origine del segnalatore" +send: "Inviare" +abuseMarkAsResolved: "Contrassegna la segnalazione come risolta" +openInNewTab: "Apri in una nuova scheda" +openInSideView: "Apri in vista laterale" +defaultNavigationBehaviour: "Navigazione preimpostata" +editTheseSettingsMayBreakAccount: "Modificare queste impostazioni può danneggiare + l'account." +instanceTicker: "Informazioni sull'istanza da cui vengono le note" +waitingFor: "Aspettando {x}" +random: "Casuale" +system: "Sistema" +switchUi: "Cambiare interfaccia utente" +desktop: "Desktop" +clip: "Clip" +createNew: "Crea nuov@" +optional: "Opzionale" +createNewClip: "Nuova clip" +public: "Pubblica" +i18nInfo: "Calckey è tradotto in diverse lingue da volontari. Anche tu puoi contribuire + su {link}." +manageAccessTokens: "Gestisci token di accesso" +accountInfo: "Informazioni account" +notesCount: "Conteggio note" +repliesCount: "Numero di risposte inviate" +renotesCount: "Numero di note che hai ricondiviso" +repliedCount: "Numero di risposte ricevute" +renotedCount: "Numero delle tue note ricondivise" +followingCount: "Numero di account seguiti" +followersCount: "Numero di account che ti seguono" +sentReactionsCount: "Numero di reazioni inviate" +receivedReactionsCount: "Numero di reazioni ricevute" +pollVotesCount: "Numero di voti inviati" +pollVotedCount: "Numero di voti ricevuti" +yes: "Sì" +no: "No" +driveFilesCount: "Numero di file nel Drive" +driveUsage: "Utilizzazione del Drive" +noCrawle: "Rifiuta l'indicizzazione dai robot." +noCrawleDescription: "Richiedi che i motori di ricerca non indicizzino la tua pagina + di profilo, le tue note, pagine, ecc." +lockedAccountInfo: "A meno che non imposti la visibilità delle tue note su \"Solo + ai follower\", le tue note sono visibili da tutti, anche se hai configurato l'account + per confermare manualmente le richieste di follow." +alwaysMarkSensitive: "Segnare i media come sensibili per impostazione predefinita" +loadRawImages: "Visualizza le intere immagini allegate invece delle miniature." +disableShowingAnimatedImages: "Disabilita le immagini animate" +verificationEmailSent: "Una mail di verifica è stata inviata. Si prega di accedere + al collegamento per compiere la verifica." +notSet: "Non impostato" +emailVerified: "Il tuo indirizzo email è stato verificato" +noteFavoritesCount: "Conteggio note tra i preferiti" +pageLikesCount: "Numero di pagine che ti piacciono" +pageLikedCount: "Numero delle tue pagine che hanno ricevuto \"Mi piace\"" +contact: "Contatti" +useSystemFont: "Usa il carattere predefinito del sistema" +clips: "Clip" +experimentalFeatures: "Funzioni sperimentali" +developer: "Sviluppatore" +makeExplorable: "Account visibile sulla pagina \"Esplora\"" +makeExplorableDescription: "Se disabiliti l'opzione, il tuo account non verrà visualizzato + sulla pagina \"Esplora\"." +showGapBetweenNotesInTimeline: "Mostrare un intervallo tra le note sulla timeline" +duplicate: "Duplica" +left: "Sinistra" +center: "Centro" +wide: "Largo" +reloadToApplySetting: "Le tue preferenze verranno impostate dopo il ricaricamento + della pagina. Vuoi ricaricare adesso?" +needReloadToApply: "È necessario riavviare per rendere effettive le modifiche." +showTitlebar: "Visualizza la barra del titolo" +clearCache: "Svuota cache" +onlineUsersCount: "{n} utenti online" +nUsers: "{n} utenti" +nNotes: "{n}Note" +sendErrorReports: "Invia segnalazioni di errori" +sendErrorReportsDescription: "Quando abilitato, se si verifica un problema, informazioni + dettagliate sugli errori verranno condivise con Calckey in modo da aiutare a migliorare + la qualità del software.\nCiò include informazioni come la versione del sistema + operativo, il tipo di navigatore web che usi, la cronologia delle attività, ecc." +myTheme: "I miei temi" +backgroundColor: "Sfondo" +textColor: "Testo" +saveAs: "Salva con nome" +value: "Valore" +createdAt: "Data di creazione" +updatedAt: "Aggiornato il" +saveConfirm: "Vuoi salvare le modifiche?" +deleteConfirm: "Rimuovere?" +invalidValue: "Questo non è un valore valido." +registry: "Registro" +closeAccount: "Disattiva account" +currentVersion: "Versione attuale" +latestVersion: "Ultima versione" +youAreRunningUpToDateClient: "Stai usando la versione più recente del client." +newVersionOfClientAvailable: "Una nuova versione del tuo client è disponibile." +usageAmount: "In utilizzo" +capacity: "Capacità" +inUse: "In utilizzo" +editCode: "Modifica codice" +apply: "Applica" +receiveAnnouncementFromInstance: "Ricevi i messaggi informativi dall'istanza" +emailNotification: "Eventi per notifiche via mail" +publish: "Pubblico" +inChannelSearch: "Cerca in canale" +useReactionPickerForContextMenu: "Cliccare sul tasto destro per aprire il pannello + di reazioni" +typingUsers: "{users} sta(nno) scrivendo" +jumpToSpecifiedDate: "Vai alla data " +showingPastTimeline: "Stai visualizzando una vecchia timeline" +clear: "Cancella" +markAllAsRead: "Segna tutti come già letti" +goBack: "Indietro" +unlikeConfirm: "Non ti piace più?" +fullView: "Schermo intero" +quitFullView: "Esci dalla modalità a schermo intero" +addDescription: "Aggiungi descrizione" +userPagePinTip: "Qui puoi appuntare note, premendo \"Fissa sul profilo\" nel menù + delle singole note." +notSpecifiedMentionWarning: "Sono menzionati account che non vengono inclusi fra i + destinatari" +info: "Informazioni" +userInfo: "Informazioni utente" +unknown: "Sconosciuto" +onlineStatus: "Stato di connessione" +hideOnlineStatus: "Stato invisibile" +hideOnlineStatusDescription: "Abilitare l'opzione di stato invisibile può guastare + la praticità di singole funzioni, come la ricerca." +online: "Online" +active: "Attiv@" +offline: "Offline" +notRecommended: "Sconsigliato" +botProtection: "Protezione contro i bot" +instanceBlocking: "Istanze bloccate" +selectAccount: "Scegli account" +enabled: "Attivo" +disabled: "Inattivo" +quickAction: "Azioni rapide" +user: "Utente" +administration: "Gestione" +accounts: "Account" +switch: "Sostituisci" +noMaintainerInformationWarning: "Le informazioni amministratore non sono impostate." +noBotProtectionWarning: "Nessuna protezione impostata contro i bot." +configure: "Imposta" +postToGallery: "Pubblicare nella galleria" +gallery: "Galleria" +recentPosts: "Le più recenti" +popularPosts: "Le più visualizzate" +shareWithNote: "Condividere in nota" +ads: "Pubblicità" +expiration: "Scadenza" +memo: "Promemoria" +priority: "Priorità" +high: "Alta" +middle: "Media" +low: "Bassa" +emailNotConfiguredWarning: "Non hai impostato nessun indirizzo e-mail." +ratio: "Rapporto" +previewNoteText: "Anteprima del testo" +customCss: "CSS personalizzato" +global: "Federata" +squareAvatars: "Mostra l'immagine del profilo come quadrato" +sent: "Inviare" +received: "Ricevuto" +searchResult: "Risultati della Ricerca" +hashtags: "Hashtag" +troubleshooting: "Risoluzione problemi" +useBlurEffect: "Utilizza effetto sfocatura per l'interfaccia utente" +learnMore: "Più dettagli" +misskeyUpdated: "Calckey è stato aggiornato!" +whatIsNew: "Visualizza le informazioni sull'aggiornamento" +translate: "Traduzione" +translatedFrom: "Tradotto da {x}" +accountDeletionInProgress: "La cancellazione dell'account è in corso" +usernameInfo: "Un nome per identificare univocamente il tuo account sul server. È + possibile utilizzare caratteri alfanumerici (a~z, A~Z, 0~9) e il trattino basso + (_). Non sarà possibile cambiare il nome utente in seguito." +aiChanMode: "Modalità Ai" +keepCw: "Mantieni il CW" +resolved: "Risolto" +unresolved: "Non risolto" +breakFollow: "Smetti di seguire" +itsOn: "Abilitato" +itsOff: "Disabilitato" +emailRequiredForSignup: "È necessario un indirizzo mail per registrare un account" +unread: "Non letto" +filter: "Filtri" +controlPanel: "Pannello di controllo" +manageAccounts: "Gestisci account" +classic: "Classico" +muteThread: "Silenzia la discussione" +unmuteThread: "Riattiva la discussione" +deleteAccountConfirm: "L'account verrà cancellato. Procedere?" +incorrectPassword: "La password è errata." +voteConfirm: "Votare per「{choice}」?" +hide: "Nascondere" +leaveGroup: "Esci dal gruppo" +leaveGroupConfirm: "Uscire da「{name}」?" +useDrawerReactionPickerForMobile: "Mostra sul drawer da dispositivo mobile" +welcomeBackWithName: "Bentornato/a, {name}" +clickToFinishEmailVerification: "Fai click su [{ok}] per completare la verifica dell'indirizzo + email." +searchByGoogle: "Cerca" +indefinitely: "Non scade" +tenMinutes: "10 minuti" +oneHour: "1 ora" +oneDay: "1 giorno" +oneWeek: "1 settimana" +file: "Allegati" +reverse: "Inverti" +colored: "Colorato" +label: "Etichetta" +localOnly: "Soltanto locale" +account: "Account" +_emailUnavailable: + used: "Email già in uso" + format: "Formato email non valido" + disposable: "Email non riutilizzabile" + mx: "Server email non corretto" + smtp: "Il server email non risponde" +_ffVisibility: + public: "Pubblico" + followers: "Mostra solo ai follower" + private: "Invisibile" +_signup: + almostThere: "Quasi completo" + emailAddressInfo: "Inserisci il tuo indirizzo email. Non verrà reso pubblico." +_accountDelete: + accountDelete: "Cancellazione account" + sendEmail: "Al termine della cancellazione dell'account, verrà inviata una mail + all'indirizzo a cui era registrato." + requestAccountDelete: "Richiesta di cancellazione account" + started: "Il processo di cancellazione è iniziato." + inProgress: "Cancellazione in corso" +_ad: + back: "Indietro" + reduceFrequencyOfThisAd: "Visualizza questa pubblicità meno spesso" +_forgotPassword: + enterEmail: "Inserisci l'indirizzo di posta elettronica che hai registrato nel tuo + profilo. Il collegamento necessario per ripristinare la password verrà inviato + a questo indirizzo." + ifNoEmail: "Se nessun indirizzo e-mail è stato registrato, si prega di contattare + l'amministratore·trice dell'istanza." + contactAdmin: "Poiché questa istanza non permette l'utilizzo di una mail, si prega + di contattare l'amministratore·trice dell'istanza per poter ripristinare la password." +_gallery: + my: "Le mie pubblicazioni" + liked: "Pubblicazioni che mi piacciono" + like: "Mi piace!" + unlike: "Non mi piace più" +_email: + _follow: + title: "Ha iniziato a seguirti" + _receiveFollowRequest: + title: "Hai ricevuto una richiesta di follow" +_plugin: + install: "Installa estensioni" + installWarn: "Si prega di installare soltanto estensioni che provengono da fonti + affidabili." + manage: "Gestisci estensioni" +_registry: + key: "Dati" + keys: "Dati" + domain: "Dominio" + createKey: "Crea chiave" +_aboutMisskey: + about: "Misskey è un software libero e open source, sviluppato da syuilo dal 2014." + contributors: "Principali sostenitori" + allContributors: "Tutti i sostenitori" + source: "Codice sorgente" + translation: "Tradurre Calckey" + donate: "Sostieni Calckey" + morePatrons: "Apprezziamo sinceramente il supporto di tante altre persone. Grazie + mille! 🥰" + patrons: "Sostenitori" +_nsfw: + respect: "Nascondere i media segnati come sensibli" + ignore: "Visualizzare i media segnati come sensibili" + force: "Nascondere tutti i media" +_mfm: + cheatSheet: "Bigliettino MFM" + intro: "MFM è un linguaggio Markdown particolare che si può usare in diverse parti + di Calckey. Qui puoi visualizzare a colpo d'occhio tutta la sintassi MFM utile." + dummy: "Il Fediverso si espande con Calckey" + mention: "Menzioni" + mentionDescription: "Si può menzionare un utente specifico digitando il suo nome + utente subito dopo il segno @." + hashtag: "Hashtag" + url: "URL" + link: "Link" + bold: "Grassetto" + blockCode: "Codice (blocco)" + inlineMath: "Espressione matematica(Immersione)" + blockMath: "Formula matematica (blocco)" + quote: "Cita il nota" + emoji: "Emoji personalizzati" + search: "Cerca" + flip: "Inverti" + jump: "Animazione(salto)" + jumpDescription: "Da un animazione che salta su e giù." + bounce: "Animazione(rimbalzo)" + bounceDescription: "Rende il testo rimbalzante" + shake: "rimbalzante" + shakeDescription: "Rende il testo traballante" + twitch: "testo" + twitchDescription: "Fa tremare il testo" + x2: "Più grande" + x2Description: "Mostra il contenuto ingrandito." + x3: "Molto più grande" + x3Description: "Mostra il contenuto molto più ingrandito." + x4: "Estremamente più grande" + x4Description: "Mostra il contenuto estremamente più ingrandito." + blur: "Sfocatura" + blurDescription: "È possibile rendere sfocato il contenuto. Spostando il cursore + su di esso tornerà visibile chiaramente." + font: "Tipo di carattere" + fontDescription: "Puoi scegliere il tipo di carattere per il contenuto." + rainbow: "Arcobaleno" + rotate: "Ruota" + fade: "Dissolvenza" + fadeDescription: "Dissolvenza in entrata e in uscita del contenuto." +_instanceTicker: + none: "Nascondi" + remote: "Mostra solo per gli/le utenti remotə" + always: "Mostra sempre" +_serverDisconnectedBehavior: + reload: "Ricarica automaticamente" + dialog: "Apri avviso in finestra" + quiet: "Visualizza avviso in modo discreto" +_channel: + create: "Nuovo canale" + edit: "Gerisci canale" + setBanner: "Scegli intestazione" + removeBanner: "Rimuovi intestazione" + featured: "Tendenze" + owned: "I miei canali" + following: "Seguiti" + usersCount: "{n} partecipanti" + notesCount: "{n} note" +_menuDisplay: + hide: "Nascondere" +_wordMute: + muteWords: "Parole da filtrare" + muteWordsDescription: "Separare con uno spazio indica la condizione \"E\". Separare + con un'interruzzione riga indica la condizione \"O\"." + muteWordsDescription2: "Metti le parole chiavi tra slash per usare espressioni regolari + (regexp)." + softDescription: "Nascondi della timeline note che rispondono alle condizioni impostate + qui." + hardDescription: "Impedisci alla timeline di caricare le note che rispondono alle + condizioni impostate qui. Inoltre, le note scompariranno in modo irreversibile, + anche se le condizioni verranno successivamente rimosse." + soft: "Moderato" + hard: "Severo" + mutedNotes: "Note silenziate" +_theme: + explore: "Esplora temi" + install: "Installa un tema" + manage: "Gerisci temi" + code: "Codice tema" + description: "Descrizione" + installed: "{name} è installato" + installedThemes: "Temi installati" + builtinThemes: "Temi integrati" + alreadyInstalled: "Questo tema è già installato" + invalid: "Il formato tema non è valido" + make: "Crea un tema" + base: "Base" + addConstant: "Aggiungi costante" + constant: "Costante" + defaultValue: "Valore predefinito" + color: "Colore" + refConst: "Chiama costante" + key: "Chiave" + func: "Funzione" + funcKind: "Tipo di funzione" + argument: "Argomento" + alpha: "Opacità" + darken: "Scuro" + lighten: "Chiaro" + inputConstantName: "Inserisci un nome per la costante" + deleteConstantConfirm: "Vuoi davvero eliminare la costante {const}?" + keys: + bg: "Sfondo" + fg: "Testo" + focus: "Focalizzazione" + indicator: "Indicatore" + panel: "Pannello" + shadow: "Ombra" + header: "Intestazione" + navBg: "Sfondo della barra laterale" + navFg: "Testo della barra laterale" + navHoverFg: "Testo della barra laterale (al passaggio del mouse)" + navActive: "Testo della barra laterale (attivo)" + navIndicator: "Indicatore di barra laterale" + link: "Link" + hashtag: "Hashtag" + mention: "Menzioni" + mentionMe: "Menzioni (di me)" + renote: "Rinota" + divider: "Interruzione di linea" + infoBg: "Sfondo informazioni" + infoFg: "Testo di informazioni" + infoWarnBg: "Sfondo degli avvisi" + infoWarnFg: "Testo di avviso" + cwBg: "Sfondo del CW" + cwFg: "Testo del pulsante CW" + cwHoverBg: "Sfondo del pulsante CW (sorvolato)" + toastBg: "Sfondo di notifica a comparsa" + toastFg: "Testo di notifica a comparsa" + buttonBg: "Sfondo del pulsante" + buttonHoverBg: "Sfondo del pulsante (sorvolato)" + inputBorder: "Inquadra casella di testo" + listItemHoverBg: "Sfondo della voce di elenco (sorvolato)" + driveFolderBg: "Sfondo della cartella di disco" + badge: "Distintivo" + messageBg: "Sfondo della chat" +_sfx: + note: "Nota" + noteMy: "Mia nota" + notification: "Notifiche" + chat: "Messaggi" + chatBg: "Chat (sfondo)" + antenna: "Ricezione dell'antenna" + channel: "Notifiche di canale" +_ago: + future: "Futuro" + justNow: "Ora" + secondsAgo: "{n}s fa" + minutesAgo: "{n}min fa" + hoursAgo: "{n}h fa" + daysAgo: "{1} giorni fa" + weeksAgo: "{n} settimane fa" + monthsAgo: "{n} mesi fa" + yearsAgo: "{n} anni fa" +_time: + second: "s" + minute: "min" + hour: "ore" + day: "giorni" +_tutorial: + titolo: "Come usare Calckey" + step1_1: "Benvenuto!" + step1_2: "Vediamo di configurarla. Sarete operativi in men che non si dica!" + step2_1: "Per prima cosa, compila il tuo profilo" + step2_2: "Fornendo alcune informazioni su chi siete, sarà più facile per gli altri + capire se vogliono vedere le vostre note o seguirvi" + step3_1: "Ora è il momento di seguire alcune persone!" + step3_2: "La vostra home e le vostre timeline social si basano su chi seguite, quindi + provate a seguire un paio di account per iniziare.\nCliccate sul cerchio più in + alto a destra di un profilo per seguirlo" + step4_1: "Fatevi conoscere" + step4_2: "Per il vostro primo post, alcuni preferiscono fare un post di {introduction} + o un semplice \"Ciao mondo!\"" + step5_1: "Linee temporali, linee temporali dappertutto!" + step5_2: "La tua istanza ha attivato {timelines} diverse timelines" + step5_3: "La timeline Home {icon} è quella in cui si possono vedere i post dei propri + follower" + step5_4: "La timeline Locale {icon} è quella in cui si possono vedere i post di + tutti gli altri utenti di questa istanza" + step5_5: "La timeline Raccomandati {icon} è quella in cui si possono vedere i post + delle istanze raccomandate dagli amministratori" + step5_6: "La timeline Social {icon} è quella in cui si possono vedere i post degli + amici dei propri follower" + step5_7: "La timeline Globale {icon} è quella in cui si possono vedere i post di + ogni altra istanza collegata" + step6_1: "Allora, cos'è questo posto?" + step6_2: "Beh, non ti sei semplicemente unito a Calckey. Sei entrato in un portale + del Fediverse, una rete interconnessa di migliaia di server, chiamata \"istanze\"" + step6_3: "Ogni server funziona in modo diverso, e non tutti i server eseguono Calckey. + Questo però lo fa! È un po' complicato, ma ci riuscirete in poco tempo" + step6_4: "Ora andate, esplorate e divertitevi!" +_2fa: + registerTOTP: "Aggiungi dispositivo" +_permissions: + "read:account": "Visualizzare le informazioni dell'account" + "write:account": "Modificare le informazioni dell'account" + "read:blocks": "Visualizza gli account bloccati" + "write:blocks": "Gestisci gli account bloccati" + "read:drive": "Aprire il Drive" + "write:drive": "Gestire il Drive" + "read:favorites": "Visualizza i tuoi preferiti" + "write:favorites": "Gestisci i tuoi preferiti" + "read:following": "Vedi le informazioni di follow" + "write:following": "Seguiti/ Smetti di seguire" + "read:messaging": "Visualizzare la chat" + "write:messaging": "Gestire la chat" + "read:mutes": "Vedi account silenziati" + "write:mutes": "Gerisci account silenziati" + "write:notes": "Creare / Eliminare note" + "read:notifications": "Visualizza notifiche" + "write:notifications": "Gerisci notifiche" + "read:reactions": "Vedi reazioni" + "write:reactions": "Gerisci reazioni" + "write:votes": "Votare" + "read:pages": "Visualizzare pagine" + "write:pages": "Gestire pagine" + "read:page-likes": "Visualizzare i \"Mi piace\" di pagine" + "write:page-likes": "Gestire i \"Mi piace\" di pagine" + "read:user-groups": "Vedi gruppi di utenti" + "write:user-groups": "Gestisci gruppi di utenti" + "read:channels": "Visualizza canali" + "write:channels": "Gerisci canali" +_auth: + shareAccess: "Autorizzare「{name}」ad accedere al tuo account?" + shareAccessAsk: "Vuoi davvero consentire l'accesso al tuo account a questa app'?" + permissionAsk: "Questa app richiede le seguenti autorizzazioni:" + pleaseGoBack: "Si prega di ritornare sulla app" + callback: "Ritornando sulla app" + denied: "Accesso negato" +_antennaSources: + all: "Tutte le note" + homeTimeline: "Note dagli utenti che segui" + users: "Note dagli utenti selezionati" + userList: "Note dagli utenti della lista selezionata" + userGroup: "Note dagli utenti del gruppo selezionato" +_weekday: + sunday: "Domenica" + monday: "Lunedì" + tuesday: "Martedì" + wednesday: "Mercoledì" + thursday: "Giovedì" + friday: "Venerdì" + saturday: "Sabato" +_widgets: + memo: "Memo" + notifications: "Notifiche" + timeline: "Timeline" + calendar: "Calendario" + trends: "Tendenze" + clock: "Orologio" + rss: "Aggregatore rss" + activity: "Attività" + photos: "Foto" + digitalClock: "Orologio digitale" + federation: "Federazione" + postForm: "Finestra di pubblicazione" + slideshow: "Diapositive" + button: "Pulsante" + onlineUsers: "Utenti online" + jobQueue: "Coda di lavoro" + serverMetric: "Statistiche server" + aiscript: "Console AiScript" +_cw: + hide: "Nascondere" + show: "Mostra di più" + chars: "{count} caratteri" + files: "{count} file" +_poll: + noOnlyOneChoice: "Sono necessarie almeno 2 risposte" + choiceN: "Opzione {n}" + noMore: "Hai aggiunto il numero massimo di opzioni." + canMultipleVote: "Possibilità di risposte multiple" + expiration: "Scadenza" + infinite: "Non scade" + at: "Seleziona data" + after: "Seleziona durata" + deadlineDate: "Data di scadenza" + deadlineTime: "Ora di scadenza" + duration: "Durata" + votesCount: "{n} voti" + totalVotes: "Totale di {n} voti" + vote: "Vota" + showResult: "Visualizza risultati" + voted: "Hai votato" + closed: "Terminato" + remainingDays: "Rimangono {d} giorni e {h} ore" + remainingHours: "Rimangono {h} ore e {m} minuti" + remainingMinutes: "Rimangono {m} minuti e {s} secondi" + remainingSeconds: "Rimangono {s} secondi" +_visibility: + public: "Pubblica" + publicDescription: "Visibile per tutti sul Fediverso" + home: "Home" + homeDescription: "Visibile solo sulla timeline \"Home\"" + followers: "Followers" + followersDescription: "Visibile solo per i tuoi followers" + specified: "Diretta" + specifiedDescription: "Visibile solo per gli/le utenti menzionatə" + localOnly: "Soltanto locale" + localOnlyDescription: "Nascosta per gli/le utenti remotə" +_postForm: + replyPlaceholder: "Nota la tua risposta.." + quotePlaceholder: "Cita Nota..." + channelPlaceholder: "Pubblica in canale" + _placeholders: + a: "Che succede?" + b: "È successo qualcosa?" + c: "Che cos'hai in mente?" + d: "Vuoi dire qualcosa?" + e: "Scrivi qualcosa qui" + f: "Aspettando che scriva..." +_profile: + name: "Nome" + username: "Nome utente" + description: "Bio" + youCanIncludeHashtags: "Puoi anche includere hashtag." + metadata: "Informazioni aggiuntive" + metadataEdit: "Modifica informazioni aggiuntive" + metadataDescription: "Puoi pubblicare fino a quattro informazioni aggiuntive sul + profilo." + metadataLabel: "Etichetta" + metadataContent: "Contenuto" + changeAvatar: "Modifica immagine profilo" + changeBanner: "Cambia intestazione" +_exportOrImport: + allNotes: "Tutte le note" + followingList: "Follows" + muteList: "Account silenziati" + blockingList: "Account bloccati" + userLists: "Liste" +_charts: + federation: "Federazione" + apRequest: "Richieste" + usersIncDec: "Variazione del numero di utenti" + usersTotal: "Numero totale di utenti" + activeUsers: "Numero di utenti attivi" + notesIncDec: "Variazione del numero di note" + localNotesIncDec: "Variazione del numero di note locali" + remoteNotesIncDec: "Variazione del numero di note distanti" + notesTotal: "Conteggio totale di note" + filesIncDec: "Variazione del numero dei file" + filesTotal: "Numero totale di file" + storageUsageIncDec: "Variazione dell'utilizzo dell'immagazzinamento" + storageUsageTotal: "Utilizzo totale dell'immagazzinamento" +_instanceCharts: + requests: "Richieste" + users: "Variazione del numero di utenti" + usersTotal: "Totale cumulativo di utenti" + notes: "Variazione del numero di note" + notesTotal: "Totale cumulato di note" + ff: "Variazione dei follow/ follower" + ffTotal: "Totale cumulato dei follow/ follower" + cacheSize: "Variazione dello spazio occupato dalla cache" + cacheSizeTotal: "Totale cumulato dello spazio occupato dalla cache" + files: "Variazione del numero di file" + filesTotal: "Totale cumulato del numero di file" +_timelines: + home: "Home" + local: "Locale" + social: "Sociale" + global: "Federata" +_pages: + newPage: "Crea pagina" + editPage: "Modifica pagina" + readPage: "Visualizzando fonte " + created: "Pagina creata!" + updated: "Pagina aggiornata con successo!" + deleted: "Pagina eliminata" + pageSetting: "Impostazioni pagina" + nameAlreadyExists: "Esiste già una pagina con lo stesso URL." + invalidNameTitle: "L'URL di pagina definito non è valido" + invalidNameText: "Verifica che il campo non è vuoto" + editThisPage: "Modifica questa pagina" + viewSource: "Visualizza sorgente" + viewPage: "Visualizza pagina" + like: "Mi piace" + unlike: "Togli Mi piace" + my: "Le mie pagine" + liked: "Pagine che mi piacciono" + featured: "Popolari" + contents: "Contenuto" + content: "Blocco di pagina" + variables: "Variabili" + title: "Titolo" + url: "URL della pagina" + summary: "Riassunto di pagina" + hideTitleWhenPinned: "Nascondere il titolo pagina quando è fissata in cima al profilo." + font: "Tipo di carattere" + fontSerif: "Serif" + fontSansSerif: "Sans serif" + eyeCatchingImageSet: "Imposta un'immagine attrattiva" + eyeCatchingImageRemove: "Elimina l'immagine attrattiva" + chooseBlock: "Aggiungi blocco" + selectType: "Seleziona tipo" + enterVariableName: "Digita un nome di variabile" + variableNameIsAlreadyUsed: "Esiste già una variabile con lo stesso nome" + contentBlocks: "Contenuto" + inputBlocks: "Blocchi di input" + specialBlocks: "Speciale" + blocks: + text: "Testo" + textarea: "Area di testo" + section: "Sezione" + image: "Immagini" + button: "Pulsante" + if: "Se" + _if: + variable: "Variabili" + post: "Finestra di pubblicazione" + _post: + text: "Contenuto" + textInput: "Immissione testo" + _textInput: + name: "Nome della variabile" + text: "Titolo" + default: "Valore predefinito" + textareaInput: "Immissione testo a più righe" + _textareaInput: + name: "Nome della variabile" + text: "Titolo" + default: "Valore predefinito" + numberInput: "Immissione numerica" + _numberInput: + name: "Nome della variabile" + text: "Titolo" + default: "Valore predefinito" + _canvas: + width: "Larghezza" + height: "Altezza" + note: "Nota integrata" + _note: + id: "ID nota" + idDescription: "Qui puoi anche incollare l'URL della nota che vuoi impostare." + detailed: "Visualizzazione dettagliata" + switch: "Interruttore" + _switch: + name: "Nome della variabile" + text: "Titolo" + default: "Valore predefinito" + counter: "Contatore" + _counter: + name: "Nome della variabile" + text: "Titolo" + inc: "Valore da aggiungere" + _button: + text: "Titolo" + colored: "Colorato" + action: "Operazione da eseguire quando viene premuto il pulsante" + _action: + dialog: "Visualizzare una finestra di dialogo" + _dialog: + content: "Contenuto" + resetRandom: "Ripristinare un numero aleatorio" + pushEvent: "Inviare evento" + _pushEvent: + event: "Nome evento" + message: "Messaggio da visualizzare quando abilitato" + variable: "Variabile da inviare" + no-variable: "Nessun contenuto" + callAiScript: "Chiamare AiScript" + _callAiScript: + functionName: "Nome della funzione" + radioButton: "Opzioni" + _radioButton: + name: "Nome della variabile" + title: "Titolo" + default: "Valore predefinito" + script: + categories: + comparison: "Metodo comparativo" + random: "Aleatorietà" + value: "Valore" + fn: "Funzione" + list: "Liste" + blocks: + text: "Testo" + multiLineText: "Testo (a più righe)" + textList: "Lista di testo" + _strLen: + arg1: "Testo" + _strPick: + arg1: "Testo" + _strReplace: + arg1: "Testo" + _strReverse: + arg1: "Testo" + _join: + arg1: "Liste" + _add: + arg1: "A" + arg2: "B" + _subtract: + arg1: "A" + arg2: "B" + _multiply: + arg1: "A" + arg2: "B" + _divide: + arg1: "A" + arg2: "B" + _mod: + arg1: "A" + arg2: "B" + _eq: + arg1: "A" + arg2: "B" + notEq: "A e B sono differenti" + _notEq: + arg1: "A" + arg2: "B" + and: "A e B" + _and: + arg1: "A" + arg2: "B" + or: "A o B" + _or: + arg1: "A" + arg2: "B" + _lt: + arg1: "A" + arg2: "B" + _gt: + arg1: "A" + arg2: "B" + _ltEq: + arg1: "A" + arg2: "B" + _gtEq: + arg1: "A" + arg2: "B" + _if: + arg1: "Se" + arg2: "Se" + random: "Aleatorietà" + _randomPick: + arg1: "Liste" + _dailyRandomPick: + arg1: "Liste" + _seedRandom: + arg2: "Probabilità" + _seedRandomPick: + arg2: "Liste" + _DRPWPM: + arg1: "Lista di testo" + _pick: + arg1: "Liste" + _listLen: + arg1: "Liste" + _stringToNumber: + arg1: "Testo" + _splitStrByLine: + arg1: "Testo" + ref: "Variabili" + fn: "Funzione" + types: + string: "Testo" + array: "Liste" + stringArray: "Lista di testo" +_relayStatus: + requesting: "In attesa di approvazione" + accepted: "Approvato" + rejected: "Respinto" +_notification: + fileUploaded: "File caricato correttamente" + youGotMention: "{name} ti ha menzionato" + youGotReply: "{name} ti ha risposto" + youGotQuote: "{name} ha citato il tuo Nota e ha detto" + youRenoted: "{name} ha rinotato" + youGotPoll: "{name} ha votato" + youGotMessagingMessageFromUser: "{name} ti ha mandato un messaggio" + youGotMessagingMessageFromGroup: "{name} ti ha mandato un messaggio nella chat" + youWereFollowed: "Ha iniziato a seguirti" + youReceivedFollowRequest: "Hai ricevuto una richiesta di follow" + yourFollowRequestAccepted: "La tua richiesta di follow è stata accettata" + youWereInvitedToGroup: "Invitat@ al gruppo" + _types: + all: "Tutto" + follow: "Nuovə follower" + mention: "Menzioni" + reply: "Risposte" + renote: "Rinota" + quote: "Cita" + reaction: "Reazioni" + pollVote: "Voti ricevuti" + receiveFollowRequest: "Richiesta di follow ricevuta" + followRequestAccepted: "Richiesta di follow accettata" + groupInvited: "Invito a un gruppo" + app: "Notifiche da applicazioni" + _actions: + reply: "Rispondi" + renote: "Rinota" +_deck: + alwaysShowMainColumn: "Mostra sempre la colonna principale" + columnAlign: "Allineare colonne" + addColumn: "Aggiungi colonna" + swapLeft: "Sposta a sinistra" + swapRight: "Sposta a destra" + swapUp: "Sposta in alto" + swapDown: "Sposta in basso" + stackLeft: "Impila a sinistra" + popRight: "Estrai a destra" + profile: "Profilo" + _columns: + main: "Principale" + widgets: "Widget" + notifications: "Notifiche" + tl: "Timeline" + antenna: "Antenne" + list: "Liste" + mentions: "Menzioni" + direct: "Diretta" +noThankYou: No grazie +addInstance: Aggiungi un'istanza +deleted: Eliminato diff --git a/fe_calckey/frontend/locales/ja-JP.yml b/fe_calckey/frontend/locales/ja-JP.yml new file mode 100644 index 0000000..617930d --- /dev/null +++ b/fe_calckey/frontend/locales/ja-JP.yml @@ -0,0 +1,1933 @@ +_lang_: "日本語" +headlineMisskey: "ずっと無料でオープンソースの非中央集権型ソーシャルメディアプラットフォーム🚀" +introMisskey: "ようこそ!Calckeyは、オープンソースの非中央集権型ソーシャルメディアプラットフォームです。\nいま起こっていることを共有したり、あなたについて皆に発信しましょう📡\n\ + 「リアクション」機能で、皆の投稿に素早く反応を追加できます👍\n新しい世界を探検しよう🚀" +monthAndDay: "{month}月 {day}日" +search: "検索" +notifications: "通知" +username: "ユーザー名" +password: "パスワード" +forgotPassword: "パスワードを忘れました" +fetchingAsApObject: "連合宇宙から取得中" +ok: "OK" +gotIt: "わかった!" +cancel: "キャンセル" +noThankYou: "やめておく" +enterUsername: "ユーザー名を入力" +renotedBy: "{user}がブースト" +noNotes: "投稿はありません" +noNotifications: "通知はありません" +instance: "サーバー" +settings: "設定" +basicSettings: "基本設定" +otherSettings: "その他の設定" +openInWindow: "ウィンドウで開く" +profile: "プロフィール" +timeline: "タイムライン" +noAccountDescription: "自己紹介はありません" +login: "ログイン" +loggingIn: "ログイン中" +logout: "ログアウト" +signup: "新規登録" +uploading: "アップロード中" +save: "保存" +users: "ユーザー" +addUser: "ユーザーを追加" +addInstance: "サーバーを追加" +favorite: "お気に入り" +favorites: "お気に入り" +unfavorite: "お気に入り解除" +favorited: "お気に入りに登録しました。" +alreadyFavorited: "既にお気に入りに登録されています。" +cantFavorite: "お気に入りに登録できませんでした。" +pin: "ピン留め" +unpin: "ピン留め解除" +copyContent: "内容をコピー" +copyLink: "リンクをコピー" +delete: "削除" +deleteAndEdit: "削除して編集" +deleteAndEditConfirm: "この投稿を削除してもう一度編集しますか?この投稿へのリアクション、ブースト、返信は全て失われます。" +addToList: "リストに追加" +sendMessage: "メッセージを送信" +copyUsername: "ユーザー名をコピー" +searchUser: "ユーザーを検索" +reply: "返信" +loadMore: "もっと読み込む" +showMore: "もっと見る" +showLess: "閉じる" +youGotNewFollower: "フォローされました" +receiveFollowRequest: "フォローリクエストされました" +followRequestAccepted: "フォローが承認されました" +mention: "メンション" +mentions: "あなた宛て" +directNotes: "ダイレクト投稿" +importAndExport: "インポートとエクスポート" +import: "インポート" +export: "エクスポート" +files: "ファイル" +download: "ダウンロード" +driveFileDeleteConfirm: "ファイル「{name}」を削除しますか?これにより、このファイルが添付されている投稿も削除されます。" +unfollowConfirm: "{name}さんのフォローを解除しますか?" +exportRequested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、「ドライブ」に追加されます。" +importRequested: "インポートをリクエストしました。これには時間がかかる場合があります。" +lists: "リスト" +noLists: "リストはありません" +note: "投稿" +notes: "投稿" +following: "フォロー" +followers: "フォロワー" +followsYou: "フォローされています" +createList: "リスト作成" +manageLists: "リストの管理" +error: "エラー" +somethingHappened: "問題が発生しました" +retry: "再試行" +pageLoadError: "ページの読み込みに失敗しました。" +pageLoadErrorDescription: "これは通常、ネットワークまたはブラウザキャッシュが原因です。キャッシュをクリアするか、しばらく待ってから再度試してください。" +serverIsDead: "サーバーの応答がありません。しばらく待ってから再度試してください。" +youShouldUpgradeClient: "このページを表示するためには、リロードして新しいバージョンのクライアントをご利用ください。" +enterListName: "リスト名を入力" +privacy: "プライバシー" +makeFollowManuallyApprove: "フォローを承認制にする" +defaultNoteVisibility: "デフォルトの公開範囲" +follow: "フォロー" +followRequest: "フォロー申請" +followRequests: "フォロー申請" +unfollow: "フォロー解除" +followRequestPending: "フォロー許可待ち" +enterEmoji: "絵文字を入力" +renote: "ブースト" +unrenote: "ブースト解除" +renoted: "ブーストしました。" +cantRenote: "この投稿はブーストできません。" +cantReRenote: "ブーストをブーストすることはできません。" +quote: "引用" +pinnedNote: "ピン留めされた投稿" +pinned: "ピン留め" +you: "あなた" +clickToShow: "クリックして表示" +sensitive: "閲覧注意" +add: "追加" +reaction: "リアクション" +enableEmojiReactions: "絵文字リアクションを有効にする" +showEmojisInReactionNotifications: "自分の投稿に対するリアクションの通知で絵文字を表示する" +reactionSetting: "ピッカーに表示するリアクション" +reactionSettingDescription2: "ドラッグして並び替え、クリックして削除、+を押して追加します。" +rememberNoteVisibility: "公開範囲を記憶する" +attachCancel: "添付取り消し" +markAsSensitive: "閲覧注意にする" +unmarkAsSensitive: "閲覧注意を解除する" +enterFileName: "ファイル名を入力" +mute: "ミュート" +unmute: "ミュート解除" +renoteMute: "ブーストをミュート" +renoteUnmute: "ブーストのミュートを解除" +block: "ブロック" +unblock: "ブロック解除" +suspend: "凍結" +unsuspend: "解凍" +blockConfirm: "ブロックしますか?" +unblockConfirm: "ブロックを解除しますか?" +suspendConfirm: "凍結しますか?" +unsuspendConfirm: "解凍しますか?" +selectList: "リストを選択" +selectAntenna: "アンテナを選択" +selectWidget: "ウィジェットを選択" +selectChannel: "チャンネルを選択" +editWidgets: "ウィジェットを編集" +editWidgetsExit: "編集を終了" +customEmojis: "カスタム絵文字" +emoji: "絵文字" +emojis: "絵文字" +emojiName: "絵文字名" +emojiUrl: "絵文字画像URL" +addEmoji: "絵文字を追加" +settingGuide: "おすすめ設定" +cacheRemoteFiles: "リモートのファイルをキャッシュする" +cacheRemoteFilesDescription: "この設定を無効にすると、リモートファイルをキャッシュせず直リンクします。サーバーのストレージを節約できますが、サムネイルが生成されないので通信量が増加します。" +flagAsBot: "Botとして設定" +flagAsBotDescription: "このアカウントがBotである場合は、この設定をオンにします。オンにすると、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、Calckeyのシステム上での扱いがBotに合ったものになります。" +flagAsCat: "あなたは…猫?😺" +flagAsCatDescription: "このアカウントが猫であることを示す猫モードを有効にするには、このフラグをオンにします。" +flagSpeakAsCat: "猫語で話す" +flagSpeakAsCatDescription: "猫モードが有効の場合にオンにすると、あなたの投稿の「な」を「にゃ」に変換します。" +flagShowTimelineReplies: "タイムラインに投稿の返信を表示する" +flagShowTimelineRepliesDescription: "オンにすると、タイムラインにユーザーの他の投稿への返信も表示されます。" +autoAcceptFollowed: "フォローしているユーザーからのフォロー申請を自動承認" +addAccount: "アカウントを追加" +loginFailed: "ログインに失敗しました" +showOnRemote: "リモートで表示" +general: "全般" +accountMoved: "このユーザーは新しいアカウントに移行しました" +wallpaper: "壁紙" +setWallpaper: "壁紙を設定" +removeWallpaper: "壁紙を削除" +searchWith: "検索: {q}" +youHaveNoLists: "リストがありません" +followConfirm: "{name}をフォローしますか?" +proxyAccount: "プロキシアカウント" +proxyAccountDescription: "プロキシアカウントは、特定の条件下でユーザーのリモートフォローを代行するアカウントです。例えば、ユーザーがリモートユーザーをリストに入れたとき、リストに入れられたユーザーを誰もフォローしていないとアクティビティがサーバーに配達されないため、代わりにプロキシアカウントがフォローするようにします。" +host: "ホスト" +selectUser: "ユーザーを選択" +selectInstance: "サーバーを選択" +recipient: "宛先" +annotation: "注釈" +federation: "連合" +instances: "サーバー" +registeredAt: "初観測" +latestRequestSentAt: "直近のリクエスト送信" +latestRequestReceivedAt: "直近のリクエスト受信" +latestStatus: "直近のステータス" +storageUsage: "ストレージ使用量" +charts: "チャート" +perHour: "1時間ごと" +perDay: "1日ごと" +stopActivityDelivery: "アクティビティの配送を停止" +blockThisInstance: "このサーバーをブロック" +silenceThisInstance: "このサーバーをサイレンス" +operations: "操作" +software: "ソフトウェア" +version: "バージョン" +metadata: "メタデータ" +monitor: "モニター" +jobQueue: "ジョブキュー" +cpuAndMemory: "CPUとメモリ" +network: "ネットワーク" +disk: "ディスク" +instanceInfo: "サーバー情報" +statistics: "統計" +clearQueue: "キューをクリア" +clearQueueConfirmTitle: "キューをクリアしますか?" +clearQueueConfirmText: "未配達の投稿は配送されなくなります。通常この操作を行う必要はありません。" +clearCachedFiles: "キャッシュをクリア" +clearCachedFilesConfirm: "キャッシュされたリモートファイルをすべて削除しますか?" +blockedInstances: "ブロックしたサーバー" +blockedInstancesDescription: "ブロックしたいサーバーのホストを改行で区切って設定します。ブロックされたサーバーは、このサーバーとやり取りできなくなります。" +silencedInstances: "サイレンスしたサーバー" +silencedInstancesDescription: "サイレンスしたいサーバーのホストを改行で区切って設定します。サイレンスされたサーバーに所属するアカウントはすべて「サイレンス」として扱われ、フォローがすべてリクエストになり、フォロワーでないローカルアカウントにはメンションできなくなります。ブロックしたサーバーには影響しません。" +muteAndBlock: "ミュートとブロック" +mutedUsers: "ミュートしたユーザー" +blockedUsers: "ブロックしたユーザー" +noUsers: "ユーザーはいません" +noInstances: "サーバーがありません" +editProfile: "プロフィールを編集" +noteDeleteConfirm: "この投稿を削除しますか?" +pinLimitExceeded: "これ以上ピン留めできません" +intro: "Calckeyのインストールが完了しました!管理者アカウントを作成しましょう。" +done: "完了" +processing: "処理中" +preview: "プレビュー" +default: "デフォルト" +defaultValueIs: "デフォルト: {value}" +noCustomEmojis: "絵文字はありません" +noJobs: "ジョブはありません" +federating: "連合中" +blocked: "ブロック中" +silenced: "サイレンス中" +suspended: "配信停止" +all: "全て" +subscribing: "購読中" +publishing: "配信中" +notResponding: "応答なし" +instanceFollowing: "サーバーのフォロー" +instanceFollowers: "サーバーのフォロワー" +instanceUsers: "このサーバーの利用者" +changePassword: "パスワードを変更" +security: "セキュリティ" +retypedNotMatch: "入力が一致しません。" +currentPassword: "現在のパスワード" +newPassword: "新しいパスワード" +newPasswordRetype: "新しいパスワード(再入力)" +attachFile: "ファイルを添付" +more: "もっと!" +featured: "ハイライト" +usernameOrUserId: "ユーザー名かユーザーID" +noSuchUser: "ユーザーが見つかりません" +lookup: "照会" +announcements: "お知らせ" +imageUrl: "画像URL" +remove: "削除" +removed: "削除しました" +removeAreYouSure: "「{x}」を削除しますか?" +deleteAreYouSure: "「{x}」を削除しますか?" +resetAreYouSure: "リセットしますか?" +saved: "保存しました" +messaging: "チャット" +upload: "アップロード" +keepOriginalUploading: "オリジナル画像を保持" +keepOriginalUploadingDescription: "画像をアップロードする時にオリジナル版を保持します。オフにするとアップロード時にブラウザでWeb公開用画像を生成します。" +fromDrive: "ドライブから" +fromUrl: "URLから" +uploadFromUrl: "URLアップロード" +uploadFromUrlDescription: "アップロードしたいファイルのURL" +uploadFromUrlRequested: "アップロードをリクエストしました" +uploadFromUrlMayTakeTime: "アップロードが完了するまで時間がかかる場合があります。" +explore: "みつける" +messageRead: "既読" +noMoreHistory: "これより過去の履歴はありません" +startMessaging: "チャットを開始" +manageGroups: "グループ管理" +nUsersRead: "{n}人が読みました" +agreeTo: "{0}に同意" +tos: "利用規約" +start: "始める" +home: "ホーム" +remoteUserCaution: "リモートユーザーのため、情報が不完全です。" +activity: "アクティビティ" +images: "画像" +birthday: "誕生日" +yearsOld: "{age}歳" +registeredDate: "登録日" +location: "場所" +theme: "テーマ" +themeForLightMode: "ライトモードで使うテーマ" +themeForDarkMode: "ダークモードで使うテーマ" +light: "ライト" +dark: "ダーク" +lightThemes: "明るいテーマ" +darkThemes: "暗いテーマ" +syncDeviceDarkMode: "デバイスのダークモードと同期する" +drive: "ドライブ" +fileName: "ファイル名" +selectFile: "ファイルを選択" +selectFiles: "ファイルを選択" +selectFolder: "フォルダーを選択" +selectFolders: "フォルダーを選択" +renameFile: "ファイル名を変更" +folderName: "フォルダー名" +createFolder: "フォルダーを作成" +renameFolder: "フォルダー名を変更" +deleteFolder: "フォルダーを削除" +addFile: "ファイルを追加" +emptyDrive: "ドライブは空です" +emptyFolder: "フォルダーは空です" +unableToDelete: "削除できません" +inputNewFileName: "新しいファイル名を入力してください" +inputNewDescription: "新しい説明を入力してください" +inputNewFolderName: "新しいフォルダ名を入力してください" +circularReferenceFolder: "移動先のフォルダーは、移動するフォルダーのサブフォルダーです。" +hasChildFilesOrFolders: "このフォルダは空でないため、削除できません。" +copyUrl: "URLをコピー" +rename: "名前を変更" +avatar: "アイコン" +banner: "バナー" +nsfw: "閲覧注意" +whenServerDisconnected: "サーバーとの接続が失われたとき" +disconnectedFromServer: "サーバーから切断されました" +reload: "リロード" +doNothing: "なにもしない" +reloadConfirm: "リロードしますか?" +watch: "ウォッチ" +unwatch: "ウォッチ解除" +accept: "許可" +reject: "拒否" +normal: "正常" +instanceName: "サーバー名" +instanceDescription: "サーバーの紹介文" +maintainerName: "管理者の名前" +maintainerEmail: "管理者のメールアドレス" +tosUrl: "利用規約URL" +thisYear: "今年" +thisMonth: "今月" +today: "今日" +dayX: "{day}日" +monthX: "{month}月" +yearX: "{year}年" +pages: "ページ" +integration: "連携" +connectService: "接続する" +disconnectService: "切断する" +enableLocalTimeline: "ローカルタイムラインを有効にする" +enableGlobalTimeline: "グローバルタイムラインを有効にする" +enableRecommendedTimeline: "おすすめタイムラインを有効にする" +disablingTimelinesInfo: "これらのタイムラインを無効化しても、利便性のため管理者およびモデレーターは引き続き利用できます。" +registration: "登録" +enableRegistration: "誰でも新規登録できるようにする" +invite: "招待" +driveCapacityPerLocalAccount: "ローカルユーザーひとりあたりのドライブ容量" +driveCapacityPerRemoteAccount: "リモートユーザーひとりあたりのドライブ容量" +inMb: "メガバイト単位" +iconUrl: "アイコン画像のURL (faviconなど)" +bannerUrl: "バナー画像のURL" +backgroundImageUrl: "背景画像のURL" +basicInfo: "基本情報" +pinnedUsers: "ピン留めユーザー" +pinnedUsersDescription: "「みつける」ページなどにピン留めしたいユーザーを改行で区切って記述します。" +pinnedPages: "ピン留めページ" +pinnedPagesDescription: "サーバーのトップページにピン留めしたいページのパスを改行で区切って記述します。" +pinnedClipId: "ピン留めするクリップのID" +pinnedNotes: "ピン留めされた投稿" +hcaptcha: "hCaptcha" +enableHcaptcha: "hCaptchaを有効にする" +hcaptchaSiteKey: "サイトキー" +hcaptchaSecretKey: "シークレットキー" +recaptcha: "reCAPTCHA" +enableRecaptcha: "reCAPTCHAを有効にする" +recaptchaSiteKey: "サイトキー" +recaptchaSecretKey: "シークレットキー" +avoidMultiCaptchaConfirm: "複数のCaptchaを使用すると干渉を起こす可能性があります。他のCaptchaを無効にしますか?キャンセルして複数のCaptchaを有効化したままにすることも可能です。" +antennas: "アンテナ" +manageAntennas: "アンテナの管理" +name: "名前" +antennaSource: "受信ソース" +antennaKeywords: "受信キーワード" +antennaExcludeKeywords: "除外キーワード" +antennaKeywordsDescription: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります" +notifyAntenna: "新しい投稿を通知する" +withFileAntenna: "ファイルが添付された投稿のみ" +enableServiceworker: "ブラウザへのプッシュ通知を有効にする" +antennaUsersDescription: "ユーザー名を改行で区切って指定します" +antennaInstancesDescription: "サーバーを改行で区切って指定します" +caseSensitive: "大文字小文字を区別する" +withReplies: "返信を含む" +connectedTo: "次のアカウントに接続されています" +notesAndReplies: "投稿と返信" +withFiles: "ファイル付き" +silence: "サイレンス" +silenceConfirm: "サイレンスしますか?" +unsilence: "サイレンス解除" +unsilenceConfirm: "サイレンスを解除しますか?" +popularUsers: "人気のユーザー" +recentlyUpdatedUsers: "最近投稿したユーザー" +recentlyRegisteredUsers: "最近登録したユーザー" +recentlyDiscoveredUsers: "最近発見されたユーザー" +exploreUsersCount: "{count}のユーザーがいます" +exploreFediverse: "Fediverseを探索" +popularTags: "人気のタグ" +userList: "リスト" +about: "情報" +aboutMisskey: "Calckeyについて" +administrator: "管理者" +token: "トークン" +twoStepAuthentication: "二段階認証" +moderator: "モデレーター" +moderation: "モデレーション" +nUsersMentioned: "{n}人が投稿" +securityKey: "セキュリティキー" +securityKeyName: "キーの名前" +registerSecurityKey: "セキュリティキーを登録する" +lastUsed: "最後の使用" +unregister: "登録を解除" +passwordLessLogin: "パスワード無しでログイン" +resetPassword: "パスワードをリセット" +newPasswordIs: "新しいパスワードは「{password}」です" +reduceUiAnimation: "UIのアニメーションを減らす" +share: "共有" +notFound: "見つかりません" +notFoundDescription: "指定されたURLに該当するページはありませんでした。" +uploadFolder: "既定アップロード先" +cacheClear: "キャッシュを削除" +markAsReadAllNotifications: "すべての通知を既読にする" +markAsReadAllUnreadNotes: "すべての投稿を既読にする" +markAsReadAllTalkMessages: "すべてのチャットを既読にする" +help: "ヘルプ" +inputMessageHere: "ここにメッセージを入力" +close: "閉じる" +group: "グループ" +groups: "グループ" +createGroup: "グループを作成" +ownedGroups: "所有グループ" +joinedGroups: "参加しているグループ" +invites: "招待" +groupName: "グループ名" +members: "メンバー" +transfer: "譲渡" +messagingWithUser: "ユーザーとチャット" +messagingWithGroup: "グループでチャット" +title: "タイトル" +text: "テキスト" +enable: "有効にする" +next: "次へ" +retype: "再入力" +noteOf: "{user}の投稿" +inviteToGroup: "グループに招待" +quoteAttached: "引用" +quoteQuestion: "引用として添付しますか?" +noMessagesYet: "まだチャットはありません" +newMessageExists: "新しいメッセージがあります" +onlyOneFileCanBeAttached: "メッセージに添付できるファイルはひとつです" +signinRequired: "続行する前に、サインアップまたはサインインが必要です" +invitations: "招待" +invitationCode: "招待コード" +checking: "確認しています" +available: "利用できます" +unavailable: "利用できません" +usernameInvalidFormat: "a~z、A~Z、0~9、_が使えます" +tooShort: "短すぎます" +tooLong: "長すぎます" +weakPassword: "弱いパスワード" +normalPassword: "普通のパスワード" +strongPassword: "強いパスワード" +passwordMatched: "一致しました" +passwordNotMatched: "一致していません" +signinWith: "{x}でログイン" +signinFailed: "ログインできませんでした。ユーザー名とパスワードを確認してください。" +tapSecurityKey: "セキュリティキーにタッチ" +or: "もしくは" +language: "言語" +uiLanguage: "UIの表示言語" +groupInvited: "グループに招待されました" +aboutX: "{x}について" +useOsNativeEmojis: "OSネイティブの絵文字を使用" +disableDrawer: "メニューをドロワーで表示しない" +youHaveNoGroups: "グループがありません" +joinOrCreateGroup: "既存のグループに招待してもらうか、新しくグループを作成してください。" +noHistory: "履歴はありません" +signinHistory: "ログイン履歴" +disableAnimatedMfm: "動きのあるMFMを無効にする" +doing: "やっています" +category: "カテゴリ" +tags: "タグ" +docSource: "このドキュメントのソース" +createAccount: "アカウントを作成" +existingAccount: "既存のアカウント" +regenerate: "再生成" +fontSize: "フォントサイズ" +noFollowRequests: "フォロー申請はありません" +openImageInNewTab: "画像を新しいタブで開く" +dashboard: "ダッシュボード" +local: "ローカル" +remote: "リモート" +total: "合計" +weekOverWeekChanges: "前週比" +dayOverDayChanges: "前日比" +appearance: "アピアランス" +clientSettings: "クライアント設定" +accountSettings: "アカウント設定" +promotion: "プロモーション" +promote: "プロモート" +numberOfDays: "日数" +hideThisNote: "この投稿を非表示" +showFeaturedNotesInTimeline: "タイムラインにおすすめの投稿を表示する" +objectStorage: "オブジェクトストレージ" +useObjectStorage: "オブジェクトストレージを使用" +objectStorageBaseUrl: "Base URL" +objectStorageBaseUrlDesc: "参照に使用するURL。CDNやProxyを使用している場合はそのURL、S3: 'https://.s3.amazonaws.com'、GCS等: + 'https://storage.googleapis.com/'。" +objectStorageBucket: "Bucket" +objectStorageBucketDesc: "使用サービスのbucket名を指定してください。" +objectStoragePrefix: "Prefix" +objectStoragePrefixDesc: "このprefixのディレクトリ下に格納されます。" +objectStorageEndpoint: "Endpoint" +objectStorageEndpointDesc: "S3の場合は空、それ以外の場合は各サービスのendpointを指定してください。''または':'のように指定します。" +objectStorageRegion: "Region" +objectStorageRegionDesc: "'xx-east-1'のようなregionを指定してください。使用サービスにregionの概念がない場合は、空または'us-east-1'にしてください。" +objectStorageUseSSL: "SSLを使用する" +objectStorageUseSSLDesc: "API接続にhttpsを使用しない場合はオフにしてください" +objectStorageUseProxy: "Proxyを利用する" +objectStorageUseProxyDesc: "API接続にproxyを利用しない場合はオフにしてください" +objectStorageSetPublicRead: "アップロード時に'public-read'を設定する" +serverLogs: "サーバーログ" +deleteAll: "全て削除" +showFixedPostForm: "タイムライン上部に投稿フォームを表示する" +newNoteRecived: "新しい投稿があります" +sounds: "サウンド" +listen: "聴く" +none: "なし" +showInPage: "ページで表示" +popout: "ポップアウト" +volume: "音量" +masterVolume: "マスター音量" +details: "詳細" +chooseEmoji: "絵文字を選択" +unableToProcess: "操作を完了できません" +recentUsed: "最近使用" +install: "インストール" +uninstall: "アンインストール" +installedApps: "インストールされたアプリ" +nothing: "まだ何もありません" +installedDate: "インストール日時" +lastUsedDate: "最終使用日時" +state: "状態" +sort: "ソート" +ascendingOrder: "昇順" +descendingOrder: "降順" +scratchpad: "スクラッチパッド" +scratchpadDescription: "スクラッチパッドは、AiScriptの実験環境を提供します。Calckeyと対話するコードの記述、実行、結果の確認ができます。" +output: "出力" +script: "スクリプト" +disablePagesScript: "ページのスクリプトを無効にする" +updateRemoteUser: "リモートユーザー情報の更新" +deleteAllFiles: "すべてのファイルを削除" +deleteAllFilesConfirm: "すべてのファイルを削除しますか?" +removeAllFollowing: "フォローを全解除" +removeAllFollowingDescription: "{host}からのフォローをすべて解除します。そのサーバーがもう存在しなくなった場合などに実行してください。" +userSuspended: "このユーザーは凍結されています。" +userSilenced: "このユーザーはサイレンスされています。" +yourAccountSuspendedTitle: "アカウントが凍結されています" +yourAccountSuspendedDescription: "このアカウントは、サーバーの利用規約に違反したなどの理由により、凍結されています。詳細については管理者までお問い合わせください。新しいアカウントを作らないでください。" +menu: "メニュー" +divider: "分割線" +addItem: "項目を追加" +relays: "リレー" +addRelay: "リレーの追加" +inboxUrl: "inboxのURL" +addedRelays: "追加済みのリレー" +serviceworkerInfo: "プッシュ通知を行うには有効にする必要があります。" +deletedNote: "削除された投稿" +invisibleNote: "非公開の投稿" +enableInfiniteScroll: "自動でもっと見る" +visibility: "公開範囲" +poll: "アンケート" +useCw: "内容を隠す" +enablePlayer: "プレイヤーを開く" +disablePlayer: "プレイヤーを閉じる" +expandTweet: "ツイートを展開する" +themeEditor: "テーマエディター" +description: "説明" +describeFile: "説明を付ける" +enterFileDescription: "説明を入力" +author: "作者" +leaveConfirm: "未保存の変更があります。破棄しますか?" +manage: "管理" +plugins: "プラグイン" +preferencesBackups: "設定のバックアップ" +deck: "デッキ" +undeck: "デッキ解除" +useBlurEffectForModal: "モーダルにぼかし効果を使用" +useFullReactionPicker: "フル機能リアクションピッカーを使用" +width: "幅" +height: "高さ" +large: "大" +medium: "中" +small: "小" +generateAccessToken: "アクセストークンの発行" +permission: "権限" +enableAll: "全て有効にする" +disableAll: "全て無効にする" +tokenRequested: "アカウントへのアクセス許可" +pluginTokenRequestedDescription: "このプラグインはここで設定した権限を行使できるようになります。" +notificationType: "通知の種類" +edit: "編集" +emailServer: "メールサーバー" +enableEmail: "メール配信機能を有効化する" +emailConfigInfo: "メールアドレスの確認やパスワードリセットの際に使います" +email: "メール" +emailAddress: "メールアドレス" +smtpConfig: "SMTP サーバーの設定" +smtpHost: "ホスト" +smtpPort: "ポート" +smtpUser: "ユーザー名" +smtpPass: "パスワード" +emptyToDisableSmtpAuth: "ユーザー名とパスワードを空欄にすることで、SMTP認証を無効化出来ます" +smtpSecure: "SMTP 接続に暗黙的なSSL/TLSを使用する" +smtpSecureInfo: "STARTTLS使用時はオフにします。" +testEmail: "配信テスト" +wordMute: "ワードミュート" +regexpError: "正規表現エラー" +regexpErrorDescription: "{tab}ワードミュートの{line}行目の正規表現にエラーが発生しました:" +instanceMute: "サーバーミュート" +userSaysSomething: "{name}が何かを言いました" +userSaysSomethingReason: "{name}が{reason}と言いました" +userSaysSomethingReasonReply: "{name}が{reason}を含む投稿に返信しました" +userSaysSomethingReasonRenote: "{name}が{reason}を含む投稿をブーストしました" +userSaysSomethingReasonQuote: "{name}が{reason}を含む投稿を引用しました" +makeActive: "アクティブにする" +display: "表示" +copy: "コピー" +metrics: "メトリクス" +overview: "概要" +logs: "ログ" +delayed: "遅延" +database: "データベース" +channel: "チャンネル" +create: "作成" +notificationSetting: "通知設定" +notificationSettingDesc: "表示する通知の種別を選択してください。" +useGlobalSetting: "グローバル設定を使う" +useGlobalSettingDesc: "オンにすると、アカウントの通知設定が使用されます。オフにすると、個別に設定できるようになります。" +other: "その他" +regenerateLoginToken: "ログイントークンを再生成" +regenerateLoginTokenDescription: "ログインに使用される内部トークンを再生成します。通常この操作を行う必要はありません。再生成すると、全てのデバイスでログアウトされます。" +setMultipleBySeparatingWithSpace: "スペースで区切って複数設定できます。" +fileIdOrUrl: "ファイルIDまたはURL" +behavior: "動作" +sample: "サンプル" +abuseReports: "通報" +reportAbuse: "通報" +reportAbuseOf: "{name}を通報する" +fillAbuseReportDescription: "通報理由の詳細を記入してください。対象の投稿がある場合はそのURLも記入してください。" +abuseReported: "内容が送信されました。ご報告ありがとうございました。" +reporter: "通報者" +reporteeOrigin: "通報先" +reporterOrigin: "通報元" +forwardReport: "リモートサーバーに通報を転送する" +forwardReportIsAnonymous: "リモートサーバーからはあなたの情報は見られず、匿名のシステムアカウントとして表示されます。" +send: "送信" +abuseMarkAsResolved: "対応済みにする" +openInNewTab: "新しいタブで開く" +openInSideView: "サイドビューで開く" +defaultNavigationBehaviour: "デフォルトのナビゲーション" +editTheseSettingsMayBreakAccount: "これらの設定を編集するとアカウントが破損する可能性があります。" +instanceTicker: "投稿のサーバー情報" +waitingFor: "{x}を待っています" +random: "ランダム" +system: "システム" +switchUi: "UI切り替え" +desktop: "デスクトップ" +clip: "クリップ" +createNew: "新規作成" +optional: "任意" +createNewClip: "新しいクリップを作成" +unclip: "クリップ解除" +confirmToUnclipAlreadyClippedNote: "この投稿はすでにクリップ「{name}」に含まれています。投稿をこのクリップから除外しますか?" +public: "公開" +i18nInfo: "Calckeyは有志によって様々な言語に翻訳されています。{link}で翻訳に協力できます。" +manageAccessTokens: "アクセストークンの管理" +accountInfo: "アカウント情報" +notesCount: "投稿の数" +repliesCount: "返信した数" +renotesCount: "ブーストした数" +repliedCount: "返信された数" +renotedCount: "ブーストされた数" +followingCount: "フォロー数" +followersCount: "フォロワー数" +sentReactionsCount: "リアクションした数" +receivedReactionsCount: "リアクションされた数" +pollVotesCount: "アンケートに投票した数" +pollVotedCount: "アンケートに投票された数" +yes: "はい" +no: "いいえ" +driveFilesCount: "ドライブのファイル数" +driveUsage: "ドライブ使用量" +noCrawle: "クローラーによるインデックスを拒否" +noCrawleDescription: "検索エンジンにあなたのプロフィールや投稿、ページなどのコンテンツを登録(インデックス)しないよう要請します。" +lockedAccountInfo: "フォローを承認制にしても、投稿の公開範囲を「フォロワー」にしない限り、誰でもあなたの投稿を見られます。" +alwaysMarkSensitive: "デフォルトでメディアを閲覧注意にする" +loadRawImages: "添付画像のサムネイルをオリジナル画質にする" +disableShowingAnimatedImages: "アニメーション画像を再生しない" +verificationEmailSent: "確認のメールを送信しました。メールに記載されたリンクにアクセスして、設定を完了してください。" +notSet: "未設定" +emailVerified: "メールアドレスが確認されました" +noteFavoritesCount: "お気に入りの投稿の数" +pageLikesCount: "ページにいいねした数" +pageLikedCount: "ページにいいねされた数" +contact: "連絡先" +useSystemFont: "システムのデフォルトのフォントを使う" +clips: "クリップ" +experimentalFeatures: "実験的機能" +developer: "開発者" +makeExplorable: "アカウントを見つけやすくする" +makeExplorableDescription: "オフにすると、「みつける」にアカウントが載らなくなります。" +showGapBetweenNotesInTimeline: "タイムラインの投稿を離して表示する" +duplicate: "複製" +left: "左" +center: "中央" +wide: "広い" +narrow: "狭い" +reloadToApplySetting: "設定はページリロード後に反映されます。今すぐリロードしますか?" +needReloadToApply: "反映には再起動が必要です。" +showTitlebar: "タイトルバーを表示する" +clearCache: "キャッシュをクリア" +onlineUsersCount: "{n}人がオンライン" +nUsers: "{n}ユーザー" +nNotes: "{n}投稿" +sendErrorReports: "エラーリポートを送信" +sendErrorReportsDescription: "オンにすると、問題が発生したときにエラーの詳細情報がCalckeyに共有され、ソフトウェアの品質向上に役立てられます。\n\ + エラー情報には、OSのバージョン、ブラウザの種類、行動履歴などが含まれます。" +myTheme: "マイテーマ" +backgroundColor: "背景" +accentColor: "アクセント" +textColor: "文字" +saveAs: "名前を付けて保存" +advanced: "高度" +value: "値" +createdAt: "作成日時" +updatedAt: "更新日時" +saveConfirm: "保存しますか?" +deleteConfirm: "削除しますか?" +invalidValue: "有効な値ではありません。" +registry: "レジストリ" +closeAccount: "アカウントを閉鎖する" +currentVersion: "現在のバージョン" +latestVersion: "最新のバージョン" +youAreRunningUpToDateClient: "お使いのクライアントは最新です。" +newVersionOfClientAvailable: "新しいバージョンのクライアントが利用可能です。" +usageAmount: "使用量" +capacity: "容量" +inUse: "使用中" +editCode: "コードを編集" +apply: "適用" +receiveAnnouncementFromInstance: "サーバーからのお知らせを受け取る" +emailNotification: "メール通知" +publish: "公開" +inChannelSearch: "チャンネル内検索" +useReactionPickerForContextMenu: "右クリックでリアクションピッカーを開く" +typingUsers: "{users}が入力中" +jumpToSpecifiedDate: "特定の日付にジャンプ" +showingPastTimeline: "過去のタイムラインを表示しています" +clear: "クリア" +markAllAsRead: "全て既読にする" +goBack: "戻る" +unlikeConfirm: "いいねを解除しますか?" +fullView: "フルビュー" +quitFullView: "フルビュー解除" +addDescription: "説明を追加" +userPagePinTip: "個々の投稿のメニューから「ピン留め」を選択することで、ここに投稿を表示できます。" +notSpecifiedMentionWarning: "宛先に含まれていないメンションがあります" +info: "情報" +userInfo: "ユーザー情報" +unknown: "不明" +onlineStatus: "オンライン状態" +hideOnlineStatus: "オンライン状態を隠す" +hideOnlineStatusDescription: "オンライン状態を隠すと、検索などの一部機能において利便性が低下することがあります。" +online: "オンライン" +active: "アクティブ" +offline: "オフライン" +notRecommended: "非推奨" +botProtection: "Botプロテクション" +instanceBlocking: "連合の管理" +selectAccount: "アカウントを選択" +switchAccount: "アカウントを切り替え" +enabled: "有効" +disabled: "無効" +quickAction: "クイックアクション" +user: "ユーザー" +administration: "管理" +accounts: "アカウント" +switch: "切り替え" +noMaintainerInformationWarning: "管理者情報が設定されていません。" +noBotProtectionWarning: "Botプロテクションが設定されていません。" +configure: "設定する" +postToGallery: "ギャラリーへ投稿" +gallery: "ギャラリー" +recentPosts: "最近の投稿" +popularPosts: "人気の投稿" +shareWithNote: "投稿で共有" +ads: "広告" +expiration: "期限" +memo: "メモ" +priority: "優先度" +high: "高" +middle: "中" +low: "低" +emailNotConfiguredWarning: "メールアドレスの設定がされていません。" +ratio: "比率" +secureMode: "セキュアモード (Authorized Fetch)" +instanceSecurity: "サーバーのセキュリティー" +secureModeInfo: "認証情報の無いリモートサーバーからのリクエストに応えません。" +privateMode: "非公開モード" +privateModeInfo: "有効にすると、許可したサーバーのみからリクエストを受け付けます。" +allowedInstances: "許可されたサーバー" +allowedInstancesDescription: "許可したいサーバーのホストを改行で区切って設定します。非公開モードだけで有効です。" +previewNoteText: "本文をプレビュー" +customCss: "カスタムCSS" +customCssWarn: "この設定は必ず知識のある方が行ってください。不適切な設定を行うとクライアントが正常に使用できなくなる恐れがあります。" +global: "グローバル" +recommended: "推奨" +squareAvatars: "アイコンを四角形で表示" +seperateRenoteQuote: "ブーストと引用のボタンを分ける" +sent: "送信" +received: "受信" +searchResult: "検索結果" +hashtags: "ハッシュタグ" +troubleshooting: "トラブルシューティング" +useBlurEffect: "UIにぼかし効果を使用" +learnMore: "詳しく" +misskeyUpdated: "Calckeyが更新されました!" +whatIsNew: "更新情報を見る" +translate: "翻訳" +translatedFrom: "{x}から翻訳" +accountDeletionInProgress: "アカウントの削除が進行中です" +usernameInfo: "サーバー上であなたのアカウントを一意に識別するための名前です。アルファベット(a~z, A~Z)、数字(0~9)、およびアンダーバー(_)が使用できます。ユーザー名は後から変更できません。" +aiChanMode: "藍モード(クラシックUI)" +enterSendsMessage: "メッセージングでReturnキーを押すと、メッセージが送信されます(デフォルトはCtrl + Returnです)" +keepCw: "CWを維持する" +pubSub: "Pub/Subのアカウント" +lastCommunication: "直近の通信" +resolved: "解決済み" +unresolved: "未解決" +breakFollow: "フォロワーを解除" +breakFollowConfirm: "フォロワーから削除しますか?" +itsOn: "オンになっています" +itsOff: "オフになっています" +emailRequiredForSignup: "アカウント登録にメールアドレスを必須にする" +unread: "未読" +filter: "フィルタ" +controlPanel: "コントロールパネル" +manageAccounts: "アカウントを管理" +makeReactionsPublic: "リアクション一覧を公開する" +makeReactionsPublicDescription: "あなたがしたリアクション一覧を誰でも見れるようにします。" +classic: "中央寄せ" +muteThread: "スレッドをミュート" +unmuteThread: "スレッドのミュートを解除" +ffVisibility: "つながりの公開範囲" +ffVisibilityDescription: "自分のフォロー/フォロワー情報の公開範囲を設定できます。" +continueThread: "さらにスレッドを見る" +deleteAccountConfirm: "アカウントが削除されます。よろしいですか?" +incorrectPassword: "パスワードが間違っています。" +voteConfirm: "「{choice}」に投票しますか?" +hide: "隠す" +leaveGroup: "グループから抜ける" +leaveGroupConfirm: "「{name}」から抜けますか?" +useDrawerReactionPickerForMobile: "モバイルデバイスのときドロワーで表示" +welcomeBackWithName: "おかえりなさい、{name}さん" +clickToFinishEmailVerification: "[{ok}]を押して、メールアドレスの確認を完了してください。" +overridedDeviceKind: "デバイスタイプ" +smartphone: "スマートフォン" +tablet: "タブレット" +auto: "自動" +showLocalPosts: "ローカルの投稿を表示する場所" +homeTimeline: "ホームタイムライン" +socialTimeline: "ソーシャルタイムライン" +themeColor: "テーマカラー" +size: "サイズ" +numberOfColumn: "列の数" +searchByGoogle: "検索" +instanceDefaultLightTheme: "サーバーの標準ライトテーマ" +instanceDefaultDarkTheme: "サーバーの標準ダークテーマ" +instanceDefaultThemeDescription: "オブジェクト形式のテーマコードを記入します。" +mutePeriod: "ミュートする期限" +indefinitely: "無期限" +tenMinutes: "10分" +oneHour: "1時間" +oneDay: "1日" +oneWeek: "1週間" +reflectMayTakeTime: "反映されるまで時間がかかる場合があります。" +failedToFetchAccountInformation: "アカウント情報の取得に失敗しました" +rateLimitExceeded: "レート制限を超えました" +cropImage: "画像のクロップ" +cropImageAsk: "画像をクロップしますか?" +file: "ファイル" +recentNHours: "直近{n}時間" +recentNDays: "直近{n}日" +noEmailServerWarning: "メールサーバーの設定がされていません。" +thereIsUnresolvedAbuseReportWarning: "未対応の通報があります。" +check: "チェック" +driveCapOverrideLabel: "このユーザーのドライブ容量上限を変更" +driveCapOverrideCaption: "0以下を指定すると解除されます。" +requireAdminForView: "閲覧するには管理者アカウントでログインしている必要があります。" +isSystemAccount: "システムにより自動で作成・管理されているアカウントです。モデレーション・編集・削除を行うとサーバーの動作が不正になる可能性があるため、操作しないでください。" +typeToConfirm: "この操作を行うには {x} と入力してください" +deleteAccount: "アカウント削除" +document: "ドキュメント" +numberOfPageCache: "ページキャッシュ数" +numberOfPageCacheDescription: "多くすると利便性が向上しますが、負荷とメモリ使用量が増えます。" +logoutConfirm: "ログアウトしますか?" +lastActiveDate: "最終利用日時" +statusbar: "ステータスバー" +pleaseSelect: "選択してください" +reverse: "反転" +colored: "色付き" +refreshInterval: "更新間隔" +label: "ラベル" +type: "タイプ" +speed: "速度" +slow: "遅い" +fast: "速い" +sensitiveMediaDetection: "センシティブなメディアの検出" +localOnly: "ローカルのみ" +remoteOnly: "リモートのみ" +failedToUpload: "アップロード失敗" +cannotUploadBecauseInappropriate: "不適切な内容を含む可能性があると判定されたためアップロードできません。" +cannotUploadBecauseNoFreeSpace: "ドライブの空き容量が無いためアップロードできません。" +cannotUploadBecauseExceedsFileSizeLimit: "ファイルサイズの制限を超えているためアップロードできません。" +beta: "ベータ" +enableAutoSensitive: "自動NSFW判定" +enableAutoSensitiveDescription: "利用可能な場合は、機械学習を利用して自動でメディアにNSFWフラグを設定します。この機能をオフにしても、サーバーによっては自動で設定されることがあります。" +activeEmailValidationDescription: "ユーザーのメールアドレスのバリデーションを、捨てアドかどうかや実際に通信可能かどうかなどを判定しより積極的に行います。オフにすると単に文字列として正しいかどうかのみチェックされます。" +showAds: "広告を表示する" +navbar: "ナビゲーションバー" +shuffle: "シャッフル" +account: "アカウント" +move: "移動" +pushNotification: "プッシュ通知" +subscribePushNotification: "プッシュ通知を有効化" +unsubscribePushNotification: "プッシュ通知を停止する" +pushNotificationAlreadySubscribed: "プッシュ通知は有効です" +pushNotificationNotSupported: "ブラウザまたはサーバーがプッシュ通知に非対応です" +sendPushNotificationReadMessage: "通知やメッセージが既読になったらプッシュ通知を削除する" +sendPushNotificationReadMessageCaption: "「{emptyPushNotificationMessage}」という通知が一瞬表示されるようになります。端末の電池消費量が増加する可能性があります。" +adminCustomCssWarn: "この設定は、それが何をするものであるかを知っている場合のみ使用してください。不適切な値を入力すると、クライアントが正常に動作しなくなる可能性があります。ユーザー設定でCSSをテストし、正しく動作することを確認してください。" +customMOTD: "カスタムMOTD(スプラッシュスクリーンメッセージ)" +customMOTDDescription: "ユーザがページをロード/リロードするたびにランダムに表示される、改行で区切られたMOTD(スプラッシュスクリーン)用のカスタムメッセージ" +customSplashIcons: "カスタムスプラッシュスクリーンアイコン" +customSplashIconsDescription: "ユーザがページをロード/リロードするたびにランダムに表示される、改行で区切られたカスタムスプラッシュスクリーンアイコンの + URL。画像は静的なURLで、できればすべて192x192にリサイズしてください。" +showUpdates: "Calckeyの更新時にポップアップを表示する" +recommendedInstances: "おすすめサーバー" +recommendedInstancesDescription: "おすすめタイムラインに表示するサーバーを改行区切りで入力してください。`https://`は書かず、ドメインのみを入力してください。" +caption: "自動キャプション" +splash: "スプラッシュスクリーン" +updateAvailable: "アップデートがありますよ!" +swipeOnDesktop: "デスクトップでモバイルスタイルのスワイプを可能にする" +logoImageUrl: "ロゴのURL" +showAdminUpdates: "新しいCalckeyのバージョンが利用可能なときに通知する(管理者のみ)" +replayTutorial: "もう一度チュートリアルを見る" +migration: "アカウントの引っ越し" +moveTo: "このアカウントを新しいアカウントに引っ越す" +moveToLabel: "引っ越し先のアカウント:" +moveAccount: "引っ越し実行!" +moveAccountDescription: "この操作は取り消せません。まずは引っ越し先のアカウントでこのアカウントに対しエイリアスを作成したことを確認してください。エイリアス作成後、引っ越し先のアカウントをこのように入力してください:@person@server.com" +moveFrom: "別のアカウントからこのアカウントに引っ越す" +moveFromLabel: "引っ越し元のアカウント:" +moveFromDescription: "別のアカウントからこのアカウントにフォロワーを引き継いで引っ越したい場合、ここでエイリアスを作成しておく必要があります。必ず引っ越しを実行する前に作成してください!引っ越し元のアカウントをこのように入力してください:@person@server.com" +migrationConfirm: "本当にこのアカウントを {account} に引っ越しますか?一度引っ越しを行うと取り消せず、二度とこのアカウントを元の状態で使用できなくなります。\n\ + この操作を行う前に引っ越し先のアカウントでエイリアスを作成する必要があります。エイリアスが作成されているか、必ず確認してください。" +defaultReaction: "リモートとローカルの投稿に対するデフォルトの絵文字リアクション" +license: "ライセンス" +indexPosts: "投稿をインデックス" +indexFrom: "この投稿ID以降をインデックスする" +indexFromDescription: "空白で全ての投稿を指定します" +indexNotice: "インデックスを開始しました。完了まで時間がかかる場合があるため、少なくとも1時間はサーバーを再起動しないでください。" +customKaTeXMacro: "カスタムKaTeXマクロ" +customKaTeXMacroDescription: "数式入力を楽にするためのマクロを設定しましょう!記法はLaTeXにおけるコマンドの定義と同様に \\newcommand{\\ + name}{content} または \\newcommand{\\add}[2]{#1 + #2} のように記述します。後者の例では \\add{3}{foo} + が 3 + foo に展開されます。また、マクロの名前を囲む波括弧を丸括弧 () および角括弧 [] に変更した場合、マクロの引数に使用する括弧が変更されます。マクロの定義は一行に一つのみで、途中で改行はできません。マクロの定義が無効な行は無視されます。文字列を単純に置換する機能のみに対応していて、条件分岐などの高度な構文は使用できません。" +enableCustomKaTeXMacro: "カスタムKaTeXマクロを有効にする" +preventAiLearning: "AIによる学習を防止" +preventAiLearningDescription: "投稿したノート、添付した画像などのコンテンツを学習の対象にしないようAIに要求します。これはnoaiフラグをHTMLレスポンスに含めることによって実現されます。" +noGraze: "ブラウザの拡張機能「Graze for Mastodon」は、Calckeyの動作を妨げるため、無効にしてください。" + +_sensitiveMediaDetection: + description: "機械学習を使って自動でセンシティブなメディアを検出し、モデレーションに役立てられます。サーバーの負荷が少し増えます。" + sensitivity: "検出感度" + sensitivityDescription: "感度を低くすると、誤検知(偽陽性)が減ります。感度を高くすると、検知漏れ(偽陰性)が減ります。" + setSensitiveFlagAutomatically: "NSFWフラグを設定する" + setSensitiveFlagAutomaticallyDescription: "この設定をオフにしても内部的に判定結果は保持されます。" + analyzeVideos: "動画の解析を有効化" + analyzeVideosDescription: "静止画に加えて動画も解析するようにします。サーバーの負荷が少し増えます。" +_emailUnavailable: + used: "既に使用されています" + format: "形式が正しくありません" + disposable: "恒久的に使用可能なアドレスではありません" + mx: "正しいメールサーバーではありません" + smtp: "メールサーバーが応答しません" +_ffVisibility: + public: "公開" + followers: "フォロワーだけに公開" + private: "非公開" +_signup: + almostThere: "ほとんど完了です" + emailAddressInfo: "あなたが使っているメールアドレスを入力してください。メールアドレスが公開されることはありません。" + emailSent: "入力されたメールアドレス({email})宛に確認のメールが送信されました。メールに記載されたリンクにアクセスすると、アカウントの作成が完了します。" +_accountDelete: + accountDelete: "アカウントの削除" + mayTakeTime: "アカウントの削除は負荷のかかる処理であるため、作成したコンテンツの数やアップロードしたファイルの数が多いと完了までに時間がかかることがあります。" + sendEmail: "アカウントの削除が完了した際に、登録されていたメールアドレス宛に通知を送信します。" + requestAccountDelete: "アカウント削除をリクエスト" + started: "削除処理を開始しました。" + inProgress: "削除が進行中" +_ad: + back: "戻る" + reduceFrequencyOfThisAd: "この広告の表示頻度を下げる" +_forgotPassword: + enterEmail: "アカウントに登録したメールアドレスを入力してください。そのアドレス宛てに、パスワードリセット用のリンクが送信されます。" + ifNoEmail: "メールアドレスを登録していない場合は、管理者までお問い合わせください。" + contactAdmin: "このインスタンスではメールアドレスの登録がサポートされていないため、パスワードリセットを行う場合は管理者までお問い合わせください。" +_gallery: + my: "自分の投稿" + liked: "いいねした投稿" + like: "いいね!" + unlike: "いいね解除" +_email: + _follow: + title: "フォローされました" + _receiveFollowRequest: + title: "フォローリクエストを受け取りました" +_plugin: + install: "プラグインのインストール" + installWarn: "信頼できないプラグインはインストールしないでください。" + manage: "プラグインの管理" +_preferencesBackups: + list: "作成したバックアップ" + saveNew: "新規保存" + loadFile: "ファイルを読み込み" + apply: "このデバイスに適用" + save: "上書き保存" + inputName: "バックアップ名を入力" + cannotSave: "保存できません" + nameAlreadyExists: "バックアップ名「{name}」は既に存在します。違う名前を指定してください。" + applyConfirm: "バックアップ「{name}」を現在のデバイスに適用しますか?現在のデバイス設定は失われます。" + saveConfirm: "{name}に上書き保存しますか?" + deleteConfirm: "{name}を削除しますか?" + renameConfirm: "「{old}」を「{new}」に変更しますか?" + noBackups: "バックアップはありません。「新規保存」で現在のクライアント設定をサーバーに保存できます。" + createdAt: "作成日時: {date} {time}" + updatedAt: "更新日時: {date} {time}" + cannotLoad: "読み込めません。" + invalidFile: "ファイル形式が違います。" +_registry: + scope: "スコープ" + key: "キー" + keys: "キー" + domain: "ドメイン" + createKey: "キーを作成" +_aboutMisskey: + about: "Calckeyは、2022年に生まれたThatOneCalculatorによるMisskeyのforkです。" + contributors: "主なコントリビューター" + allContributors: "全てのコントリビューター" + source: "ソースコード" + translation: "Calckeyを翻訳" + donate: "Calckeyに寄付" + morePatrons: "他にも多くの方が支援してくれています。ありがとうございます! 🥰" + patrons: "支援者" +_nsfw: + respect: "閲覧注意のメディアは隠す" + ignore: "閲覧注意のメディアを隠さない" + force: "常にメディアを隠す" +_mfm: + cheatSheet: "MFMチートシート" + intro: "MFMは、MisskeyやCalckey、Akkomaなどの様々な場所で使用できるマークアップ言語です。ここでは、MFMで使用可能な構文一覧が確認できます。" + dummy: "CalckeyでFediverseの世界が広がります" + mention: "メンション" + mentionDescription: "アットマーク + ユーザー名で、特定のユーザーを示せます。" + hashtag: "ハッシュタグ" + hashtagDescription: "ナンバーサイン + タグで、ハッシュタグを示せます。" + url: "URL" + urlDescription: "URLを表示できます。" + link: "リンク" + linkDescription: "文章の特定の範囲を、URLに紐づけられます。" + bold: "太字" + boldDescription: "文字を太く表示して強調できます。" + small: "目立たなく" + smallDescription: "内容を小さく・薄く表示させられます。" + center: "中央寄せ" + centerDescription: "内容を中央寄せで表示させられます。" + inlineCode: "コード(インライン)" + inlineCodeDescription: "プログラムなどのコードをインラインでシンタックスハイライトします。" + blockCode: "コード(ブロック)" + blockCodeDescription: "複数行のプログラムなどのコードをブロックでシンタックスハイライトします。" + inlineMath: "数式(インライン)" + inlineMathDescription: "数式(KaTeX)をインラインで表示します。" + blockMath: "数式(ブロック)" + blockMathDescription: "数式(KaTeX)をブロックで表示します。" + quote: "引用" + quoteDescription: "内容が引用であることを示せます。" + emoji: "カスタム絵文字" + emojiDescription: "コロンでカスタム絵文字名を囲むと、カスタム絵文字を表示させられます。" + search: "検索" + searchDescription: "検索ボックスを表示させられます。" + flip: "反転" + flipDescription: "内容を上下または左右に反転させます。" + jelly: "アニメーション(びよんびよん)" + jellyDescription: "びよんびよんするアニメーションを与えます。" + tada: "アニメーション(じゃーん)" + tadaDescription: "ジャーン!という感じのアニメーションを与えます。" + jump: "アニメーション(ジャンプ)" + jumpDescription: "飛び跳ねるようなアニメーションを与えます。" + bounce: "アニメーション(バウンド)" + bounceDescription: "ぽよんぽよん弾むようなアニメーションを与えます。" + shake: "アニメーション(ぶるぶる)" + shakeDescription: "ぶるぶる震えるアニメーションを与えます。" + twitch: "アニメーション(ブレ)" + twitchDescription: "激しくブレるアニメーションを与えます。" + spin: "アニメーション(回転)" + spinDescription: "回転するアニメーションを与えます。" + x2: "大きく" + x2Description: "内容を大きく表示します。" + x3: "とても大きく" + x3Description: "内容をとても大きく表示します。" + x4: "究極に大きく" + x4Description: "内容を究極に大きく表示します。" + blur: "ぼかし" + blurDescription: "内容をぼかすことができます。ポインターを上に乗せるとはっきり見えるようになります。" + font: "フォント" + fontDescription: "内容のフォントを指定できます。" + rainbow: "レインボー" + rainbowDescription: "内容をレインボーにします。" + sparkle: "キラキラ" + sparkleDescription: "キラキラしたパーティクルのエフェクトを追加します。" + rotate: "回転" + rotateDescription: "指定した角度で回転させます。" + plain: "プレーン" + plainDescription: "内側の構文を全て無効にします。" + position: 位置 + stop: MFMを停止 + alwaysPlay: MFMアニメーションを自動再生する + play: MFMを再生 + warn: MFMアニメーションは激しい動きを含む可能性があります。 + positionDescription: 位置を指定した値だけずらします。 + foreground: 文字色 + backgroundDescription: 背景の色を変更します。 + background: 背景色 + scale: 拡大・縮小 + scaleDescription: 大きさを指定した値に拡大・縮小します。 + foregroundDescription: 文字の色を変更します。 + fade: フェード + fadeDescription: フェードインとフェードアウトする。 + crop: 切り抜き + cropDescription: 内容を切り抜く。 + advancedDescription: オフにすると、アニメーション再生中を除いて基本的なMFMだけ表示します。 + advanced: 高度なMFM +_instanceTicker: + none: "表示しない" + remote: "リモートユーザーに表示" + always: "常に表示" +_serverDisconnectedBehavior: + reload: "自動でリロード" + dialog: "ダイアログで警告" + quiet: "控えめに警告" + nothing: "何もしない" +_channel: + create: "チャンネルを作成" + edit: "チャンネルを編集" + setBanner: "バナーを設定" + removeBanner: "バナーを削除" + featured: "トレンド" + owned: "管理中" + following: "フォロー中" + usersCount: "{n}人が参加中" + notesCount: "{n}投稿があります" + nameAndDescription: "名前と説明" + nameOnly: "名前のみ" +_messaging: + dms: "プライベート" + groups: "グループ" +_menuDisplay: + sideFull: "横" + sideIcon: "横(アイコン)" + top: "上部" + hide: "隠す" +_wordMute: + muteWords: "ミュートするワード" + muteWordsDescription: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります。" + muteWordsDescription2: "キーワードをスラッシュで囲むと正規表現になります。" + softDescription: "指定した条件の投稿をタイムラインから隠します。" + hardDescription: "指定した条件の投稿をタイムラインに追加しないようにします。追加されなかった投稿は、条件を変更しても除外されたままになります。" + soft: "ソフト" + hard: "ハード" + mutedNotes: "ミュートされた投稿" +_instanceMute: + instanceMuteDescription: "ミュートしたサーバーのユーザーへの返信を含めて、設定したサーバーの全ての投稿とブーストをミュートします。" + instanceMuteDescription2: "改行で区切って設定します" + title: "設定したサーバーの投稿を隠します。" + heading: "ミュートするサーバー" +_theme: + explore: "テーマを探す" + install: "テーマのインストール" + manage: "テーマの管理" + code: "テーマコード" + description: "説明" + installed: "{name}をインストールしました" + installedThemes: "インストールされたテーマ" + builtinThemes: "標準のテーマ" + alreadyInstalled: "そのテーマは既にインストールされています" + invalid: "テーマの形式が間違っています" + make: "テーマを作る" + base: "ベース" + addConstant: "定数を追加" + constant: "定数" + defaultValue: "デフォルト値" + color: "色" + refProp: "プロパティを参照" + refConst: "定数を参照" + key: "キー" + func: "関数" + funcKind: "関数の種類" + argument: "引数" + basedProp: "元にするプロパティの名前" + alpha: "不透明度" + darken: "暗さ" + lighten: "明るさ" + inputConstantName: "定数名を入力してください" + importInfo: "ここにテーマコードを貼り付けて、エディターにインポートできます" + deleteConstantConfirm: "定数 {const} を削除しても良いですか?" + keys: + accent: "アクセント" + bg: "背景" + fg: "文字" + focus: "フォーカス" + indicator: "インジケーター" + panel: "パネル" + shadow: "影" + header: "ヘッダー" + navBg: "サイドバーの背景" + navFg: "サイドバーの文字" + navHoverFg: "サイドバー文字(ホバー)" + navActive: "サイドバー文字(アクティブ)" + navIndicator: "サイドバーのインジケーター" + link: "リンク" + hashtag: "ハッシュタグ" + mention: "メンション" + mentionMe: "あなた宛てメンション" + renote: "ブースト" + modalBg: "モーダルの背景" + divider: "分割線" + scrollbarHandle: "スクロールバーの取っ手" + scrollbarHandleHover: "スクロールバーの取っ手(ホバー)" + dateLabelFg: "日付ラベルの文字" + infoBg: "情報の背景" + infoFg: "情報の文字" + infoWarnBg: "警告の背景" + infoWarnFg: "警告の文字" + cwBg: "CW ボタンの背景" + cwFg: "CW ボタンの文字" + cwHoverBg: "CW ボタンの背景 (ホバー)" + toastBg: "通知トーストの背景" + toastFg: "通知トーストの文字" + buttonBg: "ボタンの背景" + buttonHoverBg: "ボタンの背景 (ホバー)" + inputBorder: "入力ボックスの縁取り" + listItemHoverBg: "リスト項目の背景 (ホバー)" + driveFolderBg: "ドライブフォルダーの背景" + wallpaperOverlay: "壁紙のオーバーレイ" + badge: "バッジ" + messageBg: "チャットの背景" + accentDarken: "アクセント (暗め)" + accentLighten: "アクセント (明るめ)" + fgHighlighted: "強調された文字" +_sfx: + note: "投稿" + noteMy: "投稿(自分)" + notification: "通知" + chat: "チャット" + chatBg: "チャット(バックグラウンド)" + antenna: "アンテナ受信" + channel: "チャンネル通知" +_ago: + future: "未来" + justNow: "たった今" + secondsAgo: "{n}秒前" + minutesAgo: "{n}分前" + hoursAgo: "{n}時間前" + daysAgo: "{n}日前" + weeksAgo: "{n}週間前" + monthsAgo: "{n}ヶ月前" + yearsAgo: "{n}年前" +_time: + second: "秒" + minute: "分" + hour: "時間" + day: "日" +_tutorial: + title: "Calckeyの使い方" + step1_1: "ようこそ!" + step1_2: "使い始める前に、いくつか設定を済ませましょう。すぐできますよ!" + step2_1: "最初に、あなたのプロフィールを作りましょう。" + step2_2: "プロフィールを設定することで、他の人があなたの投稿を見たり、フォローしたりするときの助けになります。" + step3_1: "それでは、何人かフォローしてみましょう!" + step3_2: "あなたのホームとソーシャルタイムラインは、あなたが誰をフォローしているかで決まります。まずは、いくつかのアカウントをフォローしてみましょう。\n\ + プロフィールの右上にある丸い+ボタンをクリックするとフォローできます。" + step4_1: "投稿してみましょう!" + step4_2: "最初は{introduction}に投稿したり、シンプルに「こんにちは、アカウント作ってみました!」などの投稿をする人もいます。" + step5_1: "タイムライン、タイムラインだらけ!" + step5_2: "あなたのサーバーでは{timelines}種類のタイムラインが有効になっています。" + step5_3: "ホーム{icon}タイムラインでは、あなたがフォローしているアカウントの投稿を見られます。" + step5_4: "ローカル{icon}タイムラインでは、このサーバーにいるみんなの投稿を見られます。" + step5_5: "ソーシャル{icon}タイムラインでは、ホームタイムラインとローカルタイムラインの投稿が両方表示されます。" + step5_6: "おすすめ{icon}タイムラインでは、管理人がおすすめするサーバーの投稿を見られます。" + step5_7: "グローバル{icon}タイムラインでは、接続している他のすべてのサーバーからの投稿を見られます。" + step6_1: "じゃあ、ここはどんな場所なの?" + step6_2: "実は、あなたはただCalckeyに参加しただけではありません。ここは、何千もの相互接続されたサーバーが構成する Fediverse への入口です。" + step6_3: "それぞれのサーバーでは必ずしもCalckeyが使われているわけではなく、異なる動作をするサーバーもあります。しかし、あなたは他のサーバーのアカウントもフォローしたり、返信・ブーストができます。一見難しそうですが大丈夫!すぐ慣れます。" + step6_4: "これで完了です。お楽しみください!" +_2fa: + alreadyRegistered: "既に設定は完了しています。" + registerTOTP: "認証アプリの設定を開始" + step1: "まず、{a}や{b}などの認証アプリをお使いのデバイスにインストールします。" + step2: "次に、表示されているQRコードをアプリでスキャンします。" + step2Click: "QRコードをクリックすると、お使いの端末にインストールされている認証アプリやキーリングに登録できます。" + step2Url: "デスクトップアプリでは次のURIを入力します:" + step3Title: "確認コードを入力" + step3: "アプリに表示されている確認コード(トークン)を入力して完了です。" + step4: "これからログインするときも、同じように確認コードを入力します。" + securityKeyNotSupported: "お使いのブラウザはセキュリティキーに対応していません。" + registerTOTPBeforeKey: "セキュリティキー・パスキーを登録するには、まず認証アプリの設定を行なってください。" + securityKeyInfo: "FIDO2をサポートするハードウェアセキュリティキー、端末の生体認証やPINロック、パスキーといった、WebAuthn由来の鍵を登録します。" + chromePasskeyNotSupported: "Chromeのパスキーは現在サポートしていません。" + registerSecurityKey: "セキュリティキー・パスキーを登録する" + securityKeyName: "キーの名前を入力" + tapSecurityKey: "ブラウザの指示に従い、セキュリティキーやパスキーを登録してください" + removeKey: "セキュリティキーを削除" + removeKeyConfirm: "{name}を削除しますか?" + whyTOTPOnlyRenew: "セキュリティキーが登録されている場合、認証アプリの設定は解除できません。" + renewTOTP: "認証アプリを再設定" + renewTOTPConfirm: "今までの認証アプリの確認コードは使用できなくなります" + renewTOTPOk: "再設定する" + renewTOTPCancel: "やめておく" +_permissions: + "read:account": "アカウントの情報を見る" + "write:account": "アカウントの情報を変更する" + "read:blocks": "ブロックを見る" + "write:blocks": "ブロックを操作する" + "read:drive": "ドライブを見る" + "write:drive": "ドライブを操作する" + "read:favorites": "お気に入りを見る" + "write:favorites": "お気に入りを操作する" + "read:following": "フォローの情報を見る" + "write:following": "フォロー・フォロー解除する" + "read:messaging": "チャットを見る" + "write:messaging": "チャットを操作する" + "read:mutes": "ミュートを見る" + "write:mutes": "ミュートを操作する" + "write:notes": "投稿を作成・削除する" + "read:notifications": "通知を見る" + "write:notifications": "通知を操作する" + "read:reactions": "リアクションを見る" + "write:reactions": "リアクションを操作する" + "write:votes": "投票する" + "read:pages": "ページを見る" + "write:pages": "ページを操作する" + "read:page-likes": "ページのいいねを見る" + "write:page-likes": "ページのいいねを操作する" + "read:user-groups": "ユーザーグループを見る" + "write:user-groups": "ユーザーグループを操作する" + "read:channels": "チャンネルを見る" + "write:channels": "チャンネルを操作する" + "read:gallery": "ギャラリーを見る" + "write:gallery": "ギャラリーを操作する" + "read:gallery-likes": "ギャラリーのいいねを見る" + "write:gallery-likes": "ギャラリーのいいねを操作する" +_auth: + shareAccess: "「{name}」がアカウントにアクセスすることを許可しますか?" + shareAccessAsk: "アカウントへのアクセスを許可しますか?" + permissionAsk: "このアプリケーションは次の権限を要求しています" + pleaseGoBack: "アプリケーションに戻り続行してください" + callback: "アプリケーションに戻っています" + denied: "アクセスを拒否しました" + copyAsk: "以下の認証コードをアプリケーションにコピーしてください" +_antennaSources: + all: "全ての投稿" + homeTimeline: "フォローしているユーザーの投稿" + users: "指定した一人または複数のユーザーの投稿" + userList: "指定したリストのユーザーの投稿" + userGroup: "指定したグループのユーザーの投稿" + instances: "指定したサーバーの全ユーザーの投稿" +_weekday: + sunday: "日曜日" + monday: "月曜日" + tuesday: "火曜日" + wednesday: "水曜日" + thursday: "木曜日" + friday: "金曜日" + saturday: "土曜日" +_widgets: + memo: "付箋" + notifications: "通知" + timeline: "タイムライン" + calendar: "カレンダー" + trends: "トレンド" + clock: "時計" + rss: "RSSリーダー" + rssTicker: "RSSティッカー" + activity: "アクティビティ" + photos: "フォト" + digitalClock: "デジタル時計" + unixClock: "UNIX時計" + federation: "連合" + instanceCloud: "サーバークラウド" + postForm: "投稿フォーム" + slideshow: "スライドショー" + button: "ボタン" + onlineUsers: "オンラインユーザー" + jobQueue: "ジョブキュー" + serverMetric: "サーバーメトリクス" + aiscript: "AiScriptコンソール" + userList: "ユーザーリスト" + _userList: + chooseList: "リストを選択" + meiliStatus: サーバーステータス + serverInfo: サーバー情報 + meiliSize: インデックスサイズ + meiliIndexCount: インデックス済みの投稿 +_cw: + hide: "隠す" + show: "もっと見る" + chars: "{count}文字" + files: "{count}ファイル" +_poll: + noOnlyOneChoice: "選択肢は最低2つ必要です" + choiceN: "選択肢{n}" + noMore: "これ以上追加できません" + canMultipleVote: "複数回答可" + expiration: "期限" + infinite: "無期限" + at: "日時指定" + after: "経過指定" + deadlineDate: "期日" + deadlineTime: "時間" + duration: "期間" + votesCount: "{n}票" + totalVotes: "計{n}票" + vote: "投票する" + showResult: "結果を見る" + voted: "投票済み" + closed: "終了済み" + remainingDays: "終了まであと{d}日{h}時間" + remainingHours: "終了まであと{h}時間{m}分" + remainingMinutes: "終了まであと{m}分{s}秒" + remainingSeconds: "終了まであと{s}秒" +_visibility: + public: "公開" + publicDescription: "全てのユーザーに公開" + home: "未収載" + homeDescription: "ホームタイムラインのみに公開" + followers: "フォロワー" + followersDescription: "自分のフォロワーのみに公開" + specified: "ダイレクト" + specifiedDescription: "指定したユーザーのみに公開" + localOnly: "ローカルのみ" + localOnlyDescription: "リモートユーザーには非公開" +_postForm: + replyPlaceholder: "この投稿に返信..." + quotePlaceholder: "この投稿を引用..." + channelPlaceholder: "チャンネルに投稿..." + _placeholders: + a: "いまどうしてる?" + b: "何かありましたか?" + c: "何をお考えですか?" + d: "言いたいことは?" + e: "ここに書いてください" + f: "あなたが書くのを待っています..." +_profile: + name: "名前" + username: "ユーザー名" + description: "自己紹介" + youCanIncludeHashtags: "ハッシュタグを含められます。" + metadata: "追加情報" + metadataEdit: "追加情報を編集" + metadataDescription: "プロフィールに表として追加情報を表示できます。" + metadataLabel: "ラベル" + metadataContent: "内容" + changeAvatar: "アバター画像を変更" + changeBanner: "バナー画像を変更" + locationDescription: "英語表記の都市名から始まる内容を入力すると、現地時間がユーザーページに表示されます。" +_exportOrImport: + allNotes: "全ての投稿" + followingList: "フォロー" + muteList: "ミュート" + blockingList: "ブロック" + userLists: "リスト" + excludeMutingUsers: "ミュートしているユーザーを除外" + excludeInactiveUsers: "使われていないアカウントを除外" +_charts: + federation: "連合" + apRequest: "リクエスト" + usersIncDec: "ユーザーの増減" + usersTotal: "ユーザーの合計" + activeUsers: "アクティブユーザー数" + notesIncDec: "投稿の増減" + localNotesIncDec: "ローカルの投稿の増減" + remoteNotesIncDec: "リモートの投稿の増減" + notesTotal: "投稿の合計" + filesIncDec: "ファイルの増減" + filesTotal: "ファイルの合計" + storageUsageIncDec: "ストレージ使用量の増減" + storageUsageTotal: "ストレージ使用量の合計" +_instanceCharts: + requests: "リクエスト" + users: "ユーザーの増減" + usersTotal: "ユーザーの累積" + notes: "投稿の増減" + notesTotal: "投稿の累積" + ff: "フォロー/フォロワーの増減" + ffTotal: "フォロー/フォロワーの累積" + cacheSize: "キャッシュサイズの増減" + cacheSizeTotal: "キャッシュサイズの累積" + files: "ファイル数の増減" + filesTotal: "ファイル数の累積" +_timelines: + home: "ホーム" + local: "ローカル" + recommended: "おすすめ" + social: "ソーシャル" + global: "グローバル" +_pages: + newPage: "ページの作成" + editPage: "ページの編集" + readPage: "ソースを表示中" + created: "ページを作成しました" + updated: "ページを更新しました" + deleted: "ページを削除しました" + pageSetting: "ページ設定" + nameAlreadyExists: "指定されたページURLは既に存在しています" + invalidNameTitle: "不正なページURLです" + invalidNameText: "空白でないか確認してください" + editThisPage: "このページを編集" + viewSource: "ソースを表示" + viewPage: "ページを見る" + like: "いいね" + unlike: "いいね解除" + my: "自分のページ" + liked: "いいねしたページ" + featured: "人気" + inspector: "インスペクター" + contents: "コンテンツ" + content: "ページブロック" + variables: "変数" + title: "タイトル" + url: "ページURL" + summary: "ページの要約" + alignCenter: "中央寄せ" + hideTitleWhenPinned: "ピン留めされているときにタイトルを非表示" + font: "フォント" + fontSerif: "セリフ" + fontSansSerif: "サンセリフ" + eyeCatchingImageSet: "アイキャッチ画像を設定" + eyeCatchingImageRemove: "アイキャッチ画像を削除" + chooseBlock: "ブロックを追加" + selectType: "種類を選択" + enterVariableName: "変数名を決めてください" + variableNameIsAlreadyUsed: "その変数名は既に使われています" + contentBlocks: "コンテンツ" + inputBlocks: "入力" + specialBlocks: "特殊" + blocks: + text: "テキスト" + textarea: "テキストエリア" + section: "セクション" + image: "画像" + button: "ボタン" + if: "もし" + _if: + variable: "変数" + post: "投稿フォーム" + _post: + text: "内容" + attachCanvasImage: "キャンバスの画像を添付する" + canvasId: "キャンバスID" + textInput: "テキスト入力" + _textInput: + name: "変数名" + text: "タイトル" + default: "デフォルト値" + textareaInput: "複数行テキスト入力" + _textareaInput: + name: "変数名" + text: "タイトル" + default: "デフォルト値" + numberInput: "数値入力" + _numberInput: + name: "変数名" + text: "タイトル" + default: "デフォルト値" + canvas: "キャンバス" + _canvas: + id: "キャンバスID" + width: "幅" + height: "高さ" + note: "投稿の埋め込み" + _note: + id: "投稿のID" + idDescription: "投稿のURLをペーストして設定することもできます。" + detailed: "詳細な表示" + switch: "スイッチ" + _switch: + name: "変数名" + text: "タイトル" + default: "デフォルト値" + counter: "カウンター" + _counter: + name: "変数名" + text: "タイトル" + inc: "増加値" + _button: + text: "タイトル" + colored: "色付き" + action: "ボタンを押したときの動作" + _action: + dialog: "ダイアログを表示する" + _dialog: + content: "内容" + resetRandom: "乱数をリセット" + pushEvent: "イベントを送信させる" + _pushEvent: + event: "イベント名" + message: "押したときに表示するメッセージ" + variable: "送信する変数" + no-variable: "なし" + callAiScript: "AiScript呼び出し" + _callAiScript: + functionName: "関数名" + radioButton: "選択肢" + _radioButton: + name: "変数名" + title: "タイトル" + values: "改行で区切った選択肢" + default: "デフォルト値" + script: + categories: + flow: "制御" + logical: "論理演算" + operation: "計算" + comparison: "比較" + random: "ランダム" + value: "値" + fn: "関数" + text: "テキスト操作" + convert: "変換" + list: "リスト" + blocks: + text: "テキスト" + multiLineText: "テキスト(複数行)" + textList: "テキストのリスト" + _textList: + info: "ひとつひとつを改行で区切ってください" + strLen: "テキストの長さ" + _strLen: + arg1: "テキスト" + strPick: "文字取り出し" + _strPick: + arg1: "テキスト" + arg2: "文字の位置" + strReplace: "テキスト置き換え" + _strReplace: + arg1: "テキスト" + arg2: "置き換え前" + arg3: "置き換え後" + strReverse: "テキストを反転" + _strReverse: + arg1: "テキスト" + join: "テキストを連結" + _join: + arg1: "リスト" + arg2: "区切り" + add: "足す" + _add: + arg1: "A" + arg2: "B" + subtract: "引く" + _subtract: + arg1: "A" + arg2: "B" + multiply: "掛ける" + _multiply: + arg1: "A" + arg2: "B" + divide: "割る" + _divide: + arg1: "A" + arg2: "B" + mod: "割った余り" + _mod: + arg1: "A" + arg2: "B" + round: "小数を丸める" + _round: + arg1: "数値" + eq: "AとBが同じ" + _eq: + arg1: "A" + arg2: "B" + notEq: "AとBが異なる" + _notEq: + arg1: "A" + arg2: "B" + and: "AかつB" + _and: + arg1: "A" + arg2: "B" + or: "AまたはB" + _or: + arg1: "A" + arg2: "B" + lt: "< AがBより小さい" + _lt: + arg1: "A" + arg2: "B" + gt: "> AがBより大きい" + _gt: + arg1: "A" + arg2: "B" + ltEq: "<= AがBと同じか小さい" + _ltEq: + arg1: "A" + arg2: "B" + gtEq: ">= AがBと同じか大きい" + _gtEq: + arg1: "A" + arg2: "B" + if: "分岐" + _if: + arg1: "もし" + arg2: "なら" + arg3: "そうでなければ" + not: "否定" + _not: + arg1: "否定" + random: "ランダム" + _random: + arg1: "確率" + rannum: "乱数" + _rannum: + arg1: "最小" + arg2: "最大" + randomPick: "リストからランダムに選択" + _randomPick: + arg1: "リスト" + dailyRandom: "ランダム (ユーザーごとに日替わり)" + _dailyRandom: + arg1: "確率" + dailyRannum: "乱数 (ユーザーごとに日替わり)" + _dailyRannum: + arg1: "最小" + arg2: "最大" + dailyRandomPick: "リストからランダムに選択 (ユーザーごとに日替わり)" + _dailyRandomPick: + arg1: "リスト" + seedRandom: "ランダム (シード)" + _seedRandom: + arg1: "シード" + arg2: "確率" + seedRannum: "乱数 (シード)" + _seedRannum: + arg1: "シード" + arg2: "最小" + arg3: "最大" + seedRandomPick: "リストからランダムに選択 (シード)" + _seedRandomPick: + arg1: "シード" + arg2: "リスト" + DRPWPM: "確率付きリストからランダムに選択 (ユーザーごとに日替わり)" + _DRPWPM: + arg1: "テキストのリスト" + pick: "リストから選択" + _pick: + arg1: "リスト" + arg2: "位置" + listLen: "リストの長さを取得" + _listLen: + arg1: "リスト" + number: "数値" + stringToNumber: "テキストを数値に" + _stringToNumber: + arg1: "テキスト" + numberToString: "数値をテキストに" + _numberToString: + arg1: "数値" + splitStrByLine: "テキストを行で分割" + _splitStrByLine: + arg1: "テキスト" + ref: "変数" + aiScriptVar: "AiScript変数" + fn: "関数" + _fn: + slots: "スロット" + slots-info: "スロットひとつひとつを改行で区切ってください" + arg1: "出力" + for: "繰り返し" + _for: + arg1: "回数" + arg2: "処理" + typeError: "スロット{slot}は\"{expect}\"を受け付けますが、\"{actual}\"が入れられています!" + thereIsEmptySlot: "スロット{slot}が空です!" + types: + string: "テキスト" + number: "数値" + boolean: "フラグ" + array: "リスト" + stringArray: "テキストのリスト" + emptySlot: "空のスロット" + enviromentVariables: "環境変数" + pageVariables: "ページ要素" + argVariables: "入力スロット" +_relayStatus: + requesting: "承認待ち" + accepted: "承認済み" + rejected: "拒否済み" +_notification: + fileUploaded: "ファイルがアップロードされました" + youGotMention: "{name}からのメンション" + youGotReply: "{name}からのリプライ" + youGotQuote: "{name}による引用" + youRenoted: "{name}がブーストしました" + youGotPoll: "{name}が投票しました" + youGotMessagingMessageFromUser: "{name}からのチャットがあります" + youGotMessagingMessageFromGroup: "{name}のチャットがあります" + youWereFollowed: "フォローされました" + youReceivedFollowRequest: "フォローリクエストが来ました" + yourFollowRequestAccepted: "フォローリクエストが承認されました" + youWereInvitedToGroup: "{userName}があなたをグループに招待しました" + pollEnded: "アンケートの結果が出ました" + emptyPushNotificationMessage: "プッシュ通知の更新をしました" + _types: + all: "すべて" + follow: "フォロー" + mention: "メンション" + reply: "リプライ" + renote: "ブースト" + quote: "引用" + reaction: "リアクション" + pollVote: "アンケートに投票された" + pollEnded: "アンケートが終了" + receiveFollowRequest: "フォロー申請を受け取った" + followRequestAccepted: "フォローが受理された" + groupInvited: "グループに招待された" + app: "連携アプリからの通知" + _actions: + followBack: "フォローバック" + reply: "返信" + renote: "ブースト" + reacted: がリアクションしました + renoted: がブーストしました + voted: が投票しました +_deck: + alwaysShowMainColumn: "常にメインカラムを表示" + columnAlign: "カラムの寄せ" + addColumn: "カラムを追加" + configureColumn: "カラムの設定" + swapLeft: "左に移動" + swapRight: "右に移動" + swapUp: "上に移動" + swapDown: "下に移動" + stackLeft: "左に重ねる" + popRight: "右に出す" + profile: "ワークスペース" + newProfile: "新規ワークスペース" + renameProfile: "ワークスペース名を変更" + deleteProfile: "ワークスペースを削除" + nameAlreadyExists: "この名前のワークスペースは既に存在します。" + introduction: "カラムを組み合わせて自分だけのインターフェイスを作りましょう!" + introduction2: "画面の右にある + を押して、いつでもカラムを追加できます。" + widgetsIntroduction: "カラムのメニューから、「ウィジェットの編集」を選択してウィジェットを追加してください" + _columns: + main: "メイン" + widgets: "ウィジェット" + notifications: "通知" + tl: "タイムライン" + antenna: "アンテナ" + list: "リスト" + channel: "チャンネル" + mentions: "あなた宛て" + direct: "ダイレクト" +noteId: 投稿のID +hiddenTagsDescription: 'トレンドと「みつける」から除外したいハッシュタグを(先頭の # を除いて)改行区切りで入力してください。この設定はトレンドと「みつける」以外には影響しません。' +hiddenTags: 非表示にするハッシュタグ +apps: "アプリ" +_experiments: + enablePostEditing: 投稿の編集機能を有効にする + title: 試験的な機能 + postEditingCaption: 投稿のメニューに既存の投稿を編集するボタンを表示し、他サーバーの編集も受信できるようにします。 + postImportsCaption: + ユーザーが過去の投稿をCalckey・Misskey・Mastodon・Akkoma・Pleromaからインポートすることを許可します。キューが溜まっているときにインポートするとサーバーに負荷がかかる可能性があります。 + enablePostImports: 投稿のインポートを有効にする +sendModMail: モデレーション通知を送る +deleted: 削除済み +editNote: 投稿を編集 +edited: '編集済み: {date} {time}' +signupsDisabled: + 現在、このサーバーでは新規登録が一般開放されていません。招待コードをお持ちの場合には、以下の欄に入力してください。招待コードをお持ちでない場合にも、新規登録を開放している他のサーバーには入れますよ! +findOtherInstance: 他のサーバーを探す +newer: 新しい投稿 +older: 古い投稿 +accessibility: アクセシビリティ +jumpToPrevious: 前に戻る +cw: 閲覧注意 +silencedWarning: スパムの可能性があるため、これらのユーザーが所属するサーバーは管理者によりサイレンスされています。 +searchPlaceholder: Calckeyを検索 +channelFederationWarn: 現時点では、チャンネルは他のサーバーへ連合しません +listsDesc: リストでは指定したユーザーだけのタイムラインを作れます。リストには「タイムライン」のページからアクセスできます。 +antennasDesc: "アンテナでは指定した条件に合致する投稿が表示されます。\nアンテナには「タイムライン」のページからアクセスできます。" +expandOnNoteClickDesc: オフの場合、右クリックメニューか日付をクリックすることで開けます。 +expandOnNoteClick: クリックで投稿の詳細を開く +clipsDesc: クリップは分類と共有ができるブックマークです。各投稿のメニューからクリップを作成できます。 +_dialog: + charactersExceeded: "最大文字数を超えています! 現在 {current} / 制限 {max}" + charactersBelow: "最小文字数を下回っています! 現在 {current} / 制限 {min}" +_filters: + followersOnly: フォロワーのみ + fromUser: ユーザーを指定 + withFile: 添付ファイルあり + fromDomain: ドメインを指定 + notesBefore: 指定の日付以前 + notesAfter: 指定の日付以降 + followingOnly: フォロー中のみ +isModerator: モデレーター +audio: 音声 +image: 画像 +video: 動画 +isBot: このアカウントはBotです +isLocked: このアカウントのフォローは承認制です +isAdmin: 管理者 +isPatron: Calckey 後援者 diff --git a/fe_calckey/frontend/locales/ja-KS.yml b/fe_calckey/frontend/locales/ja-KS.yml new file mode 100644 index 0000000..8a9b914 --- /dev/null +++ b/fe_calckey/frontend/locales/ja-KS.yml @@ -0,0 +1,1415 @@ +--- +_lang_: "日本語 (関西弁)" +headlineMisskey: "ノートでつながるネットワーク" +introMisskey: "ようお越し!Misskeyは、オープンソースの分散型マイクロブログサービスやねん。\n「ノート」を作って、いま起こっとることを共有したり、あんたについて皆に発信しよう📡\n「リアクション」機能で、皆のノートに素早く反応を追加したりもできるで✌\nほな新しい世界を探検しよか🚀" +monthAndDay: "{month}月 {day}日" +search: "探す" +notifications: "通知" +username: "ユーザー名" +password: "パスワード" +forgotPassword: "パスワード忘れてん" +fetchingAsApObject: "今ちと連合に照会しとるで" +ok: "OKや" +gotIt: "ほい" +cancel: "やめとく" +enterUsername: "ユーザー名を入れてや" +renotedBy: "{user}がRenote" +noNotes: "ノートはあらへん" +noNotifications: "通知はあらへん" +instance: "インスタンス" +settings: "設定" +basicSettings: "基本設定" +otherSettings: "その他の設定" +openInWindow: "ウィンドウで開くで" +profile: "プロフィール" +timeline: "タイムライン" +noAccountDescription: "自己紹介食ってもた" +login: "ログイン" +loggingIn: "ログインしよるで" +logout: "ログアウト" +signup: "新規登録" +uploading: "アップロードしとるで" +save: "保存" +users: "ユーザー" +addUser: "ユーザーを追加や" +favorite: "お気に入り" +favorites: "お気に入り" +unfavorite: "やっぱ気に入らん" +favorited: "お気に入りに登録したで" +alreadyFavorited: "もうお気に入りに入れとるがな。" +cantFavorite: "アカン、お気に入り登録できへんかったで。" +pin: "ピン留めしとく" +unpin: "やっぱピン留めせん" +copyContent: "内容をコピー" +copyLink: "リンクをコピー" +delete: "ほかす" +deleteAndEdit: "ほかして直す" +deleteAndEditConfirm: "このノートをほかして書き直すんか?このノートへのリアクション、Renote、返信も全部消えてまうで。" +addToList: "リストに入れたる" +sendMessage: "メッセージを送る" +copyUsername: "ユーザー名をコピー" +searchUser: "ユーザーを検索" +reply: "返事" +loadMore: "まだまだあるで!" +showMore: "まだまだあるで!" +showLess: "閉じる" +youGotNewFollower: "フォローされたで" +receiveFollowRequest: "フォローリクエストされたで" +followRequestAccepted: "フォローが承認されたで" +mention: "メンション" +mentions: "うち宛て" +directNotes: "ダイレクト投稿" +importAndExport: "インポートとエクスポート" +import: "インポート" +export: "エクスポート" +files: "ファイル" +download: "ダウンロード" +driveFileDeleteConfirm: "ファイル「{name}」を消してしもうてええか?このファイルを添付したノートも消えてまうで。" +unfollowConfirm: "{name}のフォローを解除してもええんか?" +exportRequested: "エクスポートしてな、ってリクエストしたけど、これ多分めっちゃ時間かかるで。エクスポート終わったら「ドライブ」に突っ込んどくで。" +importRequested: "インポートしてな、ってリクエストしたけど、これ多分めっちゃ時間かかるで。" +lists: "リスト" +noLists: "リストなんてあらへんで" +note: "ノート" +notes: "ノート" +following: "フォロー" +followers: "フォロワー" +followsYou: "フォローされとるで" +createList: "リスト作る" +manageLists: "リストの管理" +error: "エラー" +somethingHappened: "なんかアカンことが起こったで" +retry: "もっぺんやる?" +pageLoadError: "ページの読み込みに失敗してしもうたで…" +pageLoadErrorDescription: "これは普通、ネットワークかブラウザキャッシュが原因やからね。キャッシュをクリアするか、もうちっとだけ待ってくれへんか?" +serverIsDead: "The server is not responding. Please wait for a while before trying again." +youShouldUpgradeClient: "To display this page, please reload and use a new version client. " +enterListName: "リスト名を入れてや" +privacy: "プライバシー" +makeFollowManuallyApprove: "自分が認めた人だけがこのアカウントをフォローできるようにする" +defaultNoteVisibility: "もとからの公開範囲" +follow: "フォロー" +followRequest: "フォローを頼む" +followRequests: "フォロー申請" +unfollow: "フォローやめる" +followRequestPending: "フォロー許してくれるん待っとる" +enterEmoji: "絵文字を入れてや" +renote: "Renote" +unrenote: "Renoteやめる" +renoted: "Renoteしたで。" +cantRenote: "この投稿はRenoteできへんらしい。" +cantReRenote: "Renote自体はRenoteできへんで。" +quote: "引用" +pinnedNote: "ピン留めされとるノート" +pinned: "ピン留めしとく" +you: "あんた" +clickToShow: "押したら見えるで" +sensitive: "ちょっとアカンやつやで" +add: "増やす" +reaction: "リアクション" +reactionSetting: "Reaction that will be displayed in Picker. " +reactionSettingDescription2: "ドラッグで並び替え、クリックで削除、+を押して追加やで。" +rememberNoteVisibility: "公開範囲覚えといて" +attachCancel: "のっけるのやめる" +markAsSensitive: "ちょっとこれはアカン" +unmarkAsSensitive: "そこまでアカンことないやろ" +enterFileName: "ファイル名を入れてや" +mute: "ミュート" +unmute: "ミュートやめたる" +block: "ブロック" +unblock: "ブロックやめたる" +suspend: "凍結" +unsuspend: "溶かす" +blockConfirm: "ブロックしてもええんか?" +unblockConfirm: "ブロックやめたるってほんまか?" +suspendConfirm: "凍結してしもうてええか?" +unsuspendConfirm: "解凍するけどええか?" +selectList: "リストを選ぶ" +selectAntenna: "アンテナを選ぶ" +selectWidget: "ウィジェットを選ぶ" +editWidgets: "ウィジェットをいじる" +editWidgetsExit: "編集終ったで" +customEmojis: "カスタム絵文字" +emoji: "絵文字" +emojis: "絵文字" +emojiName: "絵文字名" +emojiUrl: "絵文字画像URL" +addEmoji: "絵文字を追加" +settingGuide: "ええ感じの設定" +cacheRemoteFiles: "リモートのファイルをキャッシュする" +cacheRemoteFilesDescription: "この設定を切っとくと、リモートファイルをキャッシュせず直リンクするようになるで。サーバーの容量は節約できるけど、サムネイルが作られんくなるから通信量が増えるで。" +flagAsBot: "Botやで" +flagAsBotDescription: "もしこのアカウントがプログラムによって運用されるんやったら、このフラグをオンにしてたのむで。オンにすると、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、Misskeyのシステム上での扱いがBotに合ったもんになるんやで。" +flagAsCat: "Catやで" +flagAsCatDescription: "ワレ、猫ちゃんならこのフラグをつけてみ?" +flagShowTimelineReplies: "It will display the reply to the note in the timeline. " +flagShowTimelineRepliesDescription: "It will display the reply to notes other than the user notes in the timeline when you turn it on. " +autoAcceptFollowed: "フォローしとるユーザーからのフォローリクエストを勝手に許可しとく" +addAccount: "アカウントを追加" +loginFailed: "ログインに失敗してしもうた…" +showOnRemote: "リモートで見る" +general: "全般" +wallpaper: "壁紙" +setWallpaper: "壁紙を設定" +removeWallpaper: "壁紙を削除" +searchWith: "検索: {q}" +youHaveNoLists: "リストがあらへんで?" +followConfirm: "{name}をフォローしてええか?" +proxyAccount: "プロキシアカウント" +proxyAccountDescription: "プロキシアカウントは、代わりにフォローしてくれるアカウントや。例えば、551に豚まんが無いときやったり、ユーザーがリモートユーザーをアカウントに入れたとき、リストに入れられたユーザーが誰からもフォローされてないと寂しいやん。寂しいし、アクティビティも配達されへんから、プロキシアカウントがフォローしてくれるで。ええやつやん…" +host: "ホスト" +selectUser: "ユーザーを選ぶ" +recipient: "宛先" +annotation: "注釈" +federation: "連合" +instances: "インスタンス" +registeredAt: "初観測" +latestRequestSentAt: "ちょっと前のリクエスト送信" +latestRequestReceivedAt: "ちょっと前のリクエスト受信" +latestStatus: "ちょっと前のステータス" +storageUsage: "ストレージ使うた量" +charts: "チャート" +perHour: "1時間ごと" +perDay: "1日ごと" +stopActivityDelivery: "アクティビティの配送をやめる" +blockThisInstance: "このインスタンスをブロック" +operations: "操作" +software: "ソフトウェア" +version: "バージョン" +metadata: "メタデータ" +monitor: "モニター" +jobQueue: "ジョブキュー" +cpuAndMemory: "CPUとメモリ" +network: "ネットワーク" +disk: "ディスク" +instanceInfo: "インスタンス情報" +statistics: "統計" +clearQueue: "キューにさいなら" +clearQueueConfirmTitle: "キューをクリアしまっか?" +clearQueueConfirmText: "未配達の投稿は配送されなくなるで。通常この操作を行う必要はあらへんや。" +clearCachedFiles: "キャッシュにさいなら" +clearCachedFilesConfirm: "キャッシュされとるリモートファイルをみんなほかしてええか?" +blockedInstances: "インスタンスブロック" +blockedInstancesDescription: "ブロックしたいインスタンスのホストを改行で区切って設定してな。ブロックされてもうたインスタンスとはもう金輪際やり取りできひんくなるで。" +muteAndBlock: "ミュートとブロック" +mutedUsers: "ミュートしたユーザー" +blockedUsers: "ブロックしたユーザー" +noUsers: "ユーザーはおらへん" +editProfile: "プロフィールをいじる" +noteDeleteConfirm: "このノートを削除しまっか?" +pinLimitExceeded: "これ以上ピン留めできひん" +intro: "Misskeyのインストールが完了してん!管理者アカウントを作ってや。" +done: "でけた" +processing: "処理しとる" +preview: "プレビュー" +default: "デフォルト" +defaultValueIs: "デフォルト" +noCustomEmojis: "絵文字はあらへん" +noJobs: "ジョブはあらへん" +federating: "連合しとる" +blocked: "ブロックしとる" +suspended: "配信せぇへん" +all: "みんな" +subscribing: "購読しとる" +publishing: "配信しとる" +notResponding: "応答してへんで" +instanceFollowing: "インスタンスのフォロー" +instanceFollowers: "インスタンスのフォロワー\n" +instanceUsers: "インスタンスのユーザー" +changePassword: "パスワード変える" +security: "セキュリティ" +retypedNotMatch: "そやないねん。" +currentPassword: "今のパスワード" +newPassword: "今度のパスワード" +newPasswordRetype: "今度のパスワード(もっぺん入れて)" +attachFile: "ファイルのっける" +more: "他のやつ!" +featured: "ハイライト" +usernameOrUserId: "ユーザー名かユーザーID" +noSuchUser: "ユーザーが見つからへんで" +lookup: "見てきて" +announcements: "お知らせ" +imageUrl: "画像URL" +remove: "ほかす" +removed: "削除したで!" +removeAreYouSure: "「{x}」はほかしてええか?" +deleteAreYouSure: "「{x}」はほかしてええか?" +resetAreYouSure: "リセットしてええん?" +saved: "保存したで!" +messaging: "チャット" +upload: "アップロード" +keepOriginalUploading: "Retain the original image. " +keepOriginalUploadingDescription: "When uploading the clip, the original version will be retained. Turning it of then uploading will produce images for public use. " +fromDrive: "ドライブから" +fromUrl: "URLから" +uploadFromUrl: "URLアップロード" +uploadFromUrlDescription: "このURLのファイルをアップロードしたいねん" +uploadFromUrlRequested: "アップロードしたい言うといたで" +uploadFromUrlMayTakeTime: "アップロード終わるんにちょい時間かかるかもしれへんわ。" +explore: "みつける" +messageRead: "もう読んだ" +noMoreHistory: "これより過去の履歴はあらへんで" +startMessaging: "チャットやるで" +nUsersRead: "{n}人が読んでもうた" +agreeTo: "{0}に同意したで" +tos: "利用規約" +start: "始める" +home: "ホーム" +remoteUserCaution: "リモートユーザーやから、足りひん情報あるかもしれへん。" +activity: "アクティビティ" +images: "画像" +birthday: "生まれた日" +yearsOld: "{age}歳" +registeredDate: "始めた日" +location: "場所" +theme: "テーマ" +themeForLightMode: "ライトモードではこのテーマつこて" +themeForDarkMode: "ダークモードではこのテーマつこて" +light: "ライト" +dark: "ダーク" +lightThemes: "デイゲーム" +darkThemes: "ナイトゲーム" +syncDeviceDarkMode: "デバイスのダークモードと一緒にする" +drive: "ドライブ" +fileName: "ファイル名" +selectFile: "ファイル選んでや" +selectFiles: "ファイル選んでや" +selectFolder: "フォルダ選んでや" +selectFolders: "フォルダ選んでや" +renameFile: "ファイル名をいらう" +folderName: "フォルダー名" +createFolder: "フォルダー作る" +renameFolder: "フォルダー名を変える" +deleteFolder: "フォルダーを消してまう" +addFile: "ファイルを追加" +emptyDrive: "ドライブにはなんも残っとらん" +emptyFolder: "ふぉろだーにはなんも残っとらん" +unableToDelete: "消そうおもってんけどな、あかんかったわ" +inputNewFileName: "今度のファイル名は何にするん?" +inputNewDescription: "新しいキャプションを入力しましょ" +inputNewFolderName: "今度のフォルダ名は何にするん?" +circularReferenceFolder: "移動先のフォルダーは、移動するフォルダーのサブフォルダーや。" +hasChildFilesOrFolders: "このフォルダ、まだなんか入っとるから消されへん" +copyUrl: "URLをコピー" +rename: "名前を変えるで" +avatar: "アイコン" +banner: "バナー" +nsfw: "閲覧注意" +whenServerDisconnected: "サーバーとの接続が切れたとき" +disconnectedFromServer: "サーバーとの通信が切れたで" +reload: "リロード" +doNothing: "何もせんとく" +reloadConfirm: "リロードしてええか?" +watch: "ウォッチ" +unwatch: "ウォッチやめる" +accept: "ええで" +reject: "あかん" +normal: "ええ感じ" +instanceName: "インスタンス名" +instanceDescription: "インスタンスの紹介" +maintainerName: "管理者の名前" +maintainerEmail: "管理者のメールアドレス" +tosUrl: "利用規約のURL" +thisYear: "今年" +thisMonth: "今月" +today: "今日" +dayX: "{day}日" +monthX: "{month}月" +yearX: "{year}年" +pages: "ページ" +integration: "連携" +connectService: "つなげるで" +disconnectService: "切るで" +enableLocalTimeline: "ローカルタイムラインを使えるようにする" +enableGlobalTimeline: "グローバルタイムラインを使えるようにする" +disablingTimelinesInfo: "ここらへんのタイムラインを使えんようにしてしもても、管理者とモデレーターは使えるままになってるで、そうやなかったら不便やからな。" +registration: "登録" +enableRegistration: "一見さんでも誰でもいらっしゃ~い" +invite: "来てや" +driveCapacityPerLocalAccount: "ローカルユーザーひとりあたりのドライブ容量" +driveCapacityPerRemoteAccount: "リモートユーザーひとりあたりのドライブ容量" +inMb: "メガバイト単位" +iconUrl: "アイコン画像のURL" +bannerUrl: "バナー画像のURL" +backgroundImageUrl: "背景画像のURL" +basicInfo: "基本情報" +pinnedUsers: "ピン留めしたユーザー" +pinnedUsersDescription: "「みつける」ページとかにピン留めしたいユーザーをここに書けばええんやで。他ん人との名前は改行で区切ればええんやで。" +pinnedPages: "ピン留めページ" +pinnedPagesDescription: "インスタンスのいっちゃん上にピン留めしたいページのパスを改行で区切って記述してな" +pinnedClipId: "ピン留めするクリップのID" +pinnedNotes: "ピン留めされとるノート" +hcaptcha: "hCaptcha(キャプチャ)" +enableHcaptcha: "hCaptcha(キャプチャ)をつけとく" +hcaptchaSiteKey: "サイトキー" +hcaptchaSecretKey: "シークレットキー" +recaptcha: "reCAPTCHA" +enableRecaptcha: "reCAPTCHA(リキャプチャ)を有効にする" +recaptchaSiteKey: "サイトキー" +recaptchaSecretKey: "シークレットキー" +avoidMultiCaptchaConfirm: "ぎょうさんのCaptchaをつこてしまうと、仲良うせんことがあるんや。他のCaptchaをなおしとこか?別にキャンセルしてもろうたらCaptchaは消されへんで済むけど知らんで。" +antennas: "アンテナ" +manageAntennas: "アンテナいじる" +name: "名前" +antennaSource: "受信ソース(このソースは食われへん)" +antennaKeywords: "受信キーワード" +antennaExcludeKeywords: "除外キーワード" +antennaKeywordsDescription: "スペースで区切ったるとAND指定で、改行で区切ったるとOR指定や" +notifyAntenna: "新しいノートを通知すんで" +withFileAntenna: "なんか添付されたノートだけ" +enableServiceworker: "ServiceWorkerをつこて" +antennaUsersDescription: "ユーザー名を改行で区切ったってな" +caseSensitive: "大文字と小文字は別もんや" +withReplies: "返信も入れたって" +connectedTo: "次のアカウントに繋がっとるで" +notesAndReplies: "投稿と返信" +withFiles: "ファイル付いとる" +silence: "サイレンス" +silenceConfirm: "サイレンスしよか?" +unsilence: "サイレンスやめるで" +unsilenceConfirm: "サイレンスやめよか?" +popularUsers: "人気のユーザー" +recentlyUpdatedUsers: "ちょっと前に投稿したばっかりのユーザー" +recentlyRegisteredUsers: "ちょっと前に始めたばっかりのユーザー" +recentlyDiscoveredUsers: "最近見っけたユーザー" +exploreUsersCount: "{count}もユーザーおるで" +exploreFediverse: "Fediverseを探ってみる" +popularTags: "人気のタグ" +userList: "リスト" +about: "情報" +aboutMisskey: "Misskeyってなんや?" +administrator: "管理者" +token: "トークン" +twoStepAuthentication: "二段階認証" +moderator: "モデレーター" +moderation: "モデレーション" +nUsersMentioned: "{n}人が投稿" +securityKey: "セキュリティキー" +securityKeyName: "キーの名前" +registerSecurityKey: "セキュリティキーを登録するで" +lastUsed: "最後につこうた日" +unregister: "登録やめる" +passwordLessLogin: "パスワード無くてもログインできるようにする" +resetPassword: "パスワードをリセット" +newPasswordIs: "今度のパスワードは「{password}」や" +reduceUiAnimation: "UIの動きやアニメーションを減らす" +share: "わけわけ" +notFound: "見つからへんね" +notFoundDescription: "指定されたURLに該当するページはあらへんやった。" +uploadFolder: "とりあえずアップロードしたやつ置いとく所" +cacheClear: "キャッシュをほかす" +markAsReadAllNotifications: "通知はもう全て読んだわっ" +markAsReadAllUnreadNotes: "投稿は全て読んだわっ" +markAsReadAllTalkMessages: "チャットはもうぜんぶ読んだわっ" +help: "ヘルプ" +inputMessageHere: "ここにメッセージ書いてや" +close: "閉じる" +group: "グループ" +groups: "グループ" +createGroup: "グループを作るで" +ownedGroups: "所有しとるグループ" +joinedGroups: "参加しとるグループ" +invites: "来てや" +groupName: "グループ名" +members: "メンバー" +transfer: "譲渡" +messagingWithUser: "ユーザーとチャット" +messagingWithGroup: "グループでチャット" +title: "タイトル" +text: "テキスト" +enable: "有効にするで" +next: "次" +retype: "もっかい入力" +noteOf: "{user}のノート" +inviteToGroup: "グループに招く" +quoteAttached: "引用付いとるで" +quoteQuestion: "引用として添付してもええか?" +noMessagesYet: "まだチャットはあらへんで" +newMessageExists: "新しいメッセージがきたで" +onlyOneFileCanBeAttached: "すまん、メッセージに添付できるファイルはひとつだけなんや。" +signinRequired: "ログインしてくれへん?" +invitations: "来てや" +invitationCode: "招待コード" +checking: "確認しとるで" +available: "利用できる\n" +unavailable: "利用できん" +usernameInvalidFormat: "a~z、A~Z、0~9、_が使えるで" +tooShort: "短すぎやろ!" +tooLong: "長すぎやろ!" +weakPassword: "へぼいパスワード" +normalPassword: "普通のパスワード" +strongPassword: "ええ感じのパスワード" +passwordMatched: "よし!一致や!" +passwordNotMatched: "一致しとらんで?" +signinWith: "{x}でログイン" +signinFailed: "ログインできんかったで。もっかいユーザー名とパスワードを確認してみてな。" +tapSecurityKey: "セキュリティキーにタッチしてな" +or: "それか" +language: "言語" +uiLanguage: "UIの表示言語" +groupInvited: "グループに招待されとるで" +aboutX: "{x}について" +useOsNativeEmojis: "OSネイティブの絵文字を使う" +disableDrawer: "メニューをドロワーで表示せぇへん" +youHaveNoGroups: "グループがあらへんねぇ。" +joinOrCreateGroup: "既存のグループに招待してもらうか、新しくグループ作ってからやってな" +noHistory: "履歴はあらへんねぇ。" +signinHistory: "ログイン履歴" +disableAnimatedMfm: "動きがやかましいMFMを止める" +doing: "やっとるがな" +category: "カテゴリ" +tags: "タグ" +docSource: "このドキュメントのソース" +createAccount: "アカウントを作成" +existingAccount: "既存のアカウント" +regenerate: "再生成" +fontSize: "フォントサイズ" +noFollowRequests: "フォロー申請はあらへんで" +openImageInNewTab: "画像を新しいタブで開く" +dashboard: "ダッシュボード" +local: "ローカル" +remote: "リモート" +total: "合計" +weekOverWeekChanges: "前週比" +dayOverDayChanges: "前日比" +appearance: "見た目" +clientSettings: "クライアントの設定" +accountSettings: "アカウントの設定" +promotion: "宣伝" +promote: "宣伝" +numberOfDays: "日数" +hideThisNote: "このノートは表示せんでいい" +showFeaturedNotesInTimeline: "タイムラインにおすすめのノートを表示してや" +objectStorage: "オブジェクトストレージ" +useObjectStorage: "オブジェクトストレージを使う" +objectStorageBaseUrl: "Base URL" +objectStorageBaseUrlDesc: "参照に使うにURLやで。CDNやProxyを使用してるんならそのURL、S3: 'https://.s3.amazonaws.com'、GCSとかなら: 'https://storage.googleapis.com/'。" +objectStorageBucket: "Bucket" +objectStorageBucketDesc: "使ってるサービスのbucket名を選んでな" +objectStoragePrefix: "Prefix" +objectStoragePrefixDesc: "このprefixのディレクトリ下に格納されるで" +objectStorageEndpoint: "Endpoint" +objectStorageEndpointDesc: "S3のときは空、それ以外は各サービスのendpointを指定してなー。''ってやるか':'みたいに指定するんやで。" +objectStorageRegion: "Region" +objectStorageRegionDesc: "'xx-east-1'みたいなregionを指定したってやー。使ってるサービスにregionの概念がないときは、空か'us-east-1'にするんやで。" +objectStorageUseSSL: "SSLを使う" +objectStorageUseSSLDesc: "API接続にhttpsを使わん場合はオフにするんやで" +objectStorageUseProxy: "Proxyを使う" +objectStorageUseProxyDesc: "API接続にproxy使わんのやったら切ってくれへん?" +objectStorageSetPublicRead: "アップロードした時に'public-read'を設定してや" +serverLogs: "サーバーログ" +deleteAll: "全て削除してや" +showFixedPostForm: "タイムラインの上の方で投稿できるようにやってくれへん?" +newNoteRecived: "新しいノートがあるで" +sounds: "サウンド" +listen: "聴く" +none: "なし" +showInPage: "ページで表示" +popout: "ポップアウト" +volume: "音量" +masterVolume: "全体の音量" +details: "もっと" +chooseEmoji: "絵文字を選ぶ" +unableToProcess: "なんか作業が止まってしまったようやね" +recentUsed: "最近使ったやつ" +install: "インストール" +uninstall: "アンインストール" +installedApps: "インストールされとるアプリ" +nothing: "あらへん" +installedDate: "インストールした日時" +lastUsedDate: "最後に使った日時" +state: "状態" +sort: "仕分ける" +ascendingOrder: "小さい順" +descendingOrder: "大きい順" +scratchpad: "スクラッチパッド" +scratchpadDescription: "スクラッチパッドではAiScriptを色々試すことができるんや。Misskeyに対して色々できるコードを書いて動かしてみたり、結果を見たりできるで。" +output: "出力" +script: "スクリプト" +disablePagesScript: "Pagesのスクリプトを無効にしてや" +updateRemoteUser: "リモートユーザー情報の更新してくれん?" +deleteAllFiles: "すべてのファイルを削除" +deleteAllFilesConfirm: "ホンマにすべてのファイルを削除するん?消したもんはもう戻ってこんのやで?" +removeAllFollowing: "フォローを全解除" +removeAllFollowingDescription: "{host}からのフォローをすべて解除するで。そのインスタンスが消えて無くなった時とかには便利な機能やで。" +userSuspended: "このユーザーは...凍結されとる。" +userSilenced: "このユーザーは...サイレンスされとる。" +yourAccountSuspendedTitle: "あんたのアカウント凍結されとるで" +yourAccountSuspendedDescription: "あんたのアカウントは、サーバーの利用規約に違反したとかの理由で、凍結されとるで。細かいことは管理者までお問い合わせたってなー。絶対に新しいアカウント作ったらあかんで。絶対やで。" +menu: "メニュー" +divider: "分割線" +addItem: "項目を追加" +relays: "リレー" +addRelay: "リレーの追加" +inboxUrl: "inboxのURL" +addedRelays: "追加済みのリレー" +serviceworkerInfo: "プッシュ通知をするんなら有効にせなあかんで。" +deletedNote: "消された投稿" +invisibleNote: "非公開の投稿" +enableInfiniteScroll: "自動でもっと見る" +visibility: "公開範囲" +poll: "アンケート" +useCw: "内容を隠す" +enablePlayer: "プレイヤーを開く" +disablePlayer: "プレイヤーを閉じる" +expandTweet: "ツイートを展開する" +themeEditor: "テーマエディター" +description: "説明" +describeFile: "キャプションを付ける" +enterFileDescription: "キャプションを入力" +author: "作者" +leaveConfirm: "未保存の変更があるで!ほかしてええか?" +manage: "管理" +plugins: "プラグイン" +deck: "デッキ" +undeck: "デッキ解除" +useBlurEffectForModal: "モーダルにぼかし効果を使用" +useFullReactionPicker: "フル機能にリアクションピッカーを使用" +width: "幅" +height: "高さ" +large: "大" +medium: "中" +small: "小" +generateAccessToken: "アクセストークンの発行" +permission: "権限" +enableAll: "全部使えるようにする" +disableAll: "全部使えへんようにする" +tokenRequested: "アカウントへのアクセス許可" +pluginTokenRequestedDescription: "このプラグインはここで設定した権限を使えるようになるで。" +notificationType: "通知の種類" +edit: "編集" +emailServer: "メールサーバー" +enableEmail: "メール配信を受け取る" +emailConfigInfo: "メールアドレスの確認とかパスワードリセットの時に使うで" +email: "メール" +emailAddress: "メールアドレス" +smtpConfig: "SMTP サーバーの設定" +smtpHost: "ホスト" +smtpPort: "ポート" +smtpUser: "ユーザー名" +smtpPass: "パスワード" +emptyToDisableSmtpAuth: "ユーザー名とパスワードになんも入れんかったら、SMTP認証を無効化するで" +smtpSecure: "SMTP 接続に暗黙的なSSL/TLSを使用する" +smtpSecureInfo: "STARTTLS使っとる時はオフにするで。" +testEmail: "配信テスト" +wordMute: "ワードミュート" +regexpError: "正規表現エラー" +regexpErrorDescription: "{tab}ワードミュートの{line}行目の正規表現にエラーが出てきたで:" +instanceMute: "インスタンスミュート" +userSaysSomething: "{name}が何か言ったようやで" +makeActive: "使うで" +display: "表示" +copy: "コピー" +metrics: "メトリクス" +overview: "概要" +logs: "ログ" +delayed: "遅延" +database: "データベース" +channel: "チャンネル" +create: "作成" +notificationSetting: "通知設定" +notificationSettingDesc: "表示する通知の種類えらんでや。" +useGlobalSetting: "グローバル設定を使ってや" +useGlobalSettingDesc: "オンにすると、アカウントの通知設定が使われるで。オフにすると、別々に設定できるようになるで。" +other: "その他" +regenerateLoginToken: "ログイントークンを再生成" +regenerateLoginTokenDescription: "ログインに使われる内部トークンをもっかい作るで。いつもならこれをやる必要はないで。もっかい作ると、全部のデバイスでログアウトされるで気ぃつけてなー。" +setMultipleBySeparatingWithSpace: "スペースで区切って複数設定できるで。" +fileIdOrUrl: "ファイルIDかURL" +behavior: "動作" +sample: "サンプル" +abuseReports: "通報" +reportAbuse: "通報" +reportAbuseOf: "{name}を通報する" +fillAbuseReportDescription: "細かい通報理由を書いてなー。対象ノートがある時はそのURLも書いといてなー。" +abuseReported: "無事内容が送信されたみたいやで。おおきに〜。" +reporter: "通報者" +reporteeOrigin: "通報先" +reporterOrigin: "通報元" +forwardReport: "リモートインスタンスに通報を転送するで" +forwardReportIsAnonymous: "リモートインスタンスからはあんたの情報は見れへんくって、匿名のシステムアカウントとして表示されるで。" +send: "送信" +abuseMarkAsResolved: "対応したで" +openInNewTab: "新しいタブで開く" +openInSideView: "サイドビューで開く" +defaultNavigationBehaviour: "デフォルトのナビゲーション" +editTheseSettingsMayBreakAccount: "このへんの設定をようわからんままイジるとアカウントが壊れて使えんくなるかも知れへんで?" +instanceTicker: "ノートのインスタンス情報" +waitingFor: "{x}を待っとるで" +random: "ランダム" +system: "システム" +switchUi: "UI切り替え" +desktop: "デスクトップ" +clip: "クリップ" +createNew: "新しく作るで" +optional: "任意" +createNewClip: "新しいクリップを作るで" +unclip: "クリップ解除するで" +confirmToUnclipAlreadyClippedNote: "このノートはすでにクリップ「{name}」に含まれとるで。ノートをこのクリップから除外したる?" +public: "パブリック" +i18nInfo: "Calckeyは有志によっていろんな言語に翻訳されとるで。{link}で翻訳に協力したってやー。" +manageAccessTokens: "アクセストークンの管理" +accountInfo: "アカウント情報" +notesCount: "ノートの数やで" +repliesCount: "返信した数やで" +renotesCount: "Renoteした数やで" +repliedCount: "返信された数やで" +renotedCount: "Renoteされた数やで" +followingCount: "フォロー数やで" +followersCount: "フォロワー数やで" +sentReactionsCount: "リアクションした数やで" +receivedReactionsCount: "リアクションされた数" +pollVotesCount: "アンケートに投票した数" +pollVotedCount: "アンケートに投票された数" +yes: "はい" +no: "いいえ" +driveFilesCount: "ドライブのファイル数" +driveUsage: "ドライブ使用量やで" +noCrawle: "クローラーによるインデックスを拒否するで" +noCrawleDescription: "検索エンジンにあんたのユーザーページ、ノート、Pagesとかのコンテンツを登録(インデックス)せぇへんように頼むで。" +lockedAccountInfo: "フォローを承認制にしとっても、ノートの公開範囲を「フォロワー」にせぇへん限り、誰でもあんたのノートを見れるで。" +alwaysMarkSensitive: "デフォルトでメディアを閲覧注意にするで" +loadRawImages: "添付画像のサムネイルをオリジナル画質にするで" +disableShowingAnimatedImages: "アニメーション画像を再生しやへんで" +verificationEmailSent: "無事確認のメールを送れたで。メールに書いてあるリンクにアクセスして、設定を完了してなー。" +notSet: "未設定" +emailVerified: "メールアドレスは確認されたで" +noteFavoritesCount: "お気に入りノートの数やで" +pageLikesCount: "Pageにええやんと思った数" +pageLikedCount: "Pageにええやんと思ってくれた数" +contact: "連絡先" +useSystemFont: "システムのデフォルトのフォントを使うで" +clips: "クリップ" +experimentalFeatures: "実験的機能やで" +developer: "開発者やで" +makeExplorable: "アカウントを見つけやすくするで" +makeExplorableDescription: "オフにすると、「みつける」にアカウントが載らんくなるで。" +showGapBetweenNotesInTimeline: "タイムラインのノートを放して表示するで" +duplicate: "複製" +left: "左" +center: "中央" +wide: "広い" +narrow: "狭い" +reloadToApplySetting: "設定はページリロード後に反映されるで。今リロードしとくか?" +needReloadToApply: "反映には再起動せなあかんで" +showTitlebar: "タイトルバーを見せる" +clearCache: "キャッシュをほかす" +onlineUsersCount: "{n}人が起きとるで" +nUsers: "{n}ユーザー" +nNotes: "{n}ノート" +sendErrorReports: "エラーリポートを送る" +sendErrorReportsDescription: "オンにしたら、なんか変なことが起きたときにエラーの詳細がMisskeyに共有されて、ソフトウェアの品質向上に役立てられるんや。エラー情報には、OSのバージョン、ブラウザの種類、行動履歴などが含まれるで。" +myTheme: "マイテーマ" +backgroundColor: "背景" +accentColor: "アクセント" +textColor: "文字" +saveAs: "名前を付けて保存" +advanced: "高度" +value: "値" +createdAt: "作成した日" +updatedAt: "更新日時" +saveConfirm: "保存するで?" +deleteConfirm: "ホンマに削除するで?" +invalidValue: "有効な値じゃないみたいやで。" +registry: "レジストリ" +closeAccount: "アカウントを閉鎖する" +currentVersion: "現在のバージョン" +latestVersion: "最新のバージョン" +youAreRunningUpToDateClient: "今使ってるクライアントが最新やで!" +newVersionOfClientAvailable: "新しいバージョンのクライアントが使えるで。" +usageAmount: "使用量" +capacity: "容量" +inUse: "使用中" +editCode: "コードを編集" +apply: "適用" +receiveAnnouncementFromInstance: "インスタンスからのお知らせを受け取る" +emailNotification: "メール通知" +publish: "公開" +inChannelSearch: "チャンネル内検索" +useReactionPickerForContextMenu: "右クリックでリアクションピッカーを開くようにする" +typingUsers: "{users}が今書きよるで" +jumpToSpecifiedDate: "特定の日付にジャンプ" +showingPastTimeline: "過去のタイムラインを表示してるで" +clear: "クリア" +markAllAsRead: "もうみな読んでもうたわ" +goBack: "戻る" +unlikeConfirm: "いいね解除するんか?" +fullView: "フルビュー" +quitFullView: "フルビュー解除" +addDescription: "説明を追加するで" +userPagePinTip: "個々のノートのメニューから「ピン留め」を選んどくと、ここにノートを表示しておけるで。" +notSpecifiedMentionWarning: "宛先に含まれてへんメンションがあるで" +info: "情報" +userInfo: "ユーザー情報やで" +unknown: "不明" +onlineStatus: "オンライン状態" +hideOnlineStatus: "オンライン状態を隠すで" +hideOnlineStatusDescription: "オンライン状態を隠すと、検索とかの一部の機能で使いにくくなるかもしれんよ。" +online: "オンライン" +active: "アクティブ" +offline: "オフライン" +notRecommended: "あんま推奨しやんで" +botProtection: "Botプロテクション" +instanceBlocking: "インスタンスブロック" +selectAccount: "アカウントを選んでなー" +switchAccount: "アカウントを変えるで" +enabled: "有効" +disabled: "無効" +quickAction: "クイックアクション" +user: "ユーザー" +administration: "管理" +accounts: "アカウント" +switch: "切り替え" +noMaintainerInformationWarning: "管理者情報が設定されてへんで" +noBotProtectionWarning: "Botプロテクションが設定されてへんで。" +configure: "設定する" +postToGallery: "ギャラリーへ投稿" +gallery: "ギャラリー" +recentPosts: "最近の投稿" +popularPosts: "人気の投稿" +shareWithNote: "ノートで共有" +ads: "広告" +expiration: "期限" +memo: "メモ" +priority: "優先度" +high: "高い" +middle: "中" +low: "低い" +emailNotConfiguredWarning: "メアドの設定がされてへんで。" +ratio: "比率" +previewNoteText: "本文を下見するで" +customCss: "カスタムCSS" +customCssWarn: "この設定は必ず知識のある人がやらなあかんで。あんま良くない設定をしたるとクライアントがちゃんと使えへんくなってくで。" +global: "グローバル" +squareAvatars: "アイコンを四角形で表示するで" +sent: "送信" +received: "受信" +searchResult: "検索結果やで" +hashtags: "ハッシュタグ" +troubleshooting: "トラブルシューティング" +useBlurEffect: "UIにぼかし効果を使うで" +learnMore: "詳しく" +misskeyUpdated: "Misskeyが更新されたで!\nモデレーターの人らに感謝せなあかんで" +whatIsNew: "更新情報を見るで" +translate: "翻訳" +translatedFrom: "{x}から翻訳するで" +accountDeletionInProgress: "アカウント削除しとるで待っとってなー" +usernameInfo: "サーバー上であんたのアカウントをあんたやと分かるようにするための名前やで。アルファベット(a~z, A~Z)、数字(0~9)、それとアンダーバー(_)が使って考えてな。この名前は後から変更することはできへんからちゃんと考えるんやで。" +aiChanMode: "藍モードやで" +keepCw: "CWを維持するで" +pubSub: "Pub/Subのアカウント" +lastCommunication: "直近の通信" +resolved: "解決したで" +unresolved: "まだ解決してないで" +breakFollow: "フォロワーを解除するで" +itsOn: "オンになっとるよ" +hide: "隠す" +searchByGoogle: "探す" +indefinitely: "無期限" +file: "ファイル" +requireAdminForView: "これを見るには管理者アカウントでログインしとらなあかんで。" +isSystemAccount: "システムが自動で作成・管理しとるアカウントやで。" +typeToConfirm: "この操作をやるんなら {x} と入力してなー" +deleteAccount: "アカウント削除するで" +document: "ドキュメント" +numberOfPageCache: "ページキャッシュ数やで" +numberOfPageCacheDescription: "増やすと使いやすくなる、負荷とメモリ使用量が増えてくで。一長一短やな。" +logoutConfirm: "ログアウトしまっか?" +lastActiveDate: "最後に使った日時" +statusbar: "ステータスバー" +pleaseSelect: "選択したってやー" +reverse: "反転" +colored: "色付き" +refreshInterval: "更新間隔" +label: "ラベル" +type: "タイプ" +speed: "速度" +slow: "遅い" +fast: "速い" +sensitiveMediaDetection: "センシティブなメディアの検出" +localOnly: "ローカルのみ" +remoteOnly: "リモートのみ" +failedToUpload: "アップロードに失敗したで" +cannotUploadBecauseInappropriate: "不適切な内容を含むかもしれへんって判定されたでアップロードできまへん。" +cannotUploadBecauseNoFreeSpace: "ドライブの空き容量が無いでアップロードできまへん。" +beta: "ベータ" +enableAutoSensitive: "自動NSFW判定" +enableAutoSensitiveDescription: "使える時は、機械学習を使って自動でメディアにNSFWフラグを設定するで。この機能をオフにしても、インスタンスによっては自動で設定されることがあるで。" +activeEmailValidationDescription: "ユーザーのメールアドレスのバリデーションを、捨てアドかどうかや実際に通信可能かどうかとかを判定して積極的に行うで。オフにすると単に文字列として正しいかどうかだけチェックするで。" +navbar: "ナビゲーションバー" +shuffle: "シャッフルするで" +account: "アカウント" +move: "移動するで" +_sensitiveMediaDetection: + description: "機械学習を使って自動でセンシティブなメディアを検出して、モデレーションに役立てることができるで。サーバーの負荷が少し増えてまうなあ。" + sensitivity: "検出感度やで" + sensitivityDescription: "感度を低くすると、誤検知(偽陽性)が減るで。感度を高くすると、検知漏れ(偽陰性)が減るで。" + setSensitiveFlagAutomatically: "NSFWフラグを設定するで" + setSensitiveFlagAutomaticallyDescription: "この設定をオフにしても内部的に判定結果は保持されるで。" +_ffVisibility: + public: "公開" +_ad: + back: "戻る" +_gallery: + unlike: "良くないわ" +_email: + _follow: + title: "フォローされたで" + _receiveFollowRequest: + title: "フォローリクエストを受け取ったで" +_plugin: + install: "プラグインのインストール" + installWarn: "信頼できへんプラグインはインストールせんとってな" + manage: "プラグインの管理" +_registry: + scope: "スコープ" + key: "キー" + keys: "キー" + domain: "ドメイン" + createKey: "キーを作る" +_aboutMisskey: + about: "Misskeyはsyuiloが2014年からずっと作ってはる、オープンソースなソフトウェアや。" + contributors: "主な貢献者" + allContributors: "全ての貢献者" + source: "ソースコード" + translation: "Misskeyを翻訳" + donate: "Misskeyに寄付" + morePatrons: "他にもぎょうさんの人からサポートしてもろてんねん。ほんまおおきに🥰" + patrons: "支援者" +_mfm: + cheatSheet: "MFMチートシート" + mention: "メンション" + hashtag: "ハッシュタグ" + url: "URL" + link: "リンク" + bold: "太字" + center: "中央寄せ" + inlineCode: "コード(インライン)" + blockCode: "コード(ブロック)" + inlineMath: "数式(インライン)" + quote: "引用" + emoji: "カスタム絵文字" + search: "探す" + shake: "アニメーション(ぶるぶる)" + twitch: "アニメーション(ブレ)" + spin: "アニメーション(回転)" + blur: "ぼかし" + font: "フォント" + rotate: "回転" +_instanceTicker: + none: "表示せん" + remote: "リモートユーザーに表示" + always: "常に表示" +_serverDisconnectedBehavior: + reload: "自動でリロード" + dialog: "ダイアログで警告" +_channel: + create: "チャンネルを作る" + edit: "チャンネルを編集" + setBanner: "バナーを設定" + removeBanner: "バナーを削除" + featured: "トレンド" + notesCount: "{n}こ投稿があるで" +_menuDisplay: + hide: "隠す" +_wordMute: + soft: "ソフト" + hard: "ハード" +_theme: + explore: "テーマを探す" + install: "テーマのインストール" + manage: "テーマの管理" + code: "テーマコード" + description: "説明" + installed: "{name}をインストールしたで。" + installedThemes: "インストールされとるテーマ" + builtinThemes: "標準のテーマ" + alreadyInstalled: "そのテーマはもうインストールされとるで?" + make: "テーマを作る" + base: "ベース" + addConstant: "定数を追加" + defaultValue: "デフォルト値" + color: "色" + refProp: "プロパティを参照" + refConst: "定数を参照" + key: "キー" + func: "関数" + funcKind: "関数の種類" + argument: "引数" + basedProp: "元にするプロパティの名前" + alpha: "不透明度" + darken: "暗さ" + lighten: "明るさ" + keys: + accent: "アクセント" + bg: "背景" + fg: "文字" + focus: "フォーカス" + indicator: "インジケーター" + panel: "パネル" + shadow: "影" + header: "ヘッダー" + navBg: "サイドバーの背景" + navFg: "サイドバーの文字" + navHoverFg: "サイドバー文字(ホバー)" + navActive: "サイドバー文字(アクティブ)" + navIndicator: "サイドバーのインジケーター" + link: "リンク" + hashtag: "ハッシュタグ" + mention: "メンション" + mentionMe: "うち宛てのメンション" + renote: "Renote" + modalBg: "モーダルの背景" + divider: "分割線" + scrollbarHandle: "スクロールバーの取っ手" + scrollbarHandleHover: "スクロールバーの取っ手(ホバー)" + dateLabelFg: "日付ラベルの文字" + infoBg: "情報の背景" + infoFg: "情報の文字" + infoWarnBg: "警告の背景" + infoWarnFg: "警告の文字" + cwBg: "CW ボタンの背景" + cwFg: "CW ボタンの文字" + cwHoverBg: "CW ボタンの背景 (ホバー)" + toastBg: "通知トーストの背景" + toastFg: "通知トーストの文字" + buttonBg: "ボタンの背景" + buttonHoverBg: "ボタンの背景 (ホバー)" + inputBorder: "入力ボックスの縁取り" + listItemHoverBg: "リスト項目の背景 (ホバー)" + driveFolderBg: "ドライブフォルダーの背景" + wallpaperOverlay: "壁紙のオーバーレイ" + badge: "バッジ" + messageBg: "チャットの背景" + accentDarken: "アクセント (暗め)" + accentLighten: "アクセント (明るめ)" + fgHighlighted: "強調されとる文字" +_sfx: + note: "ノート" + noteMy: "ノート(自分)" + notification: "通知" + chat: "チャット" +_ago: + future: "未来" + justNow: "たった今" + secondsAgo: "{n}秒前" + minutesAgo: "{n}分前" + hoursAgo: "{n}時間前" + daysAgo: "{n}日前" + weeksAgo: "{n}週間前" + monthsAgo: "{n}ヶ月前" + yearsAgo: "{n}年前" +_time: + second: "秒" + minute: "分" + hour: "時間" + day: "日" +_2fa: + alreadyRegistered: "もう設定終わっとるわ。" +_permissions: + "read:reactions": "リアクションを見る" + "write:votes": "投票する" + "read:pages": "ページを見る" + "read:page-likes": "ページのええやんを見る" + "write:page-likes": "ページのええやんを操作する" + "read:user-groups": "ユーザーグループを見る" + "read:channels": "チャンネルを見る" +_auth: + permissionAsk: "このアプリは次の権限を要求しとるで" +_antennaSources: + all: "みんなのノート" + homeTimeline: "フォローしとるユーザーのノート" +_weekday: + sunday: "日曜日" + monday: "月曜日" + tuesday: "火曜日" + wednesday: "水曜日" + thursday: "木曜日" + friday: "金曜日" + saturday: "土曜日" +_widgets: + memo: "付箋" + notifications: "通知" + timeline: "タイムライン" + calendar: "カレンダー" + trends: "トレンド" + clock: "時計" + rss: "RSSリーダー" + activity: "アクティビティ" + photos: "フォト" + digitalClock: "デジタル時計" + federation: "連合" + postForm: "投稿フォーム" + slideshow: "スライドショー" + button: "ボタン" + onlineUsers: "オンラインユーザー" + jobQueue: "ジョブキュー" + serverMetric: "サーバーメトリクス" + aiscript: "AiScriptコンソール" +_cw: + hide: "隠す" + show: "続き見して!" + chars: "{count}文字" + files: "{count}ファイル" +_poll: + choiceN: "選択肢{n}" + noMore: "これ以上追加でけへん" + canMultipleVote: "複数回答可" + expiration: "期限" + infinite: "無期限" + at: "日時指定" + after: "経過指定" + deadlineDate: "期日" + deadlineTime: "時間" + duration: "期間" + votesCount: "{n}票" + vote: "投票する" +_visibility: + publicDescription: "みんなに公開" + home: "ホーム" + followers: "フォロワー" +_profile: + name: "名前" + username: "ユーザー名" +_exportOrImport: + allNotes: "全てのノート" + followingList: "フォロー" + muteList: "ミュート" + blockingList: "ブロック" + userLists: "リスト" +_charts: + federation: "連合" + apRequest: "リクエスト" + usersTotal: "ユーザーの合計" + activeUsers: "アクティブユーザー数" + notesIncDec: "ノートの増減" + localNotesIncDec: "ローカルのノートの増減" + remoteNotesIncDec: "リモートのノートの増減" + notesTotal: "ノートの合計" + filesIncDec: "ファイルの増減" + filesTotal: "ファイルの合計" + storageUsageIncDec: "ストレージ使用量の増減" + storageUsageTotal: "ストレージ使用量の合計" +_instanceCharts: + requests: "リクエスト" + users: "ユーザーの増減" + usersTotal: "ユーザーの累積" + notes: "ノートの増減" + notesTotal: "ノートの累積" + ff: "フォロー/フォロワーの増減" + ffTotal: "フォロー/フォロワーの累積" + cacheSize: "キャッシュサイズの増減" + cacheSizeTotal: "キャッシュサイズの累積" + files: "ファイル数の増減" + filesTotal: "ファイル数の累積" +_timelines: + home: "ホーム" + local: "ローカル" + social: "ソーシャル" + global: "グローバル" +_pages: + newPage: "ページを作る" + editPage: "ページの編集" + readPage: "ソースを表示中" + created: "ページを作成したで" + updated: "ページを更新したで" + deleted: "ページを削除したで" + pageSetting: "ページ設定" + viewPage: "ページを見る" + like: "ええやん" + unlike: "良くないわ" + liked: "ええと思ったページ" + contents: "コンテンツ" + summary: "ページの要約" + alignCenter: "中央寄せ" + font: "フォント" + fontSerif: "セリフ" + fontSansSerif: "サンセリフ" + eyeCatchingImageSet: "アイキャッチ画像を設定" + eyeCatchingImageRemove: "アイキャッチ画像を削除" + chooseBlock: "ブロックを追加" + selectType: "種類を選択" + contentBlocks: "コンテンツ" + inputBlocks: "入力" + specialBlocks: "特殊" + blocks: + text: "テキスト" + textarea: "テキストエリア" + section: "セクション" + image: "画像" + button: "ボタン" + if: "もし" + _if: + variable: "変数" + post: "投稿フォーム" + _post: + text: "内容" + canvasId: "キャンバスID" + textInput: "テキスト入力" + _textInput: + name: "変数名" + text: "タイトル" + default: "デフォルト値" + textareaInput: "複数行テキスト入力" + _textareaInput: + name: "変数名" + text: "タイトル" + default: "デフォルト値" + numberInput: "数値入力" + _numberInput: + name: "変数名" + text: "タイトル" + default: "デフォルト値" + canvas: "キャンバス" + _canvas: + id: "キャンバスID" + width: "幅" + height: "高さ" + note: "ノート埋め込み" + _note: + id: "ノートID" + detailed: "詳細な表示" + switch: "スイッチ" + _switch: + name: "変数名" + text: "タイトル" + default: "デフォルト値" + counter: "カウンター" + _counter: + name: "変数名" + text: "タイトル" + inc: "増加値" + _button: + text: "タイトル" + colored: "色付き" + action: "ボタンを押したときの動作" + _action: + dialog: "ダイアログを表示する" + _dialog: + content: "内容" + resetRandom: "乱数をリセット" + pushEvent: "イベントを送信させる" + _pushEvent: + event: "イベント名" + no-variable: "なし" + callAiScript: "AiScript呼び出し" + _callAiScript: + functionName: "関数名" + radioButton: "選択肢" + _radioButton: + name: "変数名" + title: "タイトル" + values: "改行で区切った選択肢" + default: "デフォルト値" + script: + categories: + flow: "制御" + logical: "論理演算" + operation: "計算" + comparison: "比較" + random: "ランダム" + value: "値" + fn: "関数" + text: "関数" + convert: "変換" + list: "リスト" + blocks: + text: "テキスト" + multiLineText: "テキスト(複数行)" + textList: "テキストのリスト" + strLen: "テキストの長さ" + _strLen: + arg1: "テキスト" + strPick: "文字取り出し" + _strPick: + arg1: "テキスト" + arg2: "文字の位置" + strReplace: "テキスト置き換え" + _strReplace: + arg1: "テキスト" + arg2: "置き換え前" + arg3: "置き換え後" + strReverse: "テキストを反転" + _strReverse: + arg1: "テキスト" + join: "テキストを連結" + _join: + arg1: "リスト" + arg2: "区切り" + add: "足す" + _add: + arg1: "A" + arg2: "B" + subtract: "引く" + _subtract: + arg1: "A" + arg2: "A" + multiply: "掛ける" + _multiply: + arg1: "A" + arg2: "B" + divide: "割る" + _divide: + arg1: "A" + arg2: "B" + mod: "割った余り" + _mod: + arg1: "A" + arg2: "B" + round: "小数を丸める" + _round: + arg1: "数値" + eq: "AとBが同じ" + _eq: + arg1: "A" + arg2: "B" + notEq: "AとBが異なる" + _notEq: + arg1: "A" + arg2: "B" + and: "AかつB" + _and: + arg1: "A" + arg2: "B" + or: "AまたはB" + _or: + arg1: "A" + arg2: "B" + lt: "< AがBより小さい" + _lt: + arg1: "A" + arg2: "B" + gt: "> AがBより大きい" + _gt: + arg1: "A" + arg2: "B" + ltEq: "<= AがBと同じか小さい" + _ltEq: + arg1: "A" + arg2: "B" + gtEq: ">= AがBと同じか大きい" + _gtEq: + arg1: "A" + arg2: "B" + if: "分岐" + _if: + arg1: "もし" + arg2: "なら" + arg3: "そうでなければ" + not: "否定" + _not: + arg1: "否定" + random: "ランダム" + _random: + arg1: "確率" + rannum: "乱数" + _rannum: + arg1: "最小" + arg2: "最大" + randomPick: "リストからランダムに選ぶ" + _randomPick: + arg1: "リスト" + dailyRandom: "ランダム (ユーザーごとに日替わり)" + _dailyRandom: + arg1: "確率" + dailyRannum: "乱数 (ユーザーごとに日替わり)" + _dailyRannum: + arg1: "最小" + arg2: "最大" + dailyRandomPick: "リストからランダムに選ぶ (ユーザーごとに日替わり)" + _dailyRandomPick: + arg1: "リスト" + seedRandom: "ランダム (シード)" + _seedRandom: + arg1: "シード" + arg2: "確率" + seedRannum: "乱数 (シード)" + _seedRannum: + arg1: "シード" + arg2: "最小" + arg3: "最大" + seedRandomPick: "リストからランダムに選択 (シード)" + _seedRandomPick: + arg1: "シード" + arg2: "リスト" + DRPWPM: "確率付きリストからランダムに選ぶ (ユーザーごとに日替わり)" + _DRPWPM: + arg1: "テキストのリスト" + pick: "リストから選ぶ" + _pick: + arg1: "リスト" + arg2: "位置" + listLen: "リストの長さを取得" + _listLen: + arg1: "リスト" + number: "数値" + stringToNumber: "テキストを数値に" + _stringToNumber: + arg1: "テキスト" + numberToString: "数値をテキストに" + _numberToString: + arg1: "数値" + splitStrByLine: "テキストを行で分割" + _splitStrByLine: + arg1: "テキスト" + ref: "変数" + aiScriptVar: "AiScript変数" + fn: "関数" + _fn: + slots: "スロット" + arg1: "出力" + for: "繰り返し" + _for: + arg1: "回数" + arg2: "処理" + thereIsEmptySlot: "スロット{slot}が空っぽやで!" + types: + string: "テキスト" + number: "数値" + boolean: "フラグ" + array: "リスト" + stringArray: "テキストのリスト" + emptySlot: "空のスロット" + enviromentVariables: "環境変数" + pageVariables: "ページ要素" + argVariables: "入力スロット" +_notification: + fileUploaded: "ファイルが無事アップロードされたで。" + youGotMention: "{name}からのメンション" + youGotReply: "{name}からのリプライ" + youWereFollowed: "フォローされたで" + youReceivedFollowRequest: "フォロー許可してほしいみたいやな" + yourFollowRequestAccepted: "フォローさせてもろたで" + youWereInvitedToGroup: "グループに招待されとるで" + _types: + all: "すべて" + follow: "フォロー" + mention: "メンション" + renote: "Renote" + quote: "引用" + reaction: "リアクション" + receiveFollowRequest: "フォロー許可してほしいみたいやで" + followRequestAccepted: "フォローが受理されたで" + _actions: + reply: "返事" + renote: "Renote" +_deck: + alwaysShowMainColumn: "いつもメインカラムを表示" + columnAlign: "カラムの寄せ" + addColumn: "カラムを追加" + swapLeft: "左に移動" + swapRight: "右に移動" + swapUp: "上に移動" + swapDown: "下に移動" + stackLeft: "左に重ねる" + popRight: "右に出す" + profile: "プロファイル" + _columns: + main: "メイン" + widgets: "ウィジェット" + notifications: "通知" + tl: "タイムライン" + antenna: "アンテナ" + list: "リスト" + mentions: "あんた宛て" + direct: "ダイレクト" diff --git a/fe_calckey/frontend/locales/kab-KAB.yml b/fe_calckey/frontend/locales/kab-KAB.yml new file mode 100644 index 0000000..29eca64 --- /dev/null +++ b/fe_calckey/frontend/locales/kab-KAB.yml @@ -0,0 +1,126 @@ +--- +_lang_: "Taqbaylit" +monthAndDay: "{day}/{month}" +search: "Nadi" +notifications: "Ilɣuyen" +username: "Isem n umseqdac" +password: "Awal uffir" +ok: "IH" +settings: "Iɣewwaṛen" +otherSettings: "Iɣewwaren nniḍen" +profile: "Amaɣnu" +signup: "Jerred" +save: "Sekles" +delete: "Kkes" +addToList: "Rnu ɣer tebdart" +reply: "Err" +loadMore: "Wali ugar" +showMore: "Wali ugar" +youGotNewFollower: "Yeṭṭafaṛ-ik·em-id" +mention: "Bder" +import: "Kter" +export: "Sifeḍ" +files: "Ifuyla" +download: "Sider" +lists: "Tibdarin" +noLists: "Ulac ɣur-k·m ula d yiwet n tabdart" +following: "Ig ṭṭafaṛ" +followers: "Imeḍfaṛen" +followsYou: "Yeṭṭafaṛ-ik·em-id" +createList: "Snulfu-d tabdart" +enterListName: "Isem n tebdart" +privacy: "Tabaḍnit" +follow: "Ḍfeṛ" +you: "Kečči·mmi" +selectList: "Fren tabdart" +youHaveNoLists: "Ulac ɣur-k·m ula d yiwet n tabdart" +security: "Taɣellist" +remove: "Kkes" +connectService: "Qqen" +userList: "Tibdarin" +securityKey: "Tasarutt n tɣellist" +securityKeyName: "Isem n tsarutt" +signinRequired: "Ttxil jerred" +signinWith: "Tuqqna s {x}" +tapSecurityKey: "Sekcem tasarutt-ik·im n tɣellist" +uiLanguage: "Tutlayt n wegrudem" +accountSettings: "Iɣewwaṛen n umiḍan" +plugins: "Izegrar" +email: "Imayl" +emailAddress: "Tansa imayl" +smtpUser: "Isem n umseqdac" +smtpPass: "Awal uffir" +other: "Wiyyaḍ" +accountInfo: "Talɣut n umiḍan" +emailNotification: "Ilɣa imayl" +selectAccount: "Fren amiḍan" +accounts: "Imiḍan" +searchByGoogle: "Nadi" +file: "Ifuyla" +account: "Imiḍan" +_email: + _follow: + title: "Yeṭṭafaṛ-ik·em-id" +_mfm: + mention: "Bder" + search: "Nadi" + font: "Tasefsit" +_theme: + keys: + mention: "Bder" +_sfx: + notification: "Ilɣuyen" +_permissions: + "write:account": "Ẓreg talɣut n umiḍan-ik·im" +_widgets: + notifications: "Ilɣuyen" +_cw: + show: "Wali ugar" +_visibility: + followers: "Imeḍfaṛen" +_profile: + username: "Isem n umseqdac" +_exportOrImport: + followingList: "Ig ṭṭafaṛ" + muteList: "Sgugem" + blockingList: "Seḥbes" + userLists: "Tibdarin" +_pages: + contents: "Agbur" + font: "Tasefsit" + fontSerif: "Serif" + fontSansSerif: "Sans Serif" + eyeCatchingImageRemove: "Kkes tugna i d-ijebden" + selectType: "Fren anaw" + contentBlocks: "Agbur" + inputBlocks: "Anekcum" + specialBlocks: "Uzzig" + script: + categories: + list: "Tibdarin" + blocks: + _join: + arg1: "Tibdarin" + _randomPick: + arg1: "Tibdarin" + _dailyRandomPick: + arg1: "Tibdarin" + _seedRandomPick: + arg2: "Tibdarin" + _pick: + arg1: "Tibdarin" + _listLen: + arg1: "Tibdarin" + types: + array: "Tibdarin" +_notification: + youWereFollowed: "Yeṭṭafaṛ-ik·em-id" + _types: + follow: "Ig ṭṭafaṛ" + mention: "Bder" + _actions: + reply: "Err" +_deck: + _columns: + notifications: "Ilɣuyen" + list: "Tibdarin" diff --git a/fe_calckey/frontend/locales/kn-IN.yml b/fe_calckey/frontend/locales/kn-IN.yml new file mode 100644 index 0000000..7761481 --- /dev/null +++ b/fe_calckey/frontend/locales/kn-IN.yml @@ -0,0 +1,86 @@ +--- +_lang_: "ಕನ್ನಡ" +introMisskey: "ಸ್ವಾಗತ! Calckey ಓಪನ್ ಸೋರ್ಸ್ ಒಕ್ಕೂಟ ಮೈಕ್ರೋಬ್ಲಾಗಿಂಗ್ ಸೇವೆಯಾಗಿದೆ.\n ಏನಾಗುತ್ತಿದೆ ಎಂಬುದನ್ನು ಹಂಚಿಕೊಳ್ಳಲು ಅಥವಾ ನಿಮ್ಮ ಬಗ್ಗೆ ಎಲ್ಲರಿಗೂ ಹೇಳಲು \"ಟಿಪ್ಪಣಿ\"ಗಳನ್ನು ರಚಿಸಿ📡\n \"ಸ್ಪಂದನೆ\" ಕ್ರಿಯೆಯೊಂದಿಗೆ, ನೀವು ಎಲ್ಲರ ಟಿಪ್ಪಣಿಗಳಿಗೆ ತ್ವರಿತವಾಗಿ ಸ್ಪಂದನೆಗಳನ್ನು ಕೂಡ ಸೇರಿಸಬಹುದು.👍\n ಹೊಸ ಜಗತ್ತನ್ನು ಅನ್ವೇಷಿಸಿ🚀" +monthAndDay: "{month}ನೇ ತಿಂಗಳ {day}ನೇ ದಿನ" +search: "ಹುಡುಕು" +notifications: "ಅಧಿಸೂಚನೆಗಳು" +username: "ಬಳಕೆಹೆಸರು" +password: "ಗುಪ್ತಪದ" +fetchingAsApObject: "ಒಕ್ಕೂಟದಿಂದ ಪಡೆಯಲಾಗುತ್ತಿದೆ" +ok: "ಸರಿ" +gotIt: "ಅರ್ಥವಾಯಿತು!" +cancel: "ರದ್ದು" +enterUsername: "ಬಳಕೆಹೆಸರನ್ನು ಭರ್ತಿ ಮಾಡಿ" +renotedBy: "{user} ಪುನರಾವರ್ತಿಸಿದರು" +noNotes: "ಟಿಪ್ಪಣಿಗಳಿಲ್ಲ" +noNotifications: "ಅಧಿಸೂಚನೆಗಳಿಲ್ಲ" +instance: "ನಿದರ್ಶನ" +settings: "ಸಿದ್ಧತೆಗಳು" +profile: "ಪ್ರೊಫೈಲು" +timeline: "ಸಮಯಸಾಲು" +noAccountDescription: "ಇವರು ಸ್ವಯಂ ಪರಿಚಯ ರಚಿಸಿಲ್ಲ" +login: "ಪ್ರವೇಶ" +loggingIn: "ಪ್ರವೇಶಿಸುತ್ತಾ..." +logout: "ಆಚೆಗೆ" +signup: "ನೋಂದಣಿ" +uploading: "ಅಪ್‌ಲೋಡಾಗುತ್ತಿದೆ" +save: "ಉಳಿಸಿ" +users: "ಬಳಕೆದಾರ" +addUser: "ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿ" +favorite: "ಮೆಚ್ಚಿನ" +favorites: "ಮೆಚ್ಚಿನವುಗಳು" +unfavorite: "ಮೆಚ್ಚುಗೆ ಅಳಿಸು" +pin: "ಪ್ರೊಫ಼ೈಲಿಗೆ ಅಂಟಿಸು" +unpin: "ಪ್ರೊಫ಼ೈಲಿಂದ ಅಂಟುತೆಗೆ" +copyContent: "ವಿಷಯವನ್ನು ನಕಲಿಸು" +copyLink: "ಲಿಂಕನ್ನು ನಕಲಿಸು" +delete: "ಅಳಿಸು" +addToList: "ಪಟ್ಟಿಗೆ ಸೇರಿಸು" +sendMessage: "ಸಂದೇಶ ಕಳುಹಿಸು" +copyUsername: "ಬಳಕೆಹೆಸರು ನಕಲಿಸು" +reply: "ಉತ್ತರಿಸು" +loadMore: "ಇನ್ನಷ್ಟು ನೋಡು" +showMore: "ಇನ್ನಷ್ಟು ನೋಡು" +youGotNewFollower: "ಹಿಂಬಾಲಿಸಿದರು" +receiveFollowRequest: "ಹಿಂಬಾಲನೆ ವಿನಂತಿ ಬಂದಿದೆ" +followRequestAccepted: "ಹಿಂಬಾಲನೆ ವಿನಂತಿ ಸ್ವೀಕರಿಸಲಾಯಿತು" +mentions: "ಹೆಸರಿಸಿದ" +directNotes: "ನೇರ ಟಿಪ್ಪಣಿಗಳು" +importAndExport: "ಆಮದು/ರಫ್ತು" +import: "ಆಮದು" +export: "ರಫ್ತು" +files: "ಕಡತಗಳು" +download: "ಜಾಲದಿಂದಿಳಿಸು" +driveFileDeleteConfirm: "\"{name}\" ಕಡತವನ್ನು ಅಳಿಸಲು ನೀವು ಬಯಸುವಿರಾ? ಈ ನೋಡಿರಿ ಲಗತ್ತಿಸಲಾದ ಟಿಪ್ಪಣಿ ಸಹ ಕಣ್ಮರೆಯಾಗುತ್ತದೆ." +unfollowConfirm: "{name}ಅನ್ನು ಹಿಂಬಾಲಿಸದಿರುವುದೇ?" +pinned: "ಪ್ರೊಫ಼ೈಲಿಗೆ ಅಂಟಿಸು" +instances: "ನಿದರ್ಶನ" +remove: "ಅಳಿಸು" +smtpUser: "ಬಳಕೆಹೆಸರು" +smtpPass: "ಗುಪ್ತಪದ" +user: "ಬಳಕೆದಾರ" +searchByGoogle: "ಹುಡುಕು" +file: "ಕಡತಗಳು" +_email: + _follow: + title: "ಹಿಂಬಾಲಿಸಿದರು" +_mfm: + search: "ಹುಡುಕು" +_sfx: + notification: "ಅಧಿಸೂಚನೆಗಳು" +_widgets: + notifications: "ಅಧಿಸೂಚನೆಗಳು" + timeline: "ಸಮಯಸಾಲು" +_cw: + show: "ಇನ್ನಷ್ಟು ನೋಡು" +_profile: + username: "ಬಳಕೆಹೆಸರು" +_notification: + youWereFollowed: "ಹಿಂಬಾಲಿಸಿದರು" + _actions: + reply: "ಉತ್ತರಿಸು" +_deck: + _columns: + notifications: "ಅಧಿಸೂಚನೆಗಳು" + tl: "ಸಮಯಸಾಲು" + mentions: "ಹೆಸರಿಸಿದ" diff --git a/fe_calckey/frontend/locales/ko-KR.yml b/fe_calckey/frontend/locales/ko-KR.yml new file mode 100644 index 0000000..2c8e548 --- /dev/null +++ b/fe_calckey/frontend/locales/ko-KR.yml @@ -0,0 +1,1717 @@ +--- +_lang_: "한국어" +headlineMisskey: "노트로 연결되는 네트워크" +introMisskey: "환영합니다! Calckey 는 오픈 소스 분산형 마이크로 블로그 서비스입니다.\n\"노트\" 를 작성해서, 지금 일어나고 있는 일을 공유하거나, 당신만의 이야기를 모두에게 발신하세요📡\n\"리액션\" 기능으로, 친구의 노트에 총알같이 반응을 추가할 수도 있습니다👍\n새로운 세계를 탐험해 보세요🚀" +monthAndDay: "{month}월 {day}일" +search: "검색" +notifications: "알림" +username: "유저명" +password: "비밀번호" +forgotPassword: "비밀번호 재설정" +fetchingAsApObject: "연합에서 조회 중" +ok: "OK" +gotIt: "알겠어요" +cancel: "취소" +enterUsername: "유저명 입력" +renotedBy: "{user}님이 Renote" +noNotes: "노트가 없습니다" +noNotifications: "표시할 알림이 없습니다" +instance: "인스턴스" +settings: "설정" +basicSettings: "기본 설정" +otherSettings: "기타 설정" +openInWindow: "창으로 열기" +profile: "프로필" +timeline: "타임라인" +noAccountDescription: "자기소개가 없습니다" +login: "로그인" +loggingIn: "로그인 중" +logout: "로그아웃" +signup: "회원 가입" +uploading: "업로드 중" +save: "저장" +users: "유저" +addUser: "유저 추가" +favorite: "즐겨찾기" +favorites: "즐겨찾기" +unfavorite: "즐겨찾기에서 제거" +favorited: "즐겨찾기에 등록했습니다" +alreadyFavorited: "이미 즐겨찾기에 등록되어 있습니다" +cantFavorite: "즐겨찾기에 등록하지 못했습니다" +pin: "프로필에 고정" +unpin: "프로필에서 고정 해제" +copyContent: "내용 복사" +copyLink: "링크 복사" +delete: "삭제" +deleteAndEdit: "삭제 후 편집" +deleteAndEditConfirm: "이 노트를 삭제한 뒤 다시 편집하시겠습니까? 이 노트에 대한 리액션, 리노트, 답글 또한 모두 삭제됩니다." +addToList: "리스트에 추가" +sendMessage: "메시지 보내기" +copyUsername: "유저명 복사" +searchUser: "사용자 검색" +reply: "답글" +loadMore: "더 보기" +showMore: "더 보기" +showLess: "닫기" +youGotNewFollower: "새로운 팔로워가 있습니다" +receiveFollowRequest: "새로운 팔로우 요청이 있습니다" +followRequestAccepted: "팔로우가 수락되었습니다" +mention: "멘션" +mentions: "받은 멘션" +directNotes: "다이렉트 노트" +importAndExport: "가져오기와 내보내기" +import: "가져오기" +export: "내보내기" +files: "파일" +download: "다운로드" +driveFileDeleteConfirm: "파일 \"{name}\" 을 삭제하시겠습니까? 이 파일이 첨부된 노트도 함께 삭제됩니다." +unfollowConfirm: "{name}님을 언팔로우하시겠습니까?" +exportRequested: "내보내기를 요청하였습니다. 이 작업은 시간이 걸릴 수 있습니다. 내보내기가 완료되면 \"드라이브\"에 추가됩니다." +importRequested: "가져오기를 요청하였습니다. 이 작업에는 시간이 걸릴 수 있습니다." +lists: "리스트" +noLists: "리스트가 없습니다" +note: "노트" +notes: "노트" +following: "팔로잉" +followers: "팔로워" +followsYou: "당신을 팔로우합니다" +createList: "리스트 만들기" +manageLists: "리스트 관리" +error: "오류" +somethingHappened: "오류가 발생했습니다" +retry: "다시 시도" +pageLoadError: "페이지를 불러오지 못했습니다." +pageLoadErrorDescription: "네트워크 연결 또는 브라우저 캐시로 인해 발생했을 가능성이 높습니다. 캐시를 삭제하거나, 잠시 후 다시 시도해 주세요." +serverIsDead: "서버로부터 응답이 없습니다. 잠시 후 다시 시도해주세요." +youShouldUpgradeClient: "이 페이지를 표시하려면 새로고침하여 새로운 버전의 클라이언트를 이용해 주십시오." +enterListName: "리스트 이름을 입력" +privacy: "프라이버시" +makeFollowManuallyApprove: "팔로우를 수동으로 승인" +defaultNoteVisibility: "기본 공개 범위" +follow: "팔로우" +followRequest: "팔로우 요청" +followRequests: "팔로우 요청" +unfollow: "팔로우 해제" +followRequestPending: "팔로우 허가 대기중" +enterEmoji: "이모지 입력" +renote: "Renote" +unrenote: "Renote 취소" +renoted: "Renote 하였습니다" +cantRenote: "이 게시물은 Renote할 수 없습니다." +cantReRenote: "Renote를 Renote할 수 없습니다." +quote: "인용" +pinnedNote: "고정해놓은 노트" +pinned: "프로필에 고정" +you: "당신" +clickToShow: "클릭하여 보기" +sensitive: "열람주의" +add: "추가" +reaction: "리액션" +reactionSetting: "선택기에 표시할 리액션" +reactionSettingDescription2: "끌어서 순서 변경, 클릭해서 삭제, +를 눌러서 추가할 수 있습니다." +rememberNoteVisibility: "공개 범위를 기억하기" +attachCancel: "첨부 취소" +markAsSensitive: "열람주의로 설정" +unmarkAsSensitive: "열람주의 해제" +enterFileName: "파일명을 입력" +mute: "뮤트" +unmute: "뮤트 해제" +block: "차단" +unblock: "차단 해제" +suspend: "정지" +unsuspend: "정지 해제" +blockConfirm: "이 계정을 차단하시겠습니까?" +unblockConfirm: "이 계정의 차단을 해제하시겠습니까?" +suspendConfirm: "이 계정을 정지하시겠습니까?" +unsuspendConfirm: "이 계정의 정지를 해제하시겠습니까?" +selectList: "리스트 선택" +selectAntenna: "안테나 선택" +selectWidget: "위젯 선택" +editWidgets: "위젯 편집" +editWidgetsExit: "편집 종료" +customEmojis: "커스텀 이모지" +emoji: "이모지" +emojis: "이모지" +emojiName: "이모지 이름" +emojiUrl: "이모지 URL" +addEmoji: "이모지 추가" +settingGuide: "추천 설정" +cacheRemoteFiles: "리모트 파일을 캐시" +cacheRemoteFilesDescription: "이 설정을 해지하면 리모트 파일을 캐시하지 않고 해당 파일을 직접 링크하게 됩니다. 그에 따라 서버의 저장 공간을 절약할 수 있지만, 썸네일이 생성되지 않기 때문에 통신량이 증가합니다." +flagAsBot: "나는 봇입니다" +flagAsBotDescription: "이 계정을 자동화된 수단으로 운용할 경우에 활성화해 주세요. 이 플래그를 활성화하면, 다른 봇이 이를 참고하여 봇 끼리의 무한 연쇄 반응을 회피하거나, 이 계정의 시스템 상에서의 취급이 Bot 운영에 최적화되는 등의 변화가 생깁니다." +flagAsCat: "나는 고양이다냥" +flagAsCatDescription: "이 계정이 고양이라면 활성화 해주세요." +flagShowTimelineReplies: "타임라인에 노트의 답글을 표시하기" +flagShowTimelineRepliesDescription: "이 설정을 활성화하면 타임라인에 다른 유저 간의 답글을 표시합니다." +autoAcceptFollowed: "팔로우 중인 유저로부터의 팔로우 요청을 자동 수락" +addAccount: "계정 추가" +loginFailed: "로그인에 실패했습니다" +showOnRemote: "리모트에서 보기" +general: "일반" +wallpaper: "배경" +setWallpaper: "배경화면 설정" +removeWallpaper: "배경 제거" +searchWith: "검색: {q}" +youHaveNoLists: "리스트가 없습니다" +followConfirm: "{name}님을 팔로우 하시겠습니까?" +proxyAccount: "프록시 계정" +proxyAccountDescription: "프록시 계정은 특정 조건 하에서 유저의 리모트 팔로우를 대행하는 계정입니다. 예를 들면, 유저가 리모트 유저를 리스트에 넣었을 때, 리스트에 들어간 유저를 아무도 팔로우한 적이 없다면 액티비티가 인스턴스로 배달되지 않기 때문에, 대신 프록시 계정이 해당 유저를 팔로우하도록 합니다." +host: "호스트" +selectUser: "유저 선택" +recipient: "수신인" +annotation: "내용에 대한 주석" +federation: "연합" +instances: "인스턴스" +registeredAt: "등록 날짜" +latestRequestSentAt: "마지막으로 요청을 보낸 시간" +latestRequestReceivedAt: "마지막으로 요청을 받은 시간" +latestStatus: "마지막 상태" +storageUsage: "스토리지 사용량" +charts: "차트" +perHour: "1시간마다" +perDay: "1일마다" +stopActivityDelivery: "액티비티 보내지 않기" +blockThisInstance: "이 인스턴스를 차단" +operations: "작업" +software: "소프트웨어" +version: "버전" +metadata: "메타데이터" +monitor: "모니터" +jobQueue: "작업 대기열" +cpuAndMemory: "CPU와 메모리" +network: "네트워크" +disk: "디스크" +instanceInfo: "인스턴스 정보" +statistics: "통계" +clearQueue: "대기열 비우기" +clearQueueConfirmTitle: "대기열을 비우시겠습니까?" +clearQueueConfirmText: "대기열에 남아 있는 노트는 더이상 연합되지 않습니다. 보통의 경우 이 작업은 필요하지 않습니다." +clearCachedFiles: "캐시 비우기" +clearCachedFilesConfirm: "캐시된 리모트 파일을 모두 삭제하시겠습니까?" +blockedInstances: "차단된 인스턴스" +blockedInstancesDescription: "차단하려는 인스턴스의 호스트 이름을 줄바꿈으로 구분하여 설정합니다. 차단된 인스턴스는 이 인스턴스와 통신할 수 없게 됩니다." +muteAndBlock: "뮤트 및 차단" +mutedUsers: "뮤트한 유저" +blockedUsers: "차단한 유저" +noUsers: "아무도 없습니다" +editProfile: "프로필 수정" +noteDeleteConfirm: "이 노트를 삭제하시겠습니까?" +pinLimitExceeded: "더 이상 고정할 수 없습니다." +intro: "Misskey의 설치가 완료되었습니다! 관리자 계정을 생성해주세요." +done: "완료" +processing: "처리중" +preview: "미리보기" +default: "기본값" +defaultValueIs: "기본값: {value}" +noCustomEmojis: "이모지가 없습니다" +noJobs: "작업이 없습니다" +federating: "연합 중" +blocked: "차단됨" +suspended: "정지됨" +all: "전체" +subscribing: "구독 중" +publishing: "배포 중" +notResponding: "응답 없음" +instanceFollowing: "인스턴스의 팔로잉" +instanceFollowers: "인스턴스의 팔로워" +instanceUsers: "인스턴스의 유저" +changePassword: "비밀번호 변경" +security: "보안" +retypedNotMatch: "입력이 일치하지 않습니다." +currentPassword: "현재 비밀번호" +newPassword: "새 비밀번호" +newPasswordRetype: "새 비밀번호 (재입력)" +attachFile: "파일 첨부" +more: "더보기!" +featured: "하이라이트" +usernameOrUserId: "유저명이나 ID" +noSuchUser: "유저를 찾을 수 없습니다" +lookup: "조회" +announcements: "공지사항" +imageUrl: "이미지 URL" +remove: "삭제" +removed: "삭제하였습니다" +removeAreYouSure: "\"{x}\" 을(를) 삭제하시겠습니까?" +deleteAreYouSure: "\"{x}\" 을(를) 삭제하시겠습니까?" +resetAreYouSure: "초기화 하시겠습니까?" +saved: "저장하였습니다" +messaging: "대화" +upload: "업로드" +keepOriginalUploading: "원본 이미지를 유지" +keepOriginalUploadingDescription: "이미지를 업로드할 때에 원본을 그대로 유지합니다. 비활성화하면 업로드할 때 브라우저에서 웹 공개용 이미지를 생성합니다." +fromDrive: "드라이브에서" +fromUrl: "URL로부터" +uploadFromUrl: "URL 업로드" +uploadFromUrlDescription: "업로드하려는 파일의 URL" +uploadFromUrlRequested: "업로드를 요청했습니다" +uploadFromUrlMayTakeTime: "업로드가 완료될 때까지 시간이 소요될 수 있습니다." +explore: "발견하기" +messageRead: "읽음" +noMoreHistory: "이것보다 과거의 기록이 없습니다" +startMessaging: "대화 시작하기" +nUsersRead: "{n}명이 읽음" +agreeTo: "{0}에 동의" +tos: "이용 약관" +start: "시작하기" +home: "홈" +remoteUserCaution: "리모트 유저이기 때문에, 정보가 정확하지 않을 수 있습니다." +activity: "활동" +images: "이미지" +birthday: "생일" +yearsOld: "{age}세" +registeredDate: "등록일" +location: "장소" +theme: "테마" +themeForLightMode: "라이트 모드에서 사용할 테마" +themeForDarkMode: "다크 모드에서 사용할 테마" +light: "라이트" +dark: "다크" +lightThemes: "밝은 테마" +darkThemes: "어두운 테마" +syncDeviceDarkMode: "디바이스의 다크 모드 설정과 동기화" +drive: "드라이브" +fileName: "파일명" +selectFile: "파일 선택" +selectFiles: "파일 선택" +selectFolder: "폴더 선택" +selectFolders: "폴더 선택" +renameFile: "파일 이름 변경" +folderName: "폴더명" +createFolder: "폴더 만들기" +renameFolder: "폴더 이름 바꾸기" +deleteFolder: "폴더 삭제" +addFile: "파일 추가" +emptyDrive: "드라이브가 비어 있습니다" +emptyFolder: "폴더가 비어 있습니다" +unableToDelete: "삭제할 수 없습니다" +inputNewFileName: "바꿀 파일명을 입력해 주세요" +inputNewDescription: "새 캡션을 입력해 주세요" +inputNewFolderName: "바꿀 폴더명을 입력해 주세요" +circularReferenceFolder: "지정한 폴더가 이동할 폴더의 하위 폴더입니다." +hasChildFilesOrFolders: "이 폴더는 비어있지 않기 때문에 삭제할 수 없습니다." +copyUrl: "URL 복사" +rename: "이름 변경" +avatar: "아바타" +banner: "배너" +nsfw: "열람주의" +whenServerDisconnected: "서버와의 접속이 끊겼을 때" +disconnectedFromServer: "서버와의 연결이 끊어졌습니다" +reload: "새로고침" +doNothing: "무시하기" +reloadConfirm: "새로고침 하시겠습니까?" +watch: "지켜보기" +unwatch: "지켜보기 해제" +accept: "허가" +reject: "거부" +normal: "정상" +instanceName: "인스턴스 이름" +instanceDescription: "인스턴스 소개" +maintainerName: "관리자 이름" +maintainerEmail: "관리자 이메일" +tosUrl: "이용약관 URL" +thisYear: "올해" +thisMonth: "이번 달" +today: "오늘" +dayX: "{day}일" +monthX: "{month}월" +yearX: "{year}년" +pages: "페이지" +integration: "연동" +connectService: "계정 연동" +disconnectService: "계정 연동 해제" +enableLocalTimeline: "로컬 타임라인 활성화" +enableGlobalTimeline: "글로벌 타임라인 활성화" +disablingTimelinesInfo: "특정 타임라인을 비활성화하더라도 관리자 및 모더레이터는 계속 사용할 수 있습니다." +registration: "등록" +enableRegistration: "신규 회원가입을 활성화" +invite: "초대" +driveCapacityPerLocalAccount: "로컬 유저 한 명당 드라이브 용량" +driveCapacityPerRemoteAccount: "리모트 유저 한 명당 드라이브 용량" +inMb: "메가바이트 단위" +iconUrl: "아이콘 URL" +bannerUrl: "배너 이미지 URL" +backgroundImageUrl: "배경 이미지 URL" +basicInfo: "기본 정보" +pinnedUsers: "고정된 유저" +pinnedUsersDescription: "\"발견하기\" 페이지 등에 고정하고 싶은 유저를 한 줄에 한 명씩 적습니다." +pinnedPages: "고정한 페이지" +pinnedPagesDescription: "인스턴스의 대문에 고정하고 싶은 페이지의 경로를 한 줄에 하나씩 적습니다." +pinnedClipId: "고정할 클립의 ID" +pinnedNotes: "고정해놓은 노트" +hcaptcha: "hCaptcha" +enableHcaptcha: "hCaptcha 활성화" +hcaptchaSiteKey: "사이트 키" +hcaptchaSecretKey: "시크릿 키" +recaptcha: "reCAPTCHA" +enableRecaptcha: "reCAPTCHA 활성화" +recaptchaSiteKey: "사이트 키" +recaptchaSecretKey: "시크릿 키" +avoidMultiCaptchaConfirm: "여러 Captcha를 사용하는 경우 간섭이 발생할 가능성이 있습니다. 다른 Captcha를 비활성화하시겠습니까? 취소를 눌러 여러 Captcha를 활성화한 상태로 두는 것도 가능합니다." +antennas: "안테나" +manageAntennas: "안테나 관리" +name: "이름" +antennaSource: "받을 소스" +antennaKeywords: "받을 키워드" +antennaExcludeKeywords: "제외할 키워드" +antennaKeywordsDescription: "공백으로 구분하는 경우 AND, 줄바꿈으로 구분하는 경우 OR로 지정됩니다" +notifyAntenna: "새로운 노트를 알림" +withFileAntenna: "파일이 첨부된 노트만" +enableServiceworker: "ServiceWorker 사용" +antennaUsersDescription: "유저명을 한 줄에 한 명씩 적습니다" +caseSensitive: "대소문자를 구분" +withReplies: "답글 포함" +connectedTo: "다음 계정에 연결되어 있습니다" +notesAndReplies: "글과 답글" +withFiles: "미디어" +silence: "사일런스" +silenceConfirm: "이 계정을 사일런스로 설정하시겠습니까?" +unsilence: "사일런스 해제" +unsilenceConfirm: "이 계정의 사일런스를 해제하시겠습니까?" +popularUsers: "인기 유저" +recentlyUpdatedUsers: "최근 활동한 유저" +recentlyRegisteredUsers: "최근 가입한 유저" +recentlyDiscoveredUsers: "최근 발견한 유저" +exploreUsersCount: "{count}명의 유저가 있습니다" +exploreFediverse: "연합우주를 탐색" +popularTags: "인기 태그" +userList: "리스트" +about: "정보" +aboutMisskey: "Misskey에 대하여" +administrator: "관리자" +token: "토큰" +twoStepAuthentication: "2단계 인증" +moderator: "모더레이터" +moderation: "모더레이션" +nUsersMentioned: "{n}명이 언급함" +securityKey: "보안 키" +securityKeyName: "키 이름" +registerSecurityKey: "보안 키를 등록" +lastUsed: "마지막 사용" +unregister: "등록 해제" +passwordLessLogin: "비밀번호 없이 로그인" +resetPassword: "비밀번호 재설정" +newPasswordIs: "새로운 비밀번호는 \"{password}\" 입니다" +reduceUiAnimation: "UI의 애니메이션을 줄이기" +share: "공유" +notFound: "찾을 수 없습니다" +notFoundDescription: "지정한 URL에 해당하는 페이지가 존재하지 않습니다." +uploadFolder: "기본 업로드 위치" +cacheClear: "캐시 지우기" +markAsReadAllNotifications: "모든 알림을 읽은 상태로 표시" +markAsReadAllUnreadNotes: "모든 글을 읽은 상태로 표시" +markAsReadAllTalkMessages: "모든 대화를 읽은 상태로 표시" +help: "도움말" +inputMessageHere: "여기에 메시지를 입력하세요" +close: "닫기" +group: "그룹" +groups: "그룹" +createGroup: "그룹 만들기" +ownedGroups: "소유 그룹" +joinedGroups: "참여중인 그룹" +invites: "초대" +groupName: "그룹명" +members: "멤버" +transfer: "양도" +messagingWithUser: "유저와 대화하기" +messagingWithGroup: "그룹끼리 대화하기" +title: "제목" +text: "텍스트" +enable: "사용" +next: "다음" +retype: "다시 입력" +noteOf: "{user}의 노트" +inviteToGroup: "그룹에 초대하기" +quoteAttached: "인용함" +quoteQuestion: "인용해서 작성하시겠습니까?" +noMessagesYet: "아직 대화가 없습니다" +newMessageExists: "새 메시지가 있습니다" +onlyOneFileCanBeAttached: "메시지에 첨부할 수 있는 파일은 하나까지입니다" +signinRequired: "로그인 해주세요" +invitations: "초대" +invitationCode: "초대 코드" +checking: "확인하는 중입니다" +available: "사용 가능합니다" +unavailable: "사용할 수 없습니다" +usernameInvalidFormat: "a~z, A~Z, 0-9, _를 사용할 수 있습니다" +tooShort: "너무 짧습니다" +tooLong: "너무 깁니다" +weakPassword: "약한 비밀번호" +normalPassword: "좋은 비밀번호" +strongPassword: "강한 비밀번호" +passwordMatched: "일치합니다" +passwordNotMatched: "일치하지 않습니다" +signinWith: "{x}로 로그인" +signinFailed: "로그인할 수 없습니다. 사용자명과 비밀번호를 확인하여 주십시오." +tapSecurityKey: "보안 키를 터치" +or: "혹은" +language: "언어" +uiLanguage: "UI 표시 언어" +groupInvited: "그룹에 초대되었습니다" +aboutX: "{x}에 대하여" +useOsNativeEmojis: "OS 기본 이모지를 사용" +disableDrawer: "드로어 메뉴를 사용하지 않기" +youHaveNoGroups: "그룹이 없습니다" +joinOrCreateGroup: "다른 그룹의 초대를 받거나, 직접 새 그룹을 만들어 보세요." +noHistory: "기록이 없습니다" +signinHistory: "로그인 기록" +disableAnimatedMfm: "움직임이 있는 MFM을 비활성화" +doing: "잠시만요" +category: "카테고리" +tags: "태그" +docSource: "이 문서의 소스" +createAccount: "계정 만들기" +existingAccount: "기존 계정" +regenerate: "재생성" +fontSize: "글자 크기" +noFollowRequests: "처리되지 않은 팔로우 요청이 없습니다" +openImageInNewTab: "새 탭에서 이미지 열기" +dashboard: "대시보드" +local: "로컬" +remote: "리모트" +total: "합계" +weekOverWeekChanges: "지난주보다" +dayOverDayChanges: "어제보다" +appearance: "모양" +clientSettings: "클라이언트 설정" +accountSettings: "계정 설정" +promotion: "프로모션" +promote: "프로모션하기" +numberOfDays: "며칠동안" +hideThisNote: "이 노트를 숨기기" +showFeaturedNotesInTimeline: "타임라인에 추천 노트를 표시" +objectStorage: "오브젝트 스토리지" +useObjectStorage: "오브젝트 스토리지를 사용" +objectStorageBaseUrl: "Base URL" +objectStorageBaseUrlDesc: "오브젝트 (미디어) 참조 URL 을 만들 때 사용되는 URL입니다. CDN 또는 프록시를 사용하는 경우 그 URL을 지정하고, 그 외의 경우 사용할 서비스의 가이드에 따라 공개적으로 액세스 할 수 있는 주소를 지정해 주세요. 예를 들어, AWS S3의 경우 'https://.s3.amazonaws.com', GCS등의 경우 'https://storage.googleapis.com/' 와 같이 지정합니다." +objectStorageBucket: "Bucket" +objectStorageBucketDesc: "사용 서비스의 bucket명을 지정해주세요." +objectStoragePrefix: "Prefix" +objectStoragePrefixDesc: "이 Prefix 의 디렉토리 아래에 파일이 저장됩니다." +objectStorageEndpoint: "Endpoint" +objectStorageEndpointDesc: "AWS S3의 경우 공란, 다른 서비스의 경우 각 서비스의 가이드에 맞게 endpoint를 설정해주세요. '' 혹은 ':' 와 같이 지정합니다." +objectStorageRegion: "Region" +objectStorageRegionDesc: "'xx-east-1'와 같이 region을 지정해주세요. 사용하는 서비스에 region 개념이 없는 경우, 비워 두거나 'us-east-1'으로 설정해 주세요." +objectStorageUseSSL: "SSL 사용" +objectStorageUseSSLDesc: "API 호출시 HTTPS 를 사용하지 않는 경우 OFF 로 설정해 주세요" +objectStorageUseProxy: "연결에 프록시를 사용" +objectStorageUseProxyDesc: "오브젝트 스토리지 API 호출시 프록시를 사용하지 않는 경우 OFF 로 설정해 주세요" +objectStorageSetPublicRead: "업로드할 때 'public-read'를 설정하기" +serverLogs: "서버 로그" +deleteAll: "모두 삭제" +showFixedPostForm: "타임라인 상단에 글 작성란을 표시" +newNoteRecived: "새 노트가 있습니다" +sounds: "소리" +listen: "듣기" +none: "없음" +showInPage: "페이지로 보기" +popout: "새 창으로 열기" +volume: "음량" +masterVolume: "마스터 볼륨" +details: "자세히" +chooseEmoji: "이모지 선택" +unableToProcess: "작업을 완료할 수 없습니다" +recentUsed: "최근 사용" +install: "설치" +uninstall: "삭제" +installedApps: "인증된 애플리케이션" +nothing: "아무것도 없습니다" +installedDate: "승인한 날짜" +lastUsedDate: "마지막 사용" +state: "상태" +sort: "정렬" +ascendingOrder: "오름차순" +descendingOrder: "내림차순" +scratchpad: "스크래치 패드" +scratchpadDescription: "스크래치 패드는 AiScript 의 테스트 환경을 제공합니다. Calckey 와 상호 작용하는 코드를 작성, 실행 및 결과를 확인할 수 있습니다." +output: "출력" +script: "스크립트" +disablePagesScript: "Pages 에서 AiScript 를 사용하지 않음" +updateRemoteUser: "리모트 유저 정보 갱신" +deleteAllFiles: "모든 파일 삭제" +deleteAllFilesConfirm: "모든 파일을 삭제하시겠습니까?" +removeAllFollowing: "모든 팔로잉 해제" +removeAllFollowingDescription: "{host}(으)로부터 모든 팔로잉을 해제합니다. 해당 인스턴스가 더 이상 존재하지 않게 된 경우 등에 실행해 주세요." +userSuspended: "이 계정은 정지된 상태입니다." +userSilenced: "이 계정은 사일런스된 상태입니다." +yourAccountSuspendedTitle: "계정이 정지되었습니다" +yourAccountSuspendedDescription: "이 계정은 서버의 이용 약관을 위반하거나, 기타 다른 이유로 인해 정지되었습니다. 자세한 사항은 관리자에게 문의해 주십시오. 계정을 새로 생성하지 마십시오." +menu: "메뉴" +divider: "구분선" +addItem: "항목 추가" +relays: "릴레이" +addRelay: "릴레이 추가" +inboxUrl: "Inbox 주소" +addedRelays: "추가된 릴레이" +serviceworkerInfo: "푸시 알림을 수행하려면 활성화해야 합니다." +deletedNote: "삭제된 노트" +invisibleNote: "비공개 노트" +enableInfiniteScroll: "자동으로 좀 더 보기" +visibility: "공개 범위" +poll: "투표" +useCw: "내용 숨기기" +enablePlayer: "플레이어 열기" +disablePlayer: "플레이어 닫기" +expandTweet: "트윗 확장하기" +themeEditor: "테마 에디터" +description: "설명" +describeFile: "캡션 추가" +enterFileDescription: "캡션 입력" +author: "작성자" +leaveConfirm: "저장하지 않은 변경사항이 있습니다. 취소하시겠습니까?" +manage: "관리" +plugins: "플러그인" +preferencesBackups: "환경설정 백업" +deck: "덱" +undeck: "덱 해제" +useBlurEffectForModal: "모달에 흐림 효과 사용" +useFullReactionPicker: "모든 기능이 포함된 리액션 선택기 사용" +width: "폭" +height: "높이" +large: "크게" +medium: "보통" +small: "작게" +generateAccessToken: "액세스 토큰 생성" +permission: "권한" +enableAll: "전체 선택" +disableAll: "전체 해제" +tokenRequested: "계정 접근 허용" +pluginTokenRequestedDescription: "이 플러그인은 여기서 설정한 권한을 사용할 수 있게 됩니다." +notificationType: "알림 유형" +edit: "편집" +emailServer: "메일 서버" +enableEmail: "이메일 송신 기능 활성화" +emailConfigInfo: "가입 시 메일 주소 확인이나 비밀번호 초기화 시에 사용합니다." +email: "이메일" +emailAddress: "메일 주소" +smtpConfig: "SMTP 서버 설정" +smtpHost: "호스트" +smtpPort: "포트" +smtpUser: "유저명" +smtpPass: "비밀번호" +emptyToDisableSmtpAuth: "SMTP 인증을 사용하지 않으려면 공란으로 비워둡니다." +smtpSecure: "SMTP 연결에 Implicit SSL/TTS 사용" +smtpSecureInfo: "STARTTLS 사용 시에는 해제합니다." +testEmail: "이메일 전송 테스트" +wordMute: "단어 뮤트" +regexpError: "정규 표현식 오류" +regexpErrorDescription: "{tab}단어 뮤트 {line}행의 정규 표현식에 오류가 발생했습니다:" +instanceMute: "인스턴스 뮤트" +userSaysSomething: "{name}님이 무언가를 말했습니다" +makeActive: "활성화" +display: "표시" +copy: "복사" +metrics: "통계" +overview: "요약" +logs: "로그" +delayed: "지연" +database: "데이터베이스" +channel: "채널" +create: "생성" +notificationSetting: "알림 설정" +notificationSettingDesc: "표시할 알림의 종류를 선택해 주세요." +useGlobalSetting: "글로벌 설정을 사용하기" +useGlobalSettingDesc: "활성화하면 계정의 알림 설정이 적용됩니다. 비활성화하면 개별적으로 설정할 수 있게 됩니다." +other: "기타" +regenerateLoginToken: "로그인 토큰을 재생성" +regenerateLoginTokenDescription: "로그인할 때 사용되는 내부 토큰을 재생성합니다. 일반적으로 이 작업을 실행할 필요는 없습니다. 이 기능을 사용하면 이 계정으로 로그인한 모든 기기에서 로그아웃됩니다." +setMultipleBySeparatingWithSpace: "공백으로 구분하여 여러 개 설정할 수 있습니다." +fileIdOrUrl: "파일 ID 또는 URL" +behavior: "동작" +sample: "예시" +abuseReports: "신고" +reportAbuse: "신고" +reportAbuseOf: "{name}을 신고하기" +fillAbuseReportDescription: "신고하려는 이유를 자세히 알려주세요. 특정 게시물을 신고할 때에는 게시물의 URL도 포함해 주세요." +abuseReported: "신고를 보냈습니다. 신고해 주셔서 감사합니다." +reporter: "신고자" +reporteeOrigin: "피신고자" +reporterOrigin: "신고자" +forwardReport: "리모트 인스턴스에도 신고 내용 보내기" +forwardReportIsAnonymous: "리모트 인스턴스에서는 나의 정보를 볼 수 없으며, 익명의 시스템 계정으로 표시됩니다." +send: "전송" +abuseMarkAsResolved: "해결됨으로 표시" +openInNewTab: "새 탭에서 열기" +openInSideView: "사이드뷰로 열기" +defaultNavigationBehaviour: "기본 탐색 동작" +editTheseSettingsMayBreakAccount: "이 설정을 변경하면 계정이 손상될 수 있습니다." +instanceTicker: "노트의 인스턴스 정보" +waitingFor: "{x}을(를) 기다리고 있습니다" +random: "랜덤" +system: "시스템" +switchUi: "UI 전환" +desktop: "데스크탑" +clip: "클립" +createNew: "새로 만들기" +optional: "옵션" +createNewClip: "새 클립 만들기" +unclip: "클립 해제" +confirmToUnclipAlreadyClippedNote: "이 노트는 이미 \"{name}\" 클립에 포함되어 있습니다. 클립을 해제하시겠습니까?" +public: "공개" +i18nInfo: "Calckey는 자원봉사자들에 의해 다양한 언어로 번역되고 있습니다. {link}에서 번역에 참가할 수 있습니다." +manageAccessTokens: "액세스 토큰 관리" +accountInfo: "계정 정보" +notesCount: "노트 수" +repliesCount: "답글 수" +renotesCount: "Renote 수" +repliedCount: "받은 답글 수" +renotedCount: "받은 Renote 수" +followingCount: "팔로우 수" +followersCount: "팔로워 수" +sentReactionsCount: "보낸 리액션 수" +receivedReactionsCount: "받은 리액션 수" +pollVotesCount: "투표한 횟수" +pollVotedCount: "투표받은 횟수" +yes: "예" +no: "아니오" +driveFilesCount: "드라이브 파일 개수" +driveUsage: "드라이브 사용량" +noCrawle: "검색엔진의 인덱싱 거부" +noCrawleDescription: "검색엔진에 사용자 페이지, 노트, 페이지 등의 콘텐츠를 인덱싱되지 않게 합니다." +lockedAccountInfo: "팔로우를 승인으로 승인받더라도 노트의 공개 범위를 '팔로워'로 하지 않는 한 누구나 당신의 노트를 볼 수 있습니다." +alwaysMarkSensitive: "미디어를 항상 열람 주의로 설정" +loadRawImages: "첨부한 이미지의 썸네일을 원본화질로 표시" +disableShowingAnimatedImages: "움직이는 이미지를 자동으로 재생하지 않음" +verificationEmailSent: "확인 메일을 발송하였습니다. 설정을 완료하려면 메일에 첨부된 링크를 확인해 주세요." +notSet: "설정되지 않음" +emailVerified: "메일 주소가 확인되었습니다." +noteFavoritesCount: "즐겨찾기한 노트 수" +pageLikesCount: "좋아요 한 Page 수" +pageLikedCount: "Page에 받은 좋아요 수" +contact: "연락처" +useSystemFont: "시스템 기본 글꼴을 사용" +clips: "클립" +experimentalFeatures: "실험실" +developer: "개발자" +makeExplorable: "\"발견하기\"에 내 계정 보이기" +makeExplorableDescription: "비활성화하면 \"발견하기\"에 나의 계정을 표시하지 않습니다." +showGapBetweenNotesInTimeline: "타임라인의 노트 사이를 띄워서 표시" +duplicate: "복제" +left: "왼쪽" +center: "가운데" +wide: "넓게" +narrow: "좁게" +reloadToApplySetting: "이 설정을 적용하려면 페이지를 새로고침해야 합니다. 바로 새로고침하시겠습니까?" +needReloadToApply: "변경 사항은 새로고침하면 적용됩니다." +showTitlebar: "타이틀 바를 표시하기" +clearCache: "캐시 비우기" +onlineUsersCount: "{n}명이 접속 중" +nUsers: "{n} 유저" +nNotes: "{n} 노트" +sendErrorReports: "오류 보고서 보내기" +sendErrorReportsDescription: "이 설정을 활성화하면, 문제가 발생했을 때 오류에 대한 상세 정보를 Misskey에 보내어 더 나은 소프트웨어를 만드는 데에 도움을 줄 수 있습니다." +myTheme: "내 테마" +backgroundColor: "배경 색" +accentColor: "강조 색상" +textColor: "문자 색" +saveAs: "다른 이름으로 저장" +advanced: "고급" +value: "값" +createdAt: "생성된 날짜" +updatedAt: "수정한 날짜" +saveConfirm: "저장하시겠습니까?" +deleteConfirm: "삭제하시겠습니까?" +invalidValue: "올바른 값이 아닙니다." +registry: "레지스트리" +closeAccount: "계정 폐쇄" +currentVersion: "현재 버전" +latestVersion: "최신 버전" +youAreRunningUpToDateClient: "사용 중인 클라이언트는 최신입니다." +newVersionOfClientAvailable: "새로운 버전의 클라이언트를 이용할 수 있습니다." +usageAmount: "사용량" +capacity: "용량" +inUse: "사용중" +editCode: "코드 수정" +apply: "적용" +receiveAnnouncementFromInstance: "이 인스턴스의 알림을 이메일로 수신할게요" +emailNotification: "메일 알림" +publish: "게시" +inChannelSearch: "채널에서 검색" +useReactionPickerForContextMenu: "우클릭하여 리액션 선택기 열기" +typingUsers: "{users} 님이 입력하고 있어요" +jumpToSpecifiedDate: "특정 날짜로 이동" +showingPastTimeline: "과거의 타임라인을 표시하고 있어요" +clear: "지우기" +markAllAsRead: "모두 읽은 상태로 표시" +goBack: "뒤로" +unlikeConfirm: "좋아요를 취소할까요?" +fullView: "전체 화면" +quitFullView: "전체 화면 해제" +addDescription: "설명 추가" +userPagePinTip: "각 노트의 메뉴에서 「프로필에 고정」을 선택하는 것으로, 여기에 노트를 표시해 둘 수 있어요." +notSpecifiedMentionWarning: "수신자가 선택되지 않은 멘션이 있어요" +info: "정보" +userInfo: "유저 정보" +unknown: "알 수 없음" +onlineStatus: "온라인 상태" +hideOnlineStatus: "온라인 상태 숨기기" +hideOnlineStatusDescription: "온라인 상태를 숨기면, 검색과 같은 일부 기능에 영향을 미칠 수 있습니다." +online: "온라인" +active: "최근에 활동함" +offline: "오프라인" +notRecommended: "추천하지 않음" +botProtection: "Bot 방어" +instanceBlocking: "인스턴스 차단" +selectAccount: "계정 선택" +switchAccount: "계정 바꾸기" +enabled: "활성화" +disabled: "비활성화" +quickAction: "빠른 동작" +user: "유저" +administration: "관리" +accounts: "계정" +switch: "전환" +noMaintainerInformationWarning: "관리자 정보가 설정되어 있지 않습니다." +noBotProtectionWarning: "Bot 방어가 설정되어 있지 않습니다." +configure: "설정하기" +postToGallery: "갤러리에 업로드" +gallery: "갤러리" +recentPosts: "최근 포스트" +popularPosts: "인기 포스트" +shareWithNote: "노트로 공유" +ads: "광고" +expiration: "기한" +memo: "메모" +priority: "우선순위" +high: "높음" +middle: "보통" +low: "낮음" +emailNotConfiguredWarning: "메일 주소가 설정되어 있지 않습니다." +ratio: "비율" +previewNoteText: "본문 미리보기" +customCss: "CSS 사용자화" +customCssWarn: "이 설정은 기능을 알고 있는 경우에만 사용해야 합니다. 잘못된 값을 입력하면 클라이언트가 정상적으로 작동하지 않을 수 있습니다." +global: "글로벌" +squareAvatars: "프로필 아이콘을 사각형으로 표시" +sent: "전송" +received: "수신" +searchResult: "검색 결과" +hashtags: "해시태그" +troubleshooting: "문제 해결" +useBlurEffect: "UI에 흐림 효과 사용" +learnMore: "자세히" +misskeyUpdated: "Misskey가 업데이트 되었습니다!" +whatIsNew: "패치 정보 보기" +translate: "번역" +translatedFrom: "{x}에서 번역" +accountDeletionInProgress: "계정 삭제 작업을 진행하고 있습니다" +usernameInfo: "서버상에서 계정을 식별하기 위한 이름. 알파벳(a~z, A~Z), 숫자(0~9) 및 언더바(_)를 사용할 수 있습니다. 사용자명은 나중에 변경할 수 없습니다." +aiChanMode: "아이 모드" +keepCw: "CW 유지하기" +pubSub: "Pub/Sub 계정" +lastCommunication: "마지막 통신" +resolved: "해결됨" +unresolved: "해결되지 않음" +breakFollow: "팔로워 해제" +itsOn: "켜짐" +itsOff: "꺼짐" +emailRequiredForSignup: "가입할 때 이메일 주소 입력을 필수로 하기" +unread: "읽지 않음" +filter: "필터" +controlPanel: "제어판" +manageAccounts: "계정 관리" +makeReactionsPublic: "리액션 목록을 공개하기" +makeReactionsPublicDescription: "나의 리액션을 누구나 볼 수 있게 합니다." +classic: "클래식" +muteThread: "이 글타래를 뮤트" +unmuteThread: "글타래 뮤트 해제" +ffVisibility: "내 인맥의 공개 범위" +ffVisibilityDescription: "나의 팔로우와 팔로워 정보에 대한 공개 범위를 설정할 수 있습니다." +continueThread: "이 글타래 이어서 보기" +deleteAccountConfirm: "계정이 삭제되고 되돌릴 수 없게 됩니다. 계속하시겠습니까? " +incorrectPassword: "비밀번호가 올바르지 않습니다." +voteConfirm: "\"{choice}\"에 투표하시겠습니까?" +hide: "숨기기" +leaveGroup: "그룹 나가기" +leaveGroupConfirm: "\"{name}\"에서 나갈까요?" +useDrawerReactionPickerForMobile: "모바일에서 드로어 메뉴로 표시" +welcomeBackWithName: "환영합니다, {name}님" +clickToFinishEmailVerification: "[{ok}]를 눌러 이메일 인증을 완료하세요." +overridedDeviceKind: "장치 유형" +smartphone: "스마트폰" +tablet: "태블릿" +auto: "자동" +themeColor: "테마 컬러" +size: "크기" +numberOfColumn: "한 줄에 보일 리액션의 수" +searchByGoogle: "검색" +instanceDefaultLightTheme: "인스턴스 기본 라이트 테마" +instanceDefaultDarkTheme: "인스턴스 기본 다크 테마" +instanceDefaultThemeDescription: "객체 형식의 테마 코드를 입력해 주세요." +mutePeriod: "뮤트할 기간" +indefinitely: "무기한" +tenMinutes: "10분" +oneHour: "1시간" +oneDay: "1일" +oneWeek: "일주일" +reflectMayTakeTime: "반영되기까지 시간이 걸릴 수 있습니다." +failedToFetchAccountInformation: "계정 정보를 가져오지 못했습니다" +rateLimitExceeded: "요청 제한 횟수를 초과하였습니다" +cropImage: "이미지 자르기" +cropImageAsk: "이미지를 자르시겠습니까?" +file: "파일" +recentNHours: "최근 {n}시간" +recentNDays: "최근 {n}일" +noEmailServerWarning: "메일 서버가 설정되어 있지 않습니다." +thereIsUnresolvedAbuseReportWarning: "해결되지 않은 신고가 있습니다." +recommended: "추천" +check: "체크" +driveCapOverrideLabel: "이 유저의 드라이브 용량을 변경" +driveCapOverrideCaption: "0 이하를 지정하면 해제됩니다." +requireAdminForView: "열람하려면 관리자 계정으로 로그인해야 합니다." +isSystemAccount: "시스템에 의해 자동으로 생성되어 관리되는 계정입니다." +typeToConfirm: "계속하시려면 {x} 을 입력하세요" +deleteAccount: "계정 삭제" +document: "문서" +numberOfPageCache: "페이지 캐시 수" +numberOfPageCacheDescription: "숫자가 클 수록 편리성이 높아지지만, 시스템 자원과 메모리를 더 많이 사용합니다." +logoutConfirm: "로그아웃 하시겠습니까?" +lastActiveDate: "마지막 이용" +pleaseSelect: "선택해 주세요" +reverse: "플립" +colored: "색 입히기" +refreshInterval: "업데이트 주기" +label: "라벨" +type: "종류" +speed: "속도" +slow: "느리게" +fast: "빠르게" +sensitiveMediaDetection: "민감한 미디어 탐지" +localOnly: "로컬에만" +remoteOnly: "리모트만" +failedToUpload: "업로드 실패" +cannotUploadBecauseInappropriate: "이 파일은 부적절한 내용을 포함한다고 판단되어 업로드할 수 없습니다." +cannotUploadBecauseNoFreeSpace: "드라이브 용량이 부족하여 업로드할 수 없습니다." +beta: "베타" +enableAutoSensitive: "자동 NSFW 탐지" +enableAutoSensitiveDescription: "이용 가능할 경우 기계학습을 통해 자동으로 미디어 NSFW를 설정합니다. 이 기능을 해제하더라도, 인스턴스 정책에 따라 자동으로 설정될 수 있습니다." +activeEmailValidationDescription: "유저가 입력한 메일 주소가 일회용 메일인지, 실제로 통신할 수 있는 지 엄격하게 검사합니다. 해제할 경우 이메일 형식에 대해서만 검사합니다." +navbar: "네비게이션 바" +shuffle: "셔플" +account: "계정" +move: "이동" +_sensitiveMediaDetection: + description: "기계학습을 통해 자동으로 민감한 미디어를 탐지하여, 모더레이션에 참고할 수 있도록 합니다. 서버의 부하를 약간 증가시킵니다." + sensitivity: "탐지 민감도" + sensitivityDescription: "민감도가 낮을수록 안전한 미디어가 잘못 탐지될 확률이 줄어들며, 높을수록 민감한 미디어가 탐지되지 않을 확률이 줄어듭니다." + setSensitiveFlagAutomatically: "자동으로 NSFW로 설정하기" + setSensitiveFlagAutomaticallyDescription: "이 설정을 해제해도 탐지 결과는 유지됩니다." + analyzeVideos: "동영상도 같이 확인하기" + analyzeVideosDescription: "사진 뿐만 아니라 동영상의 NSFW 여부도 탐지합니다. 서버의 부하를 약간 증가시킵니다." +_emailUnavailable: + used: "이 메일 주소는 사용중입니다" + format: "형식이 올바르지 않습니다" + disposable: "임시 이메일 주소는 사용할 수 없습니다" + mx: "메일 서버가 올바르지 않습니다" + smtp: "메일 서버가 응답하지 않습니다" +_ffVisibility: + public: "공개" + followers: "팔로워에게만 공개" + private: "비공개" +_signup: + almostThere: "거의 다 끝났습니다" + emailAddressInfo: "당신이 사용하고 있는 이메일 주소를 입력해 주세요. 이메일 주소는 다른 유저에게 공개되지 않습니다." + emailSent: "입력하신 메일 주소({email})로 확인 메일을 보내드렸습니다. 가입을 완료하시려면 보내드린 메일에 있는 링크로 접속해 주세요." +_accountDelete: + accountDelete: "계정 삭제" + mayTakeTime: "계정 삭제는 서버에 부하를 가하기 때문에, 작성한 콘텐츠나 업로드한 파일의 수가 많으면 완료까지 시간이 걸릴 수 있습니다." + sendEmail: "계정 삭제가 완료되면 등록된 이메일 주소로 알림을 보냅니다." + requestAccountDelete: "계정 삭제 요청" + started: "삭제 작업이 시작되었습니다." + inProgress: "삭제 진행 중" +_ad: + back: "뒤로" + reduceFrequencyOfThisAd: "이 광고의 표시 빈도 낮추기" +_forgotPassword: + enterEmail: "여기에 계정에 등록한 메일 주소를 입력해 주세요. 입력한 메일 주소로 비밀번호 재설정 링크를 발송합니다." + ifNoEmail: "메일 주소를 등록하지 않은 경우, 관리자에 문의해 주십시오." + contactAdmin: "이 인스턴스에서는 메일 기능이 지원되지 않습니다. 비밀번호를 재설정하려면 관리자에게 문의해 주십시오." +_gallery: + my: "내 갤러리" + liked: "좋아요 한 갤러리" + like: "좋아요!" + unlike: "좋아요 취소" +_email: + _follow: + title: "새로운 팔로워가 있습니다" + _receiveFollowRequest: + title: "팔로우 요청을 받았습니다" +_plugin: + install: "플러그인 설치" + installWarn: "신뢰할 수 없는 플러그인은 설치하지 않는 것이 좋습니다." + manage: "플러그인 관리" +_preferencesBackups: + list: "생성한 백업" + saveNew: "새 백업 만들기" + loadFile: "파일 가져오기" + apply: "이 기기에 적용" + save: "현재 설정으로 덮어쓰기" + inputName: "백업 이름을 입력하세요" + cannotSave: "저장하지 못했습니다" + nameAlreadyExists: "\"{name}\" 백업이 이미 존재합니다. 다른 이름을 설정하여 주십시오." + applyConfirm: "\"{name}\" 백업을 현재 기기에 적용하시겠습니까? 현재 설정은 덮어 씌워집니다." + saveConfirm: "{name} 을 덮어쓰시겠습니까?" + deleteConfirm: "{name} 을(를) 삭제하시겠습니까?" + renameConfirm: "\"{old}\" 백업을 \"{new}\"(으)로 바꾸시겠습니까?" + noBackups: "저장된 백업이 없습니다. \"새 백업 만들기\"를 눌러 현재 클라이언트 설정을 서버에 백업할 수 있습니다." + createdAt: "생성 날짜: {date} {time}" + updatedAt: "갱신 날짜: {date} {time}" + cannotLoad: "가져오기에 실패했습니다" + invalidFile: "파일 형식이 올바르지 않습니다." +_registry: + scope: "범위" + key: "키" + keys: "키" + domain: "도메인" + createKey: "키 생성" +_aboutMisskey: + about: "Misskey는 syuilo에 의해서 2014년부터 개발되어 온 오픈소스 소프트웨어 입니다." + contributors: "주요 기여자" + allContributors: "모든 기여자" + source: "소스 코드" + translation: "Misskey를 번역하기" + donate: "Misskey에 기부하기" + morePatrons: "이 외에도 다른 많은 분들이 도움을 주시고 계십니다. 감사합니다🥰" + patrons: "후원자" +_nsfw: + respect: "열람주의로 설정된 미디어 숨기기" + ignore: "열람 주의 미디어 항상 표시" + force: "미디어 항상 숨기기" +_mfm: + cheatSheet: "MFM 도움말" + intro: "MFM는 Misskey의 다양한 곳에서 사용할 수 있는 전용 마크업 언어입니다. 여기에서는 MFM에서 사용할 수 있는 구문을 확인할 수 있습니다." + dummy: "Misskey로 연합우주의 세계가 펼쳐집니다" + mention: "멘션" + mentionDescription: "골뱅이표(@) 뒤에 사용자명을 넣어 특정 유저를 나타낼 수 있습니다." + hashtag: "해시태그" + hashtagDescription: "샵 또는 우물정자(#)를 앞에 붙여서 해시태그를 나타낼 수 있습니다." + url: "URL" + urlDescription: "URL을 나타낼 수 있습니다." + link: "링크" + linkDescription: "문장의 특정 범위를 URL로 표시합니다." + bold: "굵음/볼드체" + boldDescription: "문자를 굵게 강조합니다." + small: "눈에 띄지 않음" + smallDescription: "내용을 작고 연하게 보이게 합니다." + center: "가운데 정렬" + centerDescription: "내용을 가운데 정렬로 보이게 합니다." + inlineCode: "코드(인라인)" + inlineCodeDescription: "여러 행의 코드를 문법 강조를 적용하여 인라인으로 표시합니다." + blockCode: "코드(블록)" + blockCodeDescription: "여러 행의 코드를 문법 강조를 적용하여 블록으로 표시합니다." + inlineMath: "수식(인라인)" + inlineMathDescription: "수식(KaTeX)를 인라인으로 보이게 합니다." + blockMath: "수식(블록)" + blockMathDescription: "여러 줄의 수식(KaTeX)를 블록으로 보이게 합니다." + quote: "인용" + quoteDescription: "내용을 인용문으로 표시합니다." + emoji: "커스텀 이모지" + emojiDescription: "커스텀 이모지의 이름을 쌍점(:)으로 감싸서 커스텀 이모지를 사용합니다." + search: "검색" + searchDescription: "주어진 키워드가 입력된 검색창을 보이게 합니다." + flip: "플립" + flipDescription: "내용을 상하 또는 좌우로 반전시킵니다." + jelly: "애니메이션 (젤리)" + jellyDescription: "젤리처럼 탱글탱글한 느낌의 효과를 줍니다." + tada: "애니메이션 (짠!)" + tadaDescription: "짠! 하는 느낌의 효과를 줍니다." + jump: "애니메이션(점프)" + jumpDescription: "펄쩍 뛸 듯한 느낌의 효과를 줍니다." + bounce: "애니메이션 (바운스)" + bounceDescription: "통통 튀는 느낌의 효과를 줍니다." + shake: "애니메이션 (부들부들)" + shakeDescription: "부들부들 떠는 느낌의 효과를 줍니다." + twitch: "애니메이션 (경련)" + twitchDescription: "격하게 흔들리는 느낌의 효과를 줍니다." + spin: "애니메이션 (회전)" + spinDescription: "회전 효과를 줍니다." + x2: "크게" + x2Description: "내용을 크게 표시합니다." + x3: "더 크게" + x3Description: "내용을 더 크게 표시합니다." + x4: "매우 크게" + x4Description: "내용을 매우 크게 표시합니다." + blur: "흐림" + blurDescription: "내용이 흐리게 보입니다. 마우스를 위에 올려두면 내용이 보입니다." + font: "폰트" + fontDescription: "내용의 글꼴을 지정할 수 있습니다." + rainbow: "무지개" + rainbowDescription: "내용을 무지개로 표시합니다." + sparkle: "반짝반짝" + sparkleDescription: "반짝이는 파티클 효과를 추가합니다." + rotate: "회전" + rotateDescription: "지정한 각도로 회전시킵니다." + plain: "평문" + plainDescription: "안에 있는 MFM 구문을 모두 무시하고 평문으로 표시합니다." +_instanceTicker: + none: "보이지 않음" + remote: "리모트 유저에게만 보이기" + always: "항상 보이기" +_serverDisconnectedBehavior: + reload: "자동으로 새로고침" + dialog: "경고창 표시" + quiet: "조용히 경고" +_channel: + create: "채널 생성" + edit: "채널 편집" + setBanner: "배너 설정" + removeBanner: "배너 삭제" + featured: "트렌드" + owned: "관리중" + following: "팔로잉" + usersCount: "{n}명 참여 중" + notesCount: "{n}노트" +_menuDisplay: + sideFull: "가로" + sideIcon: "가로(아이콘)" + top: "상단" + hide: "숨기기" +_wordMute: + muteWords: "뮤트할 단어" + muteWordsDescription: "공백으로 구분하는 경우 AND, 줄바꿈으로 구분하는 경우 OR로 지정됩니다。" + muteWordsDescription2: "정규 표현식을 사용하려면 키워드를 빗금표(/)로 감싸 주세요." + softDescription: "지정한 조건의 노트를 타임라인에서 숨깁니다." + hardDescription: "지정한 조건의 노트를 타임라인에 추가하지 않습니다. 타임라인에 추가되지 않은 노트는 조건을 변경해도 표시되지 않습니다." + soft: "보통" + hard: "보다 높은 수준" + mutedNotes: "뮤트된 노트" +_instanceMute: + instanceMuteDescription: "뮤트한 인스턴스에서 오는 답글을 포함한 모든 노트와 Renote를 뮤트합니다." + instanceMuteDescription2: "한 줄에 하나씩 입력해 주세요" + title: "지정한 인스턴스의 노트를 숨깁니다." + heading: "뮤트할 인스턴스" +_theme: + explore: "테마 찾아보기" + install: "테마 설치" + manage: "테마 관리" + code: "테마 코드" + description: "설명" + installed: "{name} 테마가 설치되었습니다" + installedThemes: "설치된 테마" + builtinThemes: "표준 테마" + alreadyInstalled: "이미 설치된 테마입니다" + invalid: "테마 형식이 올바르지 않습니다" + make: "테마 만들기" + base: "베이스" + addConstant: "상수 추가" + constant: "상수" + defaultValue: "기본값" + color: "색" + refProp: "프로퍼티를 참조" + refConst: "상수를 참조" + key: "키" + func: "함수" + funcKind: "함수 종류" + argument: "매개변수" + basedProp: "기준으로 할 속성 이름" + alpha: "불투명도" + darken: "어두움" + lighten: "밝음" + inputConstantName: "상수 이름을 입력하세요" + importInfo: "여기에 테마 코드를 붙여 넣어 에디터로 불러올 수 있습니다." + deleteConstantConfirm: "상수 {const}를 삭제하시겠습니까?" + keys: + accent: "강조 색상" + bg: "배경" + fg: "텍스트" + focus: "포커스" + indicator: "인디케이터" + panel: "패널" + shadow: "그림자" + header: "헤더" + navBg: "사이드바 배경" + navFg: "사이드바 텍스트" + navHoverFg: "사이드바 텍스트 (호버)" + navActive: "사이드바 텍스트 (활성)" + navIndicator: "사이드바 인디케이터" + link: "링크" + hashtag: "해시태그" + mention: "멘션" + mentionMe: "나에게 보낸 멘션" + renote: "Renote" + modalBg: "모달 배경" + divider: "구분선" + scrollbarHandle: "스크롤바 핸들" + scrollbarHandleHover: "스크롤바 핸들 (호버)" + dateLabelFg: "날짜 레이블 텍스트" + infoBg: "정보창 배경" + infoFg: "정보창 텍스트" + infoWarnBg: "경고창 배경" + infoWarnFg: "경고창 텍스트" + cwBg: "CW 버튼 배경" + cwFg: "CW 버튼 텍스트" + cwHoverBg: "CW 버튼 배경 (호버)" + toastBg: "알림창 배경" + toastFg: "알림창 텍스트" + buttonBg: "버튼 배경" + buttonHoverBg: "버튼 배경 (호버)" + inputBorder: "입력 필드 테두리" + listItemHoverBg: "리스트 항목 배경 (호버)" + driveFolderBg: "드라이브 폴더 배경" + wallpaperOverlay: "배경화면 오버레이" + badge: "배지" + messageBg: "채팅 배경" + accentDarken: "강조 색상 (어두움)" + accentLighten: "강조 색상 (밝음)" + fgHighlighted: "강조된 텍스트" +_sfx: + note: "새 노트" + noteMy: "내 노트" + notification: "알림" + chat: "대화" + chatBg: "대화 (백그라운드)" + antenna: "안테나 수신" + channel: "채널 알림" +_ago: + future: "미래" + justNow: "방금 전" + secondsAgo: "{n}초 전" + minutesAgo: "{n}분 전" + hoursAgo: "{n}시간 전" + daysAgo: "{n}일 전" + weeksAgo: "{n}주 전" + monthsAgo: "{n}개월 전" + yearsAgo: "{n}년 전" +_time: + second: "초" + minute: "분" + hour: "시간" + day: "일" +_2fa: + alreadyRegistered: "이미 설정이 완료되었습니다." + registerTOTP: "디바이스 등록" + registerSecurityKey: "키를 등록" + step1: "먼저, {a}나 {b}등의 인증 앱을 사용 중인 디바이스에 설치합니다." + step2: "그 후, 표시되어 있는 QR코드를 앱으로 스캔합니다." + step2Url: "데스크톱 앱에서는 다음 URL을 입력하세요:" + step3: "앱에 표시된 토큰을 입력하시면 완료됩니다." + step4: "다음 로그인부터는 토큰을 입력해야 합니다." + securityKeyInfo: "FIDO2를 지원하는 하드웨어 보안 키 혹은 디바이스의 지문인식이나 화면잠금 PIN을 이용해서 로그인하도록 설정할 수 있습니다." +_permissions: + "read:account": "계정의 정보를 봅니다" + "write:account": "계정의 정보를 변경합니다" + "read:blocks": "차단 여부를 확인합니다" + "write:blocks": "차단을 하거나 해제합니다" + "read:drive": "드라이브를 조회합니다" + "write:drive": "드라이브에 파일을 올리거나, 이름을 변경하거나, 삭제합니다" + "read:favorites": "즐겨찾기를 조회합니다" + "write:favorites": "즐겨찾기에 추가하거나 삭제합니다" + "read:following": "팔로우 상태를 봅니다" + "write:following": "팔로우하거나 팔로우를 해제합니다" + "read:messaging": "대화를 읽습니다" + "write:messaging": "대화를 시작하거나 메시지를 보냅니다" + "read:mutes": "뮤트 여부를 확인합니다" + "write:mutes": "뮤트를 하거나 해제합니다" + "write:notes": "노트를 작성하거나 삭제합니다" + "read:notifications": "알림을 확인합니다" + "write:notifications": "알림을 모두 읽음 처리합니다" + "read:reactions": "리액션을 확인합니다" + "write:reactions": "리액션을 추가하거나 취소합니다" + "write:votes": "투표를 합니다" + "read:pages": "페이지를 봅니다" + "write:pages": "페이지를 수정합니다" + "read:page-likes": "페이지의 좋아요를 확인합니다" + "write:page-likes": "페이지에 좋아요를 추가하거나 취소합니다" + "read:user-groups": "유저 그룹을 조회합니다" + "write:user-groups": "유저 그룹을 만들거나, 초대하거나, 이름을 변경하거나, 양도하거나, 삭제합니다" + "read:channels": "채널을 보기" + "write:channels": "채널을 추가하거나 삭제합니다" + "read:gallery": "갤러리를 봅니다" + "write:gallery": "갤러리를 추가하거나 삭제합니다" + "read:gallery-likes": "갤러리의 좋아요를 확인합니다" + "write:gallery-likes": "갤러리에 좋아요를 추가하거나 취소합니다" +_auth: + shareAccess: "\"{name}\" 이 계정에 접근하는 것을 허용하시겠습니까?" + shareAccessAsk: "이 애플리케이션이 계정에 접근하는 것을 허용하시겠습니까?" + permissionAsk: "이 앱은 다음의 권한을 요청합니다" + pleaseGoBack: "앱으로 돌아가서 시도해 주세요" + callback: "앱으로 돌아갑니다" + denied: "접근이 거부되었습니다" +_antennaSources: + all: "모든 노트" + homeTimeline: "팔로우중인 유저의 노트" + users: "지정한 한 명 혹은 여러 명의 유저의 노트" + userList: "지정한 리스트에 속한 유저의 노트" + userGroup: "지정한 그룹에 속한 유저의 노트" +_weekday: + sunday: "일요일" + monday: "월요일" + tuesday: "화요일" + wednesday: "수요일" + thursday: "목요일" + friday: "금요일" + saturday: "토요일" +_widgets: + memo: "스티커 메모" + notifications: "알림" + timeline: "타임라인" + calendar: "달력" + trends: "트렌드" + clock: "시계" + rss: "RSS 리더" + activity: "활동" + photos: "사진" + digitalClock: "디지털 시계" + unixClock: "UNIX 시계" + federation: "연합" + instanceCloud: "인스턴스 구름" + postForm: "글 입력란" + slideshow: "슬라이드 쇼" + button: "버튼" + onlineUsers: "온라인 유저" + jobQueue: "작업 대기열" + serverMetric: "서버 통계" + aiscript: "AiScript 콘솔" + aichan: "아이" +_cw: + hide: "숨기기" + show: "더 보기" + chars: "{count} 문자" + files: "{count} 파일" +_poll: + noOnlyOneChoice: "투표 항목이 최소 2개 필요합니다" + choiceN: "선택지 {n}" + noMore: "더 이상 추가할 수 없습니다" + canMultipleVote: "복수 응답 허용" + expiration: "투표 기한" + infinite: "무기한" + at: "일시 지정" + after: "기간 지정" + deadlineDate: "기한" + deadlineTime: "시간" + duration: "기간" + votesCount: "{n}표" + totalVotes: "총 {n}표" + vote: "투표하기" + showResult: "결과 보기" + voted: "투표함" + closed: "종료됨" + remainingDays: "종료까지 앞으로 {d}일 {h}시간" + remainingHours: "종료까지 앞으로 {h}시간 {m}분" + remainingMinutes: "종료까지 앞으로 {m}분 {s}초" + remainingSeconds: "종료까지 앞으로 {s}초" +_visibility: + public: "공개" + publicDescription: "모든 유저에게 공개" + home: "홈" + homeDescription: "홈 타임라인에만 공개" + followers: "팔로워" + followersDescription: "팔로워에게만 공개" + specified: "다이렉트" + specifiedDescription: "지정한 유저에게만 공개" + localOnly: "로컬에만" + localOnlyDescription: "리모트 유저에게 보이지 않기" +_postForm: + replyPlaceholder: "이 노트에 답글..." + quotePlaceholder: "이 노트를 인용..." + channelPlaceholder: "채널에 게시하기..." + _placeholders: + a: "지금 무엇을 하고 있나요?" + b: "무슨 일이 일어나고 있나요?" + c: "무엇을 생각하고 있나요?" + d: "말하고 싶은 게 있나요?" + e: "여기에 적어주세요" + f: "작성해주시길 기다리고 있어요..." +_profile: + name: "이름" + username: "유저명" + description: "자기소개" + youCanIncludeHashtags: "해시 태그를 포함할 수 있습니다." + metadata: "추가 정보" + metadataEdit: "추가 정보 편집" + metadataDescription: "프로필에 추가 정보를 표시할 수 있어요" + metadataLabel: "라벨" + metadataContent: "내용" + changeAvatar: "아바타 이미지 변경" + changeBanner: "배너 이미지 변경" +_exportOrImport: + allNotes: "모든 노트" + followingList: "팔로잉" + muteList: "뮤트" + blockingList: "차단" + userLists: "리스트" + excludeMutingUsers: "뮤트한 유저 제외하기" + excludeInactiveUsers: "휴면 중인 계정 제외하기" +_charts: + federation: "연합" + apRequest: "요청" + usersIncDec: "유저 수 증감" + usersTotal: "유저 수 합계" + activeUsers: "활성 유저 수" + notesIncDec: "노트 수 증감" + localNotesIncDec: "로컬 노트 수 증감" + remoteNotesIncDec: "리모트 노트 수 증감" + notesTotal: "노트 수 합계" + filesIncDec: "파일 수 증감" + filesTotal: "파일 수 합계" + storageUsageIncDec: "스토리지 사용량 증감" + storageUsageTotal: "스토리지 사용량 합계" +_instanceCharts: + requests: "요청" + users: "유저 수 증감" + usersTotal: "누적 유저 수" + notes: "노트 수 증감" + notesTotal: "누적 노트 수" + ff: "팔로잉/팔로워 증감" + ffTotal: "누적 팔로잉/팔로워 수" + cacheSize: "캐시 용량 증감" + cacheSizeTotal: "누적 캐시 용량" + files: "파일 수 증감" + filesTotal: "누적 파일 수" +_timelines: + home: "홈" + local: "로컬" + social: "소셜" + global: "글로벌" +_pages: + newPage: "페이지 만들기" + editPage: "페이지 수정" + readPage: "소스 표시 중" + created: "페이지를 만들었습니다" + updated: "페이지를 수정했습니다" + deleted: "페이지가 삭제되었습니다" + pageSetting: "페이지 설정" + nameAlreadyExists: "지정한 페이지 URL이 이미 존재합니다" + invalidNameTitle: "유효하지 않은 페이지 URL입니다" + invalidNameText: "비어있지 않은지 확인해주세요" + editThisPage: "이 페이지를 편집" + viewSource: "소스 보기" + viewPage: "페이지 보기" + like: "좋아요" + unlike: "좋아요 해제" + my: "내 페이지" + liked: "좋아요한 페이지" + featured: "인기" + inspector: "인스펙터" + contents: "콘텐츠" + content: "페이지 블록" + variables: "변수" + title: "제목" + url: "페이지 URL" + summary: "페이지 요약" + alignCenter: "가운데 정렬" + hideTitleWhenPinned: "프로필에 고정해놓은 경우 타이틀을 표시하지 않음" + font: "폰트" + fontSerif: "명조체" + fontSansSerif: "고딕체" + eyeCatchingImageSet: "아이캐치 이미지를 설정" + eyeCatchingImageRemove: "아이캐치 이미지를 삭제" + chooseBlock: "블록 추가" + selectType: "종류 선택" + enterVariableName: "변수명을 지정해주세요" + variableNameIsAlreadyUsed: "해당 변수명은 이미 사용중입니다" + contentBlocks: "콘텐츠" + inputBlocks: "입력" + specialBlocks: "특수" + blocks: + text: "텍스트" + textarea: "텍스트 영역" + section: "섹션" + image: "이미지" + button: "버튼" + if: "조건문" + _if: + variable: "변수" + post: "글 입력란" + _post: + text: "내용" + attachCanvasImage: "캔버스의 이미지와 함께 게시하기" + canvasId: "캔버스 ID" + textInput: "텍스트 입력" + _textInput: + name: "변수명" + text: "제목" + default: "기본값" + textareaInput: "여러 줄 텍스트 입력" + _textareaInput: + name: "변수명" + text: "제목" + default: "기본값" + numberInput: "수치 입력" + _numberInput: + name: "변수명" + text: "제목" + default: "기본값" + canvas: "캔버스" + _canvas: + id: "캔버스 ID" + width: "폭" + height: "높이" + note: "노트필기" + _note: + id: "노트 ID" + idDescription: "노트 URL을 붙여넣어 설정할 수도 있습니다." + detailed: "세부 정보 보기" + switch: "스위치" + _switch: + name: "변수명" + text: "제목" + default: "기본값" + counter: "카운터" + _counter: + name: "변수명" + text: "제목" + inc: "증가치" + _button: + text: "제목" + colored: "색 입히기" + action: "버튼을 눌렀을 때의 동작" + _action: + dialog: "대화상자를 표시" + _dialog: + content: "내용" + resetRandom: "난수를 초기화" + pushEvent: "이벤트 보내기" + _pushEvent: + event: "이벤트 이름" + message: "눌렀을 때 표시할 페이지" + variable: "보낼 변수" + no-variable: "없음" + callAiScript: "AiScript 호출" + _callAiScript: + functionName: "함수명" + radioButton: "선택지" + _radioButton: + name: "변수명" + title: "제목" + values: "줄바꿈으로 구분된 선택지" + default: "기본값" + script: + categories: + flow: "흐름 제어" + logical: "논리 연산" + operation: "계산" + comparison: "비교" + random: "랜덤" + value: "값" + fn: "함수" + text: "텍스트 조작" + convert: "변환" + list: "리스트" + blocks: + text: "텍스트" + multiLineText: "텍스트 (여러 줄)" + textList: "텍스트 목록" + _textList: + info: "각각을 줄바꿈으로 구분해주세요" + strLen: "텍스트의 길이" + _strLen: + arg1: "텍스트" + strPick: "문자 추출" + _strPick: + arg1: "텍스트" + arg2: "문자 위치" + strReplace: "텍스트 대체" + _strReplace: + arg1: "텍스트" + arg2: "대체될 텍스트" + arg3: "대체할 텍스트" + strReverse: "텍스트 뒤집기" + _strReverse: + arg1: "텍스트" + join: "텍스트 합치기" + _join: + arg1: "리스트" + arg2: "구분자" + add: "더하기" + _add: + arg1: "A" + arg2: "B" + subtract: "빼기" + _subtract: + arg1: "A" + arg2: "B" + multiply: "곱하기" + _multiply: + arg1: "A" + arg2: "B" + divide: "나누기" + _divide: + arg1: "A" + arg2: "B" + mod: "나눈 나머지" + _mod: + arg1: "A" + arg2: "B" + round: "소수점을 반올림" + _round: + arg1: "수치" + eq: "A와 B가 동일" + _eq: + arg1: "A" + arg2: "B" + notEq: "A와 B가 다름" + _notEq: + arg1: "A" + arg2: "B" + and: "A와 B가 둘 다 참" + _and: + arg1: "A" + arg2: "B" + or: "A, B중 하나 이상이 참" + _or: + arg1: "A" + arg2: "B" + lt: "< A가 B보다 작음" + _lt: + arg1: "A" + arg2: "B" + gt: "> A가 B보다 큼" + _gt: + arg1: "A" + arg2: "B" + ltEq: "<= A가 B보다 작거나 같음" + _ltEq: + arg1: "A" + arg2: "B" + gtEq: ">= A가 B보다 크거나 같음" + _gtEq: + arg1: "A" + arg2: "B" + if: "분기" + _if: + arg1: "조건문" + arg2: "참일 경우" + arg3: "거짓일 경우" + not: "부정" + _not: + arg1: "부정" + random: "랜덤" + _random: + arg1: "확률" + rannum: "난수" + _rannum: + arg1: "최솟값" + arg2: "최댓값" + randomPick: "목록에서 임의로 선택" + _randomPick: + arg1: "리스트" + dailyRandom: "랜덤 (하루동안 결과 유지)" + _dailyRandom: + arg1: "확률" + dailyRannum: "난수 (하루동안 결과 유지)" + _dailyRannum: + arg1: "최솟값" + arg2: "최댓값" + dailyRandomPick: "목록에서 임의로 선택 (하루동안 결과 유지)" + _dailyRandomPick: + arg1: "리스트" + seedRandom: "무작위 (시드)" + _seedRandom: + arg1: "시드" + arg2: "확률" + seedRannum: "난수 (시드)" + _seedRannum: + arg1: "시드" + arg2: "최솟값" + arg3: "최댓값" + seedRandomPick: "목록에서 무작위로 선택 (시드)" + _seedRandomPick: + arg1: "시드" + arg2: "리스트" + DRPWPM: "확률형 목록에서 임의로 선택 (하루동안 결과 유지)" + _DRPWPM: + arg1: "텍스트 목록" + pick: "목록에서 선택" + _pick: + arg1: "리스트" + arg2: "위치" + listLen: "리스트의 길이 가져오기" + _listLen: + arg1: "리스트" + number: "수치" + stringToNumber: "텍스트를 수치로" + _stringToNumber: + arg1: "텍스트" + numberToString: "수치를 텍스트로" + _numberToString: + arg1: "수치" + splitStrByLine: "텍스트를 행 단위로 분할" + _splitStrByLine: + arg1: "텍스트" + ref: "변수" + aiScriptVar: "AiScript 변수" + fn: "함수" + _fn: + slots: "슬롯" + slots-info: "각 슬롯을 줄바꿈으로 구분하여 주세요" + arg1: "출력" + for: "반복" + _for: + arg1: "횟수" + arg2: "처리" + typeError: "슬롯 {slot}은 \"{expect}\"를 사용할 수 있지만 \"{actual}이 들어있습니다!" + thereIsEmptySlot: "슬롯 {slot}이(가) 비었습니다!" + types: + string: "텍스트" + number: "수치" + boolean: "플래그" + array: "리스트" + stringArray: "텍스트 목록" + emptySlot: "빈 슬롯" + enviromentVariables: "환경 변수" + pageVariables: "페이지 요소" + argVariables: "입력 슬롯" +_relayStatus: + requesting: "대기 중" + accepted: "승인됨" + rejected: "거절됨" +_notification: + fileUploaded: "파일이 업로드되었습니다" + youGotMention: "{name}님이 멘션함" + youGotReply: "{name}님이 답글함" + youGotQuote: "{name}님이 인용함" + youRenoted: "{name}님이 Renote" + youGotPoll: "{name}님이 투표함" + youGotMessagingMessageFromUser: "{name} 님이 보낸 채팅이 있어요" + youGotMessagingMessageFromGroup: "{name}에서 보낸 채팅이 있어요" + youWereFollowed: "새로운 팔로워가 있습니다" + youReceivedFollowRequest: "새로운 팔로우 요청이 있습니다" + yourFollowRequestAccepted: "팔로우 요청이 수락되었습니다" + youWereInvitedToGroup: "그룹에 초대되었습니다" + pollEnded: "투표 결과가 발표되었습니다" + emptyPushNotificationMessage: "푸시 알림이 갱신되었습니다" + _types: + all: "전부" + follow: "팔로잉" + mention: "멘션" + reply: "답글" + renote: "Renote" + quote: "인용" + reaction: "리액션" + pollVote: "투표 참여" + pollEnded: "투표가 종료됨" + receiveFollowRequest: "팔로우 요청을 받았을 때" + followRequestAccepted: "팔로우 요청이 승인되었을 때" + groupInvited: "그룹에 초대되었을 때" + app: "연동된 앱을 통한 알림" + _actions: + followBack: "팔로우" + reply: "답글" + renote: "Renote" +_deck: + alwaysShowMainColumn: "메인 칼럼 항상 표시" + columnAlign: "칼럼 정렬" + addColumn: "칼럼 추가" + configureColumn: "칼럼 설정" + swapLeft: "왼쪽으로 이동" + swapRight: "오른쪽으로 이동" + swapUp: "위로 이동" + swapDown: "아래로 이동" + stackLeft: "왼쪽에 쌓기" + popRight: "오른쪽으로 빼기" + profile: "프로파일" + newProfile: "새 프로파일" + deleteProfile: "프로파일 삭제" + introduction: "칼럼을 조합해서 나만의 인터페이스를 구성해 보아요!" + introduction2: "나중에라도 화면 우측의 + 버튼을 눌러 새 칼럼을 추가할 수 있습니다." + widgetsIntroduction: "칼럼 메뉴의 \"위젯 편집\"에서 위젯을 추가해 주세요" + _columns: + main: "메인" + widgets: "위젯" + notifications: "알림" + tl: "타임라인" + antenna: "안테나" + list: "리스트" + mentions: "받은 멘션" + direct: "다이렉트" diff --git a/fe_calckey/frontend/locales/nl-NL.yml b/fe_calckey/frontend/locales/nl-NL.yml new file mode 100644 index 0000000..45bc362 --- /dev/null +++ b/fe_calckey/frontend/locales/nl-NL.yml @@ -0,0 +1,684 @@ +_lang_: "Nederlands" +headlineMisskey: "Een open source, gedecentraliseerd, social media platform dat voor + altijd gratis is! 🚀" +introMisskey: "Welkom! Calckey is een open source, gedecentraliseerde microblogdienst.\n + Maak \"notities\" om je gedachten te delen met iedereen om je heen. 📡\nMet \"reacties\"\ + \ kun je ook snel je mening geven over berichten van anderen. 👍\nLaten we een nieuwe + wereld verkennen! 🚀" +monthAndDay: "{day} {month}" +search: "Zoeken" +notifications: "Meldingen" +username: "Gebruikersnaam" +password: "Wachtwoord" +forgotPassword: "Wachtwoord vergeten" +fetchingAsApObject: "Ophalen vanuit de Fediverse" +ok: "Ok" +gotIt: "Begrepen!" +cancel: "Annuleren" +enterUsername: "Voer een gebruikersnaam in" +renotedBy: "Hergedeeld door {user}" +noNotes: "Geen notities" +noNotifications: "Geen meldingen" +instance: "Server" +settings: "Instellingen" +basicSettings: "Basisinstellingen" +otherSettings: "Overige instellingen" +openInWindow: "In een venster openen" +profile: "Profiel" +timeline: "Tijdlijn" +noAccountDescription: "Deze gebruiker heeft nog geen bio geschreven" +login: "Inloggen" +loggingIn: "Aan het inloggen" +logout: "Afmelden" +signup: "Registreren" +uploading: "Bezig met uploaden" +save: "Opslaan" +users: "Gebruikers" +addUser: "Toevoegen gebruiker" +favorite: "Favorieten" +favorites: "Toevoegen aan favorieten" +unfavorite: "Verwijderen uit favorieten" +favorited: "Toegevoegd aan favorieten." +alreadyFavorited: "Al toegevoegd aan favorieten" +cantFavorite: "Kon niet toevoegen aan favorieten" +pin: "Vastmaken aan profielpagina" +unpin: "Losmaken van profielpagina" +copyContent: "Kopiëren inhoud" +copyLink: "Kopiëren link" +delete: "Verwijderen" +deleteAndEdit: "Verwijderen en bewerken" +deleteAndEditConfirm: "Weet je zeker dat je deze post wilt verwijderen en dan bewerken? + Je verliest alle reacties, boosts en antwoorden erop." +addToList: "Aan lijst toevoegen" +sendMessage: "Verstuur bericht" +copyUsername: "Gebruikersnaam kopiëren" +searchUser: "Zoek een gebruiker" +reply: "Antwoord" +loadMore: "Laad meer" +showMore: "Toon meer" +youGotNewFollower: "volgt jou" +receiveFollowRequest: "Volgverzoek ontvangen" +followRequestAccepted: "Volgverzoek geaccepteerd" +mention: "Vermelding" +mentions: "Vermeldingen" +directNotes: "Directe notities" +importAndExport: "Import / export" +import: "Import" +export: "Export" +files: "Bestanden" +download: "Downloaden" +driveFileDeleteConfirm: "Weet je zeker dat je het bestand \"{name}\" wilt verwijderen? + Posts met dit bestand als bijlage worden ook verwijderd." +unfollowConfirm: "Weet je zeker dat je {name} wilt ontvolgen?" +exportRequested: "Je hebt een export aangevraagd. Dit kan een tijdje duren. Het wordt + toegevoegd aan je Drive zodra het is voltooid." +importRequested: "Je hebt een import aangevraagd. Dit kan even duren." +lists: "Lijsten" +noLists: "Je hebt geen lijsten" +note: "Notitie" +notes: "Notities" +following: "Volgend" +followers: "Volgers" +followsYou: "Volgt jou" +createList: "Creëer lijst" +manageLists: "Lijsten beheren" +error: "Fout" +somethingHappened: "Er is iets misgegaan." +retry: "Probeer opnieuw" +pageLoadError: "Pagina laden mislukt" +pageLoadErrorDescription: "Dit wordt normaal gesproken veroorzaakt door netwerkfouten + of door de cache van de browser. Probeer de cache te wissen en probeer het na een + tijdje wachten opnieuw." +serverIsDead: "De server reageert niet. Wacht even en probeer het opnieuw." +youShouldUpgradeClient: "Werk je client bij om deze pagina te zien." +enterListName: "Voer de naam van de lijst in" +privacy: "Privacy" +makeFollowManuallyApprove: "Volgverzoeken vergen een goedkeuring" +defaultNoteVisibility: "Standaard zichtbaarheid" +follow: "Volgen" +followRequest: "Verzoek om te mogen volgen" +followRequests: "Volgverzoeken" +unfollow: "Ontvolgen" +followRequestPending: "Wachten op goedkeuring volgverzoek" +enterEmoji: "Voer een emoji in" +renote: "Boost" +unrenote: "Boost intrekken" +renoted: "Boosted." +cantRenote: "Dit bericht kan niet worden geboost." +cantReRenote: "Een boost kan niet worden geboost." +quote: "Quote" +pinnedNote: "Vastgemaakte post" +pinned: "Vastmaken aan profielpagina" +you: "Jij" +clickToShow: "Klik om te bekijken" +sensitive: "NSFW" +add: "Toevoegen" +reaction: "Reacties" +reactionSettingDescription2: "Sleep om opnieuw te ordenen, Klik om te verwijderen, + Druk op \"+\" om toe te voegen" +rememberNoteVisibility: "Onthoud post zichtbaarheidsinstellingen" +attachCancel: "Verwijder bijlage" +markAsSensitive: "Markeren als NSFW" +unmarkAsSensitive: "Geen NSFW" +enterFileName: "Bestandsnaam invoeren" +mute: "Dempen" +unmute: "Stop dempen" +block: "Blokkeren" +unblock: "Deblokkeren" +suspend: "Opschorten" +unsuspend: "Heractiveren" +blockConfirm: "Weet je zeker dat je dit account wil blokkeren?" +unblockConfirm: "Ben je zeker dat je deze account wil blokkeren?" +suspendConfirm: "Ben je zeker dat je deze account wil suspenderen?" +unsuspendConfirm: "Ben je zeker dat je deze account wil opnieuw aanstellen?" +flagAsBot: "Markeer dit account als een robot" +flagAsBotDescription: "Als dit account van een programma wordt beheerd, zet deze vlag + aan. Het aanzetten helpt andere ontwikkelaars om bijvoorbeeld onbedoelde feedback + loops te doorbreken of om Calckey meer geschikt te maken." +flagAsCat: "Markeer dit account als een kat." +flagAsCatDescription: "Zet deze vlag aan als je wilt aangeven dat dit account een + kat is." +flagShowTimelineReplies: "Toon antwoorden op de tijdlijn" +flagShowTimelineRepliesDescription: "Als je deze vlag aanzet, toont de tijdlijn ook + antwoorden op andere en niet alleen jouw eigen post." +autoAcceptFollowed: "Accepteer verzoeken om jezelf te volgen vanzelf als je de verzoeker + al volgt" +addAccount: "Account toevoegen" +loginFailed: "Aanmelding mislukt." +showOnRemote: "Bekijk op de externe server" +general: "Algemeen" +wallpaper: "Achtergrond" +setWallpaper: "Achtergrond instellen" +removeWallpaper: "Achtergrond verwijderen" +searchWith: "Zoeken: {q}" +youHaveNoLists: "Je hebt geen lijsten" +followConfirm: "Weet je zeker dat je {name} wilt volgen?" +proxyAccount: "Proxy account" +proxyAccountDescription: "Een proxy-account is een account dat onder bepaalde voorwaarden + fungeert als externe volger voor gebruikers. Als een gebruiker bijvoorbeeld een + externe gebruiker aan de lijst toevoegt, wordt de activiteit van de externe gebruiker + niet aan de server geleverd als geen lokale gebruiker die gebruiker volgt, dus het + proxy-account volgt in plaats daarvan." +host: "Server" +selectUser: "Kies een gebruiker" +recipient: "Ontvanger(s)" +annotation: "Reacties" +federation: "Federatie" +instances: "Servers" +registeredAt: "Geregistreerd op" +latestRequestSentAt: "Laatste aanvraag verstuurd" +latestRequestReceivedAt: "Laatste aanvraag ontvangen" +latestStatus: "Laatste status" +storageUsage: "Gebruikte opslagruimte" +charts: "Grafieken" +perHour: "Per uur" +perDay: "Per dag" +stopActivityDelivery: "Stop met versturen activiteiten" +blockThisInstance: "Blokkeer deze server" +operations: "Verwerkingen" +software: "Software" +version: "Versie" +metadata: "Metadata" +monitor: "Monitor" +jobQueue: "Job Queue" +cpuAndMemory: "CPU en geheugen" +network: "Netwerk" +disk: "Schijfruimte" +instanceInfo: "Serverinformatie" +statistics: "Statistieken" +clearQueue: "Wachtrij wissen" +clearQueueConfirmTitle: "Weet je zeker dat je de wachtrji leeg wil maken?" +clearQueueConfirmText: "Niet-bezorgde posts die nog in de wachtrij staan, worden niet + gefedereerd. Meestal is deze operatie niet nodig." +clearCachedFiles: "Cache opschonen" +clearCachedFilesConfirm: "Weet je zeker dat je alle externe bestanden in de cache + wilt verwijderen?" +blockedInstances: "Geblokkeerde servers" +blockedInstancesDescription: "Maak een lijst van de servers die moeten worden geblokkeerd, + gescheiden door regeleinden. Geblokkeerde servers kunnen niet meer communiceren + met deze server." +muteAndBlock: "Gedempt en geblokkeerd" +mutedUsers: "Gedempte gebruikers" +blockedUsers: "Geblokkeerde gebruikers" +noUsers: "Er zijn geen gebruikers." +editProfile: "Bewerk Profiel" +noteDeleteConfirm: "Ben je zeker dat je deze post wil verwijderen?" +pinLimitExceeded: "Je kunt geen posts meer vastprikken" +intro: "Installatie van Calckey geëindigd! Maak nu een beheerder aan." +done: "Klaar" +processing: "Bezig met verwerken" +preview: "Voorbeeld" +default: "Standaard" +noCustomEmojis: "Er zijn geen emojis" +noJobs: "Er zijn geen taken" +federating: "Federeren" +blocked: "Geblokkeerd" +suspended: "Opgeschort" +all: "Alle" +subscribing: "Abonneren" +publishing: "Publiceren" +notResponding: "Reageert niet" +instanceFollowing: "Volgend op server" +instanceFollowers: "Volgers op server" +instanceUsers: "Gebruikers van deze server" +changePassword: "Wachtwoord wijzigen" +security: "Beveiliging" +retypedNotMatch: "Invoer komt niet overeen" +currentPassword: "Huidig wachtwoord" +newPassword: "Nieuwe wachtwoord" +newPasswordRetype: "Nieuw wachtwoord (herhalen)" +attachFile: "Bestanden toevoegen" +more: "Meer!" +featured: "Uitgelicht" +usernameOrUserId: "Gebruikersnaam of id" +noSuchUser: "Gebruiker niet gevonden" +lookup: "Opzoeken" +announcements: "Aankondigingen" +imageUrl: "AfbeeldingsURL" +remove: "Verwijderen" +removed: "Succesvol verwijderd" +removeAreYouSure: "Weet je zeker dat je \"{x}\" wil verwijderen?" +deleteAreYouSure: "Weet je zeker dat je \"{x}\" wil verwijderen?" +resetAreYouSure: "Resetten?" +saved: "Opgeslagen" +messaging: "Chat" +upload: "Uploaden" +keepOriginalUploading: "Origineel beeld behouden." +keepOriginalUploadingDescription: "Bewaar de originele versie bij het uploaden van + afbeeldingen. Indien uitgeschakeld, wordt bij het uploaden een alternatieve versie + voor webpublicatie genereert." +fromDrive: "Van schijf" +fromUrl: "Van URL" +uploadFromUrl: "Uploaden vanaf een URL" +uploadFromUrlDescription: "URL van het bestand dat je wil uploaden" +uploadFromUrlRequested: "Uploadverzoek" +uploadFromUrlMayTakeTime: "Het kan even duren voordat het uploaden voltooid is." +explore: "Verkennen" +messageRead: "Lezen" +noMoreHistory: "Er is geen verdere geschiedenis" +startMessaging: "Start een gesprek" +nUsersRead: "gelezen door {n}" +agreeTo: "Ik stem in met {0}" +tos: "Gebruiksvoorwaarden" +start: "Aan de slag" +home: "Startpagina" +remoteUserCaution: "Aangezien deze gebruiker van een externe server afkomstig is, + kan de weergegeven informatie onvolledig zijn." +activity: "Activiteit" +images: "Afbeeldingen" +birthday: "Geboortedatum" +yearsOld: "{age} jaar" +registeredDate: "Inschrijvingsdatum" +location: "Locatie" +theme: "Thema's" +themeForLightMode: "Thema voor gebruik in de lichte modus" +themeForDarkMode: "Thema voor gebruik in de donkere modus" +light: "Licht" +dark: "Donker" +lightThemes: "Licht thema's" +darkThemes: "Donkere thema's" +syncDeviceDarkMode: "Synchroniseer donkere modus met je apparaatinstellingen" +drive: "Schijf" +fileName: "Bestandsnaam" +selectFile: "Kies een bestand" +selectFiles: "Selecteer bestanden" +selectFolder: "Kies een map" +selectFolders: "Kies mappen" +renameFile: "Wijzig bestandsnaam" +folderName: "Mapnaam" +createFolder: "Map aanmaken" +renameFolder: "Map hernoemen" +deleteFolder: "Map verwijderen" +addFile: "Bestand toevoegen" +emptyDrive: "Jouw Drive is leeg." +emptyFolder: "Deze map is leeg" +unableToDelete: "Kan niet worden verwijderd" +inputNewFileName: "Voer een nieuwe naam in" +copyUrl: "URL kopiëren" +rename: "Hernoemen" +avatar: "Avatar" +banner: "Banner" +nsfw: "NSFW" +whenServerDisconnected: "Wanneer de verbinding met de server wordt onderbroken" +disconnectedFromServer: "Verbinding met de server onderbroken." +inMb: "in megabytes" +pinnedNotes: "Vastgemaakte notitie" +userList: "Lijsten" +aboutMisskey: "Over Calckey" +administrator: "Beheerder" +token: "Token" +securityKeyName: "Sleutelnaam" +registerSecurityKey: "Zekerheids-Sleutel registreren" +lastUsed: "Laatst gebruikt" +unregister: "Uitschrijven" +passwordLessLogin: "Inloggen zonder wachtwoord" +resetPassword: "Wachtwoord terugzetten" +newPasswordIs: "Het nieuwe wachtwoord is „{password}”." +reduceUiAnimation: "Verminder beweging in de UI" +share: "Delen" +notFound: "Niet gevonden" +cacheClear: "Cache verwijderen" +smtpHost: "Server" +smtpUser: "Gebruikersnaam" +smtpPass: "Wachtwoord" +clearCache: "Cache opschonen" +user: "Gebruikers" +muteThread: "Discussies dempen " +unmuteThread: "Dempen van discussie ongedaan maken" +hide: "Verbergen" +searchByGoogle: "Zoeken" +cropImage: "Afbeelding bijsnijden" +cropImageAsk: "Bijsnijdengevraagd" +file: "Bestanden" +_email: + _follow: + title: "Je hebt een nieuwe volger" +_mfm: + mention: "Vermelding" + quote: "Quote" + search: "Zoeken" +_theme: + keys: + mention: "Vermelding" + renote: "Herdelen" +_sfx: + note: "Notities" + notification: "Meldingen" + chat: "Chat" +_widgets: + notifications: "Meldingen" + timeline: "Tijdlijn" + activity: "Activiteit" + federation: "Federatie" + jobQueue: "Job Queue" +_cw: + show: "Laad meer" +_visibility: + home: "Startpagina" + followers: "Volgers" +_profile: + username: "Gebruikersnaam" +_exportOrImport: + followingList: "Volgend" + muteList: "Dempen" + blockingList: "Blokkeren" + userLists: "Lijsten" + excludeMutingUsers: "Negeer gedempte gebruikers" + excludeInactiveUsers: "Negeer inactieve gebruikers" +_charts: + federation: "Federatie" +_timelines: + home: "Startpagina" +_pages: + blocks: + image: "Afbeeldingen" + script: + categories: + list: "Lijsten" + blocks: + _join: + arg1: "Lijsten" + _randomPick: + arg1: "Lijsten" + _dailyRandomPick: + arg1: "Lijsten" + _seedRandomPick: + arg2: "Lijsten" + _pick: + arg1: "Lijsten" + _listLen: + arg1: "Lijsten" + types: + array: "Lijsten" +_notification: + youWereFollowed: "volgt jou" + _types: + follow: "Volgend" + mention: "Vermelding" + renote: "Herdelen" + quote: "Quote" + reaction: "Reacties" + _actions: + reply: "Antwoord" + renote: "Herdelen" +_deck: + _columns: + notifications: "Meldingen" + tl: "Tijdlijn" + list: "Lijsten" + mentions: "Vermeldingen" +showLess: Sluiten +emoji: Emoji +selectList: Selecteer een lijst +selectAntenna: Selecteer een antenne +deleted: Verwijderd +editNote: Bewerk notitie +edited: 'Bewerkt om {date} {time}' +emojis: Emojis +emojiName: Emoji naam +emojiUrl: Emoji URL +addEmoji: Voeg toe +settingGuide: Aanbevolen instellingen +flagSpeakAsCat: Praat als een kat +accountMoved: 'Gebruiker is naar een nieuw account verhuisd:' +showEmojisInReactionNotifications: Toon emojis in reactie notificaties +selectWidget: Selecteer een widget +editWidgetsExit: Klaar +noThankYou: Nee bedankt +addInstance: Voeg een server toe +enableEmojiReactions: Schakel emoji reacties in +editWidgets: Bewerk widgets +thisYear: Jaar +thisMonth: Maand +registration: Registreren +_ffVisibility: + public: Openbaar + private: Privé + followers: Alleen zichtbaar voor volgers +noInstances: Er zijn geen servers +_signup: + almostThere: Bijna klaar + emailAddressInfo: Voer je emailadres in. Deze zal niet openbaar gemaakt worden. +_ad: + back: Terug + reduceFrequencyOfThisAd: Toon deze advertentie minder +pushNotificationNotSupported: Je browser of server ondersteunt geen pushmeldingen +sendPushNotificationReadMessage: Verwijder pushmeldingen wanneer de relevante meldingen + of berichten zijn gelezen +customEmojis: Custom emoji +cacheRemoteFiles: Cache externe bestanden +hiddenTags: Verborgen hashtags +enableRecommendedTimeline: Schakel aanbevolen tijdlijn in +_forgotPassword: + enterEmail: Voer het emailadres in dat je gebruikte om te registreren. Een link + waarmee je je wachtwoord opnieuw kunt instellen zal daar naartoe gestuurd worden. +jumpToReply: Spring naar Antwoord +newer: nieuwer +older: ouder +selectInstance: Kies een server +defaultValueIs: 'Standaard: {value}' +reload: Hernieuwen +doNothing: Negeren +today: Vandaag +inputNewDescription: Voer een nieuw onderschrift in +inputNewFolderName: Voer een nieuwe mapnaam in +circularReferenceFolder: De bestemmingsmap is een submap van de map die je wil verplaatsen. +hasChildFilesOrFolders: Omdat deze map niet leeg is, kan deze niet verwijderd worden. +enableLocalTimeline: Schakel lokale tijdlijn in +enableGlobalTimeline: Schakel globale tijdlijn in +enableRegistration: Nieuwe gebruikersregistratie inschakelen +invite: Uitnodigen +move: Verplaatsen +showAds: Toon advertenties +pushNotification: Pushmeldingen +_gallery: + my: Mijn Gallerij +reactionSetting: Reacties om te tonen in het reactie selectie menu +dayX: '{day}' +renoteMute: Demp boosts +reloadConfirm: Wil je de tijdlijn hernieuwen? +watch: Volgen +unwatch: Ontvolgen +accept: Accepteren +reject: Afwijzen +normal: Normaal +pages: Pagina's +integration: Integraties +connectService: Koppelen +monthX: '{month}' +yearX: '{year}' +instanceName: Servernaam +instanceDescription: Server omschrijving +maintainerName: Onderhouder +maintainerEmail: Onderhouder email +tosUrl: Algemene Voorwaarden URL +disconnectService: Ontkoppelen +unread: Ongelezen +manageGroups: Beheer groepen +subscribePushNotification: Pushmeldingen inschakelen +unsubscribePushNotification: Pushmeldingen uitschakelen +pushNotificationAlreadySubscribed: Pushmeldingen zijn al ingeschakeld +antennaSource: Antenne bron +antennaKeywords: Trefwoorden om naar te luisteren +antennaExcludeKeywords: Trefwoorden om te negeren +driveCapacityPerRemoteAccount: Schijfruimte per externe gebruiker +backgroundImageUrl: Achtergrondafbeelding URL +basicInfo: Basis informatie +pinnedUsers: Vastgezette gebruikers +pinnedPages: Vastgezette Pagina's +driveCapacityPerLocalAccount: Schijfruimte per lokale gebruiker +iconUrl: Icoon URL +bannerUrl: Banner afbeelding URL +manageAntennas: Beheer Antennes +name: Naam +notifyAntenna: Meld nieuwe posts +withFileAntenna: Alleen posts met bestanden +enableServiceworker: Schakel pushmeldingen voor je browser in +renoteUnmute: Ontdemp boosts +jumpToPrevious: Spring naar vorige +caseSensitive: Hoofdlettergevoelig +cw: Inhoudswaarschuwing +recaptcha: reCAPTCHA +enableRecaptcha: reCAPTCHA inschakelen +recaptchaSiteKey: Site sleutel +notFoundDescription: Een pagina met deze URL kon niet worden gevonden. +uploadFolder: Standaard map voor uploads +markAsReadAllNotifications: Markeer alle notificaties als gelezen +text: Tekst +enable: Inschakelen +or: Of +language: Taal +securityKey: Veiligheidssleutel +groupInvited: Je bent voor een groep uitgenodigd +docSource: Bron van dit document +createAccount: Maak account aan +groupName: Groepsnaam +members: Leden +messagingWithUser: Privé chat +messagingWithGroup: Groepschat +title: Titel +createGroup: Maak een groep +ownedGroups: Beheerde groepen +invites: Uitnodigingen +useOsNativeEmojis: Gebruik je standaard besturingssysteem Emojis +disableDrawer: Gebruik niet de lade-stijl menus +joinOrCreateGroup: Krijg een uitnodiging voor een groep of maak er zelf eentje aan. +noHistory: Geen geschiedenis beschikbaar +signinHistory: Inloggeschiedenis +available: Beschikbaar +unavailable: Niet beschikbaar +tooShort: Te kort +signinFailed: Niet gelukt om in te loggen. Gebruikersnaam of wachtwoord is incorrect. +tapSecurityKey: Tik je veiligheidssleutel aan +recaptchaSecretKey: Geheime sleutel +antennas: Antennes +antennaUsersDescription: Zet één gebruikersnaam per regel neer +notesAndReplies: Posts en antwoorden +withFiles: Met bestanden +popularUsers: Populaire gebruikers +recentlyUpdatedUsers: Recente actieve gebruikers +recentlyRegisteredUsers: Nieuwe gebruikers +recentlyDiscoveredUsers: Nieuwe ontdekte gebruikers +exploreUsersCount: Er zijn {count} gebruikers +about: Over +exploreFediverse: Ontdek de Fediverse +popularTags: Populaire labels +moderation: Moderatie +nUsersMentioned: Genoemd door {n} gebruikers +markAsReadAllUnreadNotes: Markeer alle posts als gelezen +markAsReadAllTalkMessages: Markeer alle berichten als gelezen +help: Help +inputMessageHere: Schrijf hier je bericht +close: Sluiten +group: Groep +groups: Groepen +newMessageExists: Er zijn nieuwe berichten +next: Volgende +noteOf: Post door {user} +inviteToGroup: Nodig uit voor de groep +quoteAttached: Quote +noMessagesYet: Nog geen berichten +weakPassword: Zwak wachtwoord +normalPassword: Middelmatig wachtwoord +strongPassword: Sterk wachtwoord +onlyOneFileCanBeAttached: Je kan maar één bestand toevoegen aan je bericht +invitationCode: Uitnodigingscode +checking: Controleren... +uiLanguage: Gebruikersinterface taal +aboutX: Over {x} +youHaveNoGroups: Je hebt geen groepen +disableAnimatedMfm: Schakel MFM met animaties uit +passwordMatched: Komt overeen +passwordNotMatched: Komt niet overeen +signinWith: Log in met {x} +fontSize: Tekstgrootte +openImageInNewTab: Open afbeeldingen in een nieuwe tab +category: Categorie +tags: Labels +existingAccount: Bestaand account +regenerate: Hernieuwen +dayOverDayChanges: Verschillen met gisteren +appearance: Uiterlijk +local: Lokaal +remote: Extern +total: Totaal +weekOverWeekChanges: Verschillen met vorige week +hcaptcha: hCaptcha +enableHcaptcha: hCaptcha inschakelen +hcaptchaSiteKey: Site sleutel +hcaptchaSecretKey: Geheime sleutel +withReplies: Met antwoorden +twoStepAuthentication: Tweefactorauthenticatie +moderator: Moderator +invitations: Uitnodigingen +tooLong: Te lang +doing: Verwerken... +silencedInstances: Gedempte Servers +cacheRemoteFilesDescription: Als deze instelling is uitgeschakeld, worden externe + bestanden direct van de externe server geladen. Het uitschakelen zal opslagruimte + verminderen, maar verkeer zal toenemen, omdat er geen thumbnails gemaakt zullen + worden. +flagSpeakAsCatDescription: Je posts zullen worden ge-'nyanified' als je in kat-modus + zit +avoidMultiCaptchaConfirm: Het gebruik van meerdere Captcha systemen kan voor storing + zorgen tussen ze. Wil je de andere actieve Captcha systemen uitschakelen? Als je + ze ingeschakeld wilt houden, klik op annuleren. +silence: Dempen +silenceConfirm: Weet je zeker dat je deze gebruiker wilt dempen? +unsilence: Ontdempen +unsilenceConfirm: Weet je zeker dat je het dempen van deze gebruiker ongedaan wilt + maken? +silenceThisInstance: Demp deze server +silenced: Gedempt +disablingTimelinesInfo: Beheerders en moderators zullen altijd toegang hebben tot + alle tijdlijnen, zelfs als deze uitgeschakeld zijn. +accountSettings: Account Instellingen +numberOfDays: Aantal dagen +hideThisNote: Verberg deze post +dashboard: Dashboard +accessibility: Toegankelijkheid +promotion: Gepromoot +promote: Promoten +objectStorage: Objectopslag +useObjectStorage: Gebruik objectopslag +objectStorageBaseUrl: Basis -URL +objectStorageUseSSLDesc: Schakel dit uit als je geen HTTPS voor je API connecties + gebruikt +objectStorageUseProxy: Verbind over Proxy +objectStorageUseProxyDesc: Schakel dit uit als je geen Proxy voor je API connecties + gebruikt +sounds: Geluiden +lastUsedDate: Laatst gebruikt op +installedDate: Geautoriseerd op +sort: Sorteren +output: Uitvoer +script: Script +popout: Pop-out +descendingOrder: Aflopend +showInPage: Toon in de pagina +chooseEmoji: Kies een emoji +ascendingOrder: Oplopend +volume: Volume +masterVolume: Master volume +details: Details +unableToProcess: Deze operatie kon niet worden voltooid +nothing: Niks te zien hier +scratchpad: Kladblok +recentUsed: Recentelijk gebruikt +install: Installeer +uninstall: Verwijderen +installedApps: Geautoriseerde Applicaties +state: Status +updateRemoteUser: Update externe gebruikersinformatie +listen: Luister +none: Geen +scratchpadDescription: Het kladblok is een omgeving voor AiScript experimenten. Je + kan hier schrijven, uitvoeren, en de resultaten bekijken van de interactie met Calckey. +disablePagesScript: Zet AiScript op Pages uit +deleteAllFiles: Verwijder alle bestanden +deleteAllFilesConfirm: Weet je zeker dat je alle bestanden wil verwijderen? +removeAllFollowing: Ontvolg alle gevolgde gebruikers +serverLogs: Server logboek +deleteAll: Verwijder alles +showFixedPostForm: Toon het post formulier bovenaan de tijdlijn +newNoteRecived: Er zijn nieuwe posts diff --git a/fe_calckey/frontend/locales/no-NO.yml b/fe_calckey/frontend/locales/no-NO.yml new file mode 100644 index 0000000..83e189b --- /dev/null +++ b/fe_calckey/frontend/locales/no-NO.yml @@ -0,0 +1,2 @@ +--- +_lang_: "Norsk Bokmål" diff --git a/fe_calckey/frontend/locales/pl-PL.yml b/fe_calckey/frontend/locales/pl-PL.yml new file mode 100644 index 0000000..571f6af --- /dev/null +++ b/fe_calckey/frontend/locales/pl-PL.yml @@ -0,0 +1,2032 @@ +_lang_: "Polski" +headlineMisskey: "Otwartoźródłowa, zdecentralizowana sieć społecznościowa, która zawsze + będzie darmowa! 🚀" +introMisskey: "Hej! Calckey to otwartoźródłowa oraz zdecentralizowana sieć społecznościowa, + która zawsze będzie darmowa! 🚀" +monthAndDay: "{month}-{day}" +search: "Szukaj" +notifications: "Powiadomienia" +username: "Nazwa użytkownika" +password: "Hasło" +forgotPassword: "Nie pamiętam hasła" +fetchingAsApObject: "Pobieranie z Fediwersum" +ok: "OK" +gotIt: "Rozumiem!" +cancel: "Anuluj" +enterUsername: "Wprowadź nazwę użytkownika" +renotedBy: "Podbito przez {user}" +noNotes: "Brak wpisów" +noNotifications: "Brak powiadomień" +instance: "Serwer" +settings: "Ustawienia" +basicSettings: "Podstawowe ustawienia" +otherSettings: "Pozostałe ustawienia" +openInWindow: "Otwórz w oknie" +profile: "Profil" +timeline: "Oś czasu" +noAccountDescription: "Ten użytkownik nie napisał jeszcze swojego opisu." +login: "Zaloguj się" +loggingIn: "Logowanie" +logout: "Wyloguj się" +signup: "Zarejestruj się" +uploading: "Wysyłanie..." +save: "Zapisz" +users: "Użytkownicy" +addUser: "Dodaj użytkownika" +favorite: "Dodaj do ulubionych" +favorites: "Zakładki" +unfavorite: "Usuń zakładkę" +favorited: "Dodano do zakładek." +alreadyFavorited: "Już jest w zakładkach." +cantFavorite: "Nie można dodać do zakładek." +pin: "Przypnij do profilu" +unpin: "Odepnij z profilu" +copyContent: "Skopiuj zawartość" +copyLink: "Skopiuj odnośnik" +delete: "Usuń" +deleteAndEdit: "Usuń i edytuj" +deleteAndEditConfirm: "Czy na pewno chcesz usunąć ten wpis i zedytować go? Utracisz + wszystkie reakcje, podbicia i odpowiedzi do tego wpisu." +addToList: "Dodaj do listy" +sendMessage: "Wyślij wiadomość" +copyUsername: "Kopiuj nazwę użytkownika" +searchUser: "Wyszukiwanie użytkowników" +reply: "Odpowiedz" +loadMore: "Załaduj więcej" +showMore: "Pokaż więcej" +showLess: "Zamknij" +youGotNewFollower: "Zaobserwował* Cię" +receiveFollowRequest: "Otrzymano prośbę o możliwość obserwacji" +followRequestAccepted: "Zaakceptowano prośbę o możliwość obserwacji" +mention: "Wspomnij" +mentions: "Wspomnienia" +directNotes: "Bezpośrednie wiadomości" +importAndExport: "Import i eksport danych" +import: "Importuj" +export: "Eksportuj" +files: "Pliki" +download: "Pobierz" +driveFileDeleteConfirm: "Czy chcesz usunąć plik \"{name}\"? Wszystkie wpisy zawierające + ten plik również zostaną usunięte." +unfollowConfirm: "Czy na pewno chcesz przestać obserwować {name}?" +exportRequested: "Zażądałeś eksportu. Może to zająć chwilę. Po zakończeniu eksportu + zostanie on dodany do Twojego dysku." +importRequested: "Zażądano importu. Może to zająć chwilę." +lists: "Listy" +noLists: "Nie masz żadnych list" +note: "Utwórz wpis" +notes: "Wpisy" +following: "Obserwowani" +followers: "Obserwujący" +followsYou: "Obserwuje Cię" +createList: "Utwórz listę" +manageLists: "Zarządzaj listami" +error: "Błąd" +somethingHappened: "Coś poszło nie tak" +retry: "Spróbuj ponownie" +pageLoadError: "Nie udało się załadować strony." +pageLoadErrorDescription: "Zwykle jest to spowodowane problemem z siecią lub cache + przeglądarki. Spróbuj wyczyścić cache i sprawdź jeszcze raz za chwilę." +serverIsDead: "Serwer nie odpowiada. Zaczekaj chwilę i spróbuj ponownie." +youShouldUpgradeClient: "Aby zobaczyć tą stronę, odśwież ją, by zaaktualizować klienta." +enterListName: "Wpisz nazwę listy" +privacy: "Prywatność" +makeFollowManuallyApprove: "Prośby o możliwość obserwacji wymagają zatwierdzenia" +defaultNoteVisibility: "Domyślna widoczność" +follow: "Obserwuj" +followRequest: "Poproś o możliwość obserwacji" +followRequests: "Prośby o możliwość obserwacji" +unfollow: "Przestań obserwować" +followRequestPending: "Oczekująca prośba o możliwość obserwacji" +enterEmoji: "Wprowadź emoji" +renote: "Podbij" +unrenote: "Cofnij podbicie" +renoted: "Podbito." +cantRenote: "Ten wpis nie może zostać podbity." +cantReRenote: "Podbicie nie może zostać podbite." +quote: "Cytuj" +pinnedNote: "Przypięty wpis" +pinned: "Przypnij do profilu" +you: "Ty" +clickToShow: "Kliknij, aby wyświetlić" +sensitive: "NSFW" +add: "Dodaj" +reaction: "Reakcja" +reactionSetting: "Reakcje do pokazania w wyborniku reakcji" +reactionSettingDescription2: "Przeciągnij aby zmienić kolejność, naciśnij aby usunąć, + naciśnij „+” aby dodać." +rememberNoteVisibility: "Zapamiętuj ustawienia widoczności wpisu" +attachCancel: "Usuń załącznik" +markAsSensitive: "Oznacz jako NSFW" +unmarkAsSensitive: "Cofnij NSFW" +enterFileName: "Wprowadź nazwę pliku" +mute: "Wycisz" +unmute: "Cofnij wyciszenie" +block: "Zablokuj" +unblock: "Odblokuj" +suspend: "Zawieś" +unsuspend: "Cofnij zawieszenie" +blockConfirm: "Czy na pewno chcesz zablokować to konto?" +unblockConfirm: "Czy na pewno chcesz odblokować to konto?" +suspendConfirm: "Czy na pewno chcesz zawiesić to konto?" +unsuspendConfirm: "Czy na pewno chcesz cofnąć zawieszenie tego konta?" +selectList: "Wybierz listę" +selectAntenna: "Wybierz antenę" +selectWidget: "Wybierz widżet" +editWidgets: "Edytuj widżety" +editWidgetsExit: "Gotowe" +customEmojis: "Niestandardowe emoji" +emoji: "Emoji" +emojis: "Emoji" +emojiName: "Nazwa emoji" +emojiUrl: "Adres URL emoji" +addEmoji: "Dodaj emoji" +settingGuide: "Proponowana konfiguracja" +cacheRemoteFiles: "Przechowuj zdalne pliki w pamięci podręcznej" +cacheRemoteFilesDescription: "Gdy ta opcja jest wyłączona, zdalne pliki są ładowane + bezpośrednio ze zdalnego serwera. Wyłączenie tej opcji zmniejszy użycie powierzchni + dyskowej, ale zwiększy transfer, ponieważ miniaturki nie będą generowane." +flagAsBot: "To konto jest botem" +flagAsBotDescription: "Jeżeli ten kanał jest kontrolowany przez jakiś program, ustaw + tę opcję. Jeżeli włączona, będzie działać jako flaga informująca innych programistów, + aby zapobiegać nieskończonej interakcji z różnymi botami i dostosowywać wewnętrzne + systemy Calckey, traktując konto jako bota." +flagAsCat: "Czy jesteś kotem? 😺" +flagAsCatDescription: "Dostaniesz kocie uszka, oraz będziesz mówić jak kot!" +flagShowTimelineReplies: "Pokazuj odpowiedzi na osi czasu" +autoAcceptFollowed: "Automatycznie przyjmuj prośby o możliwość obserwacji od użytkowników, + których obserwujesz" +addAccount: "Dodaj konto" +loginFailed: "Nie udało się zalogować" +showOnRemote: "Zobacz na zdalnym serwerze" +general: "Ogólne" +wallpaper: "Tapeta" +setWallpaper: "Ustaw tapetę" +removeWallpaper: "Usuń tapetę" +searchWith: "Szukaj: {q}" +youHaveNoLists: "Nie masz żadnej listy" +followConfirm: "Czy na pewno chcesz zaobserwować {name}?" +proxyAccount: "Konto proxy" +host: "Host" +selectUser: "Wybierz użytkownika" +recipient: "Odbiorca(-y)" +annotation: "Komentarze" +federation: "Federacja" +instances: "Serwery" +registeredAt: "Zarejestrowano" +latestRequestSentAt: "Ostatnie żądanie wysłano o" +latestRequestReceivedAt: "Ostatnie żądanie otrzymano o" +latestStatus: "Najnowszy status" +storageUsage: "Użycie pamięci" +charts: "Wykresy" +perHour: "co godzinę" +perDay: "co dzień" +stopActivityDelivery: "Przestań przesyłać aktywności" +blockThisInstance: "Zablokuj ten serwer" +operations: "Działania" +software: "Oprogramowanie" +version: "Wersja" +metadata: "Metadane" +monitor: "Monitor" +jobQueue: "Kolejka zadań" +cpuAndMemory: "CPU i pamięć" +network: "Sieć" +disk: "Dysk" +instanceInfo: "Informacje o serwerze" +statistics: "Statystyki" +clearQueue: "Wyczyść kolejkę" +clearQueueConfirmTitle: "Czy na pewno chcesz wyczyścić kolejkę?" +clearQueueConfirmText: "Wszystkie niewysłane wpisy z kolejki nie zostaną wysłane. + Zwykle to nie jest konieczne." +clearCachedFiles: "Wyczyść pamięć podręczną" +clearCachedFilesConfirm: "Czy na pewno chcesz usunąć wszystkie zdalne pliki z pamięci + podręcznej?" +blockedInstances: "Zablokowane serwery" +blockedInstancesDescription: "Wypisz nazwy hostów serwerów, które chcesz zablokować. + Wymienione serwery nie będą mogły dłużej komunikować się z tym serwerem." +muteAndBlock: "Wyciszenia i blokady" +mutedUsers: "Wyciszeni użytkownicy" +blockedUsers: "Zablokowani użytkownicy" +noUsers: "Brak użytkowników" +editProfile: "Edytuj profil" +noteDeleteConfirm: "Czy na pewno chcesz usunąć ten wpis?" +pinLimitExceeded: "Nie możesz przypiąć więcej wpisów" +intro: "Zakończono instalację Calckey! Utwórz konto administratora." +done: "Gotowe" +processing: "Przetwarzanie" +preview: "Podgląd" +default: "Domyślne" +defaultValueIs: "Domyślne: {value}" +noCustomEmojis: "Brak emoji" +noJobs: "Brak zadań" +federating: "Federowanie" +blocked: "Zablokowano" +suspended: "Zawieszono" +all: "Wszystkie" +subscribing: "Subskrybowanie" +publishing: "Publikowanie" +notResponding: "Nie odpowiada" +instanceFollowing: "Obserwowani na serwerze" +instanceFollowers: "Obserwujący na serwerze" +instanceUsers: "Użytkownicy tego serwera" +changePassword: "Zmień hasło" +security: "Bezpieczeństwo" +retypedNotMatch: "Wejście nie zgadza się." +currentPassword: "Obecne hasło" +newPassword: "Nowe hasło" +newPasswordRetype: "Powtórz nowe hasło" +attachFile: "Załącz pliki" +more: "Więcej!" +featured: "Wyróżnione" +usernameOrUserId: "Nazwa lub id użytkownika" +noSuchUser: "Nie znaleziono użytkownika" +lookup: "Zapytania" +announcements: "Ogłoszenia" +imageUrl: "Adres URL obrazka" +remove: "Usuń" +removed: "Pomyślnie usunięto" +removeAreYouSure: "Czy na pewno chcesz usunąć „{x}”?" +deleteAreYouSure: "Czy na pewno chcesz usunąć „{x}”?" +resetAreYouSure: "Czy na pewno chcesz zresetować?" +saved: "Zapisano" +messaging: "Wiadomości" +upload: "Wyślij" +keepOriginalUploading: "Zachowaj oryginalny obraz" +fromDrive: "Z dysku" +fromUrl: "Z adresu URL" +uploadFromUrl: "Wyślij z adresu URL" +uploadFromUrlDescription: "Adres URL pliku, który chcesz wysłać" +uploadFromUrlRequested: "Zażądano wysłania" +uploadFromUrlMayTakeTime: "Wysyłanie może chwilę potrwać." +explore: "Eksploruj" +messageRead: "Przeczytano" +noMoreHistory: "Nie ma dalszej historii" +startMessaging: "Rozpocznij czat" +nUsersRead: "przeczytano przez {n}" +agreeTo: "Wyrażam zgodę na {0}" +tos: "Regulamin" +start: "Rozpocznij" +home: "Strona główna" +remoteUserCaution: "Te informacje mogą nie być aktualne, ponieważ użytkownik pochodzi + ze zdalnej instancji." +activity: "Aktywność" +images: "Zdjęcia" +birthday: "Data urodzenia" +yearsOld: "{age} lat" +registeredDate: "Zarejestrowano" +location: "Lokalizacja" +theme: "Motywy" +themeForLightMode: "Motyw używany w trybie jasnym" +themeForDarkMode: "Motyw używany w trybie ciemnym" +light: "Jasny" +dark: "Ciemny" +lightThemes: "Jasny motyw" +darkThemes: "Ciemny motyw" +syncDeviceDarkMode: "Synchronizuj ciemny motyw z ustawieniami urządzenia" +drive: "Dysk" +fileName: "Nazwa pliku" +selectFile: "Wybierz plik" +selectFiles: "Wybierz pliki" +selectFolder: "Wybierz folder" +selectFolders: "Wybierz foldery" +renameFile: "Zmień nazwę pliku" +folderName: "Nazwa katalogu" +createFolder: "Utwórz katalog" +renameFolder: "Zmień nazwę katalogu" +deleteFolder: "Usuń ten katalog" +addFile: "Dodaj plik" +emptyDrive: "Dysk jest pusty" +emptyFolder: "Ten katalog jest pusty" +unableToDelete: "Nie można usunąć" +inputNewFileName: "Wprowadź nową nazwę pliku" +inputNewDescription: "Proszę wpisać nowy napis" +inputNewFolderName: "Wprowadź nową nazwę katalogu" +circularReferenceFolder: "Katalog docelowy jest podkatalogiem katalogu, który chcesz + przenieść." +hasChildFilesOrFolders: "Ponieważ ten katalog nie jest pusty, nie może być usunięty." +copyUrl: "Skopiuj adres URL" +rename: "Zmień nazwę" +avatar: "Awatar" +banner: "Baner" +nsfw: "NSFW" +whenServerDisconnected: "Po utracie połączenia z serwerem" +disconnectedFromServer: "Utracono połączenie z serwerem" +reload: "Odśwież" +doNothing: "Ignoruj" +reloadConfirm: "Czy chcesz odświeżyć oś czasu?" +watch: "Śledź" +unwatch: "Przestań śledzić" +accept: "Akceptuj" +reject: "Odrzuć" +normal: "Normalny" +instanceName: "Nazwa serwera" +instanceDescription: "Opis serwera" +maintainerName: "Administrator" +maintainerEmail: "E-mail administratora" +tosUrl: "Adres URL regulaminu" +thisYear: "Rok" +thisMonth: "Miesiąc" +today: "Dziś" +dayX: "{day}" +monthX: "{month}" +yearX: "{year}" +pages: "Strony" +integration: "Integracje" +connectService: "Połącz" +disconnectService: "Rozłącz" +enableLocalTimeline: "Włącz lokalną oś czasu" +enableGlobalTimeline: "Włącz globalną oś czasu" +disablingTimelinesInfo: "Administratorzy i moderatorzy będą zawsze mieć dostęp do + wszystkich osi czasu, nawet gdy są one wyłączone." +registration: "Zarejestruj się" +enableRegistration: "Włącz rejestrację nowych użytkowników" +invite: "Zaproś" +driveCapacityPerLocalAccount: "Powierzchnia dyskowa na lokalnego użytkownika" +driveCapacityPerRemoteAccount: "Powierzchnia dyskowa na zdalnego użytkownika" +inMb: "W megabajtach" +iconUrl: "Adres URL ikony" +bannerUrl: "Adres URL banera" +backgroundImageUrl: "Adres URL tła" +basicInfo: "Podstawowe informacje" +pinnedUsers: "Przypięty użytkownik" +pinnedUsersDescription: "Wypisz po jednej nazwie użytkownika w wierszu. Podani użytkownicy + zostaną przypięci pod kartą „Eksploruj”." +pinnedPages: "Przypięte strony" +pinnedPagesDescription: "Wprowadź ścieżki stron, które chcesz przypiąć do górnej strony + tego serwera, oddzielając je znakami końca wiersza." +pinnedClipId: "ID przypiętego klipu" +pinnedNotes: "Przypięty wpis" +hcaptcha: "hCaptcha" +enableHcaptcha: "Włącz hCaptcha" +hcaptchaSiteKey: "Klucz strony" +hcaptchaSecretKey: "Tajny klucz" +recaptcha: "reCAPTCHA" +enableRecaptcha: "Włącz reCAPTCHA" +recaptchaSiteKey: "Klucz strony" +recaptchaSecretKey: "Tajny klucz" +avoidMultiCaptchaConfirm: "Używanie wielu Captchy może spowodować zakłócenia. Czy + chcesz wyłączyć inną Captchę? Możesz zostawić wiele jednocześnie, klikając Anuluj." +antennas: "Anteny" +manageAntennas: "Zarządzaj antenami" +name: "Nazwa" +antennaSource: "Źródło anteny" +antennaKeywords: "Słowa kluczowe do obserwacji" +antennaExcludeKeywords: "Wykluczone słowa kluczowe" +antennaKeywordsDescription: "Oddziel spacjami dla warunku AND, albo wymuś koniec linii + dla warunku OR." +notifyAntenna: "Powiadamiaj o nowych wpisach" +withFileAntenna: "Filtruj tylko wpisy z załączonym plikiem" +enableServiceworker: "Włącz powiadomienia push dla twojej przeglądarki" +antennaUsersDescription: "Wypisz po jednej nazwie użytkownika w linii" +caseSensitive: "Wielkość liter ma znaczenie" +withReplies: "Uwzględnij odpowiedzi" +connectedTo: "Następujące konta są połączone" +notesAndReplies: "Wpisy i odpowiedzi" +withFiles: "Media" +silence: "Wycisz" +silenceConfirm: "Czy na pewno chcesz wyciszyć tego użytkownika?" +unsilence: "Cofnij wyciszenie" +unsilenceConfirm: "Czy na pewno chcesz cofnąć wyciszenie tego użytkownika?" +popularUsers: "Popularni użytkownicy" +recentlyUpdatedUsers: "Ostatnio aktywni użytkownicy" +recentlyRegisteredUsers: "Ostatnio zarejestrowani użytkownicy" +recentlyDiscoveredUsers: "Ostatnio odkryci użytkownicy" +exploreUsersCount: "Jest {count} użytkowników" +exploreFediverse: "Eksploruj Fediwersum" +popularTags: "Tagi na czasie" +userList: "Listy" +about: "Informacje" +aboutMisskey: "O Calckey" +administrator: "Admin" +token: "Token" +twoStepAuthentication: "Uwierzytelnianie dwuskładnikowe" +moderator: "Moderator" +moderation: "Moderacja" +nUsersMentioned: "{n} wspomnianych użytkowników" +securityKey: "Klucz bezpieczeństwa" +securityKeyName: "Nazwa klucza" +registerSecurityKey: "Zarejestruj klucz bezpieczeństwa" +lastUsed: "Ostatnio używane" +unregister: "Cofnij rejestrację" +passwordLessLogin: "Skonfiguruj logowanie bez użycia hasła" +resetPassword: "Zresetuj hasło" +newPasswordIs: "Nowe hasło to „{password}”" +reduceUiAnimation: "Ogranicz animacje w UI" +share: "Udostępnij" +notFound: "Nie znaleziono" +notFoundDescription: "Nie ma strony odpowiadającej określonemu adresowi URL." +uploadFolder: "Domyślne położenie wysłanych" +cacheClear: "Wyczyść pamięć podręczną" +markAsReadAllNotifications: "Oznacz wszystkie powiadomienia jako przeczytane" +markAsReadAllUnreadNotes: "Oznacz wszystkie wpisy jako przeczytane" +markAsReadAllTalkMessages: "Oznacz wszystkie wiadomości jako przeczytane" +help: "Pomoc" +inputMessageHere: "Wprowadź wiadomość tutaj" +close: "Zamknij" +group: "Grupa" +groups: "Grupy" +createGroup: "Utwórz grupę" +ownedGroups: "Posiadane grupy" +joinedGroups: "Członkostwa w grupach" +invites: "Zaproś" +groupName: "Nazwa grupy" +members: "Członkowie" +transfer: "Transfer" +messagingWithUser: "Rozmowy z innym użytkownikiem" +messagingWithGroup: "Rozmowy wewnątrz grupy" +title: "Tytuł" +text: "Tekst" +enable: "Włącz" +next: "Dalej" +retype: "Wprowadź ponownie" +noteOf: "Wpisy {user}" +inviteToGroup: "Zaproś do grupy" +quoteAttached: "Zacytowano" +quoteQuestion: "Czy na pewno chcesz umieścić cytat?" +noMessagesYet: "Nie napisano jeszcze wiadomości" +newMessageExists: "Masz nową wiadomość" +onlyOneFileCanBeAttached: "Możesz załączyć tylko jeden plik do wiadomości" +signinRequired: "Proszę się zalogować" +invitations: "Zaproś" +invitationCode: "Kod zaproszenia" +checking: "Sprawdzam..." +available: "Dostępna" +unavailable: "Niedostępna" +usernameInvalidFormat: "Nazwa użytkownika może zawierać litery, cyfry i podkreślniki." +tooShort: "Zbyt krótka" +tooLong: "Zbyt długa" +weakPassword: "Słabe hasło" +normalPassword: "Dobre hasło" +strongPassword: "Silne hasło" +passwordMatched: "Pasuje" +passwordNotMatched: "Hasła nie pasują do siebie" +signinWith: "Zaloguj się z {x}" +signinFailed: "Nie udało się zalogować. Wprowadzona nazwa użytkownika lub hasło są + nieprawidłowe." +tapSecurityKey: "Wybierz swój klucz bezpieczeństwa" +or: "Lub" +language: "Język" +uiLanguage: "Język wyświetlania UI" +groupInvited: "Zaproszony(-a) do grupy" +aboutX: "O {x}" +useOsNativeEmojis: "Używaj natywnych Emoji systemu" +disableDrawer: "Nie używaj menu w stylu szuflady" +youHaveNoGroups: "Nie masz żadnych grup" +joinOrCreateGroup: "Uzyskaj zaproszenie do dołączenia do grupy lub utwórz własną grupę." +noHistory: "Brak historii" +signinHistory: "Historia logowania" +disableAnimatedMfm: "Wyłącz MFM z animacją" +doing: "Przetwarzanie..." +category: "Kategoria" +tags: "Tagi" +docSource: "Źródło tego dokumentu" +createAccount: "Utwórz konto" +existingAccount: "Istniejące konto" +regenerate: "Wygeneruj ponownie" +fontSize: "Rozmiar czcionki" +noFollowRequests: "Nie masz żadnych oczekujących próśb o możliwość obserwacji" +openImageInNewTab: "Otwórz obraz w nowej karcie" +dashboard: "Kokpit" +local: "Lokalne" +remote: "Zdalny" +total: "Łącznie" +weekOverWeekChanges: "Cotygodniowo" +dayOverDayChanges: "Codziennie" +appearance: "Wygląd" +clientSettings: "Ustawienia klienta" +accountSettings: "Ustawienia konta" +promotion: "Promowane" +promote: "Promuj" +numberOfDays: "Liczba dni" +hideThisNote: "Ukryj ten wpis" +showFeaturedNotesInTimeline: "Pokazuj wyróżnione wpisy w osi czasu" +objectStorage: "Pamięć obiektowa" +useObjectStorage: "Używaj pamięci obiektowej" +objectStorageBaseUrl: "Podstawowy URL" +objectStorageBucket: "Bucket" +objectStorageBucketDesc: "Podaj nazwę „wiadra” używaną przez konfigurowaną usługę." +objectStoragePrefix: "Prefiks" +objectStoragePrefixDesc: "Pliki będą przechowywane w katalogu z tym prefiksem." +objectStorageEndpoint: "Punkt końcowy" +objectStorageEndpointDesc: "Pozostaw puste jeżeli używasz AWS S3, w innym wypadku + określ punkt końcowy jako '' lub ':' zgodnie z instrukcjami usługi, + której używasz." +objectStorageRegion: "Region" +objectStorageRegionDesc: "Określ region, np. 'xx-east-1'. Jeżeli usługa której używasz + nie zawiera rozróżnienia regionów, pozostaw to pustym lub wprowadź 'us-east-1'." +objectStorageUseSSL: "Użyj SSL" +objectStorageUseSSLDesc: "Wyłącz, jeżeli nie zamierzasz używać HTTPS dla połączenia + z API" +objectStorageUseProxy: "Połącz przez proxy" +objectStorageUseProxyDesc: "Wyłącz, jeżeli nie zamierzasz używać proxy dla połączenia + z pamięcią blokową" +serverLogs: "Dziennik zdarzeń" +deleteAll: "Usuń wszystkie" +showFixedPostForm: "Wyświetlaj formularz tworzenia wpisu w górnej części osi czasu" +newNoteRecived: "Masz nowy wpis" +sounds: "Dźwięk" +listen: "Słuchaj" +none: "Brak" +showInPage: "Pokaż na stronie" +popout: "Popout" +volume: "Głośność" +masterVolume: "Głośność główna" +details: "Szczegóły" +chooseEmoji: "Wybierz emoji" +unableToProcess: "Nie udało się dokończyć działania" +recentUsed: "Ostatnio używane" +install: "Zainstaluj" +uninstall: "Odinstaluj" +installedApps: "Autoryzowane aplikacje" +nothing: "Nie ma tu niczego" +installedDate: "Autoryzowano" +lastUsedDate: "Ostatnie użycie" +state: "Stan" +sort: "Sortuj" +ascendingOrder: "Rosnąco" +descendingOrder: "Malejąco" +scratchpad: "Brudnopis" +scratchpadDescription: "Brudnopis to środowisko dla eksperymentów z AiScript. Możesz + pisać, wykonywać i sprawdzać wyniki interakcji skryptu z Calckey." +output: "Wyjście" +script: "Skrypt" +disablePagesScript: "Wyłącz AiScript na Stronach" +updateRemoteUser: "Aktualizuj zdalne dane o użytkowniku" +deleteAllFiles: "Usuń wszystkie pliki" +deleteAllFilesConfirm: "Czy na pewno chcesz usunąć wszystkie pliki?" +removeAllFollowingDescription: "Wykonanie tego polecenia spowoduje usunięcie wszystkich + kont z {host}. Zrób to, jeśli serwer np. już nie istnieje." +userSuspended: "To konto zostało zawieszone." +userSilenced: "Ten użytkownik został wyciszony." +yourAccountSuspendedTitle: "To konto jest zawieszone" +yourAccountSuspendedDescription: "To konto zostało zawieszone z powodu złamania regulaminu + serwera lub innych podobnych. Skontaktuj się z administratorem, jeśli chciałbyś + poznać bardziej szczegółowy powód. Proszę nie zakładać nowego konta." +menu: "Menu" +divider: "Rozdzielacz" +addItem: "Dodaj element" +relays: "Przekaźniki" +addRelay: "Dodaj przekaźnik" +inboxUrl: "Adres URL skrzynki nadawczej" +addedRelays: "Dodane przekaźniki" +serviceworkerInfo: "Musi być włączone dla powiadomień push." +deletedNote: "Usunięty wpis" +invisibleNote: "Niewidzialny wpis" +enableInfiniteScroll: "Włącz nieskończone przewijanie" +visibility: "Widoczność" +poll: "Ankieta" +useCw: "Ukryj zawartość" +enablePlayer: "Otwórz odtwarzacz wideo" +disablePlayer: "Zamknij odtwarzacz wideo" +expandTweet: "Rozwiń tweet" +themeEditor: "Edytor motywu" +description: "Opis" +describeFile: "Dodaj podpis" +enterFileDescription: "Wprowadź napis" +author: "Autor" +leaveConfirm: "Są niezapisane zmiany. Czy chcesz je odrzucić?" +manage: "Zarządzanie" +plugins: "Wtyczki" +deck: "Tablica" +useBlurEffectForModal: "Używaj efektu rozmycia w modalach" +useFullReactionPicker: "Używaj pełnowymiarowego wybornika reakcji" +width: "Szerokość" +height: "Wysokość" +large: "Duże" +medium: "Średnie" +small: "Małe" +generateAccessToken: "Generuj token dostępu" +permission: "Uprawnienia" +enableAll: "Włącz wszystko" +disableAll: "Wyłącz wszystko" +tokenRequested: "Przydziel dostęp do konta" +pluginTokenRequestedDescription: "Ta wtyczka będzie mogła korzystać z ustawionych + tu uprawnień." +notificationType: "Rodzaj powiadomień" +edit: "Edytuj" +emailServer: "Serwer poczty e-mail" +enableEmail: "Włącz dostarczanie wiadomości e-mail" +emailConfigInfo: "Wykorzystywany do potwierdzenia adresu e-mail w trakcie rejestracji, + lub gdy zapomnisz hasła" +email: "Adres e-mail" +emailAddress: "Adres e-mail" +smtpConfig: "Konfiguracja serwera SMTP" +smtpHost: "Host" +smtpPort: "Port" +smtpUser: "Nazwa użytkownika" +smtpPass: "Hasło" +emptyToDisableSmtpAuth: "Pozostaw adres e-mail i hasło puste, aby wyłączyć weryfikację + SMTP" +smtpSecureInfo: "Wyłącz, jeżeli używasz STARTTLS" +testEmail: "Przetestuj dostarczanie wiadomości e-mail" +wordMute: "Wyciszenie słowa" +instanceMute: "Wyciszenie serwera" +userSaysSomething: "{name} powiedział* coś" +makeActive: "Aktywuj" +display: "Wyświetlanie" +copy: "Kopiuj" +metrics: "Pomiary" +overview: "Przegląd" +logs: "Dzienniki" +delayed: "Opóźnione" +database: "Baza danych" +channel: "Kanały" +create: "Utwórz" +notificationSetting: "Ustawienia powiadomień" +notificationSettingDesc: "Wybierz rodzaj powiadomień do wyświetlania." +useGlobalSetting: "Użyj globalnych ustawień" +useGlobalSettingDesc: "Jeżeli włączone, zostaną wykorzystane ustawienia powiadomień + Twojego konta. Jeżeli wyłączone, mogą zostać wykonane oddzielne konfiguracje." +other: "Inne" +regenerateLoginToken: "Generuj token logowania ponownie" +regenerateLoginTokenDescription: "Regeneruje token używany wewnętrznie podczas logowania. + Zazwyczaj nie jest to konieczne. Po regeneracji wszystkie urządzenia zostaną wylogowane." +setMultipleBySeparatingWithSpace: "Możesz ustawić wiele, oddzielając je spacjami." +fileIdOrUrl: "ID pliku albo URL" +behavior: "Zachowanie" +sample: "Przykład" +abuseReports: "Zgłoszenia" +reportAbuse: "Zgłoś" +reportAbuseOf: "Zgłoś {name}" +fillAbuseReportDescription: "Wypełnij szczegóły zgłoszenia. Jeżeli dotyczy ono określonego + wpisu, uwzględnij jego adres URL." +abuseReported: "Twoje zgłoszenie zostało wysłane. Dziękujemy." +reporteeOrigin: "Pochodzenie osoby zgłoszonej" +reporterOrigin: "Pochodzenie osoby zgłaszającej" +forwardReport: "Przekaż zgłoszenie do zdalnego serwera" +send: "Wyślij" +abuseMarkAsResolved: "Oznacz zgłoszenie jako rozwiązane" +openInNewTab: "Otwórz w nowej karcie" +openInSideView: "Otwórz w bocznym widoku" +defaultNavigationBehaviour: "Domyślne zachowanie nawigacji" +editTheseSettingsMayBreakAccount: "Edycja tych ustawień może uszkodzić Twoje konto." +instanceTicker: "Informacje o wpisach serwera" +waitingFor: "Oczekiwanie na {x}" +random: "Losowe" +system: "System" +switchUi: "Layout" +desktop: "Pulpit" +clip: "Klip" +createNew: "Utwórz nowy" +optional: "Nieobowiązkowe" +createNewClip: "Utwórz nowy klip" +unclip: "Odczep" +confirmToUnclipAlreadyClippedNote: "Ten wpis jest już częścią klipu \"{name}\". Czy + chcesz ją usunąć z tego klipu?" +public: "Publiczny" +i18nInfo: "Calckey jest tłumaczone na wiele języków przez wolontariuszy. Możesz pomóc + na {link}." +manageAccessTokens: "Zarządzaj tokenami dostępu" +accountInfo: "Informacje o koncie" +notesCount: "Liczba wpisów" +repliesCount: "Liczba wysłanych odpowiedzi" +renotesCount: "Liczba wysłanych podbić" +repliedCount: "Liczba otrzymanych odpowiedzi" +renotedCount: "Liczba otrzymanych podbić" +followingCount: "Liczba obserwowanych kont" +followersCount: "Liczba obserwujących" +sentReactionsCount: "Liczba wysłanych reakcji" +receivedReactionsCount: "Liczba otrzymanych reakcji" +pollVotesCount: "Liczba wysłanych głosów w ankietach" +pollVotedCount: "Liczba otrzymanych głosów w ankietach" +yes: "Tak" +no: "Nie" +driveFilesCount: "Liczba plików na dysku" +driveUsage: "Użycie przestrzeni dyskowej" +noCrawle: "Odrzuć indeksowanie przez crawlery" +noCrawleDescription: "Proś wyszukiwarki internetowe, aby nie indeksowały Twojego profilu, + wpisów, stron itd." +lockedAccountInfo: "Dopóki nie ustawisz widoczności wpisu na \"Obserwujący\", twoje + wpisy będą mogli widzieć wszyscy, nawet jeśli ustawisz manualne zatwierdzanie obserwujących." +alwaysMarkSensitive: "Oznacz domyślnie jako NSFW" +loadRawImages: "Wyświetlaj zdjęcia w załącznikach w całości zamiast miniatur" +disableShowingAnimatedImages: "Nie odtwarzaj animowanych obrazów" +verificationEmailSent: "Wiadomość weryfikacyjna została wysłana. Odwiedź uwzględniony + odnośnik, aby ukończyć weryfikację." +notSet: "Nie ustawiono" +emailVerified: "Adres e-mail został potwierdzony" +noteFavoritesCount: "Liczba zakładek" +pageLikesCount: "Liczba otrzymanych polubień stron" +pageLikedCount: "Liczba polubionych stron" +contact: "Kontakt" +useSystemFont: "Używaj domyślnej czcionki systemu" +clips: "Klipy" +experimentalFeatures: "Eksperymentalne funkcje" +developer: "Programista" +makeExplorable: "Pokazuj konto na stronie „Eksploruj”" +makeExplorableDescription: "Jeżeli wyłączysz tę opcję, Twoje konto nie będzie wyświetlać + się w sekcji „Eksploruj”." +showGapBetweenNotesInTimeline: "Pokazuj odstęp między wpisami na osi czasu" +duplicate: "Duplikuj" +left: "Lewo" +center: "Wyśrodkuj" +wide: "Szerokie" +narrow: "Wąskie" +reloadToApplySetting: "To ustawienie zostanie zastosowane po odświeżeniu strony. Chcesz + odświeżyć?" +needReloadToApply: "To ustawienie zostanie zastosowane po odświeżeniu strony." +showTitlebar: "Pokazuj pasek tytułowy" +clearCache: "Wyczyść pamięć podręczną" +onlineUsersCount: "{n} osób jest online" +nUsers: "{n} użytkowników" +nNotes: "{n} wpisów" +sendErrorReports: "Wyślij raporty o błędach" +myTheme: "Mój motyw" +backgroundColor: "Tło" +accentColor: "Akcent" +textColor: "Tekst" +saveAs: "Zapisz jako…" +advanced: "Zaawansowane" +value: "Wartość" +createdAt: "Utworzono" +updatedAt: "Zaktualizowano" +saveConfirm: "Zapisać zmiany?" +deleteConfirm: "Na pewno usunąć?" +invalidValue: "Nieprawidłowa wartość." +registry: "Rejestr" +closeAccount: "Zamknij konto" +currentVersion: "Bieżąca wersja" +latestVersion: "Najnowsza wersja" +youAreRunningUpToDateClient: "Korzystasz z najnowszej wersji klienta." +newVersionOfClientAvailable: "Nowsza wersja klienta jest dostępna." +usageAmount: "Użycie" +capacity: "Pojemność" +inUse: "Użyto" +editCode: "Edytuj kod" +apply: "Zastosuj" +receiveAnnouncementFromInstance: "Otrzymuj powiadomienia e-mail z tego serwera" +emailNotification: "Powiadomienia e-mail" +publish: "Publikuj" +inChannelSearch: "Szukaj na kanale" +useReactionPickerForContextMenu: "Otwórz wybornik reakcji prawym kliknięciem" +typingUsers: "{users} pisze/ą" +jumpToSpecifiedDate: "Przejdź do określonej daty" +showingPastTimeline: "Obecnie wyświetla starą oś czasu" +clear: "Wróć" +markAllAsRead: "Oznacz wszystkie jako przeczytane" +goBack: "Wróć" +unlikeConfirm: "Na pewno chcesz usunąć polubienie?" +fullView: "Pełny widok" +quitFullView: "Opuść pełny widok" +addDescription: "Dodaj opis" +userPagePinTip: "Możesz wyświetlać wpisy w tym miejscu po wybraniu \"Przypnij do profilu\"\ + \ z menu pojedynczego wpisu." +notSpecifiedMentionWarning: "Ten wpis zawiera wzmianki o użytkownikach niezawartych + jako odbiorcy" +info: "Informacje" +userInfo: "Informacje o użykowniku" +unknown: "Nieznane" +onlineStatus: "Status online" +hideOnlineStatus: "Ukryj status online" +hideOnlineStatusDescription: "Ukrywanie statusu online ogranicza wygody niektórych + funkcji, takich jak wyszukiwanie." +online: "Online" +active: "Aktywny" +offline: "Offline" +notRecommended: "Nie zalecane" +botProtection: "Zabezpieczenie przed botami" +instanceBlocking: "Zarządzanie federacją" +selectAccount: "Wybierz konto" +switchAccount: "Przełącz konto" +enabled: "Właczono" +disabled: "Wyłączono" +quickAction: "Szybkie działania" +user: "Użytkownicy" +administration: "Zarządzanie" +accounts: "Konta" +switch: "Przełącz" +noMaintainerInformationWarning: "Informacje o administratorze nie są skonfigurowane." +noBotProtectionWarning: "Zabezpieczenie przed botami nie jest skonfigurowane." +configure: "Skonfiguruj" +postToGallery: "Opublikuj w galerii" +gallery: "Galeria" +recentPosts: "Ostatnie wpisy" +popularPosts: "Popularne wpisy" +shareWithNote: "Udostępnij z wpisem" +ads: "Reklamy" +expiration: "Ankieta kończy się" +memo: "Notatki" +priority: "Priorytet" +high: "Wysoki" +middle: "Średnie" +low: "Niski" +emailNotConfiguredWarning: "Nie podano adresu e-mail." +ratio: "Stosunek" +previewNoteText: "Pokaż podgląd" +customCss: "Własny CSS" +customCssWarn: "Używaj tego ustawienia tylko wtedy, gdy wiesz co ono robi. Nieprawidłowe + wpisy mogą spowodować, że klient przestanie działać poprawnie." +global: "Globalna" +squareAvatars: "Wyświetlaj kwadratowe awatary" +sent: "Wysłane" +received: "Otrzymane" +searchResult: "Wyniki wyszukiwania" +hashtags: "Hashtag" +troubleshooting: "Rozwiązywanie problemów" +useBlurEffect: "Użyj efektów rozmycia w UI" +learnMore: "Dowiedz się więcej" +misskeyUpdated: "Calckey zostało zaktualizowane!" +whatIsNew: "Pokaż zmiany" +translate: "Przetłumacz" +translatedFrom: "Przetłumaczone z {x}" +accountDeletionInProgress: "Trwa usuwanie konta" +usernameInfo: "Nazwa, która identyfikuje Twoje konto spośród innych na tym serwerze.\ + \ Możesz użyć alfabetu (a~z, A~Z), cyfr (0~9) lub podkreślników (_). Nazwy użytkownika + nie mogą być później zmieniane." +aiChanMode: "Ai-chan w klasycznym interfejsie" +keepCw: "Zostaw ostrzeżenia o zawartości" +pubSub: "Konta Pub/Sub" +resolved: "Rozwiązane" +unresolved: "Nierozwiązane" +breakFollow: "Usuń obserwującego" +itsOn: "Włączone" +itsOff: "Wyłączone" +unread: "Nieodczytane" +filter: "Filtr" +controlPanel: "Panel sterowania" +manageAccounts: "Zarządzaj kontami" +makeReactionsPublic: "Ustaw historię reakcji jako publiczną" +makeReactionsPublicDescription: "To spowoduje, że lista wszystkich Twoich dotychczasowych + reakcji będzie publicznie widoczna." +classic: "Wyśrodkowany" +muteThread: "Wycisz wątek" +unmuteThread: "Wyłącz wyciszenie wątku" +ffVisibility: "Widoczność obserwowanych/obserwujących" +ffVisibilityDescription: "Pozwala skonfigurować, kto może zobaczyć, kogo obserwujesz + i kto Cię obserwuje." +continueThread: "Kontynuuj wątek" +deleteAccountConfirm: "Spowoduje to nieodwracalne usunięcie Twojego konta. Kontynuować?" +incorrectPassword: "Nieprawidłowe hasło." +voteConfirm: "Potwierdzić swój głos na \"{choice}\"?" +hide: "Ukryj" +leaveGroup: "Opuść grupę" +leaveGroupConfirm: "Czy na pewno chcesz opuścić \"{name}\"?" +useDrawerReactionPickerForMobile: "Wyświetlaj wybornik reakcji jako szufladę na urządzeniach + mobilnych" +welcomeBackWithName: "Witaj z powrotem, {name}" +clickToFinishEmailVerification: "Kliknij [{ok}], aby zakończyć weryfikację e-mail." +overridedDeviceKind: "Typ urządzenia" +smartphone: "Smartfon" +tablet: "Tablet" +auto: "Automatycznie" +size: "Rozmiar" +numberOfColumn: "Liczba kolumn" +searchByGoogle: "Szukaj" +indefinitely: "Dożywotnio" +file: "Pliki" +logoutConfirm: "Czy na pewno chcesz się wylogować?" +lastActiveDate: "Ostatnio użyte w" +statusbar: "Pasek stanu" +pleaseSelect: "Wybierz opcję" +reverse: "Odwróć" +colored: "Kolorowe" +label: "Etykieta" +type: "Typ" +speed: "Prędkość" +localOnly: "Tylko lokalne" +failedToUpload: "Przesyłanie nie powiodło się" +cannotUploadBecauseInappropriate: "Nie można przesłać tego pliku, ponieważ jego części + zostały wykryte jako potencjalnie nieodpowiednie." +cannotUploadBecauseNoFreeSpace: "Przesyłanie nie powiodło się z powodu braku miejsca + na dysku." +beta: "Beta" +enableAutoSensitive: "Automatyczne oznaczanie NSFW" +enableAutoSensitiveDescription: "Umożliwia automatyczne wykrywanie i oznaczanie zawartości + NSFW za pomocą uczenia maszynowego tam, gdzie to możliwe. Nawet jeśli ta opcja jest + wyłączona, może być włączona na całym serwerze." +navbar: "Pasek nawigacyjny" +account: "Konta" +move: "Przenieś" +_sensitiveMediaDetection: + description: "Zmniejsza wysiłek związany z moderacją serwera dzięki automatycznemu + rozpoznawaniu zawartości NSFW za pomocą uczenia maszynowego. To nieznacznie zwiększy + obciążenie serwera." + setSensitiveFlagAutomatically: "Oznacz jako NSFW" + sensitivity: Czułość wykrywania + analyzeVideosDescription: Analizuje filmy, w dodatku do zdjęć. Zwiększy to nieznacznie + zużycie serwera. + sensitivityDescription: Zmniejszenie czułości doprowadzi do mniejszej liczby błędnych + wykryć (fałszywie pozytywnych), podczas gdy zwiększenie czułości doprowadzi do + mniejszej liczby brakujących wykryć (fałszywie negatywnych). + setSensitiveFlagAutomaticallyDescription: Wyniki wykrywania wewnętrznego zostaną + zachowane, nawet jeśli ta opcja jest wyłączona. + analyzeVideos: Włącz analizę filmów +_emailUnavailable: + used: "Ten adres e-mail jest już używany" + format: "Format tego adresu e-mail jest nieprawidłowy" + disposable: "Nie można używać jednorazowych adresów e-mail" + mx: "Ten serwer e-mail jest nieprawidłowy" + smtp: "Ten serwer e-mail nie odpowiada" +_ffVisibility: + public: "Publiczne" + followers: "Widoczne tylko dla obserwujących" + private: "Prywatne" +_signup: + almostThere: "Prawie na miejscu" + emailAddressInfo: "Podaj swój adres e-mail. Nie zostanie on upubliczniony." + emailSent: "E-mail z potwierdzeniem został wysłany na Twój adres e-mail ({email}). + Kliknij dołączony link, aby dokończyć tworzenie konta." +_accountDelete: + accountDelete: "Usuń konto" + mayTakeTime: "Ponieważ usuwanie konta jest procesem wymagającym dużej ilości zasobów, + jego ukończenie może zająć trochę czasu, w zależności od ilości utworzonej zawartości + i liczby przesłanych plików." + sendEmail: "Po zakończeniu usuwania konta na adres e-mail zarejestrowany na tym + koncie zostanie wysłana wiadomość e-mail." + requestAccountDelete: "Poproś o usunięcie konta" + started: "Usuwanie się rozpoczęło." + inProgress: "Usuwanie jest obecnie w toku" +_ad: + back: "Wróć" + reduceFrequencyOfThisAd: "Pokazuj tę reklamę rzadziej" +_forgotPassword: + enterEmail: "Wpisz adres e-mail użyty do rejestracji. Zostanie do niego wysłany + link, za pomocą którego możesz zresetować hasło." + ifNoEmail: "Jeśli nie użyłeś adresu e-mail podczas rejestracji, skontaktuj się z + administratorem serwera." + contactAdmin: "Ten serwer nie obsługuje adresów e-mail, zamiast tego skontaktuj + się z administratorem serwera, aby zresetować hasło." +_gallery: + my: "Moja galeria" + liked: "Polubione wpisy" + like: "Polub" + unlike: "Cofnij polubienie" +_email: + _follow: + title: "Zaobserwował* Cię" + _receiveFollowRequest: + title: "Otrzymano prośbę o możliwość obserwacji" +_plugin: + install: "Zainstaluj wtyczki" + installWarn: "Nie instaluj niezaufanych wtyczek." + manage: "Zarządzanie wtyczkami" +_preferencesBackups: + list: "Utworzone kopie zapasowe" + saveNew: "Zapisz nową kopię zapasową" + loadFile: "Załaduj z pliku" + apply: "Zastosuj do tego urządzenia" + save: "Zapisz zmiany" + inputName: "Proszę podać nazwę dla tej kopii zapasowej" + cannotSave: "Zapisanie nie powiodło się" + nameAlreadyExists: "Kopia zapasowa o nazwie \"{name}\" już istnieje. Proszę podać + inną nazwę." + applyConfirm: "Czy na pewno chcesz zastosować kopię zapasową \"{name}\" na tym urządzeniu? + Istniejące ustawienia tego urządzenia zostaną nadpisane." + saveConfirm: "Zapisać kopię zapasową jako {name}?" + deleteConfirm: "Usunąć kopię zapasową {name}?" + renameConfirm: "Zmienić nazwę kopii zapasowej z \"{old}\" na \"{new}\"?" + createdAt: "Utworzono w: {date} {time}" + updatedAt: "Zaktualizowano w: {date} {time}" + cannotLoad: "Ładowanie nie powiodło się" + invalidFile: "Nieprawidłowy format pliku" + noBackups: Nie znaleziono kopii zapasowych. Możesz utworzyć kopię zapasową twoich + ustawień klienta na tym serwerze poprzez użycie “Utwórz nową kopię zapasową”. +_registry: + scope: "Zakres" + key: "Klucz" + keys: "Klucz" + domain: "Domena" + createKey: "Utwórz klucz" +_aboutMisskey: + about: "Calckey jest forkiem Misskey utworzonym przez ThatOneCalculator, rozwijanym + od 2022." + contributors: "Główni twórcy" + allContributors: "Wszyscy twórcy" + source: "Kod źródłowy" + translation: "Tłumacz Calckey" + donate: "Przekaż darowiznę na Calckey" + morePatrons: "Naprawdę doceniam wsparcie ze strony wielu niewymienionych tu osób. + Dziękuję! 🥰" + patrons: "Wspierający" +_nsfw: + respect: "Ukrywaj media NSFW" + ignore: "Nie ukrywaj mediów NSFW" + force: "Ukrywaj wszystkie media" +_mfm: + cheatSheet: "Ściąga MFM" + intro: "MFM jest językiem składniowym używanym przez m.in. Calckey, forki *key (w + tym Calckey), oraz Akkomę, który może być użyty w wielu miejscach. Tu znajdziesz + listę wszystkich możliwych elementów składni MFM." + dummy: "Calckey rozszerza świat Fediwersum" + mention: "Wspomnij" + mentionDescription: "Używając znaku @ i nazwy użytkownika, możesz określić danego + użytkownika." + hashtag: "Hashtag" + hashtagDescription: "Używając kratki i tekstu, możesz określić hashtag." + url: "Adres URL" + urlDescription: "Adresy URL mogą być wyświetlane." + link: "Odnośnik" + linkDescription: "Określone części tekstu mogą być wyświetlane jako adres URL." + bold: "Pogrubienie" + boldDescription: "Wyróżnia litery pogrubiając je." + small: "Małe" + smallDescription: "Wyświetla treść jako małą i cienką." + center: "Wyśrodkowanie" + centerDescription: "Wyśrodkowuje zawartość." + inlineCode: "Kod (w wierszu)" + blockCode: "Kod (blok)" + blockCodeDescription: "Wyświetla kod z podświetlaną składnią składający się z wielu + linii." + blockMath: "Matematyka (Blok)" + quote: "Cytuj" + quoteDescription: "Wyświetla treść jako cytat." + emoji: "Niestandardowe emoji" + emojiDescription: "Otaczając nazwę niestandardowego emoji dwukropkami, możesz użyć + niestandardowego emoji." + search: "Szukaj" + searchDescription: "Wyświetla pole wyszukiwania z wcześniej wpisanym tekstem." + flip: "Odwróć" + flipDescription: "Przerzuca treść poziomo lub pionowo." + jelly: "Animacja (Galaretka)" + jellyDescription: "Nadaje treści galaretowatą animację." + tada: "Animacja (Tada)" + tadaDescription: "Nadaje treści animację podobną do \"Tada!\"." + jump: "Animacja (Skok)" + jumpDescription: "Nadaje treści animację skakania." + bounce: "Animacja (Odbijanie)" + bounceDescription: "Nadaje treści animację odbijania się." + shake: "Animacja (Wstrząsanie)" + shakeDescription: "Nadaje treści animację wstrząsania." + twitch: "Animacja (Drganie)" + twitchDescription: "Nadaje treści mocno drgającą animację." + spin: "Animacja (Obrót)" + spinDescription: "Nadaje treści animację obracania." + x2: "Duże" + x2Description: "Czyni treść większą." + x3: "Bardzo duże" + x3Description: "Czyni treść jeszcze większą." + x4: "Ogromne" + x4Description: "Czyni treść nawet większą niż jeszcze większa." + blur: "Rozmycie" + blurDescription: "Rozmywa treść. Zostanie wyraźnie wyświetlona po najechaniu." + font: "Czcionka" + fontDescription: "Wybiera czcionkę do wyświetlania treści." + rainbow: "Tęcza" + rainbowDescription: "Sprawia, że zawartość pojawia się w kolorach tęczy." + sparkle: "Blask" + sparkleDescription: "Nadaje zawartości efekt lśniącego brokatu." + rotate: "Obrót" + rotateDescription: "Obraca zawartość o określony kąt." + plain: "Zwyczajny" + plainDescription: "Wyłącza efekty wszystkich MFM zawartych w tym efekcie MFM." + inlineCodeDescription: Wyświetla podświetlanie składni dla kodu (programu) w linii. + inlineMath: Matematyka (Inline) + inlineMathDescription: Pokaż formuły matematyczne (KaTeX) w linii + blockMathDescription: Pokaż wieloliniowe formuły matematyczne (KaTeX) w bloku + background: Kolor tła + backgroundDescription: Zmień kolor tła tekstu. + foregroundDescription: Zmień kolor pierwszoplanowy tekstu. + positionDescription: Przesuń zawartość o określoną wartość. + position: Pozycjonuj + foreground: Kolor pierwszoplanowy + scaleDescription: Skaluj treść o określoną wielkość. + scale: Skaluj +_instanceTicker: + none: "Nigdy nie pokazuj" + remote: "Pokaż dla zdalnych użytkowników" + always: "Zawsze pokazuj" +_serverDisconnectedBehavior: + reload: "Automatycznie odśwież" + dialog: "Pokazuj okno ostrzeżenia" + quiet: "Pokazuj nieirytujące ostrzeżenia" + nothing: Nic nie rób +_channel: + create: "Utwórz kanał" + edit: "Edytuj kanał" + setBanner: "Ustaw baner" + removeBanner: "Usuń baner" + featured: "Na czasie" + owned: "Własny" + following: "Śledzeni" + usersCount: "{n} uczestnicy" + notesCount: "{n} wpisy" + nameAndDescription: Nazwa i opis + nameOnly: Tylko nazwa +_menuDisplay: + top: "Góra" + hide: "Ukryj" + sideFull: Z boku + sideIcon: Z boku (tylko ikony) +_wordMute: + muteWords: "Słowo do wyciszenia" + muteWordsDescription2: "Otocz słowa kluczowe ukośnikami, aby używać wyrażeń regularnych." + soft: "Łagodny" + hard: "Twardy" + mutedNotes: "Wyciszone wpisy" + muteWordsDescription: Rozdzielaj spacją dla kondycji AND, lub przerwaniem wiersza + dla kondycji OR. + softDescription: Ukryj z osi czasu wpisy, które spełniają podane warunki. + hardDescription: Zapobiega dodawania do osi czasu wpisów, które spełniają podane + warunki. Dodatkowo, te wpisy nie zostaną dodane do osi czasu, jeśli warunki się + zmienią. +_instanceMute: + title: "Ukrywa wpisy z wymienionych instancji." + heading: "Lista instancji do wyciszenia" + instanceMuteDescription2: Oddzielaj nowymi liniami + instanceMuteDescription: Spowoduje to wyciszenie wszystkich wpisów/podbić z podanych + instancji, w tym tych od użytkowników odpowiadających na wpisy z wyciszonych instancji. +_theme: + explore: "Przeglądaj motywy" + install: "Zainstaluj motyw" + manage: "Zarządzanie motywami" + code: "Kod motywu" + description: "Opis" + installed: "Zainstalowano {name}" + installedThemes: "Zainstalowane motywy" + builtinThemes: "Wbudowane motywy" + alreadyInstalled: "Motyw jest już zainstalowany" + invalid: "Format motywu jest nieprawidłowy" + make: "Utwórz motyw" + base: "Podstawowy" + addConstant: "Dodaj stałą" + constant: "Stała" + defaultValue: "Domyślna wartość" + color: "Kolor" + refProp: "Nawiąż do właściwości" + refConst: "Nawiąż do stałej" + key: "Klucz" + func: "Funkcje" + funcKind: "Rodzaj funkcji" + argument: "Argument" + basedProp: "Nawiązana właściwość" + alpha: "Przezroczystość" + darken: "Ściemnij" + lighten: "Rozjaśnij" + inputConstantName: "Wprowadź nazwę stałej" + importInfo: "Jeżeli wprowadzisz tu kod motywu, możesz zaimportować go w edytorze + motywu" + deleteConstantConfirm: "Czy na pewno chcesz usunąć stałą {const}?" + keys: + accent: "Akcent" + bg: "Tło" + fg: "Tekst" + focus: "Skupienie" + indicator: "Wskaźnik" + panel: "Panel" + shadow: "Cień" + header: "Nagłówek" + navBg: "Tło paska bocznego" + navFg: "Tekst paska bocznego" + navHoverFg: "Tekst paska bocznego (zbliżenie)" + navActive: "Tekst paska bocznego (aktywny)" + navIndicator: "Wskaźnik paska bocznego" + link: "Odnośnik" + hashtag: "Hashtag" + mention: "Wspomnij" + mentionMe: "Wspomnienia (ja)" + renote: "Podbij" + modalBg: "Tło modalu" + divider: "Rozdzielacz" + scrollbarHandle: "Uchwyt paska przewijania" + scrollbarHandleHover: "Uchwyt paska przewijania (po najechaniu)" + dateLabelFg: "Tekst z datą" + infoBg: "Tło informacji" + infoFg: "Tekst informacji" + infoWarnBg: "Tło ostrzeżenia" + infoWarnFg: "Tekst ostrzeżenia" + cwBg: "Tło CW" + cwFg: "Tekst CW" + cwHoverBg: "Tło CW (po najechaniu)" + toastBg: "Tło powiadomień" + toastFg: "Tekst powiadomień" + buttonBg: "Tło przycisku" + buttonHoverBg: "Tło przycisku (po najechaniu)" + inputBorder: "Obramowanie pola wejścia" + listItemHoverBg: "Tło elementu listy (po najechaniu)" + driveFolderBg: "Tło folderu na dysku" + wallpaperOverlay: "Nakładka tapety" + badge: "Odznaka" + messageBg: "Tło czatu" + accentDarken: "Akcent (ciemniejszy)" + accentLighten: "Akcent (jaśniejszy)" + fgHighlighted: "Wyróżniony tekst" +_sfx: + note: "Wpisy" + noteMy: "Mój wpis" + notification: "Powiadomienia" + chat: "Wiadomości" + chatBg: "Rozmowy (tło)" + antenna: "Anteny" + channel: "Powiadomienia kanału" +_ago: + future: "W przyszłości" + justNow: "Przed chwilą" + secondsAgo: "{n} sek. temu" + minutesAgo: "{n} min. temu" + hoursAgo: "{n} godz. temu" + daysAgo: "{n} dni temu" + weeksAgo: "{n} tyg. temu" + monthsAgo: "{n} mies. temu" + yearsAgo: "{n} lat temu" +_time: + second: "sekunda" + minute: "minuta" + hour: "godz." + day: "dzień" +_tutorial: + title: "Jak korzystać z Calckey" + step1_1: "Witamy!" + step1_2: "Pozwól, że Cię skonfigurujemy. Będziesz działać w mgnieniu oka!" + step2_1: "Najpierw, proszę wypełnij swój profil." + step2_2: "Podanie kilku informacji o tym, kim jesteś, ułatwi innym stwierdzenie, + czy chcą zobaczyć Twoje wpisy lub śledzić Cię." + step3_1: "Pora znaleźć osoby do śledzenia!" + step3_2: "Twoje domowe i społeczne linie czasu opierają się na tym, kogo śledzisz, + więc spróbuj śledzić kilka kont, aby zacząć.\nKliknij kółko z plusem w prawym + górnym rogu profilu, aby go śledzić." + step4_1: "Pozwól, że zabierzemy Cię tam." + step4_2: "W pierwszym wpisie możesz się przedstawić lub wysłać powitanie - \"Witaj, + świecie!\"" + step5_1: "Osie czasu, wszędzie widzę osie czasu!" + step5_2: "Twoja instancja ma włączone {timelines} różne osie czasu." + step5_3: "Główna {icon} oś czasu to miejsce, w którym możesz zobaczyć posty od użytkowników + których obserwujesz, oraz innych użytkowników z tej instancji. Jeśli wolisz, by + główna oś czasu pokazywała tylko posty od użytkowników których obserwujesz, możesz + łatwo to zmienić w ustawieniach!" + step5_4: "Lokalna {icon} oś czasu to miejsce, w którym możesz zobaczyć posty od + wszystkich innych osób na tej instancji." + step5_5: "Społeczna {icon} oś czasu to miejsce, gdzie możesz zobaczyć posty z instancji, + które admini polecają." + step5_6: "Polecana {icon} oś czasu to miejsce, gdzie możesz zobaczyć posty z instancji, + które admini polecają." + step5_7: "Globalna {icon} oś czasu to miejsce, gdzie możesz zobaczyć posty z każdej + innej połączonej instancji." + step6_1: "Więc, czym to jest to miejsce?" + step6_2: "Cóż, nie dołączył*ś po prostu do Calckey. Dołączył*ś do portalu do Fediverse, + połączonej sieci tysięcy serwerów, zwanych instancjami." + step6_3: "Każdy serwer działa w inny sposób, i nie wszystkie serwery używają Calckey. + Ten jednak używa! Jest to trochę skomplikowane, ale w krótkim czasie załapiesz + o co chodzi." + step6_4: "A teraz idź, odkrywaj i baw się dobrze!" +_2fa: + alreadyRegistered: "Zarejestrowałeś już urządzenie do uwierzytelniania dwuskładnikowego." + registerTOTP: "Zarejestruj nowe urządzenie" + registerSecurityKey: "Zarejestruj klucz bezpieczeństwa" + step1: "Najpierw, zainstaluj aplikację uwierzytelniającą (taką jak {a} lub {b}) + na swoim urządzeniu." + step2: "Następnie, zeskanuje kod QR z ekranu." + step3: "Wprowadź token podany w aplikacji, aby ukończyć konfigurację." + step4: "Od teraz, przy każdej próbie logowania otrzymasz prośbę o token logowania." + step2Url: 'Możesz też wpisać ten URL jeśli używasz programu komputerowego:' + securityKeyInfo: Oprócz uwierzytelnienia odciskiem palców lub PIN, możesz również + skonfigurować uwierzytelnienie za pomocą kluczy sprzętowych obsługujących FIDO2, + w celu dalszego zabezpieczenia Twojego konta. +_permissions: + "read:account": "Wyświetlanie informacji o twoim koncie" + "write:account": "Edycja informacji o twoim koncie" + "read:blocks": "Wyświetlanie listy zablokowanych użytkowników" + "write:blocks": "Blokowanie i odblokowywanie użytkowników" + "read:drive": "Wyświetlanie plików i folderów z twojego Dysku" + "write:drive": "Edycja i usuwanie plików i katalogów z Twojego dysku" + "read:favorites": "Wyświetlanie Twoich zakładek" + "write:favorites": "Edycja Twoich zakładek" + "read:following": "Wyświetlanie informacji o obserwowanych" + "write:following": "Obserwowanie lub cofanie obserwacji innych kont" + "read:messaging": "Wyświetlanie twoich czatów" + "read:mutes": "Wyświetlanie listy wyciszonych osób" + "write:mutes": "Edycja listy wyciszonych osób" + "read:notifications": "Wyświetlanie powiadomień" + "write:notifications": "Działanie na powiadomieniach" + "read:reactions": "Wyświetlanie reakcji" + "write:reactions": "Edycja reakcji" + "write:votes": "Głosowanie w ankiecie" + "read:pages": "Wyświetlanie Twoich stron" + "write:pages": "Edycja i usuwanie Twoich stron" + "read:page-likes": "Wyświetlanie polubień na stronach" + "write:page-likes": "Edycja polubień na stronach" + "read:user-groups": "Wyświetlanie grup użytkownika" + "write:user-groups": "Edycja i usuwanie grup użytkownika" + "read:channels": "Wyświetlenie Twoich kanałów" + "write:channels": "Edycja Twoich kanałów" + "read:gallery": "Wyświetlenie Twojej galerii" + "write:gallery": "Edycja Twojej galerii" + "write:messaging": Tworzenie i usuwanie wiadomości czatu + "write:notes": Tworzenie i usuwanie wpisów + "read:gallery-likes": Wyświetlenie Twojej listy z polubionymi postami galerii + "write:gallery-likes": Edycja Twojej listy z polubionymi postami galerii +_auth: + shareAccess: "Czy chcesz autoryzować „{name}” do dostępu do tego konta?" + permissionAsk: "Ta aplikacja wymaga następujących uprawnień:" + denied: Odmowa dostępu + copyAsk: Proszę wpisz następujący kod autoryzacyjny w aplikacji + shareAccessAsk: Czy na pewno chcesz upoważnić tą aplikację do dostępu do Twojego + konta? + pleaseGoBack: Wróć do aplikacji + callback: Wracam do aplikacji +_weekday: + sunday: "Niedziela" + monday: "Poniedziałek" + tuesday: "Wtorek" + wednesday: "Środa" + thursday: "Czwartek" + friday: "Piątek" + saturday: "Sobota" +_widgets: + memo: "Przypięte notatki" + notifications: "Powiadomienia" + timeline: "Oś czasu" + calendar: "Kalendarz" + trends: "Na czasie" + clock: "Zegar" + rss: "Czytnik RSS" + activity: "Aktywność" + photos: "Zdjęcia" + digitalClock: "Zegar cyfrowy" + unixClock: "Zegar UNIX" + federation: "Federacja" + instanceCloud: "Chmura instancji" + postForm: "Formularz tworzenia wpisu" + slideshow: "Pokaz slajdów" + button: "Przycisk" + onlineUsers: "Użytkownicy online" + jobQueue: "Kolejka zadań" + serverMetric: "Metryka serwera" + aiscript: "Konsola AiScript" + aichan: "Ai" + rssTicker: Ticker RSS + userList: Lista użytkowników + _userList: + chooseList: Wybierz listę +_cw: + hide: "Ukryj" + show: "Załaduj więcej" + chars: "{count} znak(-i/-ów)" + files: "{count} plik(-i/-ów)" +_poll: + noOnlyOneChoice: "Wymagane są przynajmniej dwie opcje" + choiceN: "Opcja {n}" + noMore: "Nie możesz dodać więcej opcji" + canMultipleVote: "Pozwól na wiele odpowiedzi" + expiration: "Ankieta kończy się" + infinite: "Nigdy" + at: "Zakończ o…" + after: "Zakończ po…" + deadlineDate: "Data zakończenia" + deadlineTime: "godz." + duration: "Czas trwania" + votesCount: "{n} głosów" + totalVotes: "Łącznie {n} głosów" + vote: "Głosowanie w ankiecie" + showResult: "Pokaż wyniki" + voted: "Zagłosowano" + closed: "Zakończono" + remainingDays: "Pozostało {d} dni i {h} godzin" + remainingHours: "Pozostali {h} godzin i {m} minut" + remainingMinutes: "Pozostało {m} minut i {s} sekund" + remainingSeconds: "Pozostało {s} sekund" +_visibility: + public: "Publiczny" + publicDescription: "Wpis pojawi się u wszystkich" + home: "Niewidoczny" + followers: "Obserwujący" + specified: "Bezpośredni" + specifiedDescription: "Napisz tylko określonym użytkownikom" + homeDescription: Wpis będzie publiczny ale nie pojawi się na osi czasu instancji + followersDescription: Wpis pojawi się tylko na osiach czasu Twoich obserwujących + localOnly: Lokalnie + localOnlyDescription: Wpis będzie widoczny tylko dla użytkowników tej instancji +_postForm: + _placeholders: + a: "Co się dzieje?" + b: "Co się wydarzyło?" + c: "Co Ci chodzi po głowie?" + d: "Czy masz coś do powiedzenia?" + e: "Zacznij coś pisać…" + f: "Czekamy, aż coś napiszesz." + quotePlaceholder: Cytuj ten wpis... + channelPlaceholder: Wyślij na kanał... + replyPlaceholder: Odpowiedz na ten wpis... +_profile: + name: "Nazwa" + username: "Nazwa użytkownika" + description: "Opis" + youCanIncludeHashtags: "Możesz umieścić hashtagi w swoim opisie." + metadata: "Dodatkowe informacje" + metadataEdit: "Edytuj dodatkowe informacje" + metadataDescription: "Możesz wyświetlać do czterech sekcji dodatkowych informacji + na swoim profilu." + metadataLabel: "Etykieta" + metadataContent: "Treść" + changeAvatar: "Zmień awatar" + changeBanner: "Zmień baner" + locationDescription: Jeśli wpiszesz z początku swoje miasto, twój czas lokalny będzie + się pokazywać innym użytkownikom. +_exportOrImport: + allNotes: "Wszystkie wpisy" + followingList: "Obserwowani" + muteList: "Wycisz" + blockingList: "Zablokuj" + userLists: "Listy" + excludeMutingUsers: Wyklucz wyciszonych użytkowników + excludeInactiveUsers: Wyklucz nieaktywnych użytkowników +_charts: + federation: "Federacja" + apRequest: "Żądania" + usersTotal: "Łącznie # użytkowników" + activeUsers: "Aktywni użytkownicy" + storageUsageTotal: Łączne użycie dysku + filesIncDec: Różnica w liczbie plików + filesTotal: Łączna liczba plików + storageUsageIncDec: Różnica w wykorzystaniu miejsca + localNotesIncDec: Różnica w liczbie lokalnych wpisów + remoteNotesIncDec: Różnica w liczbie zdalnych wpisów + notesTotal: Łączna liczba wpisów + usersIncDec: Różnica w liczbie użytkowników + notesIncDec: Różnica w liczbie wpisów +_instanceCharts: + requests: "Żądania" + notesTotal: "Łącznie # wpisów" + ff: "Różnica w # obserwujących " + ffTotal: "Łączna liczba # obserwujących" + cacheSize: "Różnica w rozmiarze pamięci podręcznej" + cacheSizeTotal: "Łączny rozmiar pamięci podręcznej" + files: "Różnica # plików" + filesTotal: "Łącznie # plików" + usersTotal: Łączna liczba użytkowników + users: Różnica w liczbie użytkowników + notes: Różnica w liczbie wpisów +_timelines: + home: "Strona główna" + local: "Lokalne" + social: "Społeczna" + global: "Globalna" + recommended: Polecana +_pages: + newPage: "Utwórz stronę" + editPage: "Edytuj tę stronę" + readPage: "Aktywowano widok źródła" + created: "Pomyślnie utworzono stronę" + updated: "Pomyślnie zaktualizowano stronę" + deleted: "Pomyślnie usunięto stronę" + pageSetting: "Ustawienia strony" + nameAlreadyExists: "Określony adres URL strony już istnieje" + invalidNameTitle: "Podany adres URL strony jest nieprawidłowy" + invalidNameText: "Upewnij się, że pole tytułowe strony nie jest puste" + editThisPage: "Edytuj tę stronę" + viewSource: "Zobacz źródło" + viewPage: "Wyświetlanie Twoich stron" + like: "Lubię" + unlike: "Cofnij polubienie" + my: "Moje strony" + liked: "Polubione strony" + featured: "Popularne" + inspector: "Inspektor" + contents: "Zawartość" + content: "Blok strony" + variables: "Zmienne" + title: "Tytuł" + url: "URL strony" + summary: "Podsumowanie strony" + alignCenter: "Wyśrodkuj elementy" + hideTitleWhenPinned: "Ukryj tytuł strony, gdy przypięta do profilu" + font: "Czcionka" + fontSerif: "Szeryfowa" + fontSansSerif: "Bezszeryfowa" + eyeCatchingImageSet: "Ustaw miniaturę" + eyeCatchingImageRemove: "Usuń miniaturę" + chooseBlock: "Dodaj blok" + selectType: "Wybierz typ" + enterVariableName: "Wprowadź nazwę dla swojej zmiennej" + variableNameIsAlreadyUsed: "Ta nazwa jest już używana przez inną zmienną" + contentBlocks: "Zawartość" + inputBlocks: "Wejście" + specialBlocks: "Specjalne" + blocks: + text: "Tekst" + textarea: "Pole tekstowe" + section: "Sekcja" + image: "Zdjęcia" + button: "Przycisk" + if: "Jeżeli" + _if: + variable: "Zmienna" + post: "Utwórz wpis" + _post: + text: "Treść" + attachCanvasImage: Załącz obraz płótna + canvasId: ID płótna + textInput: "Pole tekstowe" + _textInput: + name: "Nazwa zmiennej" + text: "Tytuł" + default: "Domyślna wartość" + textareaInput: "Wielowierszowe pole tekstowe" + _textareaInput: + name: "Nazwa zmiennej" + text: "Tytuł" + default: "Domyślna wartość" + numberInput: "Pole na liczbę" + _numberInput: + name: "Nazwa zmiennej" + text: "Tytuł" + default: "Domyślna wartość" + _canvas: + width: "Szerokość" + height: "Wysokość" + id: ID płótna + note: "Osadzony wpis" + _note: + id: "ID wpisu" + idDescription: "Możesz też wkleić adres URL wpisu, aby go ustawić." + detailed: "Szczegółowy widok" + switch: "Przełącznik" + _switch: + name: "Nazwa zmiennej" + text: "Tytuł" + default: "Domyślna wartość" + counter: "Licznik" + _counter: + name: "Nazwa zmiennej" + text: "Tytuł" + inc: "Zwiększ o" + _button: + text: "Tytuł" + colored: "Kolorowe" + action: "Działanie wykonywane przy naciśnięciu przycisku" + _action: + dialog: "Pokazuj okno dialogowe" + _dialog: + content: "Treść" + resetRandom: "Resetuj losowe ziarno" + pushEvent: "Wyślij zdarzenie" + _pushEvent: + event: "Nazwa zdarzenia" + message: "Wiadomość do wyświetlenia po aktywowaniu" + variable: "Zmienna do wysłania" + no-variable: "Brak" + callAiScript: "Wywołaj AiScript" + _callAiScript: + functionName: "Nazwa funkcji" + radioButton: "Wybór" + _radioButton: + name: "Nazwa zmiennej" + title: "Tytuł" + values: "Lista wyborów (oddzielonych znakiem nowego wiersza)" + default: "Domyślna wartość" + canvas: Płótno + script: + categories: + flow: "Kontrola przepływu" + logical: "Operacje logiczne" + operation: "Obliczanie" + comparison: "Porównanie" + random: "Losowe" + value: "Wartość" + fn: "Funkcje" + text: "Działania na tekście" + convert: "Transformacja" + list: "Listy" + blocks: + text: "Tekst" + multiLineText: "Tekst (w wielu wierszach)" + _textList: + info: "Oddziel każdy wpis znakiem nowego wiersza" + strLen: "Długość tekstu" + _strLen: + arg1: "Tekst" + _strPick: + arg1: "Tekst" + arg2: "Położenie znaku" + strReplace: "Zamiana tekstu" + _strReplace: + arg1: "Tekst" + arg2: "Tekst do zamiany" + arg3: "Zamieniono z" + _strReverse: + arg1: "Tekst" + _join: + arg1: "Listy" + arg2: "Odstęp" + add: "Dodaj" + _add: + arg1: "A" + arg2: "B" + subtract: "Odejmij" + _subtract: + arg1: "A" + arg2: "B" + multiply: "Pomnóż" + _multiply: + arg1: "A" + arg2: "B" + divide: "Podziel" + _divide: + arg1: "A" + arg2: "B" + mod: "Reszta" + _mod: + arg1: "A" + arg2: "B" + _round: + arg1: "Liczba" + eq: "A i B są sobie równe" + _eq: + arg1: "A" + arg2: "B" + notEq: "A i B różnią się" + _notEq: + arg1: "A" + arg2: "B" + and: "A I B" + _and: + arg1: "A" + arg2: "B" + or: "A LUB B" + _or: + arg1: "A" + arg2: "B" + lt: "< A jest mniejsze niż B" + _lt: + arg1: "A" + arg2: "B" + gt: "> A jest większe od B" + _gt: + arg1: "A" + arg2: "B" + ltEq: "<= A jest mniejsze lub równe B" + _ltEq: + arg1: "A" + arg2: "B" + gtEq: ">= A jest większe lub równe B" + _gtEq: + arg1: "A" + arg2: "B" + if: "Warunek" + _if: + arg1: "Jeżeli" + arg2: "Wtedy" + arg3: Inaczej + not: "NIE" + _not: + arg1: "NIE" + random: "Losowe" + _random: + arg1: "Prawdopodobieństwo" + rannum: "Losowa liczba" + _rannum: + arg1: "Minimalna wartość" + arg2: "Maksymalna wartość" + randomPick: "Wybierz losowo z listy" + _randomPick: + arg1: "Listy" + dailyRandom: "Losowo (zmienia się raz dziennie dla każdego użytkownika)" + _dailyRandom: + arg1: "Prawdopodobieństwo" + dailyRannum: "Losowa liczba (zmienia się raz dziennie dla każdego użytkownika)" + _dailyRannum: + arg1: "Minimalna wartość" + arg2: "Maksymalna wartość" + dailyRandomPick: "Wybierz losowo z listy (zmienia się raz dziennie dla każdegoużytkownika)" + _dailyRandomPick: + arg1: "Listy" + seedRandom: "Losowo (z ziarnem)" + _seedRandom: + arg1: "Ziarno" + arg2: "Prawdopodobieństwo" + seedRannum: "Losowa liczba (z ziarnem)" + _seedRannum: + arg1: "Ziarno" + arg2: "Minimalna wartość" + arg3: "Maksymalna wartość" + seedRandomPick: "Wybierz losowo z listy (z ziarnem)" + _seedRandomPick: + arg1: "Ziarno" + arg2: "Listy" + DRPWPM: "Wybierz losowo z ważonej listy (zmienia się raz dziennie dla każdegoużytkownika)" + pick: "Wybierz z listy" + _pick: + arg1: "Listy" + arg2: "Położenie" + listLen: "Uzyskaj długość listy" + _listLen: + arg1: "Listy" + number: "Liczba" + stringToNumber: "Tekst na liczbę" + _stringToNumber: + arg1: "Tekst" + numberToString: "Liczba na tekst" + _numberToString: + arg1: "Liczba" + splitStrByLine: "Rozdziel tekst znakami nowej linii" + _splitStrByLine: + arg1: "Tekst" + ref: "Zmienne" + aiScriptVar: "Zmienna AiScript" + fn: "Funkcje" + _fn: + arg1: "Wyjście" + slots-info: Oddziel każde gniazdo nową linią + slots: Gniazda + for: "Powtórzenie" + _for: + arg1: "Liczba powtórzeń" + arg2: "Działanie" + textList: Lista tekstowa + strPick: Wyciągaczka ciągu znaków + strReverse: Odwróć tekst + join: Łączenie tekstu + round: Zaokrąglanie wartości dziesiętnych + _DRPWPM: + arg1: Lista tekstowa + types: + string: "Tekst" + number: "Liczba" + boolean: "Flaguj" + array: "Listy" + stringArray: Lista tekstowa + enviromentVariables: "Zmienna środowiskowa" + pageVariables: "Element strony" + argVariables: Gniazda wejściowe + typeError: Gniazdo {slot} akceptuje wartości typu “{expect}”, lecz wprowadzona + wartość jest typu “{actual}”! + thereIsEmptySlot: Gniazdo {slot} jest puste! + emptySlot: Puste gniazdo +_relayStatus: + requesting: "Oczekujące" + accepted: "Zaakceptowano" + rejected: "Odrzucono" +_notification: + fileUploaded: "Pomyślnie wysłano plik" + youGotMention: "{name} wspomniał* o Tobie" + youGotReply: "{name} odpowiedział* Tobie" + youGotQuote: "{name} zacytował* Ciebie" + youRenoted: "{name} podbił* Twój wpis" + youGotPoll: "{name} zagłosował* w Twojej ankiecie" + youGotMessagingMessageFromUser: "{name} wysłał* Ci wiadomość" + youGotMessagingMessageFromGroup: "Została wysłana wiadomość do grupy {name}" + youWereFollowed: "Zaobserwował* Cię" + youReceivedFollowRequest: "Otrzymał*ś prośbę o możliwość obserwacji" + yourFollowRequestAccepted: "Twoja prośba o możliwość obserwacji została przyjęta" + youWereInvitedToGroup: "{userName} zaprosił* Ciebie do grupy" + pollEnded: "Wyniki ankiety stały się dostępne" + emptyPushNotificationMessage: "Powiadomienia push zostały zaktualizowane" + _types: + all: "Wszystkie" + follow: "Nowi obserwujący" + mention: "Wspomnienia" + reply: "Odpowiedzi" + renote: "Podbicia" + quote: "Cytaty" + reaction: "Reakcje" + pollVote: "Głosy w ankietach" + receiveFollowRequest: "Otrzymane prośby o możliwość obserwacji" + followRequestAccepted: "Przyjęte prośby o możliwość obserwacji" + groupInvited: "Zaproszenia do grup" + app: "Powiadomienia z powiązanych aplikacji" + pollEnded: Zakończone ankiety + _actions: + followBack: "zaobserwował* cię z powrotem" + reply: "Odpowiedz" + renote: "Podbicia" +_deck: + alwaysShowMainColumn: "Zawsze pokazuj główną kolumnę" + columnAlign: "Wyrównaj kolumny" + addColumn: "Dodaj kolumnę" + configureColumn: "Ustawienia kolumny" + swapLeft: "Przesuń w lewo" + swapRight: "Przesuń w prawo" + swapUp: "Zamień z powyższym" + swapDown: "Zamień z poniższym" + stackLeft: "Przypnij do lewej" + popRight: "Odepnij w prawo" + profile: "Przestrzeń" + newProfile: "Nowa przestrzeń" + deleteProfile: "Usuń przestrzeń" + widgetsIntroduction: "Wybierz \"Edytuj widżety\" w menu kolumny i dodaj widżet." + _columns: + main: "Główna" + widgets: "Widżety" + notifications: "Powiadomienia" + tl: "Oś czasu" + antenna: "Anteny" + list: "Listy" + mentions: "Wspomnienia" + direct: "Bezpośrednie wiadomości" + introduction2: Kliknij + z prawej strony ekranu, by dodać nowe kolumny kiedy chcesz. + introduction: Utwórz idealny dla siebie interfejs, poprzez dowolne ustawianie kolumn! + renameProfile: Zmień nazwę przestrzeni + nameAlreadyExists: Ta nazwa przestrzeni już istnieje. +accountMoved: 'Użytkownik przeniósł się na nowe konto:' +flagShowTimelineRepliesDescription: Jeśli włączone, pokazuje odpowiedzi użytkowników + na wpisy innych użytkowników na osi czasu. +manageGroups: Zarządzaj grupami +objectStorageSetPublicRead: Ustaw "public-read" podczas wysyłania +removeAllFollowing: Przestań obserwować wszystkich obserwowanych użytkowników +smtpSecure: Użyj implicit SSL/TLS dla połączeń SMTP +secureMode: Tryb bezpieczny (Authorized Fetch) +instanceSecurity: Bezpieczeństwo serwera +privateMode: Tryb prywatny +allowedInstances: Dopuszczone serwery +recommended: Polecane +allowedInstancesDescription: Hosty serwerów, które mają być dopuszczone do federacji, + każdy oddzielony nowym wierszem (dotyczy tylko trybu prywatnego). +seperateRenoteQuote: Oddziel przyciski podbicia i cytowania +refreshInterval: 'Częstotliwość aktualizacji ' +slow: Wolna +_messaging: + dms: Prywatne + groups: Grupy +_antennaSources: + all: Wszystkie wpisy + users: Wpisy od konkretnych użytkowników + homeTimeline: Wpisy od obserwowanych użytkowników + userList: Wpisy od użytkowników z konkretnej listy + userGroup: Wpisy od użytkowników z konkretnej grupy + instances: Wpisy od wszystkich użytkowników na instancji +enableRecommendedTimeline: Włącz polecaną oś czasu +recentNDays: Ostatnie {n} dni +driveCapOverrideCaption: Zresetuj pojemność do domyślnej poprzed wpisanie wartości + 0 lub mniejszej. +requireAdminForView: Musisz zalogować się jako administrator, by to zobaczyć. +replayTutorial: Powtórz samouczek +migration: Migracja +moveTo: Przenieś obecne konto do nowego +moveToLabel: 'Konto na które się przenosisz:' +moveAccount: Przenieś konto! +moveAccountDescription: Ten proces jest nieodwracalny. Upewnij się, że utworzył*ś + alias dla tego konta na nowym koncie, przed rozpoczęciem. Proszę wpisz tag konta + w formacie @osoba@serwer.com +moveFrom: Przejdź ze starego konta na obecne +moveFromLabel: 'Konto które przenosisz:' +showUpdates: Pokaż pop-up po aktualizacji Calckey +swipeOnDesktop: Zezwól na przeciąganie w stylu mobilnym na desktopie +moveFromDescription: To utworzy alias twojego starego konta, w celu umożliwienia migracji + z tamtego konta na to. Zrób to ZANIM rozpoczniesz przenoszenie się z tamtego konta. + Proszę wpisz tag konta w formacie @osoba@serwer.com +migrationConfirm: "Czy jesteś absolutnie pewn* tego, że chcesz przenieść swoje konto + na {account}? Tego działania nie można odwrócić. Nieodwracalnie stracisz możliwość + normalnego korzystania z konta.\nUpewnij się, że to konto zostało ustawione jako + konto z którego się przenosisz." +noThankYou: Nie, dziękuję +addInstance: Dodaj serwer +renoteMute: Wycisz podbicia +renoteUnmute: Odcisz podbicia +flagSpeakAsCat: Mów jak kot +flagSpeakAsCatDescription: Twoje posty zostaną znya-izowane, gdy w trybie kota +selectInstance: Wybierz serwer +noInstances: Brak serwerów +keepOriginalUploadingDescription: Zapisuje oryginalne zdjęcie. Jeśli wyłączone, wersja + do wyświetlania w sieci zostanie wygenerowana podczas wysłania. +antennaInstancesDescription: Wymień jeden host serwera w każdym wierszu +regexpError: Błąd regularnego wyrażenia +regexpErrorDescription: 'Wystąpił błąd w regularnym wyrażeniu znajdującym się w linijce + {line} Twoich {tab} wyciszeń słownych:' +forwardReportIsAnonymous: Zamiast twojego konta, anonimowe konto systemowe będzie + wyświetlane jako zgłaszający na zdalnym serwerze. +breakFollowConfirm: Czy na pewno chcesz usunąć obserwującego? +instanceDefaultThemeDescription: Wpisz kod motywu w formacie obiektowym. +mutePeriod: Długość wyciszenia +tenMinutes: 10 minut +showLocalPosts: 'Pokaż lokalne wpisy w:' +socialTimeline: Społeczna oś czasu +homeTimeline: Główna oś czasu +reflectMayTakeTime: Może upłynąć trochę czasu, zanim pojawią się zmiany. +failedToFetchAccountInformation: Nie można uzyskać informacji o koncie +pushNotification: Powiadomienia push +subscribePushNotification: Włącz powiadomienia push +unsubscribePushNotification: Wyłącz powiadomienia push +pushNotificationAlreadySubscribed: Powiadomienia push są już włączone +pushNotificationNotSupported: Twoja przeglądarka lub serwer nie obsługuje powiadomień + push +sendPushNotificationReadMessage: Usuń powiadomienia push, gdy odpowiednie powiadomienia + lub wiadomości zostaną odczytane +sendPushNotificationReadMessageCaption: Powiadomienie zawierające tekst "{emptyPushNotificationMessage}" + zostanie wyświetlone przez krótką chwilę. Jeśli dotyczy, może to zwiększyć zużycie + baterii Twojego urządzenia. +defaultReaction: Domyślna reakcja emoji dla wychodzących i przychodzących wpisów +license: Licencja +indexPosts: Indeksuj wpisy +indexFrom: Indeksuj wpisy od ID +indexFromDescription: Zostaw puste dla indeksowania wszystkich wpisów +indexNotice: Indeksuję. Zapewne zajmie to chwilę, nie restartuj serwera przez co najmniej + godzinę. +customKaTeXMacro: Niestandardowe makra KaTeX +enableCustomKaTeXMacro: Włącz niestandardowe makra KaTeX +noteId: ID wpisu +hiddenTagsDescription: 'Wypisz tagi (bez #) hashtagów które masz zamiar ukryć z "Na + czasie" i "Eksploruj". Na ukryte hashtagi można dalej wejść innymi sposobami. Ta + lista nie ma wpływu na zablokowane instancje.' +proxyAccountDescription: Konto proxy jest kontem które w określonych sytuacjach zachowuje + się jak zdalny obserwujący. Na przykład, kiedy użytkownik dodaje zdalnego użytkownika + do listy, oraz żaden lokalny użytkownik nie obserwuje tego konta, aktywność owego + użytkownika nie zostanie dostarczona na oś czasu. W takim razie, użytkownika zaobserwuje + konto proxy. +objectStorageBaseUrlDesc: "URL stosowany jako odniesienie. Podaj URL twojego CDN, + albo proxy, jeśli używasz któregokolwiek.\nDla S3 użyj 'https://.s3.amazonaws.com', + a dla GCS i jego odpowiedników użyj 'https://storage.googleapis.com/', itd." +sendErrorReportsDescription: "Gdy ta opcja jest włączona, szczegółowe informacje o + błędach będą udostępnianie z Calckey gdy wystąpi problem, pomagając w ulepszaniu + Calckey.\nZawrze to informacje takie jak wersja twojego systemu operacyjnego, przeglądarki, + Twoja aktywność na Calckey itd." +privateModeInfo: Gdy ta opcja jest włączona, tylko serwery z białej listy mogą federować + się z twoim serwerem. Wszystkie posty będą ukryte publicznie. +oneHour: Godzina +oneDay: Dzień +oneWeek: Tydzień +recommendedInstances: Polecane serwery +recommendedInstancesDescription: Polecane serwery, mające pojawić się w odpowiedniej + osi czasu, oddzielane nowymi liniami. NIE dodawaj “https://”, TYLKO samą domenę. +rateLimitExceeded: Przekroczono ratelimit +cropImage: Kadruj zdjęcie +cropImageAsk: Czy chcesz skadrować to zdjęcie? +recentNHours: Ostatnie {n} godzin +noEmailServerWarning: Serwer email nie jest skonfigurowany. +thereIsUnresolvedAbuseReportWarning: Istnieją nierozwiązane zgłoszenia. +check: Sprawdź +driveCapOverrideLabel: Zmień pojemność dysku dla tego użytkownika +isSystemAccount: To konto jest tworzone i automatycznie obsługiwane przez system. + Nie moderuj, nie edytuj, nie usuwaj, ani w żaden inny sposób nie ingeruj w to konto, + bowiem może to uszkodzić twój serwer. +typeToConfirm: Wpisz {x} by potwierdzić +deleteAccount: Usuń konto +document: Dokumentacja +numberOfPageCache: Liczba zbuforowanych stron +numberOfPageCacheDescription: Zwiększenie tej liczby poprawi wygodę użytkowników, + ale spowoduje większe zużycie serwera, jak i pamięci. +fast: Szybka +sensitiveMediaDetection: Wykrywanie nieodpowiednich multimediów +remoteOnly: Tylko zdalne +activeEmailValidationDescription: Włącza ściślejszą walidację adresów e-mail, która + obejmuje sprawdzanie adresów jednorazowych oraz tego, czy rzeczywiście można się + z nim komunikować. Jeśli wyłączone, walidowany jest tylko format wiadomości e-mail. +shuffle: Losuj +showAds: Pokazuj reklamy +enterSendsMessage: Wciśnij Enter w komunikatorze, by wysłać wiadomość (domyślnie – + Ctrl + Enter) +adminCustomCssWarn: To ustawienie powinno być używane tylko pod warunkiem, że wiesz + za co ono odpowiada. Wpisanie niepoprawnych wartości może spowodować niepoprawne + działanie klientów KAŻDEGO użytkownika. Proszę upewnij się, że twój CSS działa poprawnie + poprzez przetestowanie go w ustawieniach twojego użytkownika. +customMOTD: Niestandardowe MOTD (wiadomości splash screen) +customMOTDDescription: Niestandardowe wiadomości dla MOTD (splash screen), oddzielane + nowymi liniami, mające pokazywać się za każdym razem gdy użytkownik ładuje/odświeża + stronę. +customSplashIcons: Niestandardowe ikony na splash screenie (URL-e) +customSplashIconsDescription: URL-e dla niestandardowych ikonych na splash screenie, + mające pokazywać się za każdym razem, gdy użytkownik ładuje/odświeża stronę, oddzielane + nowymi liniami. Upewnij się, że zdjęcia są na statycznych URL-ach, najlepiej o rozmiarze + 192x192. +caption: Auto opis +splash: Splash screen +updateAvailable: Może być dostępna aktualizacja! +logoImageUrl: URL grafiki loga +showAdminUpdates: Wskaż, że jest dostępna nowa wersja Calckey (tylko dla adminów) +hiddenTags: Ukryte hashtagi +userSaysSomethingReason: '{name} powiedział* {reason}' +customKaTeXMacroDescription: 'Skonfiguruj makra, aby łatwo pisać wyrażenia matematyczne! + Notacja jest zgodna z definicjami poleceń LaTeXa i zapisywana jest jako \newcommand{\nazwa}{treść} + lub \newcommand{\nazwa}[numer argumentów]{treść}. Na przykład, \newcommand{\add}[2]{#1 + + #2} rozszerzy \add{3}{foo} do 3 + foo. Nawiasy klamrowe otaczające nazwę makra + mogą być zmienione na nawiasy okrągłe lub kwadratowe. Wpłynie to na nawiasy używane + dla argumentów. W każdym wierszu można zdefiniować jedno (i tylko jedno) makro i + nie można przerwać linii w środku definicji. Nieprawidłowe linie są po prostu ignorowane. + Obsługiwane są tylko proste funkcje podstawiania łańcuchów; nie można tu stosować + zaawansowanej składni, takiej jak warunkowe rozgałęzienia.' +secureModeInfo: W przypadku żądań z innych serwerów nie odsyłaj bez dowodu. +preferencesBackups: Kopie zapasowe ustawień +undeck: Opuść tablicę +reporter: Osoba zgłaszająca +instanceDefaultDarkTheme: Domyślny ciemny motyw serwera +lastCommunication: Ostatnie połączenie +emailRequiredForSignup: Wymagaj adresu email przy rejestracji +themeColor: Kolor znacznika serwera +instanceDefaultLightTheme: Domyślny jasny motyw serwera +enableEmojiReactions: Włącz reakcje emoji +showEmojisInReactionNotifications: Pokazuj emoji w powiadomieniach reakcyjnych +apps: Aplikacje +silenceThisInstance: Wycisz ten serwer +silencedInstances: Wyciszone serwery +deleted: Usunięte +editNote: Edytuj wpis +edited: 'Edytowano o {date} {time}' +silenced: Wyciszony +findOtherInstance: Znajdź inny serwer +userSaysSomethingReasonReply: '{name} odpowiedział na wpis zawierający {reason}' +userSaysSomethingReasonRenote: '{name} podbił post zawierający {reason}' +signupsDisabled: Rejestracja na tym serwerze jest obecnie zamknięta, ale zawsze możesz + zarejestrować się na innym serwerze! Jeśli masz kod zaproszenia na ten serwer, wpisz + go poniżej. +userSaysSomethingReasonQuote: '{name} zacytował wpis zawierający {reason}' +silencedInstancesDescription: Wypisz nazwy hostów serwerów, które chcesz wyciszyć. + Konta na wymienionych serwerach są traktowane jako "Wyciszone", mogą jedynie wysyłać + prośby obserwacji i nie mogą oznaczać we wzmiankach profili lokalnych jeśli nie + są obserwowane. To nie będzie miało wpływu na zablokowane serwery. +cannotUploadBecauseExceedsFileSizeLimit: Ten plik nie mógł być przesłany, ponieważ + jego wielkość przekracza dozwolony limit. +sendModMail: Wyślij Powiadomienie Moderacyjne +searchPlaceholder: Szukaj Calckey +jumpToPrevious: Przejdź do poprzedniej sekcji +listsDesc: Listy umożliwiają tworzenie osi czasu z określonymi użytkownikami. Dostęp + do nich można uzyskać na stronie osi czasu. +accessibility: Dostępność +selectChannel: Wybierz kanał +antennasDesc: "Anteny wyświetlają nowe posty spełniające ustawione przez Ciebie kryteria!\n + Dostęp do nich można uzyskać ze strony osi czasu." +expandOnNoteClick: Otwórz post przy kliknięciu +expandOnNoteClickDesc: Jeśli opcja ta jest wyłączona, nadal będzie można otwierać + posty w menu po kliknięciu prawym przyciskiem myszy lub klikając znacznik czasowy. +channelFederationWarn: Kanały nie są jeszcze federowane z innymi serwerami +newer: nowsze +older: starsze +cw: Ostrzeżenie zawartości +removeReaction: Usuń reakcję diff --git a/fe_calckey/frontend/locales/pt-PT.yml b/fe_calckey/frontend/locales/pt-PT.yml new file mode 100644 index 0000000..3e15bee --- /dev/null +++ b/fe_calckey/frontend/locales/pt-PT.yml @@ -0,0 +1,732 @@ +--- +_lang_: "Português" +headlineMisskey: "Uma rede ligada por notas" +introMisskey: "Bem-vindo! Calckey é um serviço de microblogue descentralizado de código aberto.\nCria \"notas\" e partilha o que te ocorre com todos à tua volta. 📡\nCom \"reações\" podes também expressar logo o que sentes às notas de todos. 👍\nExploremos um novo mundo! 🚀" +monthAndDay: "{day}/{month}" +search: "Buscar" +notifications: "Notificações" +username: "Nome de usuário" +password: "Senha" +forgotPassword: "Esqueci a senha" +fetchingAsApObject: "Buscando no Fediverso" +ok: "OK" +gotIt: "Entendi" +cancel: "Cancelar" +enterUsername: "Digite o nome de usuário" +renotedBy: "Repostado por {user}" +noNotes: "Sem posts" +noNotifications: "Sem notificações" +instance: "Instância" +settings: "Configurações" +basicSettings: "Configurações básicas" +otherSettings: "Outras configurações" +openInWindow: "Abrir numa janela" +profile: "Perfil" +timeline: "Timeline" +noAccountDescription: "Este usuário não tem uma descrição." +login: "Iniciar sessão" +loggingIn: "Iniciando sessão…" +logout: "Sair" +signup: "Registrar-se" +uploading: "Enviando…" +save: "Guardar" +users: "Usuários" +addUser: "Adicionar usuário" +favorite: "Favoritar" +favorites: "Favoritar" +unfavorite: "Remover dos favoritos" +favorited: "Adicionado aos favoritos." +alreadyFavorited: "Já adicionado aos favoritos." +cantFavorite: "Não foi possível adicionar aos favoritos." +pin: "Afixar no perfil" +unpin: "Desafixar do perfil" +copyContent: "Copiar conteúdos" +copyLink: "Copiar hiperligação" +delete: "Eliminar" +deleteAndEdit: "Eliminar e editar" +deleteAndEditConfirm: "Tens a certeza que pretendes eliminar esta nota e editá-la? Irás perder todas as suas reações, renotas e respostas." +addToList: "Adicionar a lista" +sendMessage: "Enviar uma mensagem" +copyUsername: "Copiar nome de utilizador" +searchUser: "Pesquisar utilizador" +reply: "Responder" +loadMore: "Carregar mais" +showMore: "Ver mais" +showLess: "Fechar" +youGotNewFollower: "Você tem um novo seguidor" +receiveFollowRequest: "Pedido de seguimento recebido" +followRequestAccepted: "Pedido de seguir aceito" +mention: "Menção" +mentions: "Menções" +directNotes: "Notas diretas" +importAndExport: "Importar/Exportar" +import: "Importar" +export: "Exportar" +files: "Ficheiros" +download: "Descarregar" +driveFileDeleteConfirm: "Tens a certeza que pretendes apagar o ficheiro \"{name}\"? As notas que tenham este ficheiro anexado serão também apagadas." +unfollowConfirm: "Tens a certeza que queres deixar de seguir {name}?" +exportRequested: "Pediste uma exportação. Este processo pode demorar algum tempo. Será adicionado à tua Drive após a conclusão do processo." +importRequested: "Pediste uma importação. Este processo pode demorar algum tempo." +lists: "Listas" +noLists: "Não tens nenhuma lista" +note: "Post" +notes: "Posts" +following: "Seguindo" +followers: "Seguidores" +followsYou: "Segue-te" +createList: "Criar lista" +manageLists: "Gerir listas" +error: "Erro" +somethingHappened: "Ocorreu um erro" +retry: "Tentar novamente" +pageLoadError: "Ocorreu um erro ao carregar a página." +pageLoadErrorDescription: "Isto é normalmente causado por erros de rede ou pela cache do browser. Experimenta limpar a cache e tenta novamente após algum tempo." +serverIsDead: "O servidor não está respondendo. Por favor espere um pouco e tente novamente." +youShouldUpgradeClient: "Para visualizar essa página, por favor recarregue-a para atualizar seu cliente." +enterListName: "Insira um nome para a lista" +privacy: "Privacidade" +makeFollowManuallyApprove: "Pedidos de seguimento precisam ser aprovados" +defaultNoteVisibility: "Visibilidade padrão" +follow: "Seguindo" +followRequest: "Mandar pedido de seguimento" +followRequests: "Pedidos de seguimento" +unfollow: "Deixar de seguir" +followRequestPending: "Pedido de seguimento pendente" +enterEmoji: "Inserir emoji" +renote: "Repostar" +unrenote: "Desmarcar" +renoted: "Repostado" +cantRenote: "Não pode repostar" +cantReRenote: "Não pode repostar este repost" +quote: "Citar" +pinnedNote: "Post fixado" +pinned: "Afixar no perfil" +you: "Você" +clickToShow: "Clique para ver" +sensitive: "Conteúdo sensível" +add: "Adicionar" +reaction: "Reações" +reactionSetting: "Quais reações a mostrar no selecionador de reações" +reactionSettingDescription2: "Arraste para reordenar, clique para excluir, pressione + para adicionar." +rememberNoteVisibility: "Lembrar das configurações de visibilidade de notas" +attachCancel: "Remover anexo" +markAsSensitive: "Marcar como sensível" +unmarkAsSensitive: "Desmarcar como sensível" +enterFileName: "Digite o nome do ficheiro" +mute: "Silenciar" +unmute: "Dessilenciar" +block: "Bloquear" +unblock: "Desbloquear" +suspend: "Suspender" +unsuspend: "Cancelar suspensão" +blockConfirm: "Tem certeza que gostaria de bloquear essa conta?" +unblockConfirm: "Tem certeza que gostaria de desbloquear essa conta?" +suspendConfirm: "Tem certeza que gostaria de suspender essa conta?" +unsuspendConfirm: "Tem certeza que gostaria de cancelar a suspensão dessa conta?" +selectList: "Escolhe uma lista" +selectAntenna: "Escolhe uma antena" +selectWidget: "Escolhe um widget" +editWidgets: "Editar widgets" +editWidgetsExit: "Pronto" +customEmojis: "Emoji personalizado" +emoji: "Emoji" +emojis: "Emojis" +emojiName: "Nome do Emoji" +emojiUrl: "URL do Emoji" +addEmoji: "Adicionar um Emoji" +settingGuide: "Guia de configuração" +cacheRemoteFiles: "Memória transitória de arquivos remotos" +cacheRemoteFilesDescription: "Se você desabilitar essa configuração, os arquivos remotos não serão armazenados em memória transitória e serão vinculados diretamente. Economiza o armazenamento do servidor, mas não gera miniaturas, o que aumenta o tráfego." +flagAsBot: "Marcar conta como robô" +flagAsBotDescription: "Se esta conta for operada por um programa, ative este sinalizador. Quando ativado, serve como um sinalizador para evitar o encadeamento de reações para outros programadores, e o manuseio do sistema do Calckey é adequado para ‘bots’." +flagAsCat: "Marcar conta como gato" +flagAsCatDescription: "Ative essa opção para marcar essa conta como gato." +flagShowTimelineReplies: "Mostrar respostas na linha de tempo" +flagShowTimelineRepliesDescription: "Quando ativado, a linha do tempo mostra as respostas às outras notas do utilizador, além da nota do utilizador." +autoAcceptFollowed: "Aprove automaticamente os seguidores dos seguintes utilizadores" +addAccount: "Adicionar Conta" +loginFailed: "Não consegui logar" +showOnRemote: "Exibir remotamente" +general: "Geral" +wallpaper: "Papel de parede" +setWallpaper: "Definir papel de parede" +removeWallpaper: "Remover papel de parede" +searchWith: "Buscar: {q}" +youHaveNoLists: "Não tem nenhuma lista" +followConfirm: "Tem certeza que quer deixar de seguir {name}?" +proxyAccount: "Conta proxy" +proxyAccountDescription: "Uma conta proxy é uma conta que atua como seguidora remota para utilizadores sob determinadas condições. Por exemplo, quando um utilizador lista um utilizador remoto, a atividade não será entregue à instância, a menos que alguém esteja seguindo o utilizador listado, portanto, a conta proxy deve seguir." +host: "hospedeiro" +selectUser: "Selecionar utilizador" +recipient: "Morada" +annotation: "Anotação" +federation: "União" +instances: "Instância" +registeredAt: "Registrado em" +latestRequestSentAt: "Enviar a solicitação mais recente" +latestRequestReceivedAt: "Recebeu a última solicitação" +latestStatus: "Status mais recente" +storageUsage: "Uso de armazenamento" +charts: "gráfico" +perHour: "por hora" +perDay: "por dia" +stopActivityDelivery: "Parar a entrega de atividades" +blockThisInstance: "Bloquear esta instância" +operations: "operar" +software: "Programas" +version: "versão" +metadata: "Metadados" +monitor: "monitor" +jobQueue: "Fila de trabalhos" +cpuAndMemory: "CPU e memória" +network: "rede" +disk: "disco" +instanceInfo: "Informações da instância" +statistics: "Estatisticas" +clearQueue: "Limpar a fila" +clearQueueConfirmTitle: "Quer limpar a fila?" +clearQueueConfirmText: "Postagens não entregues não serão mais entregues. Normalmente você não precisa fazer isso." +clearCachedFiles: "Limpar memória transitória" +clearCachedFilesConfirm: "Tem certeza de que deseja excluir todos os arquivos remotos armazenados em memória transitória?" +blockedInstances: "Instância bloqueada" +blockedInstancesDescription: "Defina os anfitriões das instâncias que deseja bloquear, separados por quebras de linha. Uma instância bloqueada não poderá interagir com esta instância." +muteAndBlock: "Silenciar e bloquear" +mutedUsers: "Silenciar utilizador" +blockedUsers: "Utilizadores bloqueados" +noUsers: "Sem usuários" +editProfile: "Editar Perfil" +noteDeleteConfirm: "Deseja excluir esta nota?" +pinLimitExceeded: "Não consigo mais fixar" +intro: "A instalação do Calckey está completa! Crie uma conta de administrador." +done: "Concluído" +processing: "Em Progresso" +preview: "Pré-visualizar" +default: "Padrão" +noCustomEmojis: "Não há emojis" +noJobs: "Sem trabalho" +federating: "federar" +blocked: "Bloqueado" +suspended: "Cancelar subscrição" +all: "Todos" +subscribing: "Subscrito" +publishing: "Executando" +notResponding: "Sem resposta" +instanceFollowing: "Seguir a instância" +instanceFollowers: "Seguidores da instância" +instanceUsers: "Utilizador da instância" +changePassword: "Mudar senha" +security: "Segurança" +retypedNotMatch: "As entradas não coincidem." +currentPassword: "Palavra-passe atual" +newPassword: "Nova palavra-passe" +newPasswordRetype: "Nova senha (redigite)" +attachFile: "Anexar arquivo" +more: "Mais!" +featured: "Destaques" +usernameOrUserId: "Nome de utilizador ou ID de utilizador" +noSuchUser: "Utilizador não encontrado" +lookup: "Buscando" +announcements: "Notícia" +imageUrl: "URL da imagem" +remove: "Eliminar" +removed: "Foi deletado" +removeAreYouSure: "Deseja excluir \"{x}\"?" +deleteAreYouSure: "Deseja excluir \"{x}\"?" +resetAreYouSure: "Redefinir agora?" +saved: "Salvo" +messaging: "Chat" +upload: "Enviando" +keepOriginalUploading: "Manter a imagem original" +keepOriginalUploadingDescription: "Mantenha a versão original ao carregar a imagem. Quando desligado, a imagem para publicação na web será gerada no navegador no momento do upload." +fromDrive: "\nDa unidade" +fromUrl: "Da URL" +uploadFromUrl: "Carregamento de URL" +uploadFromUrlDescription: "URL do arquivo que você deseja enviar" +uploadFromUrlRequested: "Upload solicitado" +uploadFromUrlMayTakeTime: "Pode levar algum tempo para que o upload seja concluído." +explore: "Explorar" +messageRead: "Lida" +noMoreHistory: "Sem mais história" +startMessaging: "Iniciar conversação" +nUsersRead: "{n} Pessoas leem" +agreeTo: "Eu concordo com {0}" +tos: "Termos de serviço" +start: "começar" +home: "casa" +remoteUserCaution: "As informações estão incompletas porque é um utilizador remoto." +activity: "atividade" +images: "imagem" +birthday: "aniversário" +yearsOld: "{age} anos" +registeredDate: "Data de registro" +location: "Lugar, colocar" +theme: "tema" +themeForLightMode: "Temas usados ​​no modo de luz" +themeForDarkMode: "Temas usados ​​no modo escuro" +light: "Claro" +dark: "Escuro" +lightThemes: "Tema claro" +darkThemes: "Tema escuro" +syncDeviceDarkMode: "Sincronize com o modo escuro do dispositivo" +drive: "Unidades" +fileName: "Nome do Ficheiro" +selectFile: "Selecione os arquivos" +selectFiles: "Selecione os arquivos" +selectFolder: "Selecionar uma pasta" +selectFolders: "Selecionar uma pasta" +renameFile: "Renomear ficheiro" +folderName: "Nome da pasta" +createFolder: "Criar pasta" +renameFolder: "Renomear Pasta" +deleteFolder: "Eliminar Pasta" +addFile: "Adicionar arquivo" +emptyDrive: "A unidade está vazia" +emptyFolder: "A pasta está vazia" +unableToDelete: "Não é possível eliminar" +inputNewFileName: "Por favor, digite um novo nome para a pasta!" +inputNewDescription: "Insira uma nova legenda" +inputNewFolderName: "Por favor, digite um novo nome para a pasta!" +circularReferenceFolder: "A pasta de destino é uma subpasta da pasta que você deseja mover." +hasChildFilesOrFolders: "Esta pasta não está vazia e não pode ser excluída." +copyUrl: "Copiar URL" +rename: "Renomear" +avatar: "Avatar" +banner: "Capa" +nsfw: "Conteúdo sensível" +whenServerDisconnected: "Quando a conexão com o servidor é perdida" +disconnectedFromServer: "Desconectado do servidor" +reload: "Recarregar" +doNothing: "Nenhuma ação adicional" +reloadConfirm: "Quer recarregar?" +watch: "ver" +unwatch: "Não observar" +accept: "Aceitar" +reject: "Rejeitar" +normal: "Normal" +instanceName: "Nome da instância" +instanceDescription: "Descrição da instância" +maintainerName: "Nome do administrador" +maintainerEmail: "E-mail do Administrador:" +tosUrl: "URL dos Termos de Uso" +thisYear: "Este ano" +thisMonth: "Este mês" +today: "Hoje" +dayX: " Dia {day}" +monthX: "mês de {month}" +yearX: "Ano {year}" +pages: "Páginas" +integration: "Integração" +connectService: "Conectar" +disconnectService: "Desconectar" +enableLocalTimeline: "Ativar linha do tempo local" +enableGlobalTimeline: "Ativar linha do tempo global" +disablingTimelinesInfo: "Se você desabilitar essas linhas do tempo, administradores e moderadores ainda poderão usá-las por conveniência." +registration: "Registar" +enableRegistration: "Permitir que qualquer pessoa se registre" +invite: "Convidar" +driveCapacityPerLocalAccount: "Capacidade da unidade por utilizador local" +driveCapacityPerRemoteAccount: "Capacidade da unidade por utilizador remoto" +inMb: "Em ‘megabytes’" +iconUrl: "URL da imagem do ícone (favicon, etc.)" +bannerUrl: "URL da imagem do ‘banner’" +backgroundImageUrl: "URL da imagem de fundo" +basicInfo: "Informações básicas" +pinnedUsers: "Utilizador fixado" +pinnedUsersDescription: "Descreva os utilizadores que você deseja fixar na página \"Localizar\", etc., separados por quebras de linha." +pinnedPages: "Página fixada" +pinnedPagesDescription: "Descreva o caminho da página que você deseja fixar na página superior da instância, separada por quebras de linha." +pinnedClipId: "ID do clipe a ser fixado" +pinnedNotes: "Post fixado" +hcaptcha: "hCaptcha" +enableHcaptcha: "Ativar hCaptcha" +hcaptchaSiteKey: "Chave do sítio ‘web’" +hcaptchaSecretKey: "Chave secreta" +recaptcha: "reCAPTCHA" +enableRecaptcha: "Habilitar reCAPTCHA" +recaptchaSiteKey: "Chave do sítio ‘web’" +recaptchaSecretKey: "Chave secreta" +avoidMultiCaptchaConfirm: "O uso de vários captchas pode causar interferência. Deseja desativar outros captchas? Você também pode cancelar e deixar vários captchas ativados." +antennas: "Antenas" +manageAntennas: "Gestão de antena" +name: "Nome" +antennaSource: "Origem de entrada" +antennaKeywords: "Palavras-chave recebidas" +antennaExcludeKeywords: "Palavras-chave negativas" +antennaKeywordsDescription: "Se você separá-lo com um espaço, será uma especificação AND, e se você separá-lo com uma quebra de linha, será uma especificação OR." +notifyAntenna: "Notificar novas notas" +withFileAntenna: "Apenas notas com arquivos anexados" +enableServiceworker: "Ative as notificações push para o seu navegador" +antennaUsersDescription: "Especificar nomes de utilizador separados por quebras de linha" +caseSensitive: "Maiúsculas e minúsculas" +withReplies: "Incluindo resposta" +connectedTo: "Você está conectado à seguinte conta" +notesAndReplies: "Publicações e respostas" +withFiles: "Com arquivo" +silence: "Silenciado" +silenceConfirm: "Quer silenciar?" +unsilence: "Liberar silenciar" +unsilenceConfirm: "Quer liberar o silêncio?" +popularUsers: "Utilizadores populares" +recentlyUpdatedUsers: "Utilizadores postados recentemente" +recentlyRegisteredUsers: "Utilizadores registrados recentemente" +recentlyDiscoveredUsers: "Utilizadores descobertos recentemente" +exploreUsersCount: "Há um utilizador de {count}" +exploreFediverse: "Explorar Fediverse" +popularTags: "Tags populares" +userList: "Listas" +about: "Informações" +aboutMisskey: "Sobre Calckey" +administrator: "Administrador" +token: "Símbolo" +twoStepAuthentication: "Verificação em duas etapas" +moderator: "Moderador" +nUsersMentioned: "Postado por {n} pessoas" +securityKey: "Chave de segurança" +securityKeyName: "Nome chave" +registerSecurityKey: "Registre a chave de segurança" +lastUsed: "Último uso" +unregister: "Cancelar registro" +passwordLessLogin: "Entrar sem senha" +resetPassword: "Redefinir senha" +newPasswordIs: "A nova senha é \"{password}\"" +reduceUiAnimation: "Reduzir a animação da ‘interface’ do utilizador" +share: "Compartilhar" +notFound: "Não encontrado" +notFoundDescription: "Não havia página correspondente ao URL especificado." +uploadFolder: "Destino de ‘upload’ padrão" +cacheClear: "Excluir memória transitória" +markAsReadAllNotifications: "Marcar todas as notificações como lidas" +markAsReadAllUnreadNotes: "Marcar todas as postagens como lidas" +markAsReadAllTalkMessages: "Marcar todas as conversas como lidas" +help: "Ajuda" +inputMessageHere: "Escrever mensagem aqui" +close: "Fechar" +group: "Grupos" +groups: "Grupos" +createGroup: "Criar grupo" +ownedGroups: "Grupo próprio" +invites: "Convidar" +invitations: "Convidar" +tags: "Etiquetas" +docSource: "Fonte deste documento" +createAccount: "Criar conta" +existingAccount: "Contas existentes" +regenerate: "Gerar novamente" +fontSize: "Tamanho do texto" +noFollowRequests: "Não há aplicação de acompanhamento" +openImageInNewTab: "Abrir a imagem numa nova aba" +dashboard: "Painel de controle" +local: "Local" +remote: "Remoto" +total: "Total" +weekOverWeekChanges: "Em comparação com a semana anterior" +dayOverDayChanges: "Dia anterior" +appearance: "Aparência" +clientSettings: "Configurações do cliente" +accountSettings: "Configurações da conta" +promotion: "Promoção" +promote: "Promover" +numberOfDays: "Dias" +hideThisNote: "Ocultar esta nota" +showFeaturedNotesInTimeline: "Mostrar notas recomendadas na linha do tempo" +objectStorage: "Armazenamento de objetos" +useObjectStorage: "Usar armazenamento de objetos" +objectStorageBaseUrl: "URL base" +objectStorageBaseUrlDesc: "O URL usado para referência. Se você estiver usando um CDN ou Proxy, seu URL, S3:'https: // .s3.amazonaws.com', GCS, etc .:'https://storage.googleapis.com/ ' ." +objectStorageBucket: "Bucket" +objectStorageBucketDesc: "Especifique o nome do bucket do serviço a ser usado." +objectStoragePrefix: "Prefixo" +objectStoragePrefixDesc: "Ele é armazenado neste diretório de prefixo." +objectStorageEndpoint: "Ponto final" +objectStorageEndpointDesc: "Especifique vazio para S3, caso contrário, especifique o ponto final para cada serviço. Especifique como''ou': '." +objectStorageRegion: "Região" +objectStorageRegionDesc: "Especifique uma região como 'xx-east-1'. Caso seu serviço não tenha o conceito de região, ele deve estar vazio ou 'us-east-1'." +objectStorageUseSSL: "Usar SSL" +objectStorageUseSSLDesc: "Desative-o se não quiser usar https para conexões de API" +objectStorageUseProxy: "Usar proxy" +objectStorageUseProxyDesc: "Se você não usa proxy para conexão de API, desative-o." +objectStorageSetPublicRead: "Definir 'public-read' ao fazer o upload" +serverLogs: "Registro do servidor" +deleteAll: "Apagar Tudo" +showFixedPostForm: "Exibir o formulário de postagem na parte superior da linha do tempo" +newNoteRecived: "Nova nota recebida" +sounds: "Sons" +listen: "Ouvir" +none: "Nenhum" +showInPage: "Ver na página" +popout: "Sair" +volume: "Volume" +masterVolume: "volume principal" +details: "Detalhes" +output: "Resultado" +smtpHost: "hospedeiro" +smtpUser: "Nome de usuário" +smtpPass: "Senha" +clearCache: "Limpar memória transitória" +info: "Informações" +user: "Usuários" +searchByGoogle: "Buscar" +file: "Ficheiros" +_email: + _follow: + title: "Você tem um novo seguidor" +_mfm: + mention: "Menção" + quote: "Citar" + emoji: "Emoji personalizado" + search: "Buscar" +_theme: + keys: + mention: "Menção" + renote: "Repostar" +_sfx: + note: "Posts" + notification: "Notificações" + chat: "Chat" +_widgets: + notifications: "Notificações" + timeline: "Timeline" + activity: "atividade" + federation: "União" + jobQueue: "Fila de trabalhos" +_cw: + show: "Carregar mais" +_visibility: + home: "casa" + followers: "Seguidores" +_profile: + name: "Nome" + username: "Nome de usuário" +_exportOrImport: + followingList: "Seguindo" + muteList: "Silenciar" + blockingList: "Bloquear" + userLists: "Listas" +_charts: + federation: "União" +_timelines: + home: "casa" +_pages: + blocks: + image: "imagem" + _button: + _action: + _pushEvent: + event: "Nome do evento" + message: "Mostrar mensagem quando ativado" + variable: "Variável a mandar" + no-variable: "Nenhum" + callAiScript: "Invocar AiScript" + _callAiScript: + functionName: "Nome da função" + radioButton: "Escolha" + _radioButton: + values: "Lista de escolhas separadas por quebras de texto" + script: + categories: + logical: "Operação lógica" + operation: "Cálculos" + comparison: "Comparação" + list: "Listas" + blocks: + _strReplace: + arg2: "Texto que irá ser substituído" + arg3: "Substituir com" + strReverse: "Virar texto" + join: "Sequência de texto" + _join: + arg1: "Listas" + arg2: "Separador" + add: "Somar" + _add: + arg1: "A" + arg2: "B" + subtract: "Subtrair" + _subtract: + arg1: "A" + arg2: "B" + multiply: "Multiplicar" + _multiply: + arg1: "A" + arg2: "B" + divide: "Dividir" + _divide: + arg1: "A" + arg2: "B" + mod: "O resto de" + _mod: + arg1: "A" + arg2: "B" + round: "Arredondar decimal" + _round: + arg1: "Numérico" + eq: "A e B são iguais" + _eq: + arg1: "A" + arg2: "B" + notEq: "A e B são diferentes" + _notEq: + arg1: "A" + arg2: "B" + and: "A e B" + _and: + arg1: "A" + arg2: "B" + or: "A OU B" + _or: + arg1: "A" + arg2: "B" + lt: "< A é menor do que B" + _lt: + arg1: "A" + arg2: "B" + gt: "> A é maior do que B" + _gt: + arg1: "A" + arg2: "B" + ltEq: "<= A é maior ou igual a B" + _ltEq: + arg1: "A" + arg2: "B" + gtEq: ">= A é maior ou igual a B" + _gtEq: + arg1: "A" + arg2: "B" + if: "Galho" + _if: + arg1: "Se" + arg2: "Então" + arg3: "Se não" + not: "NÃO" + _not: + arg1: "NÃO" + random: "Aleatório" + _random: + arg1: "Probabilidade" + rannum: "Numeral aleatório" + _rannum: + arg1: "Valor mínimo" + arg2: "Valor máximo" + randomPick: "Escolher aleatoriamente de uma lista" + _randomPick: + arg1: "Listas" + dailyRandom: "Aleatório (Muda uma vez por dia para cada usuário)" + _dailyRandom: + arg1: "Probabilidade" + dailyRannum: "Numeral aleatório (Muda uma vez por dia para cada usuário)" + _dailyRannum: + arg1: "Valor mínimo" + arg2: "Valor máximo" + dailyRandomPick: "Escolher aleatoriamente de uma lista (Muda uma vez por dia para cada usuário)" + _dailyRandomPick: + arg1: "Listas" + seedRandom: "Aleatório (com semente)" + _seedRandom: + arg1: "Semente" + arg2: "Probabilidade" + seedRannum: "Número aleatório (com semente)" + _seedRannum: + arg1: "Semente" + arg2: "Valor mínimo" + arg3: "Valor máximo" + seedRandomPick: "Escolher aleatoriamente de uma lista (com uma semente)" + _seedRandomPick: + arg1: "Semente" + arg2: "Listas" + DRPWPM: "Escolher aleatoriamente de uma lista ponderada (Muda uma vez por dia para cada usuário)" + _DRPWPM: + arg1: "Lista de texto" + pick: "Escolhe a partir da lista" + _pick: + arg1: "Listas" + arg2: "Posição" + listLen: "Pegar comprimento da lista" + _listLen: + arg1: "Listas" + number: "Numérico" + stringToNumber: "Texto para numérico" + _stringToNumber: + arg1: "Texto" + numberToString: "Numérico para texto" + _numberToString: + arg1: "Numérico" + splitStrByLine: "Dividir texto por quebras" + _splitStrByLine: + arg1: "Texto" + ref: "Variável" + aiScriptVar: "Variável AiScript" + fn: "Função" + _fn: + slots: "Espaços" + slots-info: "Separar cada espaço com uma quebra de texto" + arg1: "Resultado" + for: "Repetição 'for'" + _for: + arg1: "Número de repetições" + arg2: "Ação" + typeError: "Espaço {slot} aceita valores de tipo \"{expect}\", mas o valor dado é do tipo \"{actual}\"!" + thereIsEmptySlot: "O espaço {slot} está vazio!" + types: + string: "Texto" + number: "Numérico" + array: "Listas" + stringArray: "Lista de texto" + emptySlot: "Espaço vazio" + enviromentVariables: "Variáveis de ambiente" + pageVariables: "Variáveis de página" +_relayStatus: + requesting: "Pendente" + accepted: "Aprovado" + rejected: "Recusado" +_notification: + fileUploaded: "Carregamento de arquivo efetuado com sucesso" + youGotMention: "{name} te mencionou" + youGotReply: "{name} te respondeu" + youGotQuote: "{name} te citou" + youGotPoll: "{name} votou em sua enquete" + youGotMessagingMessageFromUser: "{name} te mandou uma mensagem de bate-papo" + youGotMessagingMessageFromGroup: "Uma mensagem foi mandada para o grupo {name}" + youWereFollowed: "Você tem um novo seguidor" + youReceivedFollowRequest: "Você recebeu um pedido de seguimento" + yourFollowRequestAccepted: "Seu pedido de seguimento foi aceito" + youWereInvitedToGroup: "{userName} te convidou para um grupo" + pollEnded: "Os resultados da enquete agora estão disponíveis" + emptyPushNotificationMessage: "As notificações de alerta foram atualizadas" + _types: + all: "Todos" + follow: "Seguindo" + mention: "Menção" + reply: "Respostas" + renote: "Repostar" + quote: "Citar" + reaction: "Reações" + pollVote: "Votações em enquetes" + pollEnded: "Enquetes terminando" + receiveFollowRequest: "Recebeu pedidos de seguimento" + followRequestAccepted: "Aceitou pedidos de seguimento" + groupInvited: "Convites de grupo" + app: "Notificações de aplicativos conectados" + _actions: + followBack: "te seguiu de volta" + reply: "Responder" + renote: "Repostar" +_deck: + alwaysShowMainColumn: "Sempre mostrar a coluna principal" + columnAlign: "Alinhar colunas" + addColumn: "Adicionar coluna" + swapLeft: "Trocar de posição com a coluna à esquerda" + swapRight: "Trocar de posição com a coluna à direita" + swapUp: "Trocar de posição com a coluna acima" + swapDown: "Trocar de posição com a coluna abaixo" + popRight: "Acoplar coluna à direita" + profile: "Perfil" + _columns: + main: "Principal" + widgets: "Widgets" + notifications: "Notificações" + tl: "Timeline" + antenna: "Antenas" + list: "Listas" + mentions: "Menções" + direct: "Notas diretas" diff --git a/fe_calckey/frontend/locales/pt_BR.yml b/fe_calckey/frontend/locales/pt_BR.yml new file mode 100644 index 0000000..2cc22c8 --- /dev/null +++ b/fe_calckey/frontend/locales/pt_BR.yml @@ -0,0 +1,87 @@ +username: Nome de usuário +ok: OK +_lang_: Inglês +headlineMisskey: Uma plataforma de mídia social descentralizada e de código aberto + que é gratuita para sempre! 🚀 +search: Pesquisar +gotIt: Entendi! +introMisskey: Bem vinde! Calckey é uma plataforma de mídia social descentralizada + e de código aberto que é gratuita para sempre! 🚀 +searchPlaceholder: Pesquise no Calckey +notifications: Notificações +password: Senha +forgotPassword: Esqueci a senha +cancel: Cancelar +noThankYou: Não, obrigade +save: Salvar +enterUsername: Insira nome de usuário +cw: Aviso de conteúdo +driveFileDeleteConfirm: Tem a certeza de que pretende apagar o arquivo "{name}"? O + arquivo será removido de todas as mensagens que o contenham como anexo. +deleteAndEdit: Deletar e editar +import: Importar +exportRequested: Você pediu uma exportação. Isso pode demorar um pouco. Será adicionado + ao seu Drive quando for completo. +note: Postar +notes: Postagens +deleteAndEditConfirm: Você tem certeza que quer deletar esse post e edita-lo? Você + vai perder todas as reações, impulsionamentos e respostas dele. +showLess: Fechar +importRequested: Você requisitou uma importação. Isso pode demorar um pouco. +listsDesc: Listas deixam você criar linhas do tempo com usuários específicos. Elas + podem ser acessadas pela página de linhas do tempo. +edited: 'Editado às {date} {time}' +sendMessage: Enviar uma mensagem +older: antigo +createList: Criar lista +loadMore: Carregar mais +mentions: Menções +importAndExport: Importar/Exportar Dados +files: Arquivos +lists: Listas +manageLists: Gerenciar listas +error: Erro +somethingHappened: Ocorreu um erro +retry: Tentar novamente +renotedBy: Impulsionado por {user} +noNotes: Nenhum post +noNotifications: Nenhuma notificação +instance: Servidor +settings: Configurações +basicSettings: Configurações Básicas +otherSettings: Outras Configurações +openInWindow: Abrir em janela +profile: Perfil +noAccountDescription: Esse usuário ainda não escreveu sua bio. +login: Entrar +loggingIn: Entrando +logout: Sair +signup: Criar conta +uploading: Enviando... +users: Usuários +addUser: Adicione um usuário +addInstance: Adicionar um servidor +cantFavorite: Não foi possível adicionar aos marcadores. +pin: Fixar no perfil +unpin: Desfixar do perfil +copyContent: Copiar conteúdos +copyLink: Copiar link +delete: Deletar +deleted: Deletado +editNote: Editar anotação +addToList: Adicionar a lista +copyUsername: Copiar nome de usuário +searchUser: Procurar por um usuário +reply: Responder +jumpToPrevious: Pular para o anterior +showMore: Mostrar mais +newer: novo +youGotNewFollower: seguiu você +mention: Mencionar +directNotes: Mensagens diretas +export: Exportar +unfollowConfirm: Você tem certez que deseja para de seguir {name}? +noLists: Você não possui nenhuma lista +following: Seguindo +followers: Seguidores +followsYou: Segue você diff --git a/fe_calckey/frontend/locales/ro-RO.yml b/fe_calckey/frontend/locales/ro-RO.yml new file mode 100644 index 0000000..ba51950 --- /dev/null +++ b/fe_calckey/frontend/locales/ro-RO.yml @@ -0,0 +1,727 @@ +--- +_lang_: "Română" +headlineMisskey: "O rețea conectată prin note" +introMisskey: "Bine ai venit! Calckey este un serviciu de microblogging open source și decentralizat.\nCreează \"note\" cu care să îți poți împărți gândurile cu oricine din jurul tău. 📡\nCu \"reacții\" îți poți expirma rapid părerea despre notele oricui. 👍\nHai să explorăm o lume nouă! 🚀" +monthAndDay: "{day}/{month}" +search: "Caută" +notifications: "Notificări" +username: "Nume de utilizator" +password: "Parolă" +forgotPassword: "Am uitat parola" +fetchingAsApObject: "Se aduce din Fediverse" +ok: "OK" +gotIt: "Am înțeles!" +cancel: "Anulează" +enterUsername: "Introdu numele de utilizator" +renotedBy: "Re-notat de {user}" +noNotes: "Nicio notă" +noNotifications: "Nicio notificare" +instance: "Instanță" +settings: "Setări" +basicSettings: "Setări generale" +otherSettings: "Alte Setări" +openInWindow: "Deschide într-o fereastră" +profile: "Profil" +timeline: "Cronologie" +noAccountDescription: "Acest utilizator încă nu a scris un bio." +login: "Autentifică-te" +loggingIn: "Se autentifică" +logout: "Deconectează-te" +signup: "Înregistrează-te" +uploading: "Se încarcă" +save: "Salvează" +users: "Utilizatori" +addUser: "Adăugă utilizator" +favorite: "Adaugă la favorite" +favorites: "Favorite" +unfavorite: "Elimină din favorite" +favorited: "Adăugat la favorite." +alreadyFavorited: "Deja adăugat la favorite." +cantFavorite: "Nu se poate adăuga la favorite." +pin: "Fixează pe profil" +unpin: "Anulati fixare" +copyContent: "Copiază conținutul" +copyLink: "Copiază link-ul" +delete: "Şterge" +deleteAndEdit: "Șterge și editează" +deleteAndEditConfirm: "Ești sigur că vrei să ștergi această notă și să o editezi? Vei pierde reacțiile, re-notele și răspunsurile acesteia." +addToList: "Adaugă în listă" +sendMessage: "Trimite un mesaj" +copyUsername: "Copiază numele de utilizator" +searchUser: "Caută un utilizator" +reply: "Răspunde" +loadMore: "Incarcă mai mult" +showMore: "Arată mai mult" +showLess: "Închide" +youGotNewFollower: "te-a urmărit" +receiveFollowRequest: "Cerere de urmărire primită" +followRequestAccepted: "Cerere de urmărire acceptată" +mention: "Mențiune" +mentions: "Mențiuni" +directNotes: "Note directe" +importAndExport: "Importă / Exportă" +import: "Importă" +export: "Exportă" +files: "Fișiere" +download: "Descarcă" +driveFileDeleteConfirm: "Ești sigur ca vrei să ștergi fișierul \"{name}\"? Notele atașate fișierului vor fi șterse și ele." +unfollowConfirm: "Ești sigur ca vrei să nu mai urmărești pe {name}?" +exportRequested: "Ai cerut un export. S-ar putea să ia un pic. Va fi adăugat in Drive-ul tău odată completat." +importRequested: "Ai cerut un import. S-ar putea să ia un pic." +lists: "Liste" +noLists: "Nu ai nici o listă" +note: "Notă" +notes: "Note" +following: "Urmărești" +followers: "Urmăritori" +followsYou: "Te urmărește" +createList: "Creează listă" +manageLists: "Gestionează listele" +error: "Eroare" +somethingHappened: "A survenit o eroare" +retry: "Reîncearcă" +pageLoadError: "A apărut o eroare la încărcarea paginii." +pageLoadErrorDescription: "De obicei asta este cauzat de o eroare de rețea sau cache-ul browser-ului. Încearcă să cureți cache-ul și apoi să încerci din nou puțin mai târziu." +serverIsDead: "Serverul nu răspunde. Te rugăm să aștepți o perioadă și să încerci din nou." +youShouldUpgradeClient: "Pentru a vedea această pagină, te rugăm să îți actualizezi clientul." +enterListName: "Introdu un nume pentru listă" +privacy: "Confidenţialitate" +makeFollowManuallyApprove: "Fă cererile de urmărire să necesite aprobare" +defaultNoteVisibility: "Vizibilitate implicită" +follow: "Urmărești" +followRequest: "Trimite cerere de urmărire" +followRequests: "Cereri de urmărire" +unfollow: "Nu mai urmări" +followRequestPending: "Cerere de urmărire în așteptare" +enterEmoji: "Introdu un emoji" +renote: "Re-notează" +unrenote: "Ia înapoi re-nota" +renoted: "Re-notat." +cantRenote: "Această postare nu poate fi re-notată." +cantReRenote: "O re-notă nu poate fi re-notată." +quote: "Citează" +pinnedNote: "Notă fixată" +pinned: "Fixat pe profil" +you: "Tu" +clickToShow: "Click pentru a afișa" +sensitive: "NSFW" +add: "Adaugă" +reaction: "Reacție" +reactionSetting: "Reacții care să apară in selectorul de reacții" +reactionSettingDescription2: "Trage pentru a rearanja, apasă pe \"+\" pentru a adăuga." +rememberNoteVisibility: "Amintește setarea de vizibilitate a notelor" +attachCancel: "Înlătură atașament" +markAsSensitive: "Marchează ca NSFW" +unmarkAsSensitive: "Demarchează ca NSFW" +enterFileName: "Introduceţi numele fişierului" +mute: "Amuțește" +unmute: "Înlătură amuțirea" +block: "Blochează" +unblock: "Deblochează" +suspend: "Suspendă" +unsuspend: "Anulează suspendare" +blockConfirm: "Ești sigur că vrei să blochezi acest cont?" +unblockConfirm: "Ești sigur ca vrei să deblochezi acest cont?" +suspendConfirm: "Ești sigur ca vrei să suspendezi acest cont?" +unsuspendConfirm: "Ești sigur ca vrei să nu mai suspendezi acest cont?" +selectList: "Selectează o listă" +selectAntenna: "Selectează o antenă" +selectWidget: "Selectați un widget" +editWidgets: "Editează widget-urile" +editWidgetsExit: "Terminat" +customEmojis: "Emoji personalizat" +emoji: "Emoji" +emojis: "Emoji-uri" +emojiName: "Numele emoji-ului" +emojiUrl: "URL-ul emoji-ului" +addEmoji: "Adaugă un emoji" +settingGuide: "Setări recomandate" +cacheRemoteFiles: "Ține fișierele externe in cache" +cacheRemoteFilesDescription: "Când această setare este dezactivată, fișierele externe sunt încărcate direct din instanța externă. Dezactivarea va scădea utilizarea spațiului de stocare, dar va crește traficul, deoarece thumbnail-urile nu vor fi generate." +flagAsBot: "Marchează acest cont ca bot" +flagAsBotDescription: "Activează această opțiune dacă acest cont este controlat de un program. Daca e activată, aceasta va juca rolul unui indicator pentru dezvoltatori pentru a preveni interacțiunea în lanțuri infinite cu ceilalți boți și ajustează sistemele interne al Calckey pentru a trata acest cont drept un bot." +flagAsCat: "Marchează acest cont ca pisică" +flagAsCatDescription: "Activează această opțiune dacă acest cont este o pisică." +flagShowTimelineReplies: "Arată răspunsurile în cronologie" +flagShowTimelineRepliesDescription: "Dacă e activată vor fi arătate în cronologie răspunsurile utilizatorilor către alte notele altor utilizatori." +autoAcceptFollowed: "Aprobă automat cererile de urmărire de la utilizatorii pe care îi urmărești" +addAccount: "Adaugă un cont" +loginFailed: "Autentificare eșuată" +showOnRemote: "Vezi mai multe pe instanța externă" +general: "General" +wallpaper: "Imagine de fundal" +setWallpaper: "Setați imaginea de fundal" +removeWallpaper: "Șterge imagine de fundal" +searchWith: "Caută: {q}" +youHaveNoLists: "Nu ai nici o listă" +followConfirm: "Ești sigur ca vrei să urmărești pe {name}?" +proxyAccount: "Cont proxy" +proxyAccountDescription: "Un cont proxy este un cont care se comportă ca un urmăritor extern pentru utilizatorii puși sub anumite condiții. De exemplu, când un cineva adaugă un utilizator extern intr-o listă, activitatea utilizatorului extern nu va fi adusă în instanță daca nici un utilizator local nu urmărește acel utilizator, așa că în schimb contul proxy îl va urmări." +host: "Gazdă" +selectUser: "Selectează un utilizator" +recipient: "Destinatar" +annotation: "Adnotări" +federation: "Federație" +instances: "Instanțe" +registeredAt: "Înregistrat în" +latestRequestSentAt: "Ultima cerere trimisă" +latestRequestReceivedAt: "Ultima cerere primită" +latestStatus: "Ultimul status" +storageUsage: "Utilizare stocare" +charts: "Diagrame" +perHour: "Pe oră" +perDay: "Pe zi" +stopActivityDelivery: "Nu mai trimite activități" +blockThisInstance: "Blochează această instanță" +operations: "Operațiuni" +software: "Software" +version: "Versiune" +metadata: "Metadata" +monitor: "Monitor" +jobQueue: "coada de job-uri" +cpuAndMemory: "CPU și memorie" +network: "Rețea" +disk: "Disk" +instanceInfo: "Informații despre instanță" +statistics: "Statistici" +clearQueue: "Șterge coada" +clearQueueConfirmTitle: "Ești sigur că vrei să cureți coada?" +clearQueueConfirmText: "Orice notă rămasă în coadă nu va fi federată. De obicei această operație nu este necesară." +clearCachedFiles: "Golește cache-ul" +clearCachedFilesConfirm: "Ești sigur că vrei să ștergi toate fișierele externe din cache?" +blockedInstances: "Instanțe blocate" +blockedInstancesDescription: "Scrie hostname-urile instanțelor pe care dorești să le blochezi. Instanțele listate nu vor mai putea să comunice cu această instanță." +muteAndBlock: "Amuțiri și Blocări" +mutedUsers: "Utilizatori amuțiți" +blockedUsers: "Utilizatori blocați" +noUsers: "Niciun utilizator" +editProfile: "Editează profilul" +noteDeleteConfirm: "Ești sigur că vrei să ștergi această notă?" +pinLimitExceeded: "Nu poți mai fixa mai multe note" +intro: "Calckey s-a instalat! Te rog crează un utilizator admin." +done: "Gata" +processing: "Se procesează" +preview: "Previzualizare" +default: "Prestabilit" +noCustomEmojis: "Nu e niciun emoji" +noJobs: "Nu e niciun job" +federating: "Federație" +blocked: "Blocat" +suspended: "Suspendat" +all: "Tot" +subscribing: "Abonare" +publishing: "Publicare" +notResponding: "Nu răspunde" +instanceFollowing: "Urmărind în instanță" +instanceFollowers: "Urmăritori ai instanței" +instanceUsers: "Utilizatori ai acestei instanțe" +changePassword: "Schimbă parolă" +security: "Securitate" +retypedNotMatch: "Intrările nu corespund" +currentPassword: "Parola curentă" +newPassword: "Parola nouă" +newPasswordRetype: "Rescrie parola nouă" +attachFile: "Atașează fișiere" +more: "Mai mult!" +featured: "Evidențiat" +usernameOrUserId: "Nume sau ID de utilizator" +noSuchUser: "Utilizatorul nu a fost găsit" +lookup: "Privire" +announcements: "Anunțuri" +imageUrl: "URL-ul imaginii" +remove: "Şterge" +removed: "Șterș cu succes" +removeAreYouSure: "Ești sigur că vrei să înlături {x}?" +deleteAreYouSure: "Ești sigur că vrei să ștergi {x}?" +resetAreYouSure: "Sigur vrei să resetezi?" +saved: "Salvat" +messaging: "Chat" +upload: "Încarcă" +keepOriginalUploading: "Păstrează imaginea originală" +keepOriginalUploadingDescription: "Salvează imaginea originala încărcată fără modificări. Dacă e oprită, o versiune pentru afișarea pe web va fi generată la încărcare." +fromDrive: "Din Drive" +fromUrl: "Din URL" +uploadFromUrl: "Încarcă dintr-un URL" +uploadFromUrlDescription: "URL-ul fișierului pe care dorești să îl încarci" +uploadFromUrlRequested: "Încărcare solicitată" +uploadFromUrlMayTakeTime: "S-ar putea să ia puțin până se finalizează încărcarea." +explore: "Explorează" +messageRead: "Citit" +noMoreHistory: "Nu există mai mult istoric" +startMessaging: "Începe un chat nou" +nUsersRead: "citit de {n}" +agreeTo: "Sunt de acord cu {0}" +tos: "Termenii de utilizare" +start: "Să începem" +home: "Acasă" +remoteUserCaution: "Deoarece acest utilizator este dintr-o instanță externă, informația afișată poate fi incompletă." +activity: "Activitate" +images: "Imagini" +birthday: "Zi de naștere" +yearsOld: "{age} ani" +registeredDate: "Data înregistrării" +location: "Locație" +theme: "Teme" +themeForLightMode: "Temă folosită pentru Modul Luminat" +themeForDarkMode: "Temă folosită pentru Modul Întunecat" +light: "Luminos" +dark: "Întunecat" +lightThemes: "Teme luminoase" +darkThemes: "Teme întunecate" +syncDeviceDarkMode: "Sincronizează Modul Întunecat cu setările dispozitivului" +drive: "Drive" +fileName: "Nume fișier" +selectFile: "Alege un fisier" +selectFiles: "Alege fișiere" +selectFolder: "Selectează un folder" +selectFolders: "Selectează folderele" +renameFile: "Redenumește fișier" +folderName: "Nume folder" +createFolder: "Crează folder" +renameFolder: "Redenumește acest folder" +deleteFolder: "Șterge acest folder" +addFile: "Adăugați un fișier" +emptyDrive: "Drive-ul tău e gol" +emptyFolder: "Folder-ul acesta este gol" +unableToDelete: "Nu se poate șterge" +inputNewFileName: "Introdu un nou nume de fișier" +inputNewDescription: "Introdu o descriere nouă" +inputNewFolderName: "Introdu un nume de folder nou" +circularReferenceFolder: "Destinația folderului este un subfolder al folderului pe care dorești să îl muți." +hasChildFilesOrFolders: "Acest folder nu este gol, așa că nu poate fi șters." +copyUrl: "Copiază URL" +rename: "Redenumește" +avatar: "Avatar" +banner: "Banner" +nsfw: "NSFW" +whenServerDisconnected: "Când pierzi conexiunea cu serverul" +disconnectedFromServer: "Conecțiunea cu serverul a fost pierdută" +reload: "Reîncarcă" +doNothing: "Ignoră" +reloadConfirm: "Ai dori să reîmprospătezi cronologia?" +watch: "Vezi" +unwatch: "Oprește-te din văzut" +accept: "Acceptă" +reject: "Respinge" +normal: "Normal" +instanceName: "Numele instanței" +instanceDescription: "Descrierea instanței" +maintainerName: "Administrator" +maintainerEmail: "Email-ul administratorului" +tosUrl: "URL-ul Termenilor de utilizare" +thisYear: "An" +thisMonth: "Lună" +today: "Azi" +dayX: "{day}" +monthX: "{month}" +yearX: "{year}" +pages: "Pagini" +integration: "Integrare" +connectService: "Conectează" +disconnectService: "Deconectează" +enableLocalTimeline: "Activează cronologia locală" +enableGlobalTimeline: "Activeaza cronologia globală" +disablingTimelinesInfo: "Administratorii și Moderatorii vor avea mereu access la toate cronologiile, chiar dacă nu sunt activate." +registration: "Inregistrare" +enableRegistration: "Activează înregistrările pentru utilizatori noi" +invite: "Invită" +driveCapacityPerLocalAccount: "Capacitatea Drive-ului per utilizator local" +driveCapacityPerRemoteAccount: "Capacitatea Drive-ului per utilizator extern" +inMb: "În megabytes" +iconUrl: "URL-ul iconiței" +bannerUrl: "URL-ul imaginii de banner" +backgroundImageUrl: "URL-ul imaginii de fundal" +basicInfo: "Informații de bază" +pinnedUsers: "Utilizatori fixați" +pinnedUsersDescription: "Scrie utilizatorii, separați prin pauză de rând, care vor fi fixați pe pagina \"Explorează\"." +pinnedPages: "Pagini fixate" +pinnedPagesDescription: "Introdu linkurile Paginilor pe care le vrei fixate in vâruful paginii acestei instanțe, separate de pauze de rând." +pinnedClipId: "ID-ul clip-ului pe care să îl fixezi" +pinnedNotes: "Notă fixată" +hcaptcha: "hCaptcha" +enableHcaptcha: "Activează hCaptcha" +hcaptchaSiteKey: "Site key" +hcaptchaSecretKey: "Secret key" +recaptcha: "reCAPTCHA" +enableRecaptcha: "Activează reCAPTCHA" +recaptchaSiteKey: "Site key" +recaptchaSecretKey: "Secret key" +avoidMultiCaptchaConfirm: "Folosirea mai multor sisteme Captcha poate cauza interferență între acestea. Ai dori să dezactivezi alte sisteme Captcha acum active? Dacă preferi să rămână activate, apasă Anulare." +antennas: "Antene" +manageAntennas: "Gestionează Antenele" +name: "Nume" +antennaSource: "Sursa antenei" +antennaKeywords: "Cuvinte cheie ascultate" +antennaExcludeKeywords: "Cuvinte cheie excluse" +antennaKeywordsDescription: "Separă cu spații pentru o condiție ȘI sau cu o întrerupere de rând pentru o condiție SAU." +notifyAntenna: "Notifică-mă pentru note noi" +withFileAntenna: "Doar note cu fișiere" +enableServiceworker: "Activează ServiceWorker" +antennaUsersDescription: "Scrie un nume de utilizator per linie" +caseSensitive: "Sensibil la majuscule și minuscule" +withReplies: "Include răspunsuri" +connectedTo: "Următoarele conturi sunt conectate" +notesAndReplies: "Note și răspunsuri" +withFiles: "Incluzând fișiere" +silence: "Amuțește" +silenceConfirm: "Ești sigur că vrei să amuțești acest utilizator?" +unsilence: "Anulează amuțirea" +unsilenceConfirm: "Ești sigur că vrei să anulezi amuțirea acestui utilizator?" +popularUsers: "Utilizatori populari" +recentlyUpdatedUsers: "Utilizatori activi recent" +recentlyRegisteredUsers: "Utilizatori ce s-au alăturat recent" +recentlyDiscoveredUsers: "Utilizatori descoperiți recent" +exploreUsersCount: "Aici sunt {count} utilizatori" +exploreFediverse: "Explorează Fediverse-ul" +popularTags: "Taguri populare" +userList: "Liste" +about: "Despre" +aboutMisskey: "Despre Calckey" +administrator: "Administrator" +token: "Token" +twoStepAuthentication: "Autentificare în doi pași" +moderator: "Moderator" +nUsersMentioned: "Menționat de {n} utilizatori" +securityKey: "Cheie de securitate" +securityKeyName: "Numele cheii" +registerSecurityKey: "Înregistrează o cheie de securitate" +lastUsed: "Ultima utilizată" +unregister: "Dezînregistrează" +passwordLessLogin: "Autentificare fără parolă" +resetPassword: "Resetează parola" +newPasswordIs: "Noua parolă este \"{password}\"" +reduceUiAnimation: "Redu animațiile interfeței" +share: "Distribuie" +notFound: "Nu a fost găsit" +notFoundDescription: "N-a fost găsită nicio pagină cu acest URL." +uploadFolder: "Folder implicit pentru încărcări" +cacheClear: "Golește cache-ul" +markAsReadAllNotifications: "Marchează toate notificările drept citit" +markAsReadAllUnreadNotes: "Marchează toate notele drept citit" +markAsReadAllTalkMessages: "Marchează toate mesajele drept citit" +help: "Ajutor" +inputMessageHere: "Introdu un mesaj aici" +close: "Închide" +group: "Grup" +groups: "Grupuri" +createGroup: "Crează un grup" +ownedGroups: "Grupuri deținute" +joinedGroups: "Grupuri alăturate" +invites: "Invită" +groupName: "Numele grupului" +members: "Membri" +transfer: "Transferă" +messagingWithUser: "Chat privat" +messagingWithGroup: "Chat de grup" +title: "Titlu" +text: "Text" +enable: "Activează" +next: "Următorul" +retype: "Introdu din nou" +noteOf: "Notă de {user}" +inviteToGroup: "Invită în grup" +quoteAttached: "Citat" +quoteQuestion: "Vrei să adaugi ca citat?" +noMessagesYet: "Niciun mesaj încă" +newMessageExists: "Ai mesaje noi" +onlyOneFileCanBeAttached: "Poți atașa un singur fișier la un mesaj" +signinRequired: "Te rog autentifică-te" +invitations: "Invită" +invitationCode: "Cod de invitație" +checking: "Se verifică..." +available: "Disponibil" +unavailable: "Indisponibil" +usernameInvalidFormat: "Poți folosi litere mari și mici, numere și underscore-uri." +tooShort: "Prea scurt" +tooLong: "Prea lung" +weakPassword: "Parolă slabă" +normalPassword: "Parolă medie" +strongPassword: "Parolă puternică" +passwordMatched: "Se potrivește!" +passwordNotMatched: "Nu se potrivește" +signinWith: "Autentifică-te cu {x}" +signinFailed: "Nu se poate autentifica. Numele de utilizator sau parola introduse sunt incorecte." +tapSecurityKey: "Apasă pe cheia ta de securitate." +or: "Sau" +language: "Limbă" +uiLanguage: "Limba interfeței" +groupInvited: "Ai fost invitat într-un grup" +aboutX: "Despre {x}" +useOsNativeEmojis: "Folosește emojiuri native OS-ului" +disableDrawer: "Nu folosi meniuri în stil sertar" +youHaveNoGroups: "Nu ai niciun grup" +joinOrCreateGroup: "Primește o invitație într-un grup sau creează unul nou." +noHistory: "Nu există istoric" +signinHistory: "Istoric autentificări" +disableAnimatedMfm: "Dezactivează MFM cu animații" +doing: "Se procesează..." +category: "Categorie" +tags: "Etichete" +docSource: "Sursa acestui document" +createAccount: "Creează un cont" +existingAccount: "Cont existent" +regenerate: "Regenerează" +fontSize: "Mărimea fontului" +noFollowRequests: "Nu ai nicio cerere de urmărire în așteptare" +openImageInNewTab: "Deschide imaginile în taburi noi" +dashboard: "Panou de control" +local: "Local" +remote: "Extern" +total: "Total" +weekOverWeekChanges: "Schimbări până săptămâna trecută" +dayOverDayChanges: "Schimbări până ieri" +appearance: "Aspect" +clientSettings: "Setări client" +accountSettings: "Setări cont" +promotion: "Promovat" +promote: "Promovează" +numberOfDays: "Numărul zilelor" +hideThisNote: "Ascunde această notă" +showFeaturedNotesInTimeline: "Arată notele recomandate în cronologii" +objectStorage: "Object Storage" +useObjectStorage: "Folosește Object Storage" +objectStorageBaseUrl: "URL de bază" +objectStorageBaseUrlDesc: "URL-ul este folosit pentru referință. Specifică URL-ul CDN-ului sau Proxy-ului tău dacă folosești unul. Pentru S3 folosește 'https://.s3.amazonaws.com' și pentru GCS sau servicii echivalente folosește 'https://storage.googleapis.com/', etc." +objectStorageBucket: "Bucket" +objectStorageBucketDesc: "Te rog specifică numele bucket-ului furnizorului tău." +objectStoragePrefix: "Prefix" +objectStoragePrefixDesc: "Fișierele vor fi stocate sub directoare cu acest prefix." +objectStorageEndpoint: "Endpoint" +objectStorageEndpointDesc: "Lasă acest câmp gol dacă folosești AWS S3, dacă nu specifică endpoint-ul ca '' sau ':', depinzând de ce serviciu folosești." +objectStorageRegion: "Regiune" +objectStorageRegionDesc: "Specifică o regiune precum 'xx-east-1'. Dacă serviciul tău nu face distincția între regiuni lasă acest câmp gol sau introdu 'us-east-1'." +objectStorageUseSSL: "Folosește SSl" +objectStorageUseSSLDesc: "Oprește această opțiune dacă nu vei folosi HTTPS pentru conexiunile API-ului" +objectStorageUseProxy: "Conectează-te prin Proxy" +objectStorageUseProxyDesc: "Oprește această opțiune dacă vei nu folosi un Proxy pentru conexiunile API-ului" +objectStorageSetPublicRead: "Setează \"public-read\" pentru încărcare" +serverLogs: "Loguri server" +deleteAll: "Șterge tot" +showFixedPostForm: "Arată caseta de postare în vârful cronologie" +newNoteRecived: "Sunt note noi" +sounds: "Sunete" +listen: "Ascultă" +none: "Nimic" +showInPage: "Arată în pagină" +popout: "Scoate în afară" +volume: "Volum" +masterVolume: "Volumul principal" +details: "Detalii" +chooseEmoji: "Alege un emoji" +unableToProcess: "Această operație nu poate fi completată" +recentUsed: "Folosit recent" +install: "Instalează" +uninstall: "Dezinstalează" +installedApps: "Aplicații autorizate" +nothing: "Nu e nimic de văzut aici" +installedDate: "Autorizat la data de" +lastUsedDate: "Folosit ultima oara la" +state: "Stare" +sort: "Sortează" +ascendingOrder: "Crescător" +descendingOrder: "Descrescător" +scratchpad: "Scratchpad" +scratchpadDescription: "Scratchpad-ul oferă un mediu de experimentare în AiScript. Poți scrie, executa și verifica rezultatele acestuia interacționând cu Calckey în el." +output: "Ieșire" +script: "Script" +disablePagesScript: "Dezactivează AiScript în Pagini" +updateRemoteUser: "Actualizează informațiile utilizatorului extern" +deleteAllFiles: "Șterge toate fișierele" +deleteAllFilesConfirm: "Ești sigur că vrei să ștergi toate fișierele?" +removeAllFollowing: "Dezurmărește toți utilizatorii urmăriți" +removeAllFollowingDescription: "Asta va dez-urmări toate conturile din {host}. Te rog execută asta numai dacă instanța, de ex., nu mai există." +userSuspended: "Acest utilizator a fost suspendat." +userSilenced: "Acest utilizator a fost setat silențios." +yourAccountSuspendedTitle: "Acest cont a fost suspendat" +yourAccountSuspendedDescription: "Acest cont a fost suspendat din cauza încălcării termenilor de serviciu al serverului sau ceva similar. Contactează administratorul dacă ai dori să afli un motiv mai detaliat. Te rog nu crea un cont nou." +menu: "Meniu" +divider: "Separator" +addItem: "Adaugă element" +relays: "Relee" +addRelay: "Adaugă Releu" +inboxUrl: "URL-ul inbox-ului" +addedRelays: "Relee adăugate" +serviceworkerInfo: "Trebuie să fie activat pentru notificări push." +deletedNote: "Notă ștearsă" +invisibleNote: "Note ascunse" +enableInfiniteScroll: "Încarcă mai mult automat" +visibility: "Vizibilitate" +poll: "Sondaj" +useCw: "Ascunde conținutul" +enablePlayer: "Deschide player-ul video" +disablePlayer: "Închide player-ul video" +expandTweet: "Expandează tweet" +themeEditor: "Editor de teme" +description: "Descriere" +describeFile: "Adaugă titrări" +enterFileDescription: "Introdu titrările" +author: "Autor" +leaveConfirm: "Ai schimbări nesalvate. Vrei să renunți la ele?" +manage: "Gestionare" +plugins: "Pluginuri" +deck: "Deck" +undeck: "Părăsește Deck" +useBlurEffectForModal: "Folosește efect de blur pentru modale" +width: "Lăţime" +height: "Înălţime" +large: "Mare" +medium: "Mediu" +small: "Mic" +generateAccessToken: "Generează token de acces" +permission: "Permisiuni" +enableAll: "Actevează tot" +disableAll: "Dezactivează tot" +tokenRequested: "Acordă acces la cont" +pluginTokenRequestedDescription: "Acest plugin va putea să folosească permisiunile setate aici." +notificationType: "Tipul notificării" +edit: "Editează" +emailServer: "Server email" +enableEmail: "Activează distribuția de emailuri" +emailConfigInfo: "Folosit pentru a confirma emailul tău în timpul logări dacă îți uiți parola" +email: "Email" +emailAddress: "Adresă de email" +smtpConfig: "Configurare Server SMTP" +smtpHost: "Gazdă" +smtpPort: "Port" +smtpUser: "Nume de utilizator" +smtpPass: "Parolă" +emptyToDisableSmtpAuth: "Lasă username-ul și parola necompletate pentru a dezactiva verificarea SMTP" +smtpSecure: "Folosește SSL/TLS implicit pentru conecțiunile SMTP" +smtpSecureInfo: "Oprește opțiunea asta dacă STARTTLS este folosit" +testEmail: "Testează livrarea emailurilor" +wordMute: "Cuvinte pe mut" +regexpError: "Eroare de Expresie Regulată" +regexpErrorDescription: "A apărut o eroare în expresia regulată pe linia {line} al cuvintelor {tab} setate pe mut:" +instanceMute: "Instanțe pe mut" +userSaysSomething: "{name} a spus ceva" +makeActive: "Activează" +display: "Arată" +copy: "Copiază" +metrics: "Metrici" +overview: "Privire de ansamblu" +logs: "Log-uri" +delayed: "Întârziate" +database: "Baza de date" +channel: "Canale" +create: "Crează" +notificationSetting: "Setări notificări" +notificationSettingDesc: "Selectează tipurile de notificări care să fie arătate" +useGlobalSetting: "Folosește setările globale" +useGlobalSettingDesc: "Dacă opțiunea e pornită, notificările contului tău vor fi folosite. Dacă e oprită, configurația va fi individuală." +other: "Altele" +regenerateLoginToken: "Regenerează token de login" +regenerateLoginTokenDescription: "Regenerează token-ul folosit intern în timpul logări. În mod normal asta nu este necesar. Odată regenerat, toate dispozitivele vor fi delogate." +setMultipleBySeparatingWithSpace: "Separă mai multe intrări cu spații." +fileIdOrUrl: "Introdu ID sau URL" +behavior: "Comportament" +sample: "exemplu" +abuseReports: "Rapoarte" +reportAbuse: "Raportează" +reportAbuseOf: "Raportează {name}" +fillAbuseReportDescription: "Te rog scrie detaliile legate de acest raport. Dacă este despre o notă specifică, te rog introdu URL-ul ei." +abuseReported: "Raportul tău a fost trimis. Mulțumim." +reporter: "Raportorul" +reporteeOrigin: "Originea raportatului" +reporterOrigin: "Originea raportorului" +forwardReport: "Redirecționează raportul către instanța externă" +forwardReportIsAnonymous: "În locul contului tău, va fi afișat un cont anonim, de sistem, ca raportor către instanța externă." +send: "Trimite" +abuseMarkAsResolved: "Marchează raportul ca rezolvat" +openInNewTab: "Deschide în tab nou" +openInSideView: "Deschide în vedere laterală" +defaultNavigationBehaviour: "Comportament de navigare implicit" +editTheseSettingsMayBreakAccount: "Editarea acestor setări îți pot defecta contul." +waitingFor: "Așteptând pentru {x}" +random: "Aleator" +system: "Sistem" +switchUi: "Schimbă UI" +desktop: "Desktop" +clearCache: "Golește cache-ul" +info: "Despre" +user: "Utilizatori" +administration: "Gestionare" +middle: "Mediu" +sent: "Trimite" +searchByGoogle: "Caută" +file: "Fișiere" +_email: + _follow: + title: "te-a urmărit" +_mfm: + mention: "Mențiune" + quote: "Citează" + emoji: "Emoji personalizat" + search: "Caută" +_theme: + description: "Descriere" + keys: + mention: "Mențiune" + renote: "Re-notează" + divider: "Separator" +_sfx: + note: "Note" + notification: "Notificări" + chat: "Chat" +_widgets: + notifications: "Notificări" + timeline: "Cronologie" + activity: "Activitate" + federation: "Federație" + jobQueue: "coada de job-uri" +_cw: + show: "Incarcă mai mult" +_visibility: + home: "Acasă" + followers: "Urmăritori" +_profile: + name: "Nume" + username: "Nume de utilizator" +_exportOrImport: + followingList: "Urmărești" + muteList: "Amuțește" + blockingList: "Blochează" + userLists: "Liste" +_charts: + federation: "Federație" +_timelines: + home: "Acasă" +_pages: + blocks: + image: "Imagini" + script: + categories: + list: "Liste" + blocks: + _join: + arg1: "Liste" + _randomPick: + arg1: "Liste" + _dailyRandomPick: + arg1: "Liste" + _seedRandomPick: + arg2: "Liste" + _pick: + arg1: "Liste" + _listLen: + arg1: "Liste" + types: + array: "Liste" +_notification: + youWereFollowed: "te-a urmărit" + youWereInvitedToGroup: "Ai fost invitat într-un grup" + _types: + follow: "Urmărești" + mention: "Mențiune" + renote: "Re-notează" + quote: "Citează" + reaction: "Reacție" + _actions: + reply: "Răspunde" + renote: "Re-notează" +_deck: + _columns: + notifications: "Notificări" + tl: "Cronologie" + antenna: "Antene" + list: "Liste" + mentions: "Mențiuni" diff --git a/fe_calckey/frontend/locales/ru-RU.yml b/fe_calckey/frontend/locales/ru-RU.yml new file mode 100644 index 0000000..8b3e05a --- /dev/null +++ b/fe_calckey/frontend/locales/ru-RU.yml @@ -0,0 +1,1991 @@ +_lang_: "Русский" +headlineMisskey: "Сеть, сплетённая из заметок" +introMisskey: "Calckey - это децентрализованная платформа социальных сетей с открытым\ + \ исходным кодом, которая свободна навсегда! \U0001F680" +monthAndDay: "{day}.{month}" +search: "Поиск" +notifications: "Уведомления" +username: "Имя пользователя" +password: "Пароль" +forgotPassword: "Пароль забыт" +fetchingAsApObject: "Приём с других сайтов" +ok: "Окей" +gotIt: "Ясно!" +cancel: "Отмена" +enterUsername: "Введите имя пользователя" +renotedBy: "{user} делится" +noNotes: "Нет ни одного поста" +noNotifications: "Нет ни одного уведомления" +instance: "Инстанс" +settings: "Настройки" +basicSettings: "Основные настройки" +otherSettings: "Прочие настройки" +openInWindow: "Открывать в плавающих окнах" +profile: "Профиль" +timeline: "Лента" +noAccountDescription: "Пользователь ничего не написал про себя." +login: "Войти" +loggingIn: "Выполняется вход" +logout: "Выйти" +signup: "Регистрация" +uploading: "Загрузка..." +save: "Сохранить" +users: "Пользователи" +addUser: "Добавить пользователя" +favorite: "В избранное" +favorites: "Избранное" +unfavorite: "Убрать из избранного" +favorited: "Добавлено в избранное." +alreadyFavorited: "Уже есть в избранном." +cantFavorite: "Не удалось добавить в избранное." +pin: "Закрепить в профиле" +unpin: "Открепить от профиля" +copyContent: "Скопировать содержимое" +copyLink: "Скопировать ссылку" +delete: "Удалить" +deleteAndEdit: "Удалить и отредактировать" +deleteAndEditConfirm: "Удалить этот пост и создать отредактированный? Все реакции,\ + \ ссылки и ответы на существующий будут потеряны." +addToList: "Добавить в список" +sendMessage: "Отправить сообщение" +copyUsername: "Скопировать имя пользователя" +searchUser: "Поиск людей" +reply: "Ответить" +loadMore: "Показать еще" +showMore: "Показать еще" +showLess: "Закрыть" +youGotNewFollower: "Новый подписчик" +receiveFollowRequest: "Получен запрос на подписку" +followRequestAccepted: "Запрос на подписку принят" +mention: "Упоминание" +mentions: "Упоминания" +directNotes: "Личные сообщения" +importAndExport: "Импорт и экспорт" +import: "Импорт" +export: "Экспорт" +files: "Файлы" +download: "Скачать" +driveFileDeleteConfirm: "Удалить файл «{name}»? Он будет удален со всех постов которые\ + \ содержат его как вложение." +unfollowConfirm: "Удалить из подписок пользователя {name}?" +exportRequested: "Вы запросили экспорт. Это может занять некоторое время. Результат\ + \ будет добавлен на «Диск»." +importRequested: "Вы запросили импорт. Это может занять некоторое время." +lists: "Списки" +noLists: "Нет ни одного списка" +note: "Пост" +notes: "Посты" +following: "Подписки" +followers: "Подписчики" +followsYou: "Читает вас" +createList: "Создать список" +manageLists: "Управление списками" +error: "Ошибка" +somethingHappened: "Что-то пошло не так" +retry: "Повторить попытку" +pageLoadError: "Не удалось загрузить страницу." +pageLoadErrorDescription: "Обычно это случается из-за сбоев в сети или кэша браузера.\ + \ Попробуйте очистить кэш, или подождать пару минут, а потом попытаться загрузить\ + \ страницу снова." +serverIsDead: "Ответа от сервера нет. Пожалуйста, подождите немного и повторите попытку." +youShouldUpgradeClient: "Чтобы просмотреть эту страницу, пожалуйста, обновите ее." +enterListName: "Название списка" +privacy: "Конфиденциальность" +makeFollowManuallyApprove: "Принимать подписчиков вручную" +defaultNoteVisibility: "Видимость постов по умолчанию" +follow: "Подписка" +followRequest: "Запрос на подписку" +followRequests: "Запросы на подписку" +unfollow: "Отписаться" +followRequestPending: "Нерассмотренный запрос на подписку" +enterEmoji: "Введите эмодзи" +renote: "Репост" +unrenote: "Отмена репоста" +renoted: "Репост совершён." +cantRenote: "Это нельзя репостить." +cantReRenote: "Невозможно репостить репост." +quote: "Цитата" +pinnedNote: "Закреплённый пост" +pinned: "Закрепить в профиле" +you: "Вы" +clickToShow: "Нажмите для просмотра" +sensitive: "Содержимое не для всех" +add: "Добавить" +reaction: "Реакции" +reactionSetting: "Реакции, отображаемые в палитре" +reactionSettingDescription2: "Расставляйте перетаскиванием, удаляйте нажатием, добавляйте\ + \ кнопкой «+»." +rememberNoteVisibility: "Запоминать видимость постов" +attachCancel: "Удалить вложение" +markAsSensitive: "Отметить как «не для всех»" +unmarkAsSensitive: "Снять отметку «не для всех»" +enterFileName: "Введите имя файла" +mute: "Скрыть" +unmute: "Отменить скрытие" +block: "Заблокировать" +unblock: "Разблокировать" +suspend: "Заморозить" +unsuspend: "Разморозить" +blockConfirm: "Заблокировать этот аккаунт?" +unblockConfirm: "Разблокировать этот аккаунт?" +suspendConfirm: "Заморозить этот аккаунт?" +unsuspendConfirm: "Разморозить этот аккаунт?" +selectList: "Выберите список" +selectAntenna: "Выберите антенну" +selectWidget: "Выберите виджет" +editWidgets: "Редактировать виджеты" +editWidgetsExit: "Готово" +customEmojis: "Собственные эмодзи" +emoji: "Эмодзи" +emojis: "Эмодзи" +emojiName: "Название эмодзи" +emojiUrl: "URL эмодзи" +addEmoji: "Добавить эмодзи" +settingGuide: "Рекомендуемые настройки" +cacheRemoteFiles: "Кешировать внешние файлы" +cacheRemoteFilesDescription: "Когда эта настройка отключена, файлы с других сайтов\ + \ будут загружаться прямо оттуда. Это сэкономит место на сервере, но увеличит трафик,\ + \ так как не будут создаваться эскизы." +flagAsBot: "Аккаунт бота" +flagAsBotDescription: "Включите, если этот аккаунт управляется программой. Это позволит\ + \ системе Calckey учитывать это, а также поможет разработчикам других ботов предотвратить\ + \ бесконечные циклы взаимодействия." +flagAsCat: "Аккаунт кота" +flagAsCatDescription: "Вы получите кошачьи ушки и будете говорить как кот!" +flagShowTimelineReplies: "Показывать ответы на посты в ленте" +flagShowTimelineRepliesDescription: "Если этот параметр включен, то в ленте, в дополнение\ + \ к постам пользователя, отображаются ответы на другие посты пользователя." +autoAcceptFollowed: "Принимать подписчиков автоматически" +addAccount: "Добавить учётную запись" +loginFailed: "Неудачная попытка входа" +showOnRemote: "Перейти к оригиналу на сайт" +general: "Общее" +wallpaper: "Обои" +setWallpaper: "Установить обои" +removeWallpaper: "Удалить обои" +searchWith: "Найденное «{q}»" +youHaveNoLists: "У вас нет ни одного списка" +followConfirm: "Подписаться на {name}?" +proxyAccount: "Учётная запись прокси" +proxyAccountDescription: "Учетная запись прокси предназначена служить подписчиком\ + \ на пользователей с других сайтов. Например, если пользователь добавит кого-то\ + \ с другого сайта а список, деятельность того не отобразится, пока никто с этого\ + \ же сайта не подписан на него. Чтобы это стало возможным, на него подписывается\ + \ прокси." +host: "Хост" +selectUser: "Выберите пользователя" +recipient: "Кому" +annotation: "Описание" +federation: "Федерация" +instances: "Инстанс" +registeredAt: "Первое наблюдение" +latestRequestSentAt: "Последний отправленный запрос" +latestRequestReceivedAt: "Последний полученный запрос" +latestStatus: "Последний статус" +storageUsage: "Использовано" +charts: "Диаграммы" +perHour: "По часам" +perDay: "По дням" +stopActivityDelivery: "Остановить отправку обновлений активности" +blockThisInstance: "Блокировать этот инстанс" +operations: "Операции" +software: "Программы" +version: "Версия" +metadata: "Метаданные" +monitor: "Монитор" +jobQueue: "Очередь заданий" +cpuAndMemory: "Процессор и память" +network: "Сеть" +disk: "Диск" +instanceInfo: "Информация об инстансе" +statistics: "Статистика" +clearQueue: "Очистить очередь" +clearQueueConfirmTitle: "Очистить очередь?" +clearQueueConfirmText: "Всё, что осталось в очереди, не будет доставлено. Обычно эта\ + \ операция НЕ нужна." +clearCachedFiles: "Очистить кэш" +clearCachedFilesConfirm: "Удалить все закэшированные файлы с других сайтов?" +blockedInstances: "Заблокированные инстансы" +blockedInstancesDescription: "Введите список инстансов, которые хотите заблокировать.\ + \ Они больше не смогут обмениваться с вашим инстансом." +muteAndBlock: "Скрытие и блокировка" +mutedUsers: "Скрытые пользователи" +blockedUsers: "Заблокированные пользователи" +noUsers: "Нет ни одного пользователя" +editProfile: "Редактировать профиль" +noteDeleteConfirm: "Вы хотите удалить этот пост?" +pinLimitExceeded: "Нельзя закрепить ещё больше постов" +intro: "Установка Calckey завершена! А теперь создайте учетную запись администратора." +done: "Готово" +processing: "Обработка..." +preview: "Предпросмотр" +default: "По умолчанию" +defaultValueIs: "По умолчанию: {value}" +noCustomEmojis: "Собственные эмодзи отсутствуют" +noJobs: "Нет заданий" +federating: "Федерируется" +blocked: "Заблокировано" +suspended: "Заморожено" +all: "Всё" +subscribing: "Подписка" +publishing: "Публикация" +notResponding: "Нет ответа" +instanceFollowing: "Подписанные на инстансе" +instanceFollowers: "Подписчики инстанса" +instanceUsers: "Пользователи инстанса" +changePassword: "Изменить пароль" +security: "Безопасность" +retypedNotMatch: "Не совпадают." +currentPassword: "Текущий пароль" +newPassword: "Новый пароль" +newPasswordRetype: "Новый пароль (ещё раз)" +attachFile: "Прикрепить файлы" +more: "Ещё!" +featured: "Горячее" +usernameOrUserId: "Имя или идентификатор пользователя" +noSuchUser: "Таких пользователей не найдено" +lookup: "Запрос" +announcements: "Оповещения" +imageUrl: "Ссылка на изображение" +remove: "Удалить" +removed: "\uFEFFУдалено" +removeAreYouSure: "Хотите удалить «{x}»?" +deleteAreYouSure: "Хотите удалить «{x}»?" +resetAreYouSure: "На самом деле сбросить?" +saved: "Сохранено" +messaging: "Сообщения" +upload: "Загрузить" +keepOriginalUploading: "Сохранить исходное изображение" +keepOriginalUploadingDescription: "Сохраняет исходную версию при загрузке изображений.\ + \ Если выключить, то при загрузке браузер генерирует изображение для публикации." +fromDrive: "С «диска»" +fromUrl: "По ссылке" +uploadFromUrl: "Загрузить по ссылке" +uploadFromUrlDescription: "Ссылка на файл, который хотите загрузить" +uploadFromUrlRequested: "Загрузка выбранного" +uploadFromUrlMayTakeTime: "Загрузка может занять некоторое время." +explore: "Обзор" +messageRead: "Прочитали" +noMoreHistory: "История закончилась" +startMessaging: "Начать общение" +nUsersRead: "Прочитали {n}" +agreeTo: "Я соглашаюсь с {0}" +tos: "Пользовательское соглашение" +start: "Начать" +home: "Главная" +remoteUserCaution: "Это пользователь с другого сайта, поэтому информация может быть\ + \ неточной." +activity: "Активность" +images: "Изображения" +birthday: "День рождения" +yearsOld: "Возраст: {age}" +registeredDate: "Дата регистрации" +location: "Местоположение" +theme: "Тема" +themeForLightMode: "Тема для светлого режима" +themeForDarkMode: "Тема для тёмного режима" +light: "Светлый" +dark: "Тёмный" +lightThemes: "Светлые темы" +darkThemes: "Тёмные темы" +syncDeviceDarkMode: "Синхронизировать с темным режимом устройства" +drive: "Диск" +fileName: "Имя файла" +selectFile: "Выберите файл" +selectFiles: "Выберите файлы" +selectFolder: "Выберите папку" +selectFolders: "Выберите папки" +renameFile: "Переименовать файл" +folderName: "Имя папки" +createFolder: "Создать папку" +renameFolder: "Переименовать папку" +deleteFolder: "Удалить папку" +addFile: "Добавить файл" +emptyDrive: "Диск пуст" +emptyFolder: "Папка пуста" +unableToDelete: "Удаление невозможно" +inputNewFileName: "Введите имя нового файла" +inputNewDescription: "Введите новую подпись" +inputNewFolderName: "Пожалуйста, введите новое имя папки" +circularReferenceFolder: "Вы пытаетесь переместить папку внутрь себя." +hasChildFilesOrFolders: "Эта папка не пуста и не может быть удалена." +copyUrl: "Копировать ссылку" +rename: "Переименовать" +avatar: "Аватар" +banner: "Шапка" +nsfw: "Содержимое не для всех" +whenServerDisconnected: "Когда соединение с сервером потеряно" +disconnectedFromServer: "Разорвано соединение с сервером" +reload: "Перезагрузить" +doNothing: "Ничего не делать" +reloadConfirm: "Перезагрузить ленту?" +watch: "Следить" +unwatch: "Отписаться" +accept: "Принять" +reject: "Отклонить" +normal: "Стабильно" +instanceName: "Название инстанса" +instanceDescription: "Описание инстанса" +maintainerName: "Имя администратора" +maintainerEmail: "Электронная почта администратора" +tosUrl: "Ссылка на пользовательское соглашение" +thisYear: "Этот год" +thisMonth: "Этот месяц" +today: "Этот день" +dayX: "{day} день" +monthX: "{month} месяц" +yearX: "{year} год" +pages: "Страницы" +integration: "Интеграции" +connectService: "Подключиться" +disconnectService: "Отключиться" +enableLocalTimeline: "Включить локальную ленту" +enableGlobalTimeline: "Включить глобальную ленту" +disablingTimelinesInfo: "У администраторов и модераторов есть доступ ко всем лентам,\ + \ даже если они отключены." +registration: "Регистрация" +enableRegistration: "Разрешить регистрацию" +invite: "Пригласить" +driveCapacityPerLocalAccount: "Объём диска на одного локального пользователя" +driveCapacityPerRemoteAccount: "Объём диска на одного пользователя с другого сайта" +inMb: "В мегабайтах" +iconUrl: "Ссылка на аватар" +bannerUrl: "Ссылка на изображение в шапке" +backgroundImageUrl: "Ссылка на фоновое изображение" +basicInfo: "Общая информация" +pinnedUsers: "Прикреплённый пользователь" +pinnedUsersDescription: "Перечислите по одному имени пользователя в строке. Пользователи,\ + \ перечисленные здесь, будут привязаны к закладке \"Изучение\"." +pinnedPages: "Закрепленные страницы" +pinnedPagesDescription: "Если хотите закрепить страницы на главной сайта, сюда можно\ + \ добавить пути к ним, каждый в отдельной строке." +pinnedClipId: "Идентификатор закреплённой подборки" +pinnedNotes: "Закреплённые посты" +hcaptcha: "hCaptcha" +enableHcaptcha: "Включить hCaptcha" +hcaptchaSiteKey: "Ключ сайта" +hcaptchaSecretKey: "Секретный ключ" +recaptcha: "reCAPTCHA" +enableRecaptcha: "Включить reCAPTCHA" +recaptchaSiteKey: "Ключ сайта" +recaptchaSecretKey: "Секретный ключ" +avoidMultiCaptchaConfirm: "Несколько способов проверки могут мешать друг другу. Подтвердите,\ + \ если хотите отключить другие способы. Или нажмите «Отмена», чтобы оставить их\ + \ включёнными." +antennas: "Антенны" +manageAntennas: "Настройки антенн" +name: "Название" +antennaSource: "Источник антенны" +antennaKeywords: "Ключевые слова" +antennaExcludeKeywords: "Исключения" +antennaKeywordsDescription: "Пишите слова через пробел в одной строке, чтобы ловить\ + \ их появление вместе; на отдельных строках располагайте слова, или группы слов,\ + \ чтобы ловить любые из них." +notifyAntenna: "Уведомлять о новых постах" +withFileAntenna: "Только посты с вложениями" +enableServiceworker: "Включить ServiceWorker" +antennaUsersDescription: "Пишите каждое название аккаута на отдельной строке" +caseSensitive: "С учётом регистра" +withReplies: "Включая ответы" +connectedTo: "Вы подключены к следующим аккаунтам" +notesAndReplies: "Посты и ответы" +withFiles: "Посты с файлами" +silence: "Заглушить" +silenceConfirm: "Вы уверены что хотите заглушить этого пользователя?" +unsilence: "Снять глушение" +unsilenceConfirm: "Снять глушение с этого пользователя? Уверены?" +popularUsers: "Популярные пользователи" +recentlyUpdatedUsers: "Активные последнее время" +recentlyRegisteredUsers: "Недавно зарегистрированные пользователи" +recentlyDiscoveredUsers: "Недавно обнаруженные пользователи" +exploreUsersCount: "Пользователей: {count}" +exploreFediverse: "Исследуйте Fediverse" +popularTags: "Популярные теги" +userList: "Списки" +about: "Описание" +aboutMisskey: "О Calckey" +administrator: "Администратор" +token: "Токен" +twoStepAuthentication: "Двухфакторная аутентификация" +moderator: "Модератор" +moderation: "Модерация" +nUsersMentioned: "Упомянуло пользователей: {n}" +securityKey: "Ключ безопасности" +securityKeyName: "Имя ключа" +registerSecurityKey: "Зарегистрировать защитный ключ" +lastUsed: "Последнее использование" +unregister: "Отписаться" +passwordLessLogin: "Настроить вход без пароля" +resetPassword: "Сброс пароля" +newPasswordIs: "Новый пароль — «{password}»" +reduceUiAnimation: "Уменьшить анимацию в пользовательском интерфейсе" +share: "Поделиться" +notFound: "Не найдено" +notFoundDescription: "Страница по указанной ссылке не найдена." +uploadFolder: "Место загрузки по умолчанию" +cacheClear: "Очистка кэша" +markAsReadAllNotifications: "Отметить все уведомления как прочитанные" +markAsReadAllUnreadNotes: "Отметить все посты как прочитанные" +markAsReadAllTalkMessages: "Отметить все реплики как прочитанные" +help: "Помощь" +inputMessageHere: "Введите сообщение здесь" +close: "Закрыть" +group: "Группа" +groups: "Группы" +createGroup: "Создать группу" +ownedGroups: "Собственные группы" +joinedGroups: "Участие в группах" +invites: "Приглашения" +groupName: "Название группы" +members: "Участники" +transfer: "Отдать" +messagingWithUser: "Общение с другим пользователем" +messagingWithGroup: "Общение в группе" +title: "Заголовок" +text: "Текст" +enable: "Включить" +next: "Дальше" +retype: "Введите ещё раз" +noteOf: "Что пишет {user}" +inviteToGroup: "Пригласить в группу" +quoteAttached: "Цитата" +quoteQuestion: "Хотите добавить цитату?" +noMessagesYet: "Пока ни одного сообщения" +newMessageExists: "Новое сообщение" +onlyOneFileCanBeAttached: "К сообщению можно прикрепить только один файл" +signinRequired: "Пожалуйста, войдите" +invitations: "Приглашения" +invitationCode: "Код приглашения" +checking: "Проверка..." +available: "Доступно" +unavailable: "Не доступно" +usernameInvalidFormat: "Можно использовать только латинские буквы (A—Z, a—z), цифры\ + \ (0—9) и знак подчёркивания (_)." +tooShort: "Слишком короткий" +tooLong: "Слишком длинный" +weakPassword: "Слабый пароль" +normalPassword: "Годный пароль" +strongPassword: "Надёжный пароль" +passwordMatched: "Совпали" +passwordNotMatched: "Не совпадают" +signinWith: "Использовать {x} для входа" +signinFailed: "Невозможно войти в систему. Введенное вами имя пользователя или пароль\ + \ неверны." +tapSecurityKey: "Нажмите на свой электронный ключ" +or: "или" +language: "Язык" +uiLanguage: "Язык интерфейса" +groupInvited: "Приглашение в группу" +aboutX: "Описание {x}" +useOsNativeEmojis: "Использовать эмодзи операционной системы" +disableDrawer: "Не использовать выдвижные меню" +youHaveNoGroups: "У вас нет ни одной группы" +joinOrCreateGroup: "Получайте приглашения в группы или создавайте свои собственные." +noHistory: "История пока пуста" +signinHistory: "Журнал посещений" +disableAnimatedMfm: "Отключение анимированной разметки MFM" +doing: "В процессе..." +category: "Категория" +tags: "Метки" +docSource: "Источник документа" +createAccount: "Новая учётная запись" +existingAccount: "Существующая учётная запись" +regenerate: "Создать повторно" +fontSize: "Размер шрифта" +noFollowRequests: "Нерассмотренные запросы на подписку отсутствуют" +openImageInNewTab: "Открыть изображение в новой вкладке" +dashboard: "Панель управления" +local: "С этого сайта" +remote: "С других сайтов" +total: "Всего" +weekOverWeekChanges: "За неделю" +dayOverDayChanges: "За день" +appearance: "Внешний вид" +clientSettings: "Настройки клиента" +accountSettings: "Настройки учетной записи" +promotion: "Продвинуто" +promote: "Продвинуть" +numberOfDays: "Количество дней" +hideThisNote: "Спрятать эту запись" +showFeaturedNotesInTimeline: "Показывать в ленте посты из «Горячего»" +objectStorage: "Хранилище" +useObjectStorage: "Использовать объектное хранилище" +objectStorageBaseUrl: "Базовый адрес" +objectStorageBaseUrlDesc: "URL используемый для примера. Укажите URL-адрес вашего\ + \ CDN или прокси, если вы используете любой из них.\nДля S3 используйте 'https://.s3.amazonaws.com',\ + \ а для GCS и подобных сервисов используйте 'https://storage.googleapis.com/',\ + \ и т.п." +objectStorageBucket: "Bucket" +objectStorageBucketDesc: "Укажите название контейнера (Bucket) который используется\ + \ на выбранном сервисе." +objectStoragePrefix: "Префикс" +objectStoragePrefixDesc: "Файлы будут храниться в директории, соответствующей указанному\ + \ здесь префиксу пути." +objectStorageEndpoint: "Конечная точка" +objectStorageEndpointDesc: "Если используете AWS S3, оставьте пустым. В остальных\ + \ случаях укажите конечную точку (endpoint) в форме «» или «:»,\ + \ так, как это описано в руководстве той службы, которую собираетесь использовать." +objectStorageRegion: "Регион" +objectStorageRegionDesc: "Укажите регион, например xx-east-1. Если ваша служба не\ + \ различает регионы, оставьте поле пустым, или впишите us-east-1." +objectStorageUseSSL: "Использовать SSL" +objectStorageUseSSLDesc: "Отключите, если не собираетесь использовать протокол HTTPS\ + \ для обмена по API" +objectStorageUseProxy: "Использовать прокси" +objectStorageUseProxyDesc: "Отключите, если не будете испоьзовать прокси для соединений\ + \ по протоколу ObjectStorage" +objectStorageSetPublicRead: "Устанавливать public-read при загрузке на сервер" +serverLogs: "Журнал сервера" +deleteAll: "Удалить всё" +showFixedPostForm: "Показывать поле для ввода нового поста наверху ленты" +newNoteRecived: "Появился новый пост" +sounds: "Звуки" +listen: "Слушать" +none: "Ничего" +showInPage: "Показать страницу" +popout: "Развернуть" +volume: "Громкость" +masterVolume: "Основная регулировка громкости" +details: "Подробнее" +chooseEmoji: "Выберите эмодзи" +unableToProcess: "Не удаётся завершить операцию" +recentUsed: "Последние использованные" +install: "Установить" +uninstall: "Удалить" +installedApps: "Установленные приложения" +nothing: "Ничего нет" +installedDate: "Дата установки" +lastUsedDate: "Дата использования" +state: "Состояние" +sort: "Сортировать" +ascendingOrder: "по возрастанию" +descendingOrder: "По убыванию" +scratchpad: "Когтеточка" +scratchpadDescription: "«Когтеточка» — это место для опытов с AiScript. Здесь можно\ + \ писать программы, взаимодействующие с Calckey, запускать и смотреть что из этого\ + \ получается." +output: "Выходы" +script: "Скрипт" +disablePagesScript: "Отключить скрипты на «Страницах»" +updateRemoteUser: "Обновить данные пользователя с его сервера" +deleteAllFiles: "Удалить все файлы" +deleteAllFilesConfirm: "Вы хотите удалить все файлы?" +removeAllFollowing: "Удалить всех подписчиков" +removeAllFollowingDescription: "Отменить все подписки с домена {host}? Пожалуйста,\ + \ применяйте это действие, если инстанс больше не существует." +userSuspended: "Эта учётная запись заморожена." +userSilenced: "Этот пользователь был заглушен." +yourAccountSuspendedTitle: "Эта учетная запись заблокирована" +yourAccountSuspendedDescription: "Эта учетная запись была заблокирована из-за нарушения\ + \ условий предоставления услуг сервера. Свяжитесь с администратором, если вы хотите\ + \ узнать более подробную причину. Пожалуйста, не создавайте новую учетную запись." +menu: "Меню" +divider: "Линия-разделитель" +addItem: "Добавить элемент" +relays: "Ретрансляторы" +addRelay: "Добавить ретранслятор" +inboxUrl: "URL ящика входящих сообщений" +addedRelays: "Добавленные ретрансляторы" +serviceworkerInfo: "Нужно включить, чтобы работали push-уведомления." +deletedNote: "Удалённый пост" +invisibleNote: "Личное сообщение" +enableInfiniteScroll: "Включить бесконечную прокрутку" +visibility: "Видимость" +poll: "Опрос" +useCw: "Скрывать содержимое под предупреждением" +enablePlayer: "Включить проигрыватель" +disablePlayer: "Выключить проигрыватель" +expandTweet: "Развернуть твит" +themeEditor: "Редактор темы оформления" +description: "Описание" +describeFile: "Добавить подпись" +enterFileDescription: "Введите подпись" +author: "Автор" +leaveConfirm: "Вы не сохранили изменения. Хотите выйти и потерять их?" +manage: "Управление" +plugins: "Расширения" +preferencesBackups: "Резервная копия" +deck: "Пульт" +undeck: "Покинуть пульт" +useBlurEffectForModal: "Размывка под формой поверх всего" +useFullReactionPicker: "Полнофункциональный выбор реакций" +width: "Ширина" +height: "Высота" +large: "Крупно" +medium: "Средне" +small: "Мелко" +generateAccessToken: "Создать токен доступа" +permission: "Разрешения" +enableAll: "Включить все" +disableAll: "Выключить всё" +tokenRequested: "Открыть доступ к учётной записи" +pluginTokenRequestedDescription: "Это расширение сможет пользоваться разрешениями,\ + \ установленными здесь." +notificationType: "Тип уведомления" +edit: "Изменить" +emailServer: "Сервер электронной почты" +enableEmail: "Включить обмен электронной почтой" +emailConfigInfo: "Используется для подтверждения адреса электронной почты и сброса\ + \ пароля" +email: "Электронная почта" +emailAddress: "Адрес электронной почты" +smtpConfig: "Конфигурация SMTP-сервера" +smtpHost: "Хост" +smtpPort: "Порт" +smtpUser: "Имя пользователя" +smtpPass: "Пароль" +emptyToDisableSmtpAuth: "Не заполняйте имя пользователя и пароль, чтобы отключить\ + \ аутентификацию в SMTP" +smtpSecure: "Использовать SSL/TLS для SMTP-соединений" +smtpSecureInfo: "Выключите при использовании STARTTLS" +testEmail: "Проверка доставки электронной почты" +wordMute: "Скрытие слов" +regexpError: "Ошибка в регулярном выражении" +instanceMute: "Глушение инстансов" +userSaysSomething: "{name} что-то сообщает" +makeActive: "Активировать" +display: "Отображение" +copy: "Копировать" +metrics: "Метрики" +overview: "Обзор" +logs: "Журналы" +delayed: "Задержка" +database: "База данных" +channel: "Каналы" +create: "Создать" +notificationSetting: "Настройки уведомлений" +notificationSettingDesc: "Выберите тип уведомлений для отображения." +useGlobalSetting: "Использовать глобальные настройки" +useGlobalSettingDesc: "Если включено, будут использоваться настройки учётной записи.\ + \ Если включить, этот виджет можно будет настроить индивидуально." +other: "Другие" +regenerateLoginToken: "Создать новый токен для входа" +regenerateLoginTokenDescription: "Создаёт новый токен, используемый внутри программы\ + \ во время входа. Обычно в этом нет необходимости. При создании все устройства будут\ + \ отключены." +setMultipleBySeparatingWithSpace: "Можно написать несколько через пробел." +fileIdOrUrl: "Идентификатор файла или ссылка" +behavior: "Поведение" +sample: "Пример" +abuseReports: "Жалобы" +reportAbuse: "Жалоба" +reportAbuseOf: "Пожаловаться на пользователя {name}" +fillAbuseReportDescription: "Опишите, пожалуйста, причину жалобы подробнее. Если речь\ + \ о конкретном посте, будьте добры приложить ссылку на неё." +abuseReported: "Жалоба отправлена. Большое спасибо за информацию." +reporteeOrigin: "О ком сообщено" +reporterOrigin: "Кто сообщил" +forwardReport: "Перенаправление отчета на инстанс" +forwardReportIsAnonymous: "Удаленный инстант не сможет увидеть вашу информацию и будет\ + \ отображаться как анонимная системная учетная запись." +send: "Отправить" +abuseMarkAsResolved: "Отметить жалобу как решённую" +openInNewTab: "Открыть в новой вкладке" +openInSideView: "Открывать в боковой колонке" +defaultNavigationBehaviour: "Поведение навигации по умолчанию" +editTheseSettingsMayBreakAccount: "От изменений в этих настройках ваша учётная запись\ + \ может поломаться." +instanceTicker: "Строка с названием инстанса в постах" +waitingFor: "Ждём, когда {x} ответит" +random: "Случайные" +system: "Система" +switchUi: "Выбор вида" +desktop: "Компьютер" +clip: "Подборка" +createNew: "Новый документ" +optional: "Необязательно" +createNewClip: "Новая подборка" +public: "Общедоступно" +i18nInfo: "Calckey переводят на разные языки добровольцы со всего света. Ваша помощь\ + \ тоже пригодится здесь: {link}." +manageAccessTokens: "Управление токенами доступа" +accountInfo: "Сведения об учётной записи" +notesCount: "Количество постов" +repliesCount: "Сколько раз пользователь кому-то ответил" +renotesCount: "Сколько раз пользователь делился постами" +repliedCount: "Сколько раз ответили пользователю" +renotedCount: "Сколько раз делились постами пользователя" +followingCount: "Количество подписок" +followersCount: "Количество подписавшихся" +sentReactionsCount: "Количество реакций пользователя" +receivedReactionsCount: "Количество реакций на посты пользователя" +pollVotesCount: "Сколько раз пользователь участвовал в опросах" +pollVotedCount: "Сколько раз участвовали в опросах пользователя" +yes: "Да" +no: "Нет" +driveFilesCount: "Количество файлов на диске" +driveUsage: "Занято места на диске" +noCrawle: "Запретить паукам индексировать сайт" +noCrawleDescription: "Просьба поисковым системам не ходить по вашему профилю, по постам,\ + \ страницам и не индексировать их." +lockedAccountInfo: "Даже если вы вручную подтверждаете подписки, кто угодно может\ + \ читать ваши посты, если вы не отмечаете их «для подписчиков»." +alwaysMarkSensitive: "Отмечать файлы как «содержимое не для всех» по умолчанию" +loadRawImages: "Сразу показывать изображения в полном размере" +disableShowingAnimatedImages: "Не проигрывать анимацию" +verificationEmailSent: "Вам отправлено письмо для подтверждения. Пройдите, пожалуйста,\ + \ по ссылке из письма, чтобы завершить проверку." +notSet: "Не настроено" +emailVerified: "Адрес электронной почты подтверждён" +noteFavoritesCount: "Количество добавленного в избранное" +pageLikesCount: "Количество понравившихся страниц" +pageLikedCount: "Количество страниц, понравившихся другим" +contact: "Как связаться" +useSystemFont: "Использовать шрифт, предлагаемый системой" +clips: "Подборки" +experimentalFeatures: "Экспериментальные функции" +developer: "Разработчик" +makeExplorable: "Опубликовать профиль в «Обзоре»" +makeExplorableDescription: "Если выключить, ваш профиль не будет показан в разделе\ + \ «Обзор»." +showGapBetweenNotesInTimeline: "Показывать разделитель между постами в ленте" +duplicate: "Дубликат" +left: "Влево" +center: "По центру" +wide: "Толстый" +narrow: "Тонкий" +reloadToApplySetting: "Это настройка вступает в силу при загрузке страницы. Перезагрузить\ + \ сейчас?" +needReloadToApply: "Изменения вступят в силу после перезагрузки страницы." +showTitlebar: "Показать заголовок" +clearCache: "Очистить кэш" +onlineUsersCount: "Пользователей сейчас в сети: {n}" +nUsers: "Пользователей: {n}" +nNotes: "Постов: {n}" +sendErrorReports: "Посылать отчёты о сбоях" +sendErrorReportsDescription: "Если включено, когда возникнет какая-нибудь техническая\ + \ проблема, подробные сведения об этом будут отправлены разработчикам Calckey.\n\ + Это очень помогает делать программу лучше. В отчёты попадают тип и версия ОС, браузера,\ + \ журнал действий (что привело к сбою) и тому подобное." +myTheme: "Личная тема" +backgroundColor: "Фон" +accentColor: "Акцент" +textColor: "Текст" +saveAs: "Сохранить под названием…" +advanced: "Для продвинутых" +value: "Значения" +createdAt: "Создано" +updatedAt: "Обновлено" +saveConfirm: "Сохранить изменения?" +deleteConfirm: "Удалить?" +invalidValue: "Недопустимое значение." +registry: "Реестр" +closeAccount: "Закрыть учётную запись" +currentVersion: "Используемая версия" +latestVersion: "Самая свежая версия" +youAreRunningUpToDateClient: "У вас самая свежая версия клиента." +newVersionOfClientAvailable: "Доступна более свежая версия клиента." +usageAmount: "Использовано" +capacity: "Ёмкость" +inUse: "Занято" +editCode: "Редактировать исходный текст" +apply: "Применить" +receiveAnnouncementFromInstance: "Получать оповещения с инстанса" +emailNotification: "Уведомления по электронной почте" +publish: "Опубликовать" +inChannelSearch: "Поиск по каналу" +useReactionPickerForContextMenu: "Открывать палитру реакций правой кнопкой" +typingUsers: "{users} печатает" +jumpToSpecifiedDate: "Перейти к заданной дате" +showingPastTimeline: "Отображается старая лента" +clear: "Очистить" +markAllAsRead: "Отметить всё как прочитанное" +goBack: "Выход" +unlikeConfirm: "В самом деле отменить «нравится»?" +fullView: "Полный вид" +quitFullView: "Закрыть полный вид" +addDescription: "Добавить описание" +userPagePinTip: "Можно добавить сюда посты, выбрав нужный, и включив в её меню пункт\ + \ «Закрепить в профиле»." +notSpecifiedMentionWarning: "В этом посте есть упоминание тех, кто не включён в адресаты" +info: "Описание" +userInfo: "Сведения о пользователе" +unknown: "Неизвестно" +onlineStatus: "Присутствие в сети" +hideOnlineStatus: "Скрыть присутствие" +hideOnlineStatusDescription: "Сокрытие присутствия делает некоторые функции, такие\ + \ как поиск, менее удобными." +online: "В сети" +active: "Действует" +offline: "Не в сети" +notRecommended: "Не рекомендуется" +botProtection: "Ботозащита" +instanceBlocking: "Блокировка инстансов" +selectAccount: "Выберите учётную запись" +switchAccount: "Сменить учётную запись" +enabled: "Включено" +disabled: "Отключено" +quickAction: "Быстрое действие" +user: "Пользователи" +administration: "Управление" +accounts: "Учётные записи" +switch: "Переключение" +noMaintainerInformationWarning: "Не заполнены сведения об администраторах." +noBotProtectionWarning: "Ботозащита не настроена." +configure: "Настроить" +postToGallery: "Опубликовать в галерею" +gallery: "Галерея" +recentPosts: "Недавние публикации" +popularPosts: "Популярные публикации" +shareWithNote: "Поделиться постом" +ads: "Реклама" +expiration: "Опрос длится" +memo: "Памятка" +priority: "Приоритет" +high: "Высокий" +middle: "Средне" +low: "Низкий" +emailNotConfiguredWarning: "Не указан адрес электронной почты." +ratio: "Соотношение" +previewNoteText: "Предварительный просмотр" +customCss: "Индивидуальный CSS" +customCssWarn: "Используйте эту настройку только если знаете, что делаете. Ошибки\ + \ здесь чреваты тем, что сайт перестанет нормально работать у вас." +global: "Всеобщая" +squareAvatars: "Квадратные аватарки" +sent: "Отправить" +received: "Получено" +searchResult: "Результаты поиска" +hashtags: "Хэштег" +troubleshooting: "Разрешение проблем" +useBlurEffect: "Размытие в интерфейсе" +learnMore: "Подробнее" +misskeyUpdated: "Calckey обновился!" +whatIsNew: "Показать изменения" +translate: "Перевод" +translatedFrom: "Перевод. Язык оригинала — {x}" +accountDeletionInProgress: "В настоящее время выполняется удаление учетной записи" +usernameInfo: "Имя, которое отличает вашу учетную запись от других на этом сервере.\ + \ Вы можете использовать алфавит (a~z, A~Z), цифры (0~9) или символы подчеркивания\ + \ (_). Имена пользователей не могут быть изменены позже." +aiChanMode: "ИИ режим" +keepCw: "Сохраняйте Предупреждения о содержимом" +pubSub: "Учётные записи Pub/Sub" +lastCommunication: "Последнее сообщение" +resolved: "Решено" +unresolved: "Без решения" +breakFollow: "Отписка" +itsOn: "Включено" +itsOff: "Выключено" +emailRequiredForSignup: "Для регистрации учётной записи нужен адрес электронной почты" +unread: "Непрочитанное" +filter: "Фильтры" +controlPanel: "Панель управления" +manageAccounts: "Управление аккаунтом" +makeReactionsPublic: "Опубликовать список реакций" +makeReactionsPublicDescription: "Список сделанных вами реакций доступен для просмотра\ + \ всем желающим." +classic: "Классика" +muteThread: "Заглушить цепочку" +unmuteThread: "Отменить глушение цепочки" +ffVisibility: "Видимость подписок и подписчиков" +ffVisibilityDescription: "Здесь можно настроить, кто будет видеть ваши подписки и\ + \ подписчиков." +continueThread: "Показать следующие ответы" +deleteAccountConfirm: "Учётная запись будет безвозвратно удалена. Подтверждаете?" +incorrectPassword: "Пароль неверен." +voteConfirm: "Отдать голос за «{choice}»?" +hide: "Спрятать" +leaveGroup: "Покинуть группу" +leaveGroupConfirm: "Покинуть группу «{name}»?" +useDrawerReactionPickerForMobile: "Выдвижная палитра на мобильном устройстве" +welcomeBackWithName: "С возвращением, {name}" +clickToFinishEmailVerification: "Пожалуйста, нажмите [{ok}], чтобы завершить подтверждение\ + \ адреса электронной почты." +overridedDeviceKind: "Тип устройства" +smartphone: "Смартфон" +tablet: "Планшет" +auto: "Автоматически" +themeColor: "Цвет темы" +size: "Размер" +numberOfColumn: "Количество столбцов" +searchByGoogle: "Поиск" +instanceDefaultLightTheme: "Светлая тема по умолчанию" +instanceDefaultDarkTheme: "Темная тема по умолчанию" +indefinitely: "вечно" +file: "Файлы" +recommended: "Рекомендуем" +check: "Проверить" +driveCapOverrideLabel: "Изменение лимита дискового пространства для этого пользователя" +reverse: "Переворот" +colored: "Выделена цветом" +label: "Метка" +localOnly: "Локально" +beta: "Бета" +enableAutoSensitive: "Автоматическое определение NSFW" +enableAutoSensitiveDescription: "Если доступно, используйте машинное обучение для\ + \ автоматической установки флага NSFW на носителе. Даже если эта функция отключена,\ + \ она может быть установлена автоматически в зависимости от инстанта." +account: "Учётные записи" +_sensitiveMediaDetection: + description: "Машинное обучение может быть использовано для автоматического обнаружения\ + \ чувствительных медиа для модерации. Нагрузка на сервер увеличивается незначительно." + setSensitiveFlagAutomatically: "Установить флаг NSFW" + sensitivity: Чувствительность обнаружения + sensitivityDescription: Снижение чувствительности приведет к меньшему количеству + ошибочных обнаружений (ложноположительных результатов), в то время как ее увеличение + приведет к меньшему количеству пропущенных обнаружений (ложноотрицательных результатов). + setSensitiveFlagAutomaticallyDescription: Результаты внутреннего обнаружения будут + сохранены, даже если эта опция отключена. + analyzeVideos: Включить анализ видео + analyzeVideosDescription: Анализирует видео в дополнение к изображениям. Это немного + увеличит нагрузку на сервер. +_emailUnavailable: + used: "Уже используется" + format: "Неверный формат" + disposable: "Временный адрес электронной почты не принимается" + mx: "Неверный почтовый сервер" + smtp: "Почтовый сервер не отвечает" +_ffVisibility: + public: "Общедоступны" + followers: "Показываются только подписчикам" + private: "Показываются только вам" +_signup: + almostThere: "Почти готово" + emailAddressInfo: "Введите ваш адрес электронной почты." + emailSent: "На указанный вами адрес электронной почты ({email}) отправлено письмо.\ + \ Перейдите по ссылке в письме, чтобы завершить регистрацию." +_accountDelete: + accountDelete: "Удалить свою учётную запись" + mayTakeTime: "Удаление учётной записи — ресурсозатратный процесс. Он может занять\ + \ много времени, если вы много писали и загружали файлов." + sendEmail: "Когда ваша учетная запись будет удалена, мы сообщим на указанную вами\ + \ электронную почту." + requestAccountDelete: "Запросить удаление вашей учетной записи" + started: "Процесс удаления начался." + inProgress: "Удаление в процессе" +_ad: + back: "Выход" + reduceFrequencyOfThisAd: "Реже показывать эту рекламу" +_forgotPassword: + enterEmail: "Введите адрес электронной почты, который ввели при регистрации. На\ + \ неё будет выслана ссылка для смены пароля." + ifNoEmail: "Если вы не ввели свой адрес электронной почты, свяжитесь с администратором\ + \ ресурса, чтобы сменить пароль." + contactAdmin: "Здесь не используются адреса электронной почты, так что свяжитесь\ + \ с администратором, чтобы поменять пароль." +_gallery: + my: "Личная" + liked: "Понравившееся" + like: "Нравится" + unlike: "Отменить «нравится»" +_email: + _follow: + title: "Новый подписчик" + _receiveFollowRequest: + title: "Новый запрос на подписку" +_plugin: + install: "Установка расширений" + installWarn: "Пожалуйста, не устанавливайте расширения, которым не доверяете." + manage: "Управление расширениями" +_registry: + scope: "Область" + key: "Ключ" + keys: "Ключ" + domain: "Домен" + createKey: "Новый ключ" +_aboutMisskey: + about: "Calckey это форк Calckey, сделанный ThatOneCalculator, разработка которого\ + \ началась с 2022." + contributors: "Основные соавторы" + allContributors: "Все соавторы" + source: "Исходный код" + translation: "Перевод Calckey" + donate: "Пожертвование на Calckey" + morePatrons: "Большое спасибо и многим другим, кто принял участие в этом проекте!\ + \ \U0001F970" + patrons: "Материальная поддержка" +_nsfw: + respect: "Скрывать содержимое не для всех" + ignore: "Показывать содержимое не для всех" + force: "Скрывать вообще все файлы" +_mfm: + cheatSheet: "Подсказка по разметке MFM" + intro: "MFM — язык оформления текста,используемый в Calckey, Calckey, Akkoma и готов\ + \ для применения во многих местах. На этой странице собраны и кратко изложены\ + \ способы его использовать." + dummy: "Calckey расширяет границы Федиверса" + mention: "Упоминание" + mentionDescription: "При помощи знака «собака» перед именем можно упомянуть какого-нибудь\ + \ пользователя." + hashtag: "Хэштег" + hashtagDescription: "При помощи знака «решётка» перед словом задаётся хэштег." + url: "Простая ссылка (URL)" + urlDescription: "Ссылки могут отображаться непосредственно." + link: "Ссылка с пояснением" + linkDescription: "Можно ссылку оформить в виде произвольного текста." + bold: "Жирный шрифт" + boldDescription: "Выделяет текст, делая буквы жирнее." + small: "Мелкий шрифт" + smallDescription: "Делает текст маленьким и незаметным." + center: "Выровнять элементы по центру" + centerDescription: "Так можно выровнять что-то по центру." + inlineCode: "Программа (в тексте)" + inlineCodeDescription: "Подсвечивает фрагмент программы внутри сплошного текста." + blockCode: "Программа (блок)" + blockCodeDescription: "Оформляет текст программы в виде отдельного блокоа. Он может\ + \ состоять из множества строк." + inlineMath: "Математическое выражение (в тексте)" + inlineMathDescription: "Позволяет вставлять математические выражения внутрь текста\ + \ при помощи языка KaTeX" + blockMath: "Математическое выражение (блок)" + blockMathDescription: "Оформляет математическое выражение (KaTeX) на отдельной строке" + quote: "Цитата" + quoteDescription: "Так можно процитировать чей-то текст." + emoji: "Собственные эмодзи" + emojiDescription: "Можно вставить эмодзи в текст, окружив название двоеточиями." + search: "Поиск" + searchDescription: "Можно добавить форму для поиска, сразу задав, что искать." + flip: "Переворот" + flipDescription: "Позволяет отразить текст зеркально по вертикали или горизонтали." + jelly: "Анимация желе (шлёп-плёп)" + jellyDescription: "Напоминает горку джема, дёргающуюся от шлепков." + tada: "Анимация (та-дам!)" + tadaDescription: "Получается нечто выпрыгивающее, как бы крича: «а вот и я!»." + jump: "Анимация прыжков (прыг-скок)" + jumpDescription: "Побуждает радостно подпрыгивать." + bounce: "Анимация отскоков (бум-бум)" + bounceDescription: "Это будет скакать как мяч." + shake: "Анимация дрожи (б-р-р-р)" + shakeDescription: "Такое дрожит, словно от холода. Или от страха." + twitch: "Анимация тряски" + twitchDescription: "Заставляет трястись как одержимого." + spin: "Вращение" + spinDescription: "Так можно крутить содержимое в разных направлениях." + x2: "Крупный шрифт" + x2Description: "Увеличивает содержимое." + x3: "Ещё крупнее" + x3Description: "Сильнее увеличивает содержимое." + x4: "Совсем крупно" + x4Description: "Увеличивает содержимое совсем сильно." + blur: "Размытие" + blurDescription: "Размывает текст до нечитаемости, будто его поместили за матовое\ + \ стекло. Наведение указателя мыши на размытый текст возвращает чёткость." + font: "Шрифт" + fontDescription: "Так можно писать произвольным шрифтом." + rainbow: "Радуга" + rainbowDescription: "Заставлять содержимое отображаться в цветах радуги." + sparkle: "Искры" + sparkleDescription: "Добавляет эффект искрящихся частиц." + rotate: "Повернуть" + rotateDescription: "Поворачивает на заданный угол." + plain: Обычный текст + plainDescription: Деактивирует эффекты всех MFM, содержащихся в этом эффекте MFM. +_instanceTicker: + none: "Не показывать" + remote: "Только для других сайтов" + always: "Показывать всегда" +_serverDisconnectedBehavior: + reload: "Автоматическая перезагрузка" + dialog: "Предупреждение" + quiet: "Показать ненавязчивое предупреждение" + nothing: Ничего не делать +_channel: + create: "Создать канал" + edit: "Редактировать канал" + setBanner: "Установить баннер" + removeBanner: "Удалить баннер" + featured: "Актуальные" + owned: "Собственные" + following: "Подписки" + usersCount: "Участников: {n}" + notesCount: "Постов: {n}" +_menuDisplay: + sideFull: "Сторона" + sideIcon: "Сторона (иконки)" + top: "Вверх" + hide: "Спрятать" +_wordMute: + muteWords: "Скрыть слово" + muteWordsDescription: "Пишите слова через пробел в одной строке, чтобы фильтровать\ + \ их появление вместе; а если хотите фильтровать любое из них, пишите в отдельных\ + \ строках." + muteWordsDescription2: "Здесь можно использовать регулярные выражения — просто заключите\ + \ их между двумя дробными чертами (/)." + softDescription: "Соответствующие условиям посты будут спрятаны из вашей ленты." + hardDescription: "Соответстующие условиям посты вообще не будут попадать в вашу\ + \ ленту. Даже если вы поменяете условия, отсеенные таким образом посты уже не\ + \ появятся." + soft: "Мягкий" + hard: "Жёсткий" + mutedNotes: "Скрытые посты" +_instanceMute: + heading: "Список заглушенных инстансов" + instanceMuteDescription2: Разделить переносом строки + instanceMuteDescription: Это будет скрывать все посты/репосты с указанных инстансов, + включая ответы пользователю с заглушенного инстанса. + title: Скрывает посты с указанных инстансов. +_theme: + explore: "Обзор" + install: "Установить тему" + manage: "Менеджер тем" + code: "Код темы" + description: "Описание" + installed: "Тема «{name}» установлена" + installedThemes: "Установленные темы" + builtinThemes: "Встроенные темы" + alreadyInstalled: "Тема уже установлена" + invalid: "Формат темы некорректный" + make: "Создать тему" + base: "Основа" + addConstant: "Добавить константу" + constant: "Константа" + defaultValue: "По умолчанию" + color: "Цвет" + refProp: "Ссылка на свойство" + refConst: "Ссылка на константу" + key: "Ключ" + func: "Функции" + funcKind: "Тип функции" + argument: "Аргумент" + basedProp: "Исходное свойство" + alpha: "Непрозрачность" + darken: "Затемнение" + lighten: "Осветление" + inputConstantName: "Введите имя для константы" + importInfo: "Если вы введете код темы здесь, вы можете импортировать его в редактор\ + \ тем" + deleteConstantConfirm: "Вы действительно хотите удалить константу {const}?" + keys: + accent: "Акцент" + bg: "Фон" + fg: "Текст" + focus: "Фокус" + indicator: "Индикатор" + panel: "Панель" + shadow: "Тень" + header: "Заголовок" + navBg: "Фон боковой панели" + navFg: "Текст на боковой панели" + navHoverFg: "Текст на боковой панели (под указателем)" + navActive: "Текст на боковой панели (активирован)" + navIndicator: "Индикатор на боковой панели" + link: "Ссылка" + hashtag: "Хэштег" + mention: "Упоминание" + mentionMe: "Упоминания вас" + renote: "Репост" + modalBg: "Фон формы поверх страницы" + divider: "Разделитель" + scrollbarHandle: "Ползунок прокрутки" + scrollbarHandleHover: "Ползунок прокрутки (под указателем)" + dateLabelFg: "Текст отметки даты" + infoBg: "Фон сообщения" + infoFg: "Текст сообщения" + infoWarnBg: "Фон предупреждения" + infoWarnFg: "Текст предупреждения" + cwBg: "Фон предупреждения о содержимом" + cwFg: "Текст предупреждения о содержимом" + cwHoverBg: "Фон предупреждения о содержимом (под указателем)" + toastBg: "Фон оповещения" + toastFg: "Текст оповещения" + buttonBg: "Фон кнопки" + buttonHoverBg: "Текст кнопки" + inputBorder: "Рамка поля ввода" + listItemHoverBg: "Фон пункта списка (под указателем)" + driveFolderBg: "Фон папки «Диска»" + wallpaperOverlay: "Слой обоев" + badge: "Значок" + messageBg: "Фон беседы" + accentDarken: "Фон (затемнённый)" + accentLighten: "Фон (осветлённый)" + fgHighlighted: "Подсвеченный текст" +_sfx: + note: "Новый пост" + noteMy: "Собственные посты" + notification: "Уведомления" + chat: "Сообщения" + chatBg: "Сообщения (фон)" + antenna: "Антенна" + channel: "Канал" +_ago: + future: "Из будущего" + justNow: "Только что" + secondsAgo: "{n} с назад" + minutesAgo: "{n} мин назад" + hoursAgo: "{n} ч назад" + daysAgo: "{n} сут назад" + weeksAgo: "{n} нед. назад" + monthsAgo: "{n} мес. назад" + yearsAgo: "{n} г. назад" +_time: + second: "с" + minute: "мин" + hour: "ч" + day: "сут" +_tutorial: + title: "Как использовать Calckey" + step1_1: "Добро пожаловать!" + step1_2: "Давайте настроим вас. Вы будете работать в кратчайшие сроки!" + step2_1: "Сначала, пожалуйста, заполните свой профиль." + step2_2: "Предоставив некоторую информацию о себе, другим людям будет легче понять,\ + \ хотят ли они видеть ваши записи или следить за вами." + step3_1: "Теперь пора следить за некоторыми людьми!" + step3_2: "Ваша домашняя и социальная ленты основаны на том, за кем вы следите, поэтому\ + \ для начала попробуйте следить за парой аккаунтов.\nНажмите на кружок с плюсом\ + \ в правом верхнем углу профиля, чтобы следить за ним." + step4_1: "Давайте выйдем на вас." + step4_2: "Для своего первого сообщения некоторые люди любят делать {introduction}\ + \ сообщение или простое \"Hello world!\"" + step5_1: "Временные рамки, везде временные рамки!" + step5_2: "В вашем экземпляре включены {timelines} различных временных линий." + step5_3: "Главная {icon} лента - это лента, где вы можете видеть сообщения ваших\ + \ подписок и других на этом инстансе. Если вы хотите чтобы главная лента показывала\ + \ только посты ваших подписок вы можете легко это изменить в настройках!" + step5_4: "Местная {icon} лента - это лента где вы можете видеть сообщения всех остальных\ + \ пользователей данного инстанса." + step5_5: "Лента Социальная {icon} - это лента, где вы можете видеть посты только\ + \ от аккаунтов, на которые вы подписаны." + step5_6: "Лента Рекомендованная {icon} это лента, где вы можете видеть посты с инстансов,\ + \ рекомендованных администраторами." + step5_7: "Глобальная {icon} лента - это место, где вы можете видеть сообщения от\ + \ всех других подключенных экземпляров." + step6_1: "Итак, что это за место?" + step6_2: "Ну, вы не просто присоединились к Кальки. Вы присоединились к порталу\ + \ в Fediverse, взаимосвязанной сети из тысяч серверов, называемых \"инстансами\"\ + ." + step6_3: "Каждый сервер работает по-своему, и не на всех серверах работает Calckey.\ + \ Но этот работает! Это немного сложно, но вы быстро разберетесь." + step6_4: "Теперь идите, изучайте и развлекайтесь!" +_2fa: + alreadyRegistered: "Двухфакторная аутентификация уже настроена." + registerTOTP: "Зарегистрируйте ваше устройство" + registerSecurityKey: "Зарегистрировать ключ" + step1: "Прежде всего, установите на устройство приложение для аутентификации, например,\ + \ {a} или {b}." + step2: "Далее отсканируйте отображаемый QR-код при помощи приложения." + step3: "И наконец, введите код, который покажет приложение." + step4: "Теперь при каждом входе на сайт вам нужно будет вводить код из приложения\ + \ аналогичным образом." + securityKeyInfo: "Вы можете настроить вход с помощью аппаратного ключа безопасности,\ + \ поддерживающего FIDO2, или отпечатка пальца или PIN-кода на устройстве." + step2Url: 'Вы также можете ввести этот URL если используете программу на компьютере:' +_permissions: + "read:account": "Просматривать данные учётной записи" + "write:account": "Изменять данные учётной записи" + "read:blocks": "Смотреть список блокировок" + "write:blocks": "Изменять список блокировок" + "read:drive": "Смотреть содержимое «диска»" + "write:drive": "Изменять содержимое «диска»" + "read:favorites": "Смотреть список избранного" + "write:favorites": "Изменять список избранного" + "read:following": "Смотреть спискок подписок" + "write:following": "Изменять спискок подписок" + "read:messaging": "Смотреть сообщения" + "write:messaging": "Писать и удалять сообщения" + "read:mutes": "Смотреть спискок скрытых пользователей" + "write:mutes": "Изменять список скрытых пользователей" + "write:notes": "Писать и удалять посты" + "read:notifications": "Смотреть уведомления" + "write:notifications": "Изменять уведомления" + "read:reactions": "Смотреть реакции" + "write:reactions": "Изменять реакции" + "write:votes": "Голосовать" + "read:pages": "Смотреть страницы" + "write:pages": "Изменять и удалять страницы" + "read:page-likes": "Смотреть добавления страниц в избранное" + "write:page-likes": "Изменять добавления страниц в избранное" + "read:user-groups": "Смотреть группы пользователей" + "write:user-groups": "Изменять и удалять группы пользователей" + "read:channels": "Смотреть каналы" + "write:channels": "Изменять каналы" + "read:gallery": "Просмотр галереи" + "write:gallery": "Редактирование галереи" + "read:gallery-likes": "Просмотр списка понравившегося в галерее" + "write:gallery-likes": "Изменение списка понравившегося в галерее" +_auth: + shareAccess: "Дать доступ для «{name}» к вашей учётной записи?" + shareAccessAsk: "Уверены, что хотите дать приложению доступ к своей учётной записи?" + permissionAsk: "Приложение запрашивает следующие разрешения" + pleaseGoBack: "Вернитесь, пожалуйста, в приложение" + callback: "Возврат в приложение" + denied: "Доступ закрыт" + copyAsk: Пожалуйста, вставьте следующий код авторизации в приложение +_antennaSources: + all: "Все посты" + homeTimeline: "Посты тех на которых вы подписаны" + users: "Посты выбранных пользователей" + userList: "Посты пользователей из выбранных списков" + userGroup: "Посты от пользователей из заданной группы" + instances: Посты от всех пользователей на инстансе +_weekday: + sunday: "Воскресенье" + monday: "Понедельник" + tuesday: "Вторник" + wednesday: "Среда" + thursday: "Четверг" + friday: "Пятница" + saturday: "Суббота" +_widgets: + memo: "Напоминания" + notifications: "Уведомления" + timeline: "Лента" + calendar: "Календарь" + trends: "Актуальное" + clock: "Часы" + rss: "Просмотр RSS" + activity: "Активность" + photos: "Фото" + digitalClock: "Цифровые часы" + federation: "Федерация" + postForm: "Форма отправки" + slideshow: "Показ слайдов" + button: "Кнопка" + onlineUsers: "Пользователи сейчас с сети" + jobQueue: "Очередь заданий" + serverMetric: "Показатели сервера" + aiscript: "Консоль AiScript" + aichan: "Ай" + rssTicker: RSS-тикер + unixClock: UNIX часы + instanceCloud: Облачко инстансов + userList: Список пользователей + _userList: + chooseList: Выберите список +_cw: + hide: "Спрятать" + show: "Показать еще" + chars: "знаков: {count}" + files: "файлов: {count}" +_poll: + noOnlyOneChoice: "Нужно хотя бы два варианта" + choiceN: "Выбор {n}" + noMore: "Больше вариантов добавить нельзя" + canMultipleVote: "Можно выбрать несколько вариантов" + expiration: "Опрос длится" + infinite: "вечно" + at: "Заканчивается..." + after: "Заканчивается после..." + deadlineDate: "Дата окончания" + deadlineTime: "Время" + duration: "Длительность" + votesCount: "Голосов: {n}" + totalVotes: "Голосов всего: {n}" + vote: "Проголосовать" + showResult: "Смотреть результаты" + voted: "Голос отдан" + closed: "Завершено" + remainingDays: "Осталось {d} сут {h} ч" + remainingHours: "Осталось {h} ч {m} мин" + remainingMinutes: "Осталось {m} мин {s} с" + remainingSeconds: "Осталось {s} с" +_visibility: + public: "Общедоступно" + publicDescription: "Открыто для всех" + home: "Скрытый" + homeDescription: "Не для общих лент" + followers: "Для подписчиков" + followersDescription: "Только вашим подписчикам" + specified: "Личное" + specifiedDescription: "Тем, кого укажете" + localOnly: "Локально" + localOnlyDescription: "Только для этого сайта" +_postForm: + replyPlaceholder: "Ответ на пост..." + quotePlaceholder: "Пояснение к цитате..." + channelPlaceholder: "Отправить в канал..." + _placeholders: + a: "Как дела?" + b: "Что интересного вокруг?" + c: "Что грызёт тебя, дружище?" + d: "Есть что сказать?" + e: "Напишите что-нибудь…" + f: "В ожидании, когда вы напишете…" +_profile: + name: "Имя" + username: "Имя пользователя" + description: "О себе" + youCanIncludeHashtags: "Можете использовать здесь хэштеги." + metadata: "Дополнительные сведения" + metadataEdit: "Редактировать дополнительные сведения" + metadataDescription: "Можно добавить до четырёх дополнительных граф в профиль." + metadataLabel: "Метка" + metadataContent: "Содержимое" + changeAvatar: "Поменять аватар" + changeBanner: "Поменять изображение в шапке" + locationDescription: Если вы сначала введете свой город, другим пользователям будет + показано ваше местное время. +_exportOrImport: + allNotes: "Все посты" + followingList: "Подписки" + muteList: "Скрытые" + blockingList: "Заблокированные" + userLists: "Списки" + excludeMutingUsers: "За исключением заглушенных пользователей" + excludeInactiveUsers: "Без неактивных учётных записей" +_charts: + federation: "Федерация" + apRequest: "Запросы" + usersIncDec: "Изменение числа пользователей" + usersTotal: "Количество пользователей" + activeUsers: "Активные пользователи" + notesIncDec: "Изменение числа постов" + localNotesIncDec: "Изменения числа локальных постов" + remoteNotesIncDec: "Изменения числа постов с других сайтов" + notesTotal: "Общее количество постов" + filesIncDec: "Изменения числа файлов" + filesTotal: "Суммарное количество файлов" + storageUsageIncDec: "Изменения заполнения хранилища" + storageUsageTotal: "Суммарное заполнение хранилища" +_instanceCharts: + requests: "Запросы" + users: "Изменение числа пользователей" + usersTotal: "Суммарное количество пользователей" + notes: "Изменение числа постов" + notesTotal: "Суммарное количество постов" + ff: "Изменения числа подписчиков " + ffTotal: "Суммарное количество подписчиков" + cacheSize: "Изменения размера кэша" + cacheSizeTotal: "Суммарный размер кэша" + files: "Изменения числа файлов" + filesTotal: "Суммарное количество файлов" +_timelines: + home: "Персональная" + local: "Местная" + social: "Социальная" + global: "Всеобщая" + recommended: Рекомендованная +_pages: + newPage: "Создать страницу" + editPage: "Править страницу" + readPage: "Читать страницу" + created: "Страница успешно создана" + updated: "Страница успешно обновлена" + deleted: "Страница успешно удалена" + pageSetting: "Настройки страницы" + nameAlreadyExists: "Указанный адрес страницы уже существует" + invalidNameTitle: "Указанный адрес страницы недопустим" + invalidNameText: "Проверьте, что не оставили поле пустым" + editThisPage: "Правка этой страницы" + viewSource: "Просмотр исходника" + viewPage: "Смотреть страницы" + like: "Нравится" + unlike: "Отменить «нравится»" + my: "Свои страницы" + liked: "Понравившиеся страницы" + featured: "Популярные" + inspector: "Инспектор" + contents: "Содержимое" + content: "Содержимое" + variables: "Переменные" + title: "Заголовок" + url: "Адрес страницы" + summary: "Краткое содержание" + alignCenter: "Выровнять элементы по центру" + hideTitleWhenPinned: "Скрыть заголовок страницы при привязке к профилю" + font: "Шрифт" + fontSerif: "Антиква (с засечками)" + fontSansSerif: "Гротеск (без засечек)" + eyeCatchingImageSet: "Добавить картинку для привлечения внимания" + eyeCatchingImageRemove: "Убрать картинку для привлечения внимания" + chooseBlock: "Добавить блок" + selectType: "Выберите вид" + enterVariableName: "Ведите имя переменной" + variableNameIsAlreadyUsed: "Это имя уже есть у другой переменной" + contentBlocks: "Содержательные" + inputBlocks: "Для ввода" + specialBlocks: "Особые" + blocks: + text: "Текст" + textarea: "Текст в рамке" + section: "Раздел" + image: "Изображения" + button: "Кнопка" + if: "Условный" + _if: + variable: "Переменная" + post: "Создание поста" + _post: + text: "Текст" + attachCanvasImage: "Прикрепить изображение с холста" + canvasId: "Метка холста" + textInput: "Поле ввода текста" + _textInput: + name: "Имя переменной" + text: "Подпись" + default: "Исходное содержимое" + textareaInput: "Многострочное поле ввода текста" + _textareaInput: + name: "Имя переменной" + text: "Подпись" + default: "Исходное содержимое" + numberInput: "Поле для ввода числа" + _numberInput: + name: "Имя переменной" + text: "Подпись" + default: "Исходное значение" + canvas: "Холст" + _canvas: + id: "Метка холста" + width: "Ширина" + height: "Высота" + note: "Встроенный пост" + _note: + id: "Идентификатор поста" + idDescription: "Можно также вставить ссылку на пост." + detailed: "Подробный вид" + switch: "Выключатель" + _switch: + name: "Имя переменной" + text: "Подпись" + default: "Исходное содержимое" + counter: "Кнопка со счётчиком" + _counter: + name: "Имя переменной" + text: "Надпись" + inc: "Увеличивать на" + _button: + text: "Надпись" + colored: "Выделена цветом" + action: "Действие по нажатию" + _action: + dialog: "Показать всплывающий текст" + _dialog: + content: "Всплывающий текст" + resetRandom: "Сброс генератора случайности" + pushEvent: "Вызвать событие" + _pushEvent: + event: "Имя события" + message: "Сообщение при нажатии" + variable: "Передать переменную с событием" + no-variable: "нет" + callAiScript: "Вызвать AiScript" + _callAiScript: + functionName: "Имя функции" + radioButton: "Кнопка-переключатель" + _radioButton: + name: "Имя переменной" + title: "Заголовок" + values: "Значения" + default: "Исходное значение" + script: + categories: + flow: "Управление исполнением" + logical: "Логические" + operation: "Арифметические" + comparison: "Сравнение" + random: "Случайные" + value: "Значения" + fn: "Функции" + text: "Текстовые" + convert: "Преобразование" + list: "Список" + blocks: + text: "Строка текста" + multiLineText: "Многострочный текст" + textList: "Список строк текста" + _textList: + info: "Пишите каждый пункт с новой строки" + strLen: "Длина текста" + _strLen: + arg1: "Текст" + strPick: "Взять знак из текста" + _strPick: + arg1: "Текст" + arg2: "Позиция знака" + strReplace: "Замена текста" + _strReplace: + arg1: "Текст, в котором заменять" + arg2: "Заменяемый текст" + arg3: "Менять на" + strReverse: "В обратном порядке" + _strReverse: + arg1: "Текст" + join: "Объединение" + _join: + arg1: "Списки" + arg2: "Разделитель" + add: "Добавить" + _add: + arg1: "A" + arg2: "B" + subtract: "Вычитание" + _subtract: + arg1: "A" + arg2: "B" + multiply: "Умножение" + _multiply: + arg1: "A" + arg2: "B" + divide: "Деление" + _divide: + arg1: "A" + arg2: "B" + mod: "Остаток от деления" + _mod: + arg1: "A" + arg2: "B" + round: "Округление до целого" + _round: + arg1: "Число" + eq: "A равно B" + _eq: + arg1: "А" + arg2: "B" + notEq: "A не равно B" + _notEq: + arg1: "A" + arg2: "B" + and: "A и B" + _and: + arg1: "A" + arg2: "B" + or: "A или B" + _or: + arg1: "A" + arg2: "B" + lt: "A < B (меньше)" + _lt: + arg1: "A" + arg2: "B" + gt: "A > B (больше)" + _gt: + arg1: "A" + arg2: "B" + ltEq: "A ⩽ B (меньше или равно)" + _ltEq: + arg1: "A" + arg2: "B" + gtEq: "A ⩾ B (больше или равно)" + _gtEq: + arg1: "A" + arg2: "B" + if: "Условный" + _if: + arg1: "Условие" + arg2: "Если правда" + arg3: "Если ложь" + not: "Отрицание" + _not: + arg1: "Условие" + random: "Случайность" + _random: + arg1: "Вероятность" + rannum: "Случайное число" + _rannum: + arg1: "Минимум" + arg2: "Максимум" + randomPick: "Случайный выбор из списка" + _randomPick: + arg1: "Списки" + dailyRandom: "Случайность (на день для пользователя)" + _dailyRandom: + arg1: "Вероятность" + dailyRannum: "Случайное число (на день для пользователя)" + _dailyRannum: + arg1: "Минимум" + arg2: "Максимум" + dailyRandomPick: "Случайный выбор из списка (на день для пользователя)" + _dailyRandomPick: + arg1: "Списки" + seedRandom: "Псевдослучайность (заданная зерном)" + _seedRandom: + arg1: "Зерно" + arg2: "Вероятность" + seedRannum: "Псевдослучайное число (заданное зерном)" + _seedRannum: + arg1: "Зерно" + arg2: "Минимум" + arg3: "Максимум" + seedRandomPick: "Псевдослучайный выбор из списка (заданный зерном)" + _seedRandomPick: + arg1: "Зерно" + arg2: "Списки" + DRPWPM: "Случайный выбор из взвешенного списка (на день для пользователя)" + _DRPWPM: + arg1: "Список строк текста" + pick: "Выбор из списка" + _pick: + arg1: "Списки" + arg2: "Индекс" + listLen: "Количество элементов в списке" + _listLen: + arg1: "Списки" + number: "Число" + stringToNumber: "Число из текста" + _stringToNumber: + arg1: "Текст" + numberToString: "Число в текст" + _numberToString: + arg1: "Число" + splitStrByLine: "Разделение текста на строки" + _splitStrByLine: + arg1: "Текст" + ref: "Переменная" + aiScriptVar: "Переменная AiScript" + fn: "Свои функции" + _fn: + slots: "Аргументы" + slots-info: "Напишите имя каждого аргумента с новой строки" + arg1: "Формула" + for: "Цикл" + _for: + arg1: "Количество повторений" + arg2: "Действие" + typeError: "Аргумент {slot} должен быть иметь тип «{expect}», а передали «{actual}»!" + thereIsEmptySlot: "Аргумент {slot} не заполнен!" + types: + string: "Текст" + number: "Число" + boolean: "Логический" + array: "Списки" + stringArray: "Список строк текста" + emptySlot: "Пустой аргумент" + enviromentVariables: "Переменная окружения" + pageVariables: "Элемент страницы" + argVariables: "Аргументы" +_relayStatus: + requesting: "В ожидании одобрения" + accepted: "Одобрено" + rejected: "Отказано" +_notification: + fileUploaded: "Файл успешно загружен" + youGotMention: "{name} упоминает вас" + youGotReply: "{name} отвечает вам" + youGotQuote: "{name} цитирует вас" + youRenoted: "{name} репостит ваш пост" + youGotPoll: "{name} участвует в вашем опросе" + youGotMessagingMessageFromUser: "{name} пишет вам" + youGotMessagingMessageFromGroup: "Новое сообщение в группе «{name}»" + youWereFollowed: "У вас новый подписчик" + youReceivedFollowRequest: "У вас новый запрос на подписку" + yourFollowRequestAccepted: "Ваш запрос на подписку одобрен" + youWereInvitedToGroup: "{userName} пригласил вас в группу" + _types: + all: "Все" + follow: "Подписки" + mention: "Упоминания" + reply: "Ответы" + renote: "Репосты" + quote: "Цитаты" + reaction: "Реакции" + pollVote: "Голосования" + receiveFollowRequest: "Получен запрос на подписку" + followRequestAccepted: "Запрос на подписку одобрен" + groupInvited: "Приглашение в группы" + app: "Уведомления из приложений" + pollEnded: Опрос закончен + _actions: + reply: "Ответить" + renote: "Репост" + followBack: Подписался на вас обратно + emptyPushNotificationMessage: Пуш уведомления были обновлены + pollEnded: Результаты опроса стали доступны +_deck: + alwaysShowMainColumn: "Всегда показывать главную колонку" + columnAlign: "Выравнивание колонок" + addColumn: "Добавить колонку" + configureColumn: "Настройки колонок" + swapLeft: "Переставить левее" + swapRight: "Переставить правее" + swapUp: "Переставить выше" + swapDown: "Переставить ниже" + stackLeft: "В столбик влево" + popRight: "Из столбика вправо" + profile: "Воркспейс" + _columns: + main: "Основная" + widgets: "Виджеты" + notifications: "Уведомления" + tl: "Лента" + antenna: "Антенны" + list: "Списки" + mentions: "Упоминания" + direct: "Личное" + deleteProfile: Удалить воркспейс + introduction: Создайте идеальный интерфейс для себя, свободно расположив столбцы! + introduction2: Нажмите на + в правой части экрана, чтобы добавлять новые столбцы + в любое удобное для вас время. + widgetsIntroduction: Пожалуйста, выберите "Редактировать виджеты" в меню столбца + и добавьте виджет. + newProfile: Новый воркспейс + renameProfile: Переименовать воркспейс + nameAlreadyExists: Воркспейс с таким именем уже существует. +enableRecommendedTimeline: Включить рекомендованную ленту +regexpErrorDescription: 'Произошла ошибка в регулярном выражении на строке {line} + вашего {tab} списка скрытых слов:' +confirmToUnclipAlreadyClippedNote: Этот пост уже в подборке "{name}. Хотите ли вы + вместо этого удалить пост из подборки? +unclip: Удалить из подборки +secureMode: Безопасный Режим (Авторизованное Получение) +instanceSecurity: Безопасность инстанса +seperateRenoteQuote: Разделить кнопки репоста и цитаты +accountMoved: 'Пользователь переместился на новый аккаунт:' +manageGroups: Управлять группами +allowedInstancesDescription: Список хостов, разрешённых для федерации, каждый разделён + новой строкой(применяется только в приватном режиме). +noThankYou: Нет, спасибо +addInstance: Добавить инстанс +flagSpeakAsCat: Говорить как кот +flagSpeakAsCatDescription: Ваши будут посты няифицированы в режиме кота +selectInstance: Выбрать инстанс +antennaInstancesDescription: Список инстансов, каждый с новой строки +privateMode: Приватный режим +privateModeInfo: Когда включено только инстансы в белом списке могут федерировать + с вашим инстансов. Все посты будут скрыты. +allowedInstances: Белый список инстансов +userSaysSomethingReason: '{name} сказал {reason}' +renoteMute: Заглушить репосты +renoteUnmute: Разглушить репосты +hiddenTags: Скрытые хештеги +noInstances: Нет инстансов +secureModeInfo: При запросах с других инстансов не отправлять ответ без подтверждения. +instanceDefaultThemeDescription: Введите код темы в формате объекта. +tenMinutes: 10 минут +oneHour: Один час +thereIsUnresolvedAbuseReportWarning: Есть не рассмотренные жалобы. +cropImage: Обрезать изображение +requireAdminForView: Вы должны войти с аккаунта администратора что просмотреть это. +refreshInterval: 'Интервал обновления ' +slow: Медленно +fast: Быстро +sensitiveMediaDetection: Обнаружение NSFW медиа +remoteOnly: Только другие сайты +navbar: Панель навигации +customMOTD: Своё MOTD (сообщения на заставке) +customMOTDDescription: Пользовательские сообщения для MOTD (заставки), разделенные + разрывами строк, будут отображаться случайным образом каждый раз, когда пользователь + загружает / перезагружает страницу. +recommendedInstancesDescription: Рекомендуемые инстансы, разделенные разрывами строк, + должны отображаться на рекомендуемой ленте. НЕ добавляйте `https://`, ТОЛЬКО домен. +caption: Автоматическая подпись +splash: Заставка +updateAvailable: Возможно, доступно обновление! +move: Переместить +swipeOnDesktop: Разрешить свайпы в мобильном стиле на десктопе +showAds: Показывать рекламу +noEmailServerWarning: Почтовый сервер не настроен. +type: Тип +numberOfPageCacheDescription: Увеличение этого числа повысит удобство для пользователей, + но приведет к увеличению нагрузки на сервер, а также к использованию большего объема + памяти. +statusbar: Панель статуса +speed: Скорость +oneDay: Один день +oneWeek: Одна неделя +failedToFetchAccountInformation: Не удалось получить информацию о аккаунте +cropImageAsk: Желаете ли вы обрезать это изображение? +recentNHours: Последние {n} часов +recentNDays: Последние {n} дней +typeToConfirm: Введите {x} чтобы подтвердить +document: Документация +logoutConfirm: Действительно выйти? +failedToUpload: Не удалось загрузить +pushNotification: Пуш уведомления +subscribePushNotification: Включить пуш уведомления +unsubscribePushNotification: Отключить пуш уведомления +pushNotificationAlreadySubscribed: Пуш уведомления уже включены +sendPushNotificationReadMessage: Удалять пуш уведомления после того как соответствующие + уведомления или сообщения были прочитаны +customSplashIcons: Свои иконки для заставки (URL) +customSplashIconsDescription: URL-адреса для пользовательских значков заставки, разделенных + разрывами строк, будут отображаться случайным образом каждый раз, когда пользователь + загружает / перезагружает страницу. Пожалуйста, убедитесь, что изображения находятся + на статическом URL-адресе, предпочтительно все с размером 192x192. +logoImageUrl: URL изображения логотипа +showAdminUpdates: Указать, что доступна новая версия Calckey (только для администратора) +replayTutorial: Перезапустить туториал +migration: Миграция +showLocalPosts: 'Показать локальные посты в:' +homeTimeline: Домашняя лента +socialTimeline: Социальная лента +driveCapOverrideCaption: Сбросить до настроек по умолчанию введя значение 0 или меньше. +deleteAccount: Удалить аккаунт +numberOfPageCache: Число кэшируемых страниц +pushNotificationNotSupported: Ваш браузер или инстанс не поддерживает пуш уведомления +sendPushNotificationReadMessageCaption: Уведомление содержащее текст "{emptyPushNotificationMessage}" + будет показано на короткое время. Это может увеличить расход батареи вашего устройства, + если это применимо. +cannotUploadBecauseNoFreeSpace: Загрузка не удалась из-за нехватки места на Диске. +cannotUploadBecauseInappropriate: Этот файл не может быть загружен потому что его + части были обнаружены как потенциальное NSFW. +adminCustomCssWarn: Этот параметр следует использовать только в том случае, если вы + знаете, что он делает. Ввод неправильных значений может привести к тому, что ВСЕ + клиенты перестанут нормально функционировать. Пожалуйста, убедитесь, что ваш CSS + работает должным образом, протестировав его в настройках вашего пользователя. +showUpdates: Показывать всплывающее окно при обновлении Calckey +recommendedInstances: Рекомендованные инстансы +defaultReaction: Эмодзи реакция по умолчанию для выходящих и исходящих постов +license: Лицензия +indexPosts: Индексировать посты +indexFrom: Индексировать начиная с идентификатора поста и далее +indexFromDescription: оставьте пустым для индексации каждого поста +indexNotice: Теперь индексирование. Вероятно, это займет некоторое время, пожалуйста, + не перезагружайте свой сервер по крайней мере в течение часа. +customKaTeXMacro: Кастомные KaTex макросы +enableCustomKaTeXMacro: Включить кастомные KaTeX макросы +noteId: Идентификатор поста +_preferencesBackups: + inputName: Введите имя для этой резервной копии + list: Созданные резервные копии + loadFile: Загрузить из файла + apply: Применить для этого устройства + save: Сохранить изменения + saveNew: Сохранить новую резервную копию + applyConfirm: Вы действительно хотите применить резервную копию "{name}" на этом + устройстве? Существует настройки на этом устройстве будут перезаписаны. + renameConfirm: Переименовать резервную копию "{old}" в "{new}"? + saveConfirm: Сохранить резервную как {name}? + cannotSave: Сохранение не удалось + nameAlreadyExists: Резервная копия с именем "{name}" уже существующует. Выберите + другое имя. + deleteConfirm: Удалить резервную копию {name}? + noBackups: Нет резервных копий. Вы может сделать резервную копию настроек клиента + на этом сервере используя "Создать новую резервную копию". + createdAt: 'Создано: {date} {time}' + updatedAt: 'Обновлено: {date} {time}' + cannotLoad: Загрузка не удалась + invalidFile: Неправильный формат файла +enableEmojiReactions: Включить эмодзи реакции +migrationConfirm: "Вы абсолютно уверены что хотите мигрировать ваш аккаунт на {account}?\ + \ Как только вы сделаете, вы не сможете отменить это и не сможете нормально использовать\ + \ аккаунт снова.\nТакже, пожалуйста, убедитесь, что вы установили эту текущую учетную\ + \ запись в качестве учетной записи, с которой вы переходите." +reporter: Автор жалобы +mutePeriod: Длительность глушения +reflectMayTakeTime: Это может занять некоторое время чтобы вступило в силу. +rateLimitExceeded: Превышен лимит +pleaseSelect: Выберите вариант +shuffle: Перемешать +moveFrom: Переместится на этот аккаунт с старого аккаунта +moveFromLabel: 'Аккаунт с которого перемещаетесь:' +moveAccountDescription: Этот процесс необратим. Убедитесь что вы сделали псевдоним + для этого аккаунта до перемещения. Пожалуйста введите аккаунт в формате @person@instance.com +moveTo: Переместить текущий аккаунт на новый аккаунт +_messaging: + groups: Группы + dms: Личные +isSystemAccount: Учетная запись, созданная системой и автоматически управляемая ею. +activeEmailValidationDescription: Включить более строгую проверки адресов электронной + почты,что включает в себя проверку наличия одноразовых адресов и того, действительно + ли с ними можно связаться. Если флажок снят, проверяется только формат адреса. +moveToLabel: 'Аккаунт на который вы перемещаетесь:' +lastActiveDate: Последний раз использовался в +enterSendsMessage: Нажать Return в Сообщениях чтобы отправить сообщение (если выключено, + то Ctrl + Return) +moveAccount: Переместить аккаунт! +breakFollowConfirm: Вы действительно хотите удалить подписчика? +showEmojisInReactionNotifications: Показывать эмодзи в уведомлениях о реакциях +hiddenTagsDescription: 'Список хештегов (без #), которые вы желаете скрыть из "актуальное" + и "обзор". Скрытые хэштеги по-прежнему можно обнаружить в других местах.' +moveFromDescription: Это установит псевдоним для старого аккаунта, так что вы сможете + переместить тот аккаунт на текущий. Делайте это ДО перемещения со старого аккаунта. + Пожалуйста введите аккаунт в формате @person@instance.com +customKaTeXMacroDescription: 'Настройте макросы чтобы легко писать математические + выражения! Обозначение соответствует определениям команд LaTeX и записывается как + \newcommand{\название}{содержание} или \newcommand{\название}[количество аргументов]{содержание}. + Для примера, \add{3}[2]{#1 + #2} будет раскрывать \add{3}{foo} до 3 + foo. Фигурные + скобки, окружающие имя макроса, можно заменить на круглые или квадратные скобки. + Это влияет на квадратные скобки, используемые для аргументов. Для каждой строки + может быть определен один (и только один) макрос, и вы не можете прерывать строку + в середине определения. Недопустимые строки просто игнорируются. Поддерживаются + только простые функции подстановки строк; расширенный синтаксис, такой как условное + ветвление, здесь использоваться не может.' +cannotUploadBecauseExceedsFileSizeLimit: Этот файл не может быть загружен так как + он превышает максимально разрешённый размер. +apps: Приложения +silenceThisInstance: Заглушить инстанс +silencedInstances: Заглушенные инстансы +editNote: Редактировать заметку +edited: 'Редактировано в {date} {time}' +deleted: Удалённое diff --git a/fe_calckey/frontend/locales/sk-SK.yml b/fe_calckey/frontend/locales/sk-SK.yml new file mode 100644 index 0000000..dce23d7 --- /dev/null +++ b/fe_calckey/frontend/locales/sk-SK.yml @@ -0,0 +1,1735 @@ +--- +_lang_: "Slovenčina" +headlineMisskey: "Sieť prepojená poznámkami" +introMisskey: "Vitajte! Calckey je otvorená a decentralizovaná mikroblogovacia služba.\n\"Poznámkami\" môžete zdieľať svoje myšlienky so všetkými okolo. 📡\nPomocou \"reakcií\" môžete rýchlo vyjadri svoje pocity o každého poznámkach. 👍\nPoďte objavovať svet! 🚀" +monthAndDay: "{day}. {month}." +search: "Hľadať" +notifications: "Oznámenia" +username: "Meno používateľa" +password: "Heslo" +forgotPassword: "Zabudnuté heslo" +fetchingAsApObject: "Načítam údaje z Fediverzu" +ok: "OK" +gotIt: "Rozumiem!" +cancel: "Zrušiť" +enterUsername: "Zadajte meno používateľa" +renotedBy: "{user} preposlal/a" +noNotes: "Žiadne poznámky" +noNotifications: "Žiadne oznámenia" +instance: "Inštancia" +settings: "Nastavenia" +basicSettings: "Všeobecné nastavenia" +otherSettings: "Rozšírené nastavenia" +openInWindow: "Otvoriť v novom okne" +profile: "Profil" +timeline: "Časová os" +noAccountDescription: "Tento používateľ zatiaľ nenapísal o sebe." +login: "Prihlásiť sa" +loggingIn: "Prebieha prihlasovanie" +logout: "Odhlásiť" +signup: "Registrovať" +uploading: "Nahrávanie..." +save: "Uložiť" +users: "Používatelia" +addUser: "Pridať používateľa" +favorite: "Páči sa mi" +favorites: "Obľúbené" +unfavorite: "Nepáči sa mi" +favorited: "Pridané do obľúbených" +alreadyFavorited: "Už je medzi obľúbenými" +cantFavorite: "Nepodarilo sa pridať medzi obľúbené." +pin: "Pripnúť" +unpin: "Odopnúť" +copyContent: "Kopírovať obsah" +copyLink: "Kopírovať odkaz" +delete: "Odstrániť" +deleteAndEdit: "Odstrániť a upraviť" +deleteAndEditConfirm: "Naozaj chcete odstrániť túto poznámku a upraviť ju? Stratíte tým všetky reakcie a odpovede na ňu." +addToList: "Pridať do zoznamu" +sendMessage: "Odoslať správu" +copyUsername: "Kopírovať meno používateľa" +searchUser: "Hľadať používateľov" +reply: "Odpovedať" +loadMore: "Zobraziť viac" +showMore: "Zobraziť viac" +showLess: "Zavrieť" +youGotNewFollower: "Máte nového sledujúceho" +receiveFollowRequest: "Žiadosť o sledovanie prijatá" +followRequestAccepted: "Žiadosť o sledovanie akceptovaná" +mention: "Zmienka" +mentions: "Zmienky" +directNotes: "Priame poznámky" +importAndExport: "Import a export" +import: "Importovať" +export: "Exportovať" +files: "Súbor/y" +download: "Stiahnuť" +driveFileDeleteConfirm: "Naozaj chcete odstrániť súbor \"{name}\"? Poznámky s týmto súborom sa odstránia tiež." +unfollowConfirm: "Naozaj už nechcete sledovať {name}?" +exportRequested: "Vyžiadali ste export. Môže to chvíľu trvať. Po skončení pribudne na vašom disku." +importRequested: "Požiadali ste o export. Môže to chvíľu trvať." +lists: "Zoznamy" +noLists: "Nemáte žiadne zoznamy" +note: "Poznámka" +notes: "Poznámky" +following: "Sledujete" +followers: "Sledujúci" +followsYou: "Sledujú vás" +createList: "Vytvoriť zoznam" +manageLists: "Spravovať zoznamy" +error: "Chyba" +somethingHappened: "Ups. Niečo sa nepodarilo." +retry: "Opakovať" +pageLoadError: "Nepodarilo sa načítať stránku" +pageLoadErrorDescription: "Toto môže byť spôsobené problémami so sieťou alebo cachou prehliadača. Skúste vyčistiť cache a potom skúsiť znova po chvíli." +serverIsDead: "Tento server nereaguje. Prosím chvíľu počkajte a skúste znova." +youShouldUpgradeClient: "Na pozretie tejto stránky prosím obnovte svojho klienta." +enterListName: "Zadajte názov zoznamu" +privacy: "Súkromie" +makeFollowManuallyApprove: "Žiadosti o sledovanie treba schváliť" +defaultNoteVisibility: "Predvolená viditeľnosť" +follow: "Sledovať" +followRequest: "Požiadať o sledovanie" +followRequests: "Žiadosti o sledovanie" +unfollow: "Nesledovať" +followRequestPending: "Žiadosť o sledovanie čaká" +enterEmoji: "Zadajte emoji" +renote: "Preposlať" +unrenote: "Vrátiť preposlanie" +renoted: "Preposlané." +cantRenote: "Tento príspevok sa nedá preposlať." +cantReRenote: "Odpoveď nemôže byť odstránená." +quote: "Citovať" +pinnedNote: "Pripnuté poznámky" +pinned: "Pripnúť" +you: "Vy" +clickToShow: "Kliknutím zobrazíte" +sensitive: "NSFW" +add: "Pridať" +reaction: "Reakcie" +reactionSetting: "Reakcie zobrazené vo výbere reakcií" +reactionSettingDescription2: "Ťahaním preusporiadate, kliknutím odstránite, Stlačením \"+\" pridáte" +rememberNoteVisibility: "Zapamätať nastavenia viditeľnosti poznámky" +attachCancel: "Odstrániť prílohu" +markAsSensitive: "Označiť ako NSFW" +unmarkAsSensitive: "Odznačiť NSFW" +enterFileName: "Zadajte názov súboru" +mute: "Vypnúť zvuk" +unmute: "Zapnúť zvuk" +block: "Zablokovať" +unblock: "Odblokovať" +suspend: "Zmraziť" +unsuspend: "Odmraziť" +blockConfirm: "Naozaj chcete zablokovať tento účet?" +unblockConfirm: "Naozaj chcete odblokovať tento účet?" +suspendConfirm: "Naozaj chcete zmraziť tento účet?" +unsuspendConfirm: "Naozaj chcete odmraziť tento účet?" +selectList: "Vyberte zoznam" +selectAntenna: "Vyberte anténu" +selectWidget: "Vyberte widget" +editWidgets: "Upraviť widget" +editWidgetsExit: "Hotovo" +customEmojis: "Vlastné emoji" +emoji: "Emoji" +emojis: "Emoji" +emojiName: "Názov emoji" +emojiUrl: "URL obrázku" +addEmoji: "Pridať emoji" +settingGuide: "Odporúčané nastavenia" +cacheRemoteFiles: "Cachovanie vzdialených súborov" +cacheRemoteFilesDescription: "Zakázanie tohoto nastavenia spôsobí, že vzdialené súbory budú odkazované priamo, namiesto ukladania do cache. Ušetrí sa tak miesto na serveri, ale zvýši sa dátový tok, pretože sa negenerujú miniatúry." +flagAsBot: "Tento účet je bot" +flagAsBotDescription: "Ak je tento účet ovládaný programom, zaškrtnite túto voľbu. Ostatní uvidia, že je to bot a zabráni nekonečným interakciám s ďalšími botmi a upraví interné systémy Calckey, aby ho považoval za bota." +flagAsCat: "Tento účet je mačka" +flagAsCatDescription: "Zvoľte túto voľbu, aby bol tento účet označený ako mačka." +flagShowTimelineReplies: "Zobraziť odpovede na poznámky v časovej osi" +flagShowTimelineRepliesDescription: "Keď je zapnuté, na časovej osi sa zobrazia odpovede k poznámkam používateľov okrem samotných poznámok." +autoAcceptFollowed: "Automaticky prijať sledovanie od účtov, ktoré sledujete" +addAccount: "Pridať účet" +loginFailed: "Prihlásenie sa nepodarilo." +showOnRemote: "Zobraziť na vzdialenom serveri" +general: "Všeobecné" +wallpaper: "Tapeta" +setWallpaper: "Nastaviť tapetu" +removeWallpaper: "Odstrániť tapetu" +searchWith: "Hľadať: {q}" +youHaveNoLists: "Nemáte žiadne zoznamy" +followConfirm: "Naozaj chcete sledovať {name}?" +proxyAccount: "Proxy účet" +proxyAccountDescription: "Proxy účet je účet, ktorý za určitých podmienok sleduje používateľov na diaľku vaším menom. Napríklad keď používateľ zaradí vzdialeného používateľa do zoznamu, pokiaľ nikto nesleduje používateľa na zozname, aktivita nebude doručená na server, takže namiesto toho bude používateľa sledova proxy účet." +host: "Host" +selectUser: "Vyberte používateľa" +recipient: "Prijímateľ" +annotation: "Komentáre" +federation: "Federácia" +instances: "Inštancia" +registeredAt: "Registrácia" +latestRequestSentAt: "Posledná odoslaná požiadavka" +latestRequestReceivedAt: "Posledná prijatá požiadavka" +latestStatus: "Posledný status" +storageUsage: "Využité úložisko" +charts: "Grafy" +perHour: "za hodinu" +perDay: "za deň" +stopActivityDelivery: "Zastaviť posielanie aktivít" +blockThisInstance: "Blokovať tento server" +operations: "Operácie" +software: "Softvér" +version: "Verzia" +metadata: "Metadáta" +monitor: "Monitor" +jobQueue: "Fronta úloh" +cpuAndMemory: "CPU a pamäť" +network: "Sieť" +disk: "Disk" +instanceInfo: "Informácie o serveri" +statistics: "Štatistiky" +clearQueue: "Vyčistiť frontu" +clearQueueConfirmTitle: "Naozaj chcete zrušiť všetky úlohy vo fronte?" +clearQueueConfirmText: "Všetky nedoručené poznámky čakajúce vo fronte nebudú federované. Zvyčajne táto operácia nie je potrebná." +clearCachedFiles: "Vyprázdniť cache" +clearCachedFilesConfirm: "Naozaj chcete odstrániť všetky nacachované vzdialené súbory?" +blockedInstances: "Blokované servery" +blockedInstancesDescription: "Zoznam blokovaných serverov na riadkoch. Blokované servery nebudú môcť komunikovať s týmto serverom." +muteAndBlock: "Umlčania a blokácie" +mutedUsers: "Umlčaní používatelia" +blockedUsers: "Blokovaní používatelia" +noUsers: "Žiadni používatelia" +editProfile: "Upraviť profil" +noteDeleteConfirm: "Naozaj chcete odstrániť túto poznámku?" +pinLimitExceeded: "Ďalšie poznámky už nemôžete pripnúť." +intro: "Inštalácia Calckey je dokončená! Prosím vytvorte administrátora." +done: "Hotovo" +processing: "Pracujem..." +preview: "Náhľad" +default: "Predvolené" +defaultValueIs: "Predvolené: {value}" +noCustomEmojis: "Žiadne emoji" +noJobs: "Žiadne úlohy" +federating: "Federácia" +blocked: "Blokované" +suspended: "Zmrazené" +all: "Všetko" +subscribing: "Odoberanie" +publishing: "Zverejňovanie" +notResponding: "Neodpovedá" +instanceFollowing: "Sledujem na serveri" +instanceFollowers: "Sledujúci zo servera" +instanceUsers: "Používatelia servera" +changePassword: "Zmeniť heslo" +security: "Zabezpečenie" +retypedNotMatch: "Zadané vstupy nesúhlasia" +currentPassword: "Aktuálne heslo" +newPassword: "Nové heslo" +newPasswordRetype: "Nové heslo (znovu)" +attachFile: "Priložiť súbor" +more: "Viac!" +featured: "Obľúbené poznámky" +usernameOrUserId: "Meno používateľa alebo ID používateľa" +noSuchUser: "Používateľ sa nenašiel" +lookup: "Vyhľadať" +announcements: "Oznamy" +imageUrl: "URL obrázku" +remove: "Odstrániť" +removed: "Odstránené" +removeAreYouSure: "Naozaj chcete odstrániť \"{x}\"?" +deleteAreYouSure: "Naozaj chcete odstrániť \"{x}\"?" +resetAreYouSure: "Naozaj resetovať?" +saved: "Uložené" +messaging: "Chat" +upload: "Nahrať súbor" +keepOriginalUploading: "Zachovať pôvodný obrázok" +keepOriginalUploadingDescription: "Uloží pôvodný obrázok ako je. Ak je vypnuté, verzia pre web sa vygeneruje pri nahratí." +fromDrive: "Z disku" +fromUrl: "Z URL" +uploadFromUrl: "Nahrať z URL adresy" +uploadFromUrlDescription: "URL adresa nahrávaného súboru" +uploadFromUrlRequested: "Upload vyžiadaný" +uploadFromUrlMayTakeTime: "Nahrávanie môže nejaký čas trvať." +explore: "Objavovať" +messageRead: "Prečítané" +noMoreHistory: "To je všetko" +startMessaging: "Začať chat" +nUsersRead: "prečítané {n} používateľmi" +agreeTo: "Súhlasím s {0}" +tos: "Podmienky používania" +start: "Začať" +home: "Domov" +remoteUserCaution: "Tieto informácie nemusia byť aktuálne, keďže používateľ je na vzdialenom serveri." +activity: "Aktivita" +images: "Obrázky" +birthday: "Dátum narodenia" +yearsOld: "{age} rokov" +registeredDate: "Dátum registrácie" +location: "Lokalita" +theme: "Téma" +themeForLightMode: "Téma pri svetlom režime" +themeForDarkMode: "Téma pri tmavom režime" +light: "Svetlá" +dark: "Tmavá" +lightThemes: "Svetlá téma" +darkThemes: "Tmavá téma" +syncDeviceDarkMode: "Synchronizovať tmavú tému s nastavení vášho systému" +drive: "Disk" +fileName: "Názov súboru" +selectFile: "Vyberte súbor" +selectFiles: "Vyberte súbory" +selectFolder: "Vyberte priečinok" +selectFolders: "Vyberte priečinky" +renameFile: "Premenovať súbor" +folderName: "Názov priečinka" +createFolder: "Vytvoriť priečinok" +renameFolder: "Premenovať priečinok" +deleteFolder: "Odstrániť priečinok" +addFile: "Pridať súbor" +emptyDrive: "Váš disk je prázdny" +emptyFolder: "Tento priečinok je prázdny" +unableToDelete: "Nedá sa odstrániť" +inputNewFileName: "Zadajte nový názov" +inputNewDescription: "Zadajte nový popis" +inputNewFolderName: "Zadajte nový názov priečinka" +circularReferenceFolder: "Cieľový priečinok je podpriečinkom priečinka, ktorý chcete presunúť." +hasChildFilesOrFolders: "Nemôžete odstrániť priečinok sú súbormi." +copyUrl: "Kopírovať URL" +rename: "Premenovať" +avatar: "Avatar" +banner: "BAnner" +nsfw: "NSFW" +whenServerDisconnected: "Keď sa stratí spojenie so serverom" +disconnectedFromServer: "Spojenie so serverom bolo prerušené" +reload: "Obnoviť" +doNothing: "Ignorovať" +reloadConfirm: "Chcete obnoviť časovú os?" +watch: "Sledovať" +unwatch: "Nesledovať" +accept: "Súhlasím" +reject: "Nesúhlasím" +normal: "Normálne" +instanceName: "Názov servera" +instanceDescription: "Popis servera" +maintainerName: "Správca" +maintainerEmail: "E-mailová adresa správcu" +tosUrl: "URL zmluvných podmienok" +thisYear: "Rok" +thisMonth: "Mesiac" +today: "Dnes" +dayX: "{day}" +monthX: "{month}" +yearX: "{year}" +pages: "Stránky" +integration: "Integrácia" +connectService: "Pripojiť" +disconnectService: "Odpojiť" +enableLocalTimeline: "Povoliť lokálnu časovú os" +enableGlobalTimeline: "Povoliť globálnu časovú os" +disablingTimelinesInfo: "Administrátori a moderátori majú vždy prístup ku všetkým časovým osiam, aj keď sú vypnuté." +registration: "Registrácia" +enableRegistration: "Povoliť registráciu nových používateľov" +invite: "Pozvať" +driveCapacityPerLocalAccount: "Kapacita disku pre používateľa" +driveCapacityPerRemoteAccount: "Kapacita disku pre vzdialeného používateľa" +inMb: "V megabajtoch" +iconUrl: "Favicon URL" +bannerUrl: "URL obrázku bannera" +backgroundImageUrl: "URL obrázku pozadia" +basicInfo: "Základné informácie" +pinnedUsers: "Pripnutí používatelia" +pinnedUsersDescription: "Zoznam mien používateľov oddelených riadkami, ktorý budú pripnutí v záložke \"Objavovať\"." +pinnedPages: "Pripnuté stránky" +pinnedPagesDescription: "Na každý riadok zadajte cesty stránok, ktoré chcete pripnúť na vrch stránky tohoto servera." +pinnedClipId: "ID pripnutého klipu" +pinnedNotes: "Pripnuté poznámky" +hcaptcha: "hCaptcha" +enableHcaptcha: "Zapnúť hCaptchu" +hcaptchaSiteKey: "Site key" +hcaptchaSecretKey: "Secret key" +recaptcha: "reCAPTCHA" +enableRecaptcha: "Zapnúť ReCAPTCHA" +recaptchaSiteKey: "Site key" +recaptchaSecretKey: "Secret key" +avoidMultiCaptchaConfirm: "Použitie viacerých Captcha systémov môže sposobiť problémy. Chcete radšej vypnúť ostatné Captcha systémy? Môžete ich povoliť viaceré stlačení Zrušiť." +antennas: "Antény" +manageAntennas: "Spravovať antény" +name: "Názov" +antennaSource: "Zdroj antény" +antennaKeywords: "Počúvané kľúčové slová" +antennaExcludeKeywords: "Vylúčené kľúčové slová" +antennaKeywordsDescription: "Oddeľte medzerami pre podmienku AND alebo novými riadkami pre podmienku OR." +notifyAntenna: "Upozorniť na nové poznámky" +withFileAntenna: "Len poznámky so súbormi" +enableServiceworker: "Povoliť Service Worker" +antennaUsersDescription: "Zoznam používateľov jeden na riadok" +caseSensitive: "Rozlišuje malé a veľké písmená" +withReplies: "Vrátane odpovedí" +connectedTo: "Nasledujúce účty sú pripojené" +notesAndReplies: "Poznámky a odpovede" +withFiles: "Vrátane súborov" +silence: "Ticho" +silenceConfirm: "Naozaj chcete utíšiť tohoto používateľa?" +unsilence: "Vrátiť utíšenie" +unsilenceConfirm: "Naozaj chcete vrátiť utíšenie tohoto používateľa?" +popularUsers: "Populárni používatelia" +recentlyUpdatedUsers: "Používatelia s najnovšou aktivitou" +recentlyRegisteredUsers: "Najnovší používatelia" +recentlyDiscoveredUsers: "Naposledy objavení používatelia" +exploreUsersCount: "Existuje {count} používateľov" +exploreFediverse: "Objavovať Fediverzum" +popularTags: "Populárne značky" +userList: "Zoznamy" +about: "Informácie" +aboutMisskey: "O Calckey" +administrator: "Administrátor" +token: "Token" +twoStepAuthentication: "Dvojfaktorová autentifikácia" +moderator: "Moderátor" +moderation: "Moderovanie" +nUsersMentioned: "{n} používateľov spomenulo" +securityKey: "Bezpečnostný kľúč" +securityKeyName: "Názov kľúča" +registerSecurityKey: "Registrovať bezpečnostný kľúč" +lastUsed: "Naposledy použité" +unregister: "Odregistrovať" +passwordLessLogin: "Nastaviť bezheslové prihlásenie" +resetPassword: "Resetovať heslo" +newPasswordIs: "Nové heslo je \"{password}\"" +reduceUiAnimation: "Menej UI animácií" +share: "Zdieľať" +notFound: "Nenájdené" +notFoundDescription: "Nenašla sa žiadna stránka na zadanej URL." +uploadFolder: "Predvolený priečinok pre nahrávanie" +cacheClear: "Vyčistiť cache" +markAsReadAllNotifications: "Označiť všetky oznámenia ako prečítané" +markAsReadAllUnreadNotes: "Označiť všetky poznámky ako prečítané" +markAsReadAllTalkMessages: "Označiť všetky správy ako prečítané" +help: "Pomoc" +inputMessageHere: "Sem napíšte správu" +close: "Zavrieť" +group: "Skupina" +groups: "Skupiny" +createGroup: "Vytvoriť skupinu" +ownedGroups: "Vlastnené skupiny" +joinedGroups: "Členstvo v skupinách" +invites: "Pozvať" +groupName: "Názov skupiny" +members: "Členovia" +transfer: "Presun" +messagingWithUser: "Súkromný chat" +messagingWithGroup: "Skupinový chat" +title: "Nadpis" +text: "Text" +enable: "Povoliť" +next: "Ďalší" +retype: "Zadajte znovu" +noteOf: "Poznámky používateľa {user}" +inviteToGroup: "Pozvať do skupiny" +quoteAttached: "Citované" +quoteQuestion: "Pripojiť ako citát?" +noMessagesYet: "Zatiaľ žiadne správy" +newMessageExists: "Máte novú správu" +onlyOneFileCanBeAttached: "Ku správe môžete priložiť len jeden súbor" +signinRequired: "Prihláste sa, prosím!" +invitations: "Pozvať" +invitationCode: "Kód pozvánky" +checking: "Overujem..." +available: "Dostupné" +unavailable: "Nedostupné" +usernameInvalidFormat: "Povolené sú písmená, čísla a _." +tooShort: "Príliš krátke" +tooLong: "Príliš dlhé" +weakPassword: "Slabé heslo" +normalPassword: "Dobré heslo" +strongPassword: "Silné heslo" +passwordMatched: "Heslá sú rovnaké" +passwordNotMatched: "Heslá nie sú rovnaké" +signinWith: "Prihlásiť sa použitím {x}" +signinFailed: "Nedá sa prihlásiť. Skontrolujte prosím meno používateľa a heslo." +tapSecurityKey: "Ťuknite na bezpečnostný kľúč" +or: "Alebo" +language: "Jazyk" +uiLanguage: "Jazyk používateľského prostredia" +groupInvited: "Pozvať do skupiny" +aboutX: "O {x}" +useOsNativeEmojis: "Používať natívne emoji z OS" +disableDrawer: "Nepoužívať šuflíkové menu" +youHaveNoGroups: "Nemáte žiadne skupiny" +joinOrCreateGroup: "Požiadajte o pozvanie do existujúcej skupiny alebo vytvorte novú." +noHistory: "Žiadna história" +signinHistory: "História prihlásení" +disableAnimatedMfm: "Vypnúť MFM s animáciou" +doing: "Pracujem..." +category: "Kategórie" +tags: "Značky" +docSource: "Zdroj tohoto dokumentu" +createAccount: "Vytvoriť účet" +existingAccount: "Existujúci účet" +regenerate: "Pregenerovať" +fontSize: "Veľkosť písma" +noFollowRequests: "Nemáte nijaké čakajúce žiadosti o sledovanie" +openImageInNewTab: "Otvoriť obrázok v novom tabe" +dashboard: "Prehľad" +local: "Lokálne" +remote: "Vzdialené" +total: "Celkom" +weekOverWeekChanges: "Medzitýždňové zmeny" +dayOverDayChanges: "Medzidenné zmeny" +appearance: "Vzhľad" +clientSettings: "Nastavenia klienta" +accountSettings: "Nastavenia účtu" +promotion: "Propagácia" +promote: "Propagovať" +numberOfDays: "Počet dní" +hideThisNote: "Skryť túto poznámku" +showFeaturedNotesInTimeline: "Zobraziť významné poznámky v časovej osi" +objectStorage: "Objektové úložisko" +useObjectStorage: "Použiť objektové úložisko" +objectStorageBaseUrl: "Základná URL" +objectStorageBaseUrlDesc: "URL použitá ako referencia. Zadajte URL svojho CDN alebo Proxy ak niektoré používate. S3: 'https://.s3.amazonaws.com', GCS: 'https://storage.googleapis.com/' atď." +objectStorageBucket: "Bucket" +objectStorageBucketDesc: "Prosím zadajte názov bucketu od svojho poskytovateľa." +objectStoragePrefix: "Prefix" +objectStoragePrefixDesc: "Súbory budú ukladané do priečinkov pod týmto prefixom." +objectStorageEndpoint: "Endpoint" +objectStorageEndpointDesc: "Nechajte prázdne ak používate AWS S3, inak zadajte endpoint ako \"\" alebo \":\". Záleží to od služby, ktorú používate." +objectStorageRegion: "Región" +objectStorageRegionDesc: "Zadajte región ako 'xx-east-1'. Ak vaša služba nerozlišuje regióny, nechajte prázdne alebo zadajte 'us-east-1'." +objectStorageUseSSL: "Použiť SSL" +objectStorageUseSSLDesc: "Vypnite to ak nechcete použiť HTTPS na API spojenia." +objectStorageUseProxy: "Pripájať cez Proxy" +objectStorageUseProxyDesc: "Vypnite ak nechcete, aby spojenia na API išli cez Proxy" +objectStorageSetPublicRead: "Pri nahratí nastaviť \"public-read\"" +serverLogs: "Logy servera" +deleteAll: "Odstrániť všetko" +showFixedPostForm: "Zobraziť formulár na nové príspevky nad časovou osou" +newNoteRecived: "Sú nové poznámky" +sounds: "Zvuky" +listen: "Počúvať" +none: "Žiadne" +showInPage: "Zobraziť v stránke" +popout: "Pop-out" +volume: "Hlasitosť" +masterVolume: "Celková hlasitosť" +details: "Detaily" +chooseEmoji: "Vybrať emoji" +unableToProcess: "Operáciu sa nepodarilo dokončiť." +recentUsed: "Neposledy použité" +install: "Nainštalovať" +uninstall: "Odinštalovať" +installedApps: "Autorizované aplikácie" +nothing: "Nič tu nie je" +installedDate: "Dátum autorizácie" +lastUsedDate: "Naposledy použité" +state: "Status" +sort: "Zoradiť" +ascendingOrder: "Vzostupne" +descendingOrder: "Zostupne" +scratchpad: "Zápisník" +scratchpadDescription: "Zápisník poskytuje prostredia pre experimenty s AiScriptom. Môžete písať, spúšťať a skúšať vysledky pri interakcii s Calckey." +output: "Výstup" +script: "Skript" +disablePagesScript: "Vypnúť AiScript na stránkach" +updateRemoteUser: "Aktualizovať informácie o vzdialenom účte" +deleteAllFiles: "Odstrániť všetky súbory" +deleteAllFilesConfirm: "Naozaj chcete odstrániť všetky súbory" +removeAllFollowing: "Zrušiť sledovani všetkých používateľov" +removeAllFollowingDescription: "Týmto zrušíte sledovanie všetkých používateľov z {host}. Spustite to prosím, keď server napríklad už neexistuje." +userSuspended: "Tento používateľ je zmrazený." +userSilenced: "Tento používateľ je umlčaný." +yourAccountSuspendedTitle: "Tento účet je zmrazený" +yourAccountSuspendedDescription: "Tento účet bol zmrazený, lebo porušoval zmluvné podmienky. Kontaktujte administrátora ak chcete viac podrobností. Prosím nevytvárajte nový účet." +menu: "Menu" +divider: "Oddeľovač" +addItem: "Pridať položku" +relays: "Prenos" +addRelay: "Pridať prenos" +inboxUrl: "Inbox URL" +addedRelays: "Pridané prenosy" +serviceworkerInfo: "Musí byť zapnuté pre push notifikácie." +deletedNote: "Odstránené príspevky" +invisibleNote: "Skryté príspevky" +enableInfiniteScroll: "Zapnúť nekonečné skrolovanie" +visibility: "Viditeľnosť" +poll: "Hlasovanie" +useCw: "Skryť obsah" +enablePlayer: "Otvoriť video prehrávač" +disablePlayer: "Zavrieť video prehrávač" +expandTweet: "Rozšíriť tweet" +themeEditor: "Editor tém" +description: "Popis" +describeFile: "Pridať nadpis" +enterFileDescription: "Zadajte nadpis" +author: "Autor" +leaveConfirm: "Máte neuložené zmeny. Chcete ich zahodiť?" +manage: "Administrácia" +plugins: "Pluginy" +preferencesBackups: "Zálohy nastavení" +deck: "Deck" +useBlurEffectForModal: "Použiť efekt rozmazania na okná" +useFullReactionPicker: "Použiť plnú veľkosť výberu reakcií" +width: "Šírka" +height: "Výška" +large: "Veľké" +medium: "Stredné" +small: "Malé" +generateAccessToken: "Vygenerovať prístupový token" +permission: "Oprávnenia" +enableAll: "Povoliť všetko" +disableAll: "Vypnúť všetko" +tokenRequested: "Povoliť prístup k účtu" +pluginTokenRequestedDescription: "Tento plugin bude môcť používať oprávnenia nastavené tu." +notificationType: "Typ oznámenia" +edit: "Upraviť" +emailServer: "Email server" +enableEmail: "Zapnúť email" +emailConfigInfo: "Používa sa na overenie emaily pri registrácii alebo pri zabudnutí hesla" +email: "Email" +emailAddress: "Emailová adresa" +smtpConfig: "Nastavenia SMTP servera" +smtpHost: "Host" +smtpPort: "Port" +smtpUser: "Meno používateľa" +smtpPass: "Heslo" +emptyToDisableSmtpAuth: "Vynechaním mena hesla vypnete SMTP verifikáciu" +smtpSecure: "Použiť implicitné SSL/TLS pre SMTP spojenia" +smtpSecureInfo: "Toto vypnite keď používate STARTTLS" +testEmail: "Doručenie testovacieho emailu" +wordMute: "Stíšenie slova" +regexpError: "Chyba v regulárnom výraze" +regexpErrorDescription: "Na riadku {line} sa vyskytla chyba v stíšenom slove {tab}." +instanceMute: "Stíšené servery" +userSaysSomething: "{name} niečo povedal/a" +makeActive: "Aktivovať" +display: "Zobraziť" +copy: "Kopírovať" +metrics: "Metriky" +overview: "Prehľad" +logs: "Logy" +delayed: "Oneskorené" +database: "Databáza" +channel: "Kanály" +create: "Vytvoriť" +notificationSetting: "Nastavenia oznámení" +notificationSettingDesc: "Vyberte typ oznámení na zobrazenie" +useGlobalSetting: "Použiť globálne nastavenie" +useGlobalSettingDesc: "Ak je zapnuté, použijú sa oznámenia vášho účtu. Ak je vypnuté, použijú sa jednotlivé nastavenia." +other: "Ostatní" +regenerateLoginToken: "Pregenerovať prihlasovací token" +regenerateLoginTokenDescription: "Pregeneruje token interne používaný počas prihlásenia. Normálne toto netreba robiť. Ak sa pregeneruje, všetky zariadenia sa odhlásia." +setMultipleBySeparatingWithSpace: "Viaceré položky oddeľte medzerami." +fileIdOrUrl: "ID alebo URL súboru" +behavior: "Správanie" +sample: "Ukážka" +abuseReports: "Nahlásenia" +reportAbuse: "Nahlásiť" +reportAbuseOf: "Nahlásiť {name}" +fillAbuseReportDescription: "Prosím vyplňte podrobnosti nahlásenia. Ak sa týka konkrétnej poznámky, prosím napíšte jej URL." +abuseReported: "Vaše nahlásenie je odoslané. Veľmi pekne ďakujeme." +reporter: "Nahlásil" +reporteeOrigin: "Pôvod nahláseného" +reporterOrigin: "Pôvod nahlasovača" +forwardReport: "Preposlať nahlásenie na server" +forwardReportIsAnonymous: "Namiesto vášho účtu bude zobrazený anonymný systémový účet na vzdialenom serveri ako autor nahlásenia." +send: "Poslať" +abuseMarkAsResolved: "Označiť nahlásenia ako vyriešené" +openInNewTab: "Otvoriť v novom tabe" +openInSideView: "Otvoriť v bočnom paneli" +defaultNavigationBehaviour: "Predvolené správanie navigácie" +editTheseSettingsMayBreakAccount: "Úpravou týchto nastavení si môžete pokaziť účet." +instanceTicker: "Informácie servera o poznámkach" +waitingFor: "Čaká sa na {x}" +random: "Náhodné" +system: "Systém" +switchUi: "Prepnúť UI" +desktop: "Desktop" +clip: "Klip" +createNew: "Vytvoriť nový" +optional: "Voliteľné" +createNewClip: "Vytvoriť nový klip" +unclip: "Odopnúť" +confirmToUnclipAlreadyClippedNote: "Táto poznámka je už pripnutá ako \"{name}\". Naozaj ju chcete odopnúť?" +public: "Verejné" +i18nInfo: "Calckey je prekladaný do rôznych jazykov dobrovoľníkmi. Pomôcť môžete na {link}." +manageAccessTokens: "Spravovať prístupové tokeny" +accountInfo: "Informácie o účte" +notesCount: "Počet poznámok" +repliesCount: "Počet odoslaných odpovedí" +renotesCount: "Počet preposlaných poznámok" +repliedCount: "Počet odpovedí prijatých" +renotedCount: "Počet preposlaní prijatých" +followingCount: "Počet sledovaných účtov" +followersCount: "Počet sledujúcich" +sentReactionsCount: "Počet poslaných reakcií" +receivedReactionsCount: "Počet prijatých reakcií" +pollVotesCount: "Počet odoslaných hlasov" +pollVotedCount: "Počet prijatých hlasov" +yes: "Áno" +no: "Nie" +driveFilesCount: "Počet súborov na disku" +driveUsage: "Využité miesto na disku" +noCrawle: "Odmietať indexovanie crawlerov" +noCrawleDescription: "Požiadať vyhľadávače, aby neindexovali váš profil, poznámky, stránky, atď." +lockedAccountInfo: "Pokým nenastavíte viditeľnosť poznámok na \"Len pre sledujúcich\", vaše príspevky bude vidieť hocikto, aj keď vyžadujete manuálne potvrdenie sledovania." +alwaysMarkSensitive: "Predvolene označovať ako NSFW" +loadRawImages: "Načítať originálne obrázky namiesto miniatúr" +disableShowingAnimatedImages: "Neprehrávať animované obrázky" +verificationEmailSent: "Odoslali sme overovací email. Overenie dokončíte kliknutím na odkaz v emaili." +notSet: "Nenastavené" +emailVerified: "Email overený" +noteFavoritesCount: "Počet obľúbených poznámok" +pageLikesCount: "Počet obľúbených stránok" +pageLikedCount: "Počet prijatých \"páči sa mi\"" +contact: "Kontakt" +useSystemFont: "Použiť predvolené systémové písmo" +clips: "Klip" +experimentalFeatures: "Experimentálne funkcie" +developer: "Vývojár" +makeExplorable: "Spraviť účet viditeľný v \"Objavovať\"" +makeExplorableDescription: "Ak toto vypnete, váš účet sa nezobrazí v sekcii \"Objavovat\"." +showGapBetweenNotesInTimeline: "Zobraziť medzeru medzi príspevkami časovej osi." +duplicate: "Duplikovať" +left: "Naľavo" +center: "Stred" +wide: "Široko" +narrow: "Úzko" +reloadToApplySetting: "Toto nastavenia sa prejaví až po obnovení stránky. Obnoviť teraz?" +needReloadToApply: "Toto nastavenie sa prejaví až po obnovení stránky." +showTitlebar: "Zobraziť riadok s nadpisom" +clearCache: "Vyprázdniť cache" +onlineUsersCount: "{n} používateľov je online" +nUsers: "{n} používateľov" +nNotes: "{n} poznámok" +sendErrorReports: "Poslať nahlásenie chyby" +sendErrorReportsDescription: "Keď je zapnuté, v prípade problému sa odošlú podrobné informácie o chybe do Calckey. Pomôžete tak zvýšiť kvalitu Calckey.\nTieto informácie zahŕňajú verziu vášho OS, použitý prehliadač, históriu aktivít, atď." +myTheme: "Moja téma" +backgroundColor: "Pozadie" +accentColor: "Akcent" +textColor: "Text" +saveAs: "Uložiť ako..." +advanced: "Rozšírené" +value: "Hodnoty" +createdAt: "Vytvorené" +updatedAt: "Upravené" +saveConfirm: "Uložiť zmeny?" +deleteConfirm: "Naozaj odstrániť?" +invalidValue: "Nesprávna hodnota." +registry: "Register" +closeAccount: "Zavrieť účet" +currentVersion: "Aktuálna verzia" +latestVersion: "Najnovšia verzia" +youAreRunningUpToDateClient: "Používate najnovšiu verziu vášho klienta." +newVersionOfClientAvailable: "Je dostupná novšia verzia vášho klienta." +usageAmount: "Využitie" +capacity: "Kapacita" +inUse: "Použité" +editCode: "Upraviť kód" +apply: "Použiť" +receiveAnnouncementFromInstance: "Prijať notifikácie z tohoto servera" +emailNotification: "Emailové upozornenia" +publish: "Zverejniť" +inChannelSearch: "Hľadať v kanáli" +useReactionPickerForContextMenu: "Otvoriť výber reakcií na pravý klik" +typingUsers: "{users} píše" +jumpToSpecifiedDate: "Skočiť na konkrétny dátum" +showingPastTimeline: "Práve vidíte starú časovú os" +clear: "Vrátiť" +markAllAsRead: "Označiť všetko ako prečítané" +goBack: "Späť" +unlikeConfirm: "Naozaj odstrániť váš like?" +fullView: "Plný pohľad" +quitFullView: "Zavrieť plný pohľad" +addDescription: "Pridať popis" +userPagePinTip: "Tu môžete zobraziť poznámky zvolením \"Pripnúť na profil\" z menu jednotlivých poznámok." +notSpecifiedMentionWarning: "Táto poznámka obsahuje spomenutých používateľov, ktorí nie sú medzi adresátmi." +info: "Informácie" +userInfo: "Informácie o používateľovi" +unknown: "Neznáme" +onlineStatus: "Online status" +hideOnlineStatus: "Skryť online status" +hideOnlineStatusDescription: "Skrytie vášho online statusu zníži pohodlnosť niektorých funkcií ako napríklad vyhľadávanie." +online: "Online" +active: "Aktívny" +offline: "Offline" +notRecommended: "Neodporúčané" +botProtection: "Bot ochrana" +instanceBlocking: "Blokované servery" +selectAccount: "Vyberte účet" +switchAccount: "Prepnút účet" +enabled: "Zapnuté" +disabled: "Vypnuté" +quickAction: "Rýchle akcie" +user: "Používatelia" +administration: "Spravovanie" +accounts: "Účty" +switch: "Prepnúť" +noMaintainerInformationWarning: "Informácie správcu nie sú nastavené." +noBotProtectionWarning: "Ochrana proti botom nie je nastavená." +configure: "Konfigurovať" +postToGallery: "Vytvoriť nový príspevok v galérii" +gallery: "Galéria" +recentPosts: "Najnovšie príspevky" +popularPosts: "Populárne príspevky" +shareWithNote: "Zdieľať s poznámkou" +ads: "Reklamy" +expiration: "Ukončiť hlasovanie" +memo: "Memo" +priority: "Priorita" +high: "Vysoká" +middle: "Stredné" +low: "Málo" +emailNotConfiguredWarning: "Nie je nastavená emailová adresa." +ratio: "Pomer" +previewNoteText: "Zobraziť náhľad" +customCss: "Vlastné CSS" +customCssWarn: "Toto nastavenie by sa malo používať iba ak viete čo robíte. Zadanie nesprávnych hodnôt môže spôsobiť nenormálne správanie klienta." +global: "Globálne" +squareAvatars: "Zobrazovať štvorcové avatary" +sent: "Poslať" +received: "Prijaté" +searchResult: "Výsledky hľadania" +hashtags: "Hashtagy" +troubleshooting: "Riešenie problémov" +useBlurEffect: "Používať efekty rozmazania v UI" +learnMore: "Zistiť viac" +misskeyUpdated: "Calckey sa aktualizoval!" +whatIsNew: "Čo je nové?" +translate: "Preložiť" +translatedFrom: "Preložené z {x}" +accountDeletionInProgress: "Odstraňovanie účtu prebieha" +usernameInfo: "Meno, ktoré odlišuje váš účet od ostatných na tomto serveri. Môžete použiť abecedu (a~z, A~Z), čísla (0~9) alebo podtržník (_). Používateľské mená sa nedajú neskôr zmeniť." +aiChanMode: "Ai režim" +keepCw: "Nechať varovania obsahu" +pubSub: "Pub/Sub účty" +lastCommunication: "Posledná komunikácia" +resolved: "Vyriešené" +unresolved: "Nevyriešené" +breakFollow: "Nesledovať" +itsOn: "Zapnuté" +itsOff: "Vypnuté" +emailRequiredForSignup: "Registrácia vyžaduje emailovú adresu" +unread: "Neprečítané" +filter: "Filter" +controlPanel: "Ovládací panel" +manageAccounts: "Správa účtov" +makeReactionsPublic: "Reakcie sú verejné" +makeReactionsPublicDescription: "Toto spraví všetky vaše minulé reakcie viditeľné verejnosti." +classic: "Klasika" +muteThread: "Ztíšiť vlákno" +unmuteThread: "Zrušiť stíšenie vlákna" +ffVisibility: "Viditeľnosť sledujúcich/sledovaných" +ffVisibilityDescription: "Umožňuje nastaviť kto vidí koho sledujete a kto vás sleduje." +continueThread: "Zobraziť pokračovanie vlákna" +deleteAccountConfirm: "Toto nezvrátiteľne vymaže váš účet. Pokračovať?" +incorrectPassword: "Nesprávne heslo." +voteConfirm: "Potvrdzujete svoj hlas za \"{choice}\"?" +hide: "Skryť" +leaveGroup: "Opustiť skupiny" +leaveGroupConfirm: "Naozaj chcete opustiť \"{name}\"?" +useDrawerReactionPickerForMobile: "Zobraziť výber reakcií ako šuflík na mobile" +welcomeBackWithName: "Vitajte späť, {name}" +clickToFinishEmailVerification: "Kliknutím na [{ok}] dokončíte overeniu emailu." +overridedDeviceKind: "Typ zariadenia" +smartphone: "Smartfón" +tablet: "Tablet" +auto: "Automaticky" +themeColor: "Farba témy" +size: "Veľkosť" +numberOfColumn: "Počet stĺpcov" +searchByGoogle: "Hľadať cez Google" +instanceDefaultLightTheme: "Predvolená svetlá téma" +instanceDefaultDarkTheme: "Predvolená tmavá téma" +instanceDefaultThemeDescription: "Vložte kód témy v objektovom formáte" +mutePeriod: "Trvanie stíšenia" +indefinitely: "Navždy" +tenMinutes: "10 minút" +oneHour: "1 hodina" +oneDay: "1 deň" +oneWeek: "1 týždeň" +reflectMayTakeTime: "Zmeny môžu chvíľu trvať kým sa prejavia." +failedToFetchAccountInformation: "Nepodarilo sa načítať informácie o účte." +rateLimitExceeded: "Prekročený limit rýchlosti" +cropImage: "Orezanie obrázku" +cropImageAsk: "Chcete orezať obrázok?" +file: "Súbor/y" +recentNHours: "Posledných {n} hodín" +recentNDays: "Posledných {n} dní" +noEmailServerWarning: "Nie je nastavený emailový server." +thereIsUnresolvedAbuseReportWarning: "Existuje nevyriešené nahlásenie zneužitia." +recommended: "Odporúčané" +driveCapOverrideLabel: "Zmena limitu úložiska pre tohoto používateľa" +driveCapOverrideCaption: "Ak je zadaná hodnota menšia alebo rovná 0, zruší sa." +isSystemAccount: "Tieto účty automaticky vytvoril a spravuje systém." +typeToConfirm: "Ak chcete vykonať túto operáciu, napíšte {x}" +deleteAccount: "Vymazať účet" +document: "Dokument" +numberOfPageCache: "Počet cachí pre stránky" +numberOfPageCacheDescription: "Zvýši rýchlosť ale tiež nároky na pamäť." +logoutConfirm: "Naozaj sa chcete odhlásiť?" +statusbar: "Stavový riadok" +pleaseSelect: "Prosím vyberte" +reverse: "Preklopiť" +colored: "Farebné" +refreshInterval: "Interval obnovenia" +label: "Popisok" +type: "Typ" +speed: "Rýchlosť" +slow: "Pomaly" +fast: "Rýchlo" +sensitiveMediaDetection: "Detekcia citlivých médií." +localOnly: "Iba lokálne" +remoteOnly: "Len vzdialené" +failedToUpload: "Nahrávanie zlyhalo" +cannotUploadBecauseInappropriate: "Nemožno nahrať, pretože pravdepodobne obsahuje nevhodný obsah." +cannotUploadBecauseNoFreeSpace: "Nemožno nahrať kvôli nedostatku voľného úložiska." +beta: "Beta" +enableAutoSensitive: "Automatická detekcia NSFW" +enableAutoSensitiveDescription: "Ak je zapnuté, príznak NSFW sa na médiách automaticky nastaví pomocou strojového učenia. Aj keď je táto funkcia vypnutá, v niektorých prípadoch sa môže nastaviť automaticky." +activeEmailValidationDescription: "Dôkladnejšie overí e-mailovú adresu používateľa tým, že zistí, či ide o vyradenú e-mailovú adresu a či sa s ňou dá skutočne komunikovať. Ak nie je začiarknuté, e-mailová adresa sa kontroluje len ako text." +navbar: "Navigačný panel" +account: "Účty" +move: "Pohyb" +_sensitiveMediaDetection: + description: "Strojové učenie sa použije na automatickú detekciu citlivých médií na účely ich moderovania. Mierne sa zvýši zaťaženie servera." + sensitivity: "Citlivosť detekcie" + sensitivityDescription: "Nižšia citlivosť znižuje počet falošne pozitívnych výsledkov (false positives). Vyššia citlivosť znižuje počet falošne negatívnych výsledkov (false negatives)." + setSensitiveFlagAutomatically: "Nastaviť príznak NSFW" + setSensitiveFlagAutomaticallyDescription: "Aj keď je toto nastavenie vypnuté, výsledok rozhodnutia je interne uložený." + analyzeVideos: "Zapnúť analýzu videa" + analyzeVideosDescription: "Okrem obrázkov zapne detekciu aj pre videá. Zaťaženie servera sa mierne zvýši." +_emailUnavailable: + used: "Táto emailová adresa sa už používa" + format: "Formát emailovej adresy je nesprávny" + disposable: "Jednorázové emailové adresy sa nemôžu používať." + mx: "Tento emailový server nefunguje." + smtp: "Tento emailový server neodpovedá." +_ffVisibility: + public: "Zverejniť" + followers: "Len viditeľní sledujúci" + private: "Súkromné" +_signup: + almostThere: "Skoro na konci" + emailAddressInfo: "Prosím zadajte svoju emailovú adresu!" + emailSent: "Na vašu emailovú adresu ({email}) sme odoslali email. Vytvorenie účtu dokončíte kliknutím na odkaz v emaili." +_accountDelete: + accountDelete: "Odstrániť účet" + mayTakeTime: "Keďže odstránenie účtu je náročný proces, môže to nejaký čas trvať. Záleží koľko obsahu ste vytvorili a koľko súborov ste nahrali." + sendEmail: "Po odstránení účtu vám pošleme email na emailovú adresu zadanú pri registrácii tohoto účtu." + requestAccountDelete: "Požiadať o zmazanie účtu" + started: "Odstraňovanie začalo." + inProgress: "Odstraňovanie prebieha" +_ad: + back: "Späť" + reduceFrequencyOfThisAd: "Túto reklamu zobrazovať menej" +_forgotPassword: + enterEmail: "Zadajte emailovú adresu, ktorú ste použili pri registrácii. Pošleme vám na ňu odkaz, cez ktorý si môžete obnoviť heslo." + ifNoEmail: "Ak ste pri registrácii nepoužili email, prosím kontaktujte administrátora." + contactAdmin: "Tento server nepodporuje používanie emailových adries, prosím kontaktuje administrátor, ktorý vám resetuje heslo." +_gallery: + my: "Moja galéria" + liked: "Obľúbené príspevky" + like: "Páči sa mi" + unlike: "Nepáči sa mi" +_email: + _follow: + title: "Máte nového sledujúceho" + _receiveFollowRequest: + title: "Dostali ste žiadosť o sledovanie" +_plugin: + install: "Inštalova pluginy" + installWarn: "Prosím neinštalujte nedôveryhodné pluginy." + manage: "Spravovanie pluginov" +_preferencesBackups: + list: "Vytvorené zálohy" + saveNew: "Uložiť novú" + loadFile: "Nahrať súbor" + apply: "Použiť na toto zariadenie" + save: "Uložiť" + inputName: "Názov zálohy" + cannotSave: "Nedá sa uložiť" + nameAlreadyExists: "Záloha s názvom \"{name}\" už existuje. Zadajte iný názov." + applyConfirm: "Chcete použiť zálohu '{name}' na aktuálne zariadenie? Aktuálne nastavenia zariadenia sa stratia." + saveConfirm: "Chcete prepísať {name}?" + deleteConfirm: "Naozaj chcete odstrániť \"{name}\"?" + renameConfirm: "Chcete zmeniť \"{old}\" na \"{new}\"?" + noBackups: "Nie je k dispozícii žiadna záloha. \"Uložiť novú\" umožňuje uložiť aktuálnu konfiguráciu zariadenia na server." + createdAt: "Dátum vytvorenia: {date} {time}" + updatedAt: "Dátum úpravy: {date} {time}" + cannotLoad: "Nedá sa nahrať" + invalidFile: "Neplatný formát súboru" +_registry: + scope: "Oblasť" + key: "Kľúč" + keys: "Kľúče" + domain: "Doména" + createKey: "Vytvoriť kľúč" +_aboutMisskey: + about: "Misskey je open-source softvér, ktorý vyvíja syuilo od 2014." + contributors: "Hlavní prispievatelia" + allContributors: "Všetci prispievatelia" + source: "Zdrojový kód" + translation: "Preložiť Calckey" + donate: "Podporiť Calckey" + morePatrons: "Takisto oceňujeme podporu mnoých ďalších, ktorí tu nie sú uvedení. Ďakujeme! 🥰" + patrons: "Prispievatelia" +_nsfw: + respect: "Skryť NSFW médiá" + ignore: "Neskrývať NSFW médiá" + force: "Skryť všetky médiá" +_mfm: + cheatSheet: "MFM Cheatsheet" + intro: "MFM je Calckey exkluzívny značkovací jazyk, ktorý sa dá používať na viacerých miestach. Tu môžete vidieť zoznam všetkej dostupnej MFM syntaxe." + dummy: "Calckey rozširuje svet Fediverza" + mention: "Zmienka" + mentionDescription: "Používateľa spomeniete použítím zavináča a mena používateľa" + hashtag: "Hashtag" + hashtagDescription: "Môžete zadať hashtag použitím mriežky a textu" + url: "URL" + urlDescription: "URL sa dajú zobraziť." + link: "Odkaz" + linkDescription: "Jednotlivé časti texty sa dajú zobraziť ako URL." + bold: "Tučné" + boldDescription: "Zvýrazní písmená tým, že budú tučnejšie." + small: "Malé" + smallDescription: "Zobrazí obsah malý a tenký." + center: "Vystrediť prvky" + centerDescription: "Zobrazí obsah v strede" + inlineCode: "Kód (inline)" + inlineCodeDescription: "Zobrazí kód so zvýraznením syntaxe." + blockCode: "Kód (blok)" + blockCodeDescription: "Zobrazí viacriadkový kód so zvýraznením syntaxe v bloku." + inlineMath: "Vzorec (inline)" + inlineMathDescription: "Zobrazí matematický vzorec (KaTeX) v riadku." + blockMath: "Vzorec (blok)" + blockMathDescription: "Zobrazí viacriadkový matematický vzorec (KaTeX) v bloku" + quote: "Citovať" + quoteDescription: "Zobrazí obsah ako citát." + emoji: "Vlastné emoji" + emojiDescription: "Pridaním dvojbodiek pred a za názov vlastnej emoji, sa dá zobraziť vlastná emoji." + search: "Hľadať" + searchDescription: "Zobrazí vyhľadávacie pole so zadaným textom." + flip: "Preklopiť" + flipDescription: "Preklopí obsah horizontálne alebo vertikálne" + jelly: "Animácia (želé)" + jellyDescription: "Obsah sa bude hýbať ako želé." + tada: "Animácia (tadá)" + tadaDescription: "Obsah sa bude hýbať ako Tada!" + jump: "Animácia (skok)" + jumpDescription: "Obsah skočí." + bounce: "Animácia (odraz)" + bounceDescription: "Obsah sa bude odrážať." + shake: "Animácia (trasenie)" + shakeDescription: "Obsah sa bude triasť." + twitch: "Animácia (myknutie)" + twitchDescription: "Obsahu dá animáciu silného trasenia." + spin: "Animácia (rotácia)" + spinDescription: "Obsahu pridá otáčajúcu animáciu." + x2: "Veľký" + x2Description: "Zobrazí obsah väčší." + x3: "Veľmi veľký" + x3Description: "Zobrazí obsah ešte väčší." + x4: "Neuveriteľne veľký" + x4Description: "Zobrazí obsah ešte viac veľký než veľmi veľký." + blur: "Rozmazanie" + blurDescription: "Týmto efektom môže byť obsah rozmazaný. Zaostrí sa keď ned neho príde kurzor." + font: "Písmo" + fontDescription: "Nastaví písmo, ktorým sa zobrazí text." + rainbow: "Dúha" + rainbowDescription: "Zobrazí obsah vo farbách dúhy." + sparkle: "Trblietky" + sparkleDescription: "Obsahu dodá trblietajúci efekt." + rotate: "Otáčať" + rotateDescription: "Otočí obsah o určitý uhol." + plain: "Obyčajné" + plainDescription: "Bez akejkoľvej syntaxe" +_instanceTicker: + none: "Nikdy nezobrazovať" + remote: "Zobraziť pre vzdialených používateľov" + always: "Zobraziť vždy" +_serverDisconnectedBehavior: + reload: "Automaticky obnoviť" + dialog: "Zobraziť okno s varovaním" + quiet: "Zobraziť nerušivé varovanie" +_channel: + create: "Vytvoriť kanál" + edit: "Upraviť kanál" + setBanner: "Nastaviť banner" + removeBanner: "Odstrániť banner" + featured: "Trendy" + owned: "Vlastnené" + following: "Sledované" + usersCount: "{n} účastníkov" + notesCount: "{n} poznámok" +_menuDisplay: + sideFull: "Strana" + sideIcon: "Strana (Ikony)" + top: "Hore" + hide: "Skryť" +_wordMute: + muteWords: "Umlčané slová" + muteWordsDescription: "Medzerami oddeľte pre podmienku AND a novými riadkami pre podmienku OR." + muteWordsDescription2: "Regulárne výrazy sa použijú keď použijete okolo lomítka." + softDescription: "Skryje poznámky z časovej osi, ktoré spĺňajú podmienky." + hardDescription: "Zabráni poznámky spĺňajúce množinu podmienok, aby boli pridané do časovej osi. Navyše tieto poznámky nepribudnú v časovej osi ani keď sa podmienky zmenia." + soft: "Mäkké" + hard: "Tvrdé" + mutedNotes: "Umlčané poznámky" +_instanceMute: + instanceMuteDescription: "Toto umlčí všetky poznámky/preposlania zo zoznamu serverov, vrátane tých, na ktoré používatelia odpovedajú z umlčaného servera." + instanceMuteDescription2: "Oddeľte novými riadkami" + title: "Skryje poznámky z uvedených serverov." + heading: "Zoznam umlčaných inštancií" +_theme: + explore: "Objavovať témy" + install: "Nainštalovať tému" + manage: "Spravovať témy" + code: "Kód témy" + description: "Popis" + installed: "{name} je nainštalovaná" + installedThemes: "Nainštalované témy" + builtinThemes: "Vstavané témy" + alreadyInstalled: "Táto téma je už nainštalovaná" + invalid: "Formát tejto témy je nesprávny" + make: "Vytvoriť tému" + base: "Základ" + addConstant: "Pridať konštantu" + constant: "Konštanta" + defaultValue: "Predvolená hodnota" + color: "Farba" + refProp: "Odkaz na vlastnosť" + refConst: "Odkaz na konštantu" + key: "Kľúč" + func: "Funkcie" + funcKind: "Typ funkcie" + argument: "Argument" + basedProp: "Odkazovaná vlastnosť" + alpha: "Priehľadnosť" + darken: "Stmaviť" + lighten: "Zosvetliť" + inputConstantName: "Zadajte názov tejto konštanty" + importInfo: "Ak sem zadáte kód témy, môžete ju importovať do editora tém." + deleteConstantConfirm: "Naozaj chcete odstrániť konštantu {const}?" + keys: + accent: "Akcent" + bg: "Pozadie" + fg: "Text" + focus: "Fokus" + indicator: "Indikátor" + panel: "Panel" + shadow: "Tieň" + header: "Hlavička" + navBg: "Pozadie bočného panela" + navFg: "Text bočného panela" + navHoverFg: "Text bočného panela (pod kurzorom)" + navActive: "Text bočného panela (aktívny)" + navIndicator: "Indikátor bočného panela" + link: "Odkaz" + hashtag: "Hashtag" + mention: "Zmienka" + mentionMe: "Zmienky (mňa)" + renote: "Preposlať" + modalBg: "Pozadie modálu" + divider: "Oddeľovač" + scrollbarHandle: "Rúčka scrollbaru" + scrollbarHandleHover: "Rúčka scrollbaru (pod kurzorom)" + dateLabelFg: "Text dátového popisku" + infoBg: "Pozadie informácií" + infoFg: "Informačný text" + infoWarnBg: "Pozadie varovania" + infoWarnFg: "Text varovania" + cwBg: "CW pozadie tlačidla" + cwFg: "CW text tlačidla" + cwHoverBg: "CW pozadie tlačidla (pod kurzorom)" + toastBg: "Pozadie upozornenia" + toastFg: "Text upozornenia" + buttonBg: "Pozadie tlačidla" + buttonHoverBg: "Pozadie tlačidla (pod kurzorom)" + inputBorder: "Okraj vstupného poľa" + listItemHoverBg: "Pozadie položky zoznamu (pod kurzorom)" + driveFolderBg: "Pozadie priečinu disku" + wallpaperOverlay: "Vrstvenie pozadia" + badge: "Odznak" + messageBg: "Pozadie chatu" + accentDarken: "Akcent (stmavené)" + accentLighten: "Akcent (zosvetlené)" + fgHighlighted: "Zvýraznený text" +_sfx: + note: "Poznámky" + noteMy: "Vlastná poznámka" + notification: "Oznámenia" + chat: "Chat" + chatBg: "Chat (pozadie)" + antenna: "Antény" + channel: "Upozornenia kanála" +_ago: + future: "Budúcnosť" + justNow: "Teraz" + secondsAgo: "pred {n} sekundami" + minutesAgo: "pred {n} minútami" + hoursAgo: "pred {n} hodinami" + daysAgo: "pred {n} dňami" + weeksAgo: "pred {n} týždňami" + monthsAgo: "pred {n} mesiacmi" + yearsAgo: "pred {n} rokmi" +_time: + second: "s" + minute: "min" + hour: "hod" + day: "dní" +_tutorial: + title: "How to use Calckey" + step1_1: "Welcome!" + step1_2: "Let's get you set up. You'll be up and running in no time!" + step2_1: "First, please fill out your profile." + step2_2: "Providing some information about who you are will make it easier for others to tell if they want to see your notes or follow you." + step3_1: "Now time to follow some people!" + step3_2: "Your home and social timelines are based off of who you follow, so try following a couple accounts to get started.\nClick the plus circle on the top right of a profile to follow them." + step4_1: "Let's get you out there." + step4_2: "For your first post, some people like to made a {introduction} post or a simple \"Hello world!\"" + step5_1: "Timelines, timelines everywhere!" + step5_2: "Your instance has {timelines} different timelines enabled." + step5_3: "The Home {icon} timeline is where you can see posts from your followers." + step5_4: "The Local {icon} timeline is where you can see posts from everyone else on this instance." + step5_5: "The Recommended {icon} timeline is where you can see posts from instances the admins recommend." + step5_6: "The Social {icon} timeline is where you can see posts from friends of your followers." + step5_7: "The Global {icon} timeline is where you can see posts from every other connected instance." + step6_1: "So, what is this place?" + step6_2: "Well, you didn't just join Calckey. You joined a portal to the Fediverse, an interconnected network of thousands of servers, called \"instances\"." + step6_3: "Each server works in different ways, and not all servers run Calckey. This one does though! It's a bit complicated, but you'll get the hang of it in no time." + step6_4: "Now go, explore, and have fun!" +_2fa: + alreadyRegistered: "Už ste zaregistrovali 2-faktorové autentifikačné zariadenie." + registerTOTP: "Registrovať nové zariadenie" + registerSecurityKey: "Registrovať bezpečnostný kľúč" + step1: "Najprv si nainštalujte autentifikačnú aplikáciu (napríklad {a} alebo {b}) na svoje zariadenie." + step2: "Potom, naskenujte QR kód zobrazený na obrazovke." + step2Url: "Do aplikácie zadajte nasledujúcu URL adresu:" + step3: "Nastavenie dokončíte zadaním tokenu z vašej aplikácie." + step4: "Od teraz, všetky ďalšie prihlásenia budú vyžadovať prihlasovací token." + securityKeyInfo: "Okrem odtlačku prsta alebo PIN autentifikácie si môžete nastaviť autentifikáciu cez hardvérový bezpečnostný kľúč podporujúci FIDO2 a tak ešte viac zabezpečiť svoj účet." +_permissions: + "read:account": "Vidieť informácie o vašom účte" + "write:account": "Upraviť informácie o vašom účte" + "read:blocks": "Vidieť zoznam blokovaných používateľov" + "write:blocks": "Upraviť zoznam blokovaných používateľov" + "read:drive": "Prístup k súborom a priečinkom na disku" + "write:drive": "Upraviť alebo odstrániť súbory a priečinky na disku" + "read:favorites": "Vidieť váš zoznam obľúbených" + "write:favorites": "Upraviť váš zoznam obľúbených" + "read:following": "Vidieť koho sledujete" + "write:following": "Sledovať alebo nesledovať ďalšie účty" + "read:messaging": "Vidieť vaše chaty" + "write:messaging": "Písať alebo odstraňovať správy v chate" + "read:mutes": "Vidieť váš zoznam stíšených používateľov" + "write:mutes": "Upravovať zoznam stíšených používateľov" + "write:notes": "Písať alebo odstrániť poznámky" + "read:notifications": "Vidieť vaše oznámenia" + "write:notifications": "Pracovať s vašimi notifikáciami" + "read:reactions": "Vidieť vaše reakcie" + "write:reactions": "Upravovať vaše reakcie" + "write:votes": "Hlasovať v hlasovaniach" + "read:pages": "Vidieť vaše stránky" + "write:pages": "Upraviť alebo odstrániť vaše stránky" + "read:page-likes": "Vidieť vaše páčiky na stránkach" + "write:page-likes": "Upraviť páčiky na stránkach" + "read:user-groups": "Vidieť vaše skupiny" + "write:user-groups": "Upraviť alebo odstrániť vaše skupiny" + "read:channels": "Čítať vaše kanály" + "write:channels": "Upravovať vaše kanály" + "read:gallery": "Vidieť vašu galériu" + "write:gallery": "Upravovať vašu galériu" + "read:gallery-likes": "Vidieť zoznam obľúbených príspevkov z galérie" + "write:gallery-likes": "Upraviť zoznam obľúbených príspevov z galérie" +_auth: + shareAccess: "Prajete si povoliť \"{name}\", aby mal prístup k tomuto účtu?" + shareAccessAsk: "Naozaj chcete povoliť tejto aplikácii prístup k tomuto účtu?" + permissionAsk: "Táto aplikácia vyžaduje nasledujúce nastavenia" + pleaseGoBack: "Prosím prejdite späť na aplikáciu" + callback: "Vraciam sa späť na aplikáciu" + denied: "Prístup zamietnutý" +_antennaSources: + all: "Všetky poznámky" + homeTimeline: "Poznámky od sledovaného používateľa" + users: "Poznámky od konkrétneho používateľa" + userList: "Poznámky od používateľov v zozname" + userGroup: "Poznámky od používateľov z konkrétnej skupiny." +_weekday: + sunday: "Nedeľa" + monday: "Pondelok" + tuesday: "Utorok" + wednesday: "Streda" + thursday: "Štvrtok" + friday: "Piatok" + saturday: "Sobota" +_widgets: + memo: "Prilepené poznámky" + notifications: "Oznámenia" + timeline: "Časová os" + calendar: "Kalendár" + trends: "Trendy" + clock: "Hodiny" + rss: "RSS čítačka" + rssTicker: "RSS Ticker" + activity: "Aktivita" + photos: "Fotky" + digitalClock: "Digitálne hodiny" + unixClock: "UNIX čas" + federation: "Federácia" + instanceCloud: "Cloud serverov" + postForm: "Napísať poznámku" + slideshow: "Prezentácia" + button: "Tlačidlo" + onlineUsers: "Online používatelia" + jobQueue: "Fronta úloh" + serverMetric: "Metriky servera" + aiscript: "Konzola AiScript" + aichan: "Ai" +_cw: + hide: "Skryť" + show: "Zobraziť viac" + chars: "{count} znakov" + files: "{count} súbor/ov" +_poll: + noOnlyOneChoice: "Treba aspoň dve voľby" + choiceN: "Voľba {n}" + noMore: "Nemôžete pridať viac volieb" + canMultipleVote: "Povoliť hlasovať za viac volieb." + expiration: "Ukončiť hlasovanie" + infinite: "Nikdy" + at: "Konkrétny dátum..." + after: "Ukončiť po..." + deadlineDate: "Dátum ukončenia" + deadlineTime: "hod" + duration: "Trvanie" + votesCount: "{n} hlasov" + totalVotes: "{n} hlasov celkom" + vote: "Hlasovať" + showResult: "Vidieť výsledky hlasovania" + voted: "Zahlasované" + closed: "Skončilo" + remainingDays: "zostáva {d} dní {h} hodín" + remainingHours: "zostáva {h} hodín {m} minút" + remainingMinutes: "zostáva {m} minút {s} sekúnd" + remainingSeconds: "zostáva {s} sekúnd" +_visibility: + public: "Verejné" + publicDescription: "Vaša poznámku bude viditeľná všetkým používateľom" + home: "Domov" + homeDescription: "Pridať iba na domácu časovú os" + followers: "Sledujúci" + followersDescription: "Viditeľné iba tým, ktorí vás sledujú" + specified: "Priame" + specifiedDescription: "Viditeľné iba pre konkrétnych používateľov" + localOnly: "Iba lokálne" + localOnlyDescription: "Vzdialený používatelia nebudú vidieť" +_postForm: + replyPlaceholder: "Odpoveď na túto poznámku..." + quotePlaceholder: "Citovanie tejto poznámky..." + channelPlaceholder: "Poslať do kanála..." + _placeholders: + a: "Čo máte v pláne?" + b: "Čo sa deje?" + c: "O čom rozmýšľaš?" + d: "Čo chcete povedať?" + e: "Začnite písať..." + f: "Čaká sa na písanie..." +_profile: + name: "Názov" + username: "Meno používateľa" + description: "Bio" + youCanIncludeHashtags: "Vo svojom bio môžete mať aj hashtagy." + metadata: "Dodatočné informácie" + metadataEdit: "Upraviť dodatočné informácie" + metadataDescription: "Vo svojom profile môžete uviesť až štyri dodatočné informačné polia." + metadataLabel: "Popisok" + metadataContent: "Obsah" + changeAvatar: "Zmeniť avatara" + changeBanner: "Zmeniť banner" +_exportOrImport: + allNotes: "Všetky poznámky" + followingList: "Sledujete" + muteList: "Vypnúť zvuk" + blockingList: "Zablokovať" + userLists: "Zoznamy" + excludeMutingUsers: "Vylúčiť stíšených používateľov" + excludeInactiveUsers: "Vylúčiť neaktívnych používateľov" +_charts: + federation: "Federácia" + apRequest: "Žiadosti" + usersIncDec: "Rozdiel v počte používateľov" + usersTotal: "Celkový počet používateľov" + activeUsers: "Aktívni používatelia" + notesIncDec: "Rozdiel v počte poznámok" + localNotesIncDec: "Rozdiel v počte lokálnych poznámok" + remoteNotesIncDec: "Rozdiel v počte vzdialených poznámok" + notesTotal: "Celkový počet poznámok" + filesIncDec: "Rozdiel v počte súborov" + filesTotal: "Celkový počet súborov" + storageUsageIncDec: "Rozdiel využitého úložiska" + storageUsageTotal: "Celkové využité úložisko" +_instanceCharts: + requests: "Žiadosti" + users: "Rozdiel v počte používateľov" + usersTotal: "Celkom spolu počet používateľov" + notes: "Rozdiel v počte poznámok" + notesTotal: "Celkom spolu počet poznámok" + ff: "Rozdiel v počte sledovaných/sledujúcich" + ffTotal: "Celkom spolu počet sledovaných / sledujúcich" + cacheSize: "Rozdiel vo veľkosti cache" + cacheSizeTotal: "Celkom spolu veľkosť cache" + files: "Rozdiel v počte súborov" + filesTotal: "Celkom spolu počet súborov" +_timelines: + home: "Domov" + local: "Lokálne" + social: "Sociálne" + global: "Globálne" +_pages: + newPage: "Vytvoriť novú stránku" + editPage: "Upraviť túto stránku" + readPage: "Zobrazenie zdroja aktívne" + created: "Stránka úspešne vytvorená" + updated: "Stránka úspešne upravená" + deleted: "Stránka úspešne odstránená" + pageSetting: "Nastavenia stránky" + nameAlreadyExists: "Zadaná URL stránku už existuje" + invalidNameTitle: "Zadaná URL stránku je nesprávna" + invalidNameText: "Uistite sa, že nadpis stránky nie je prázdny" + editThisPage: "Upraviť túto stránku" + viewSource: "Ukázať zdroj" + viewPage: "Ukázať vaše stránky" + like: "Páči sa mi" + unlike: "Nepáči sa mi" + my: "Moje stránky" + liked: "Obľúbené stránky" + featured: "Význačné" + inspector: "Inšpektor" + contents: "Obsah" + content: "Blok stránky" + variables: "Premenné" + title: "Nadpis" + url: "URL stránky" + summary: "Zhrnutie stránky" + alignCenter: "Vystrediť prvky" + hideTitleWhenPinned: "Skryť nadpis stránky keď je pripnutá na profil" + font: "Písmo" + fontSerif: "Pätkové" + fontSansSerif: "Bezpätkové" + eyeCatchingImageSet: "Nastaviť miniatúru" + eyeCatchingImageRemove: "Odstrániť miniatúru" + chooseBlock: "Pridať blok" + selectType: "Vyberte typ" + enterVariableName: "Zadajte meno premennej" + variableNameIsAlreadyUsed: "Meno premennej s už používa" + contentBlocks: "Obsah" + inputBlocks: "Vstup" + specialBlocks: "Špeciálne" + blocks: + text: "Text" + textarea: "Textové pole" + section: "Sekcia" + image: "Obrázky" + button: "Tlačidlo" + if: "Ak" + _if: + variable: "Premenné" + post: "Napísať poznámku" + _post: + text: "Obsah" + attachCanvasImage: "Príspevok s obrázkom na plátne" + canvasId: "ID plátna" + textInput: "Textový vstup" + _textInput: + name: "Meno premennej" + text: "Nadpis" + default: "Predvolená hodnota" + textareaInput: "Viacriadkový textový vstup" + _textareaInput: + name: "Meno premennej" + text: "Nadpis" + default: "Predvolená hodnota" + numberInput: "Číselný vstup" + _numberInput: + name: "Meno premennej" + text: "Nadpis" + default: "Predvolená hodnota" + canvas: "Plátno" + _canvas: + id: "ID plátna" + width: "Šírka" + height: "Výška" + note: "Vložená poznámka" + _note: + id: "ID poznámky" + idDescription: "Alebo môžete vložiť URL poznámky sem" + detailed: "Podrobný pohľad" + switch: "Prepnúť" + _switch: + name: "Meno premennej" + text: "Nadpis" + default: "Predvolená hodnota" + counter: "Počítadlo" + _counter: + name: "Meno premennej" + text: "Nadpis" + inc: "Pripočítať" + _button: + text: "Nadpis" + colored: "Farebné" + action: "Operácia po stlačení tlačidla" + _action: + dialog: "Zobraziť dialóg" + _dialog: + content: "Obsah" + resetRandom: "Resetovať zdroj náhodnosti" + pushEvent: "Poslať udalosť" + _pushEvent: + event: "Názov udalosti" + message: "Zobrazená správa po aktivácii" + variable: "Odoslaná premenná" + no-variable: "Žiadne" + callAiScript: "Spustiť AiScript" + _callAiScript: + functionName: "Názov funkcie" + radioButton: "Možnosť" + _radioButton: + name: "Meno premennej" + title: "Nadpis" + values: "Zoznam možností oddelené novými riadkami" + default: "Predvolená hodnota" + script: + categories: + flow: "Riadenie behu" + logical: "Logická operácia" + operation: "Výpočet" + comparison: "Porovnanie" + random: "Náhodné" + value: "Hodnoty" + fn: "Funkcie" + text: "Textové operácie" + convert: "Transformácie" + list: "Zoznamy" + blocks: + text: "Text" + multiLineText: "Text (viacriadkový)" + textList: "Zoznam textov" + _textList: + info: "Oddeľte každú položku novým riadkom" + strLen: "Dĺžka textu" + _strLen: + arg1: "Text" + strPick: "Vybrať znak" + _strPick: + arg1: "Text" + arg2: "Pozícia znaku" + strReplace: "Náhradný text" + _strReplace: + arg1: "Text" + arg2: "Nahradený text" + arg3: "Nahradiť s" + strReverse: "Otočiť text" + _strReverse: + arg1: "Text" + join: "Spojiť texty" + _join: + arg1: "Zoznamy" + arg2: "Oddeľovač" + add: "Pridať" + _add: + arg1: "A" + arg2: "B" + subtract: "Odčítať" + _subtract: + arg1: "A" + arg2: "B" + multiply: "Násobiť" + _multiply: + arg1: "A" + arg2: "B" + divide: "Deliť" + _divide: + arg1: "A" + arg2: "B" + mod: "Zvyšok po delení" + _mod: + arg1: "A" + arg2: "B" + round: "Zaokrúhliť" + _round: + arg1: "Číslo" + eq: "A a B sa rovnajú" + _eq: + arg1: "A" + arg2: "B" + notEq: "A a B sa nerovnajú" + _notEq: + arg1: "A" + arg2: "B" + and: "A a zároveň B" + _and: + arg1: "A" + arg2: "B" + or: "A alebo B" + _or: + arg1: "A" + arg2: "B" + lt: "< A je menšie ako B" + _lt: + arg1: "A" + arg2: "B" + gt: "> A je väčšie ako B" + _gt: + arg1: "A" + arg2: "B" + ltEq: "<= A je menšie alebo rovné B" + _ltEq: + arg1: "A" + arg2: "B" + gtEq: ">= A je väčšie alebo rovné B" + _gtEq: + arg1: "A" + arg2: "B" + if: "Vetva" + _if: + arg1: "Ak" + arg2: "Potom" + arg3: "Inak" + not: "Opak" + _not: + arg1: "Opak" + random: "Náhodné" + _random: + arg1: "Pravdepodobnosť" + rannum: "Náhodné číslo" + _rannum: + arg1: "Minimálna hodnota" + arg2: "Maximálna hodnota" + randomPick: "Náhodný výber zo zoznamu" + _randomPick: + arg1: "Zoznam" + dailyRandom: "Náhodne (zmení sa raz denne pre každého používateľa)" + _dailyRandom: + arg1: "Pravdepodobnosť" + dailyRannum: "Náhodné číslo (Mení sa denne pre každého používateľa)" + _dailyRannum: + arg1: "Minimálna hodnota" + arg2: "Maximálna hodnota" + dailyRandomPick: "Náhodný výber zo zoznamu (Mení sa denne pre každého používateľa)" + _dailyRandomPick: + arg1: "Zoznam" + seedRandom: "Náhodne (so seedom)" + _seedRandom: + arg1: "Seed" + arg2: "Pravdepodobnosť" + seedRannum: "Náhodné číslo (so seedom)" + _seedRannum: + arg1: "Seed" + arg2: "Minimálna hodnota" + arg3: "Maximálna hodnota" + seedRandomPick: "Náhodný výber zo zoznamu (so seedom)" + _seedRandomPick: + arg1: "Seed" + arg2: "Zoznam" + DRPWPM: "Náhodný výber z váženého zoznamu (Mení sa denne pre každého používateľa)" + _DRPWPM: + arg1: "Zoznam textov" + pick: "Vybrať zo zoznamu" + _pick: + arg1: "Zoznam" + arg2: "Pozícia" + listLen: "Získať dĺžku zoznamu" + _listLen: + arg1: "Zoznam" + number: "Číslo" + stringToNumber: "Text na číslo" + _stringToNumber: + arg1: "Text" + numberToString: "Číslo na text" + _numberToString: + arg1: "Číslo" + splitStrByLine: "Rozdelí text po riadkoch" + _splitStrByLine: + arg1: "Text" + ref: "Premenné" + aiScriptVar: "AiScript premenná" + fn: "Funkcie" + _fn: + slots: "Sloty" + slots-info: "Oddeľte každý slot novým riadkom" + arg1: "Výstup" + for: "For cyklus" + _for: + arg1: "Počet opakovaní" + arg2: "Akcia" + typeError: "Slot {slot} akceptuje hodnoty typu \"{expect}\", ale dodaná hodnota je typu \"{actual}\"!" + thereIsEmptySlot: "Slot {slot} je prázdny!" + types: + string: "Text" + number: "Číslo" + boolean: "Boolean" + array: "Zoznamy" + stringArray: "Zoznam textov" + emptySlot: "Prázdny slot" + enviromentVariables: "Premenné prostredia" + pageVariables: "Premenné stránky" + argVariables: "Vstupné sloty" +_relayStatus: + requesting: "Čaká sa" + accepted: "Akceptované" + rejected: "Odmietnuté" +_notification: + fileUploaded: "Súbor sa úspešne nahral" + youGotMention: "{name} vás spomenul/a" + youGotReply: "{name} vám odpovedal/a" + youGotQuote: "{name} vás citoval/a" + youRenoted: "{name} preposlal/a vašu poznámku" + youGotPoll: "{name} hlasoval/a" + youGotMessagingMessageFromUser: "{name} vám poslal/a správu" + youGotMessagingMessageFromGroup: "Prišla správa do skupiny {name}" + youWereFollowed: "Máte nového sledujúceho" + youReceivedFollowRequest: "Dostali ste žiadosť o sledovanie" + yourFollowRequestAccepted: "Vaša žiadosť o sledovanie bola prijatá" + youWereInvitedToGroup: "Pozvať do skupiny" + pollEnded: "Výsledky hlasovania sú k dispozícii." + emptyPushNotificationMessage: "Push notifikácie aktualizované" + _types: + all: "Všetky" + follow: "Sledujete" + mention: "Zmienka" + reply: "Odpovede" + renote: "Preposlať" + quote: "Citovať" + reaction: "Reakcie" + pollVote: "Hlasy v hlasovaniach" + pollEnded: "Hlasovanie skončilo" + receiveFollowRequest: "Doručené žiadosti o sledovanie" + followRequestAccepted: "Schválené žiadosti o sledovanie" + groupInvited: "Pozvánky do skupín" + app: "Oznámenia z prepojených aplikácií" + _actions: + followBack: "Sledovať späť\n" + reply: "Odpovedať" + renote: "Preposlať" +_deck: + alwaysShowMainColumn: "Vždy zobraziť v hlavnom stĺpci" + columnAlign: "Zarovnať stĺpce" + addColumn: "Pridať stĺpec" + configureColumn: "Nastavenie stĺpcov" + swapLeft: "Vymeniť vľavo" + swapRight: "Vymeniť vpravo" + swapUp: "Vymeniť hore" + swapDown: "Vymeniť s nasledujúcim" + stackLeft: "Priložiť do ľavého stĺpca" + popRight: "Vybrať napravo" + profile: "Profil" + newProfile: "Nový profil" + deleteProfile: "Odstrániť profil" + introduction: "Kombinujte stĺpce a vytvorte si svoje vlastné rozhranie!" + introduction2: "Stlačením tlačidla + v pravej časti obrazovky môžete kedykoľvek pridať stĺpce." + widgetsIntroduction: "V ponuke stĺpca vyberte možnosť \"Upraviť widget\" a pridajte widget" + _columns: + main: "Hlavný" + widgets: "Widgety" + notifications: "Oznámenia" + tl: "Časová os" + antenna: "Antény" + list: "Zoznam" + mentions: "Zmienky" + direct: "Priame poznámky" diff --git a/fe_calckey/frontend/locales/sv-SE.yml b/fe_calckey/frontend/locales/sv-SE.yml new file mode 100644 index 0000000..6523ce0 --- /dev/null +++ b/fe_calckey/frontend/locales/sv-SE.yml @@ -0,0 +1,320 @@ +--- +_lang_: "Svenska" +headlineMisskey: "Ett nätverk kopplat av noter" +introMisskey: "Välkommen! Calckey är en öppen och decentraliserad mikrobloggningstjänst.\nSkapa en \"not\" och dela dina tankar med alla runtomkring dig. 📡\nMed \"reaktioner\" kan du snabbt uttrycka dina känslor kring andras noter.👍\nLåt oss utforska en nya värld!🚀" +monthAndDay: "{day}/{month}" +search: "Sök" +notifications: "Notifikationer" +username: "Användarnamn" +password: "Lösenord" +forgotPassword: "Glömt lösenord" +fetchingAsApObject: "Hämtar från Fediversum" +ok: "OK" +gotIt: "Uppfattat!" +cancel: "Avbryt" +enterUsername: "Ange användarnamn" +renotedBy: "Omnoterad av {user}" +noNotes: "Inga noteringar" +noNotifications: "Inga aviseringar" +instance: "Instanser" +settings: "Inställningar" +basicSettings: "Basinställningar" +otherSettings: "Andra inställningar" +openInWindow: "Öppna i ett fönster" +profile: "Profil" +timeline: "Tidslinje" +noAccountDescription: "Användaren har inte skrivit en biografi än." +login: "Logga in" +loggingIn: "Loggar in" +logout: "Logga ut" +signup: "Registrera" +uploading: "Uppladdning sker..." +save: "Spara" +users: "Användare" +addUser: "Lägg till användare" +favorite: "Lägg till i favoriter" +favorites: "Favoriter" +unfavorite: "Avfavorisera" +favorited: "Tillagd i favoriter." +alreadyFavorited: "Redan tillagd i favoriter." +cantFavorite: "Gick inte att lägga till i favoriter." +pin: "Fäst till profil" +unpin: "Lossa från profil" +copyContent: "Kopiera innehåll" +copyLink: "Kopiera länk" +delete: "Radera" +deleteAndEdit: "Radera och ändra" +deleteAndEditConfirm: "Är du säker att du vill radera denna not och ändra den? Du kommer förlora alla reaktioner, omnoteringar och svar till den." +addToList: "Lägg till i lista" +sendMessage: "Skicka ett meddelande" +copyUsername: "Kopiera användarnamn" +searchUser: "Sök användare" +reply: "Svara" +loadMore: "Ladda mer" +showMore: "Visa mer" +youGotNewFollower: "följde dig" +receiveFollowRequest: "Följarförfrågan mottagen" +followRequestAccepted: "Följarförfrågan accepterad" +mention: "Nämn" +mentions: "Omnämningar" +directNotes: "Direktnoter" +importAndExport: "Importera / Exportera" +import: "Importera" +export: "Exportera" +files: "Filer" +download: "Nedladdning" +driveFileDeleteConfirm: "Är du säker att du vill radera filen \"{name}\"? Noter med denna fil bifogad kommer också raderas." +unfollowConfirm: "Är du säker att du vill avfölja {name}?" +exportRequested: "Du har begärt en export. Detta kan ta lite tid. Den kommer läggas till i din Drive när den blir klar." +importRequested: "Du har begärt en import. Detta kan ta lite tid." +lists: "Listor" +noLists: "Du har inga listor" +note: "Not" +notes: "Noter" +following: "Följer" +followers: "Följare" +followsYou: "Följer dig" +createList: "Skapa lista" +manageLists: "Hantera lista" +error: "Fel!" +somethingHappened: "Ett fel har uppstått" +retry: "Försök igen" +pageLoadError: "Det gick inte att ladda sidan." +pageLoadErrorDescription: "Detta händer oftast p.g.a. nätverksfel eller din webbläsarcache. Försök tömma din cache och testa sedan igen efter en liten stund." +serverIsDead: "Servern svarar inte. Vänta ett litet tag och försök igen." +youShouldUpgradeClient: "För att kunna se denna sida, vänligen ladda om sidan för att uppdatera din klient." +enterListName: "Skriv ett namn till listan" +privacy: "Integritet" +makeFollowManuallyApprove: "Följarförfrågningar kräver manuellt godkännande" +defaultNoteVisibility: "Standardsynlighet" +follow: "Följ" +followRequest: "Skicka följarförfrågan" +followRequests: "Följarförfrågningar" +unfollow: "Avfölj" +followRequestPending: "Följarförfrågning avvaktar för svar" +enterEmoji: "Skriv en emoji" +renote: "Omnotera" +unrenote: "Ta tillbaka omnotering" +renoted: "Omnoterad." +cantRenote: "Inlägget kunde inte bli omnoterat." +cantReRenote: "En omnotering kan inte bli omnoterad." +quote: "Citat" +pinnedNote: "Fästad not" +pinned: "Fäst till profil" +you: "Du" +clickToShow: "Klicka för att visa" +sensitive: "Känsligt innehåll" +add: "Lägg till" +reaction: "Reaktioner" +reactionSetting: "Reaktioner som ska visas i reaktionsväljaren" +reactionSettingDescription2: "Dra för att omordna, klicka för att radera, tryck \"+\" för att lägga till." +rememberNoteVisibility: "Komihåg notvisningsinställningar" +attachCancel: "Ta bort bilaga" +markAsSensitive: "Markera som känsligt innehåll" +unmarkAsSensitive: "Avmarkera som känsligt innehåll" +enterFileName: "Ange filnamn" +mute: "Tysta" +unmute: "Avtysta" +block: "Blockera" +unblock: "Avblockera" +suspend: "Suspendera" +unsuspend: "Ta bort suspenderingen" +blockConfirm: "Är du säker att du vill blockera kontot?" +unblockConfirm: "Är du säkert att du vill avblockera kontot?" +suspendConfirm: "Är du säker att du vill suspendera detta konto?" +unsuspendConfirm: "Är du säker att du vill avsuspendera detta konto?" +selectList: "Välj lista" +selectAntenna: "Välj en antenn" +selectWidget: "Välj en widget" +editWidgets: "Redigera widgets" +editWidgetsExit: "Avsluta redigering" +customEmojis: "Anpassa emoji" +emoji: "Emoji" +emojis: "Emoji" +emojiName: "Emoji namn" +emojiUrl: "Emoji länk" +addEmoji: "Lägg till emoji" +settingGuide: "Rekommenderade inställningar" +cacheRemoteFiles: "Spara externa filer till cachen" +cacheRemoteFilesDescription: "När denna inställning är avstängd kommer externa filer laddas direkt från den externa instansen. Genom att stänga av detta kommer lagringsutrymme minska i användning men kommer öka datatrafiken eftersom miniatyrer inte kommer genereras." +flagAsBot: "Markera konto som bot" +flagAsBotDescription: "Aktivera det här alternativet om kontot är kontrollerat av ett program. Om aktiverat kommer den fungera som en flagga för andra utvecklare för att hindra ändlösa kedjor med andra bottar. Det kommer också få Misskeys interna system att hantera kontot som en bot." +flagAsCat: "Markera konto som katt" +flagAsCatDescription: "Aktivera denna inställning för att markera kontot som en katt." +flagShowTimelineReplies: "Visa svar i tidslinje" +flagShowTimelineRepliesDescription: "Visar användarsvar till andra användares noter i tidslinjen om påslagen." +autoAcceptFollowed: "Godkänn följarförfrågningar från användare du följer automatiskt" +addAccount: "Lägg till konto" +loginFailed: "Inloggningen misslyckades" +showOnRemote: "Se på extern instans" +general: "Allmänt" +wallpaper: "Bakgrundsbild" +setWallpaper: "Välj bakgrund" +removeWallpaper: "Ta bort bakgrund" +searchWith: "Sök: {q}" +youHaveNoLists: "Du har inga listor" +followConfirm: "Är du säker att du vill följa {name}?" +proxyAccount: "Proxykonto" +proxyAccountDescription: "Ett proxykonto är ett konto som agerar som en extern följare för användare under vissa villkor. Till exempel, när en användare lägger till en extern användare till en lista så kommer den externa användarens aktivitet inte levireras till instansen om ingen lokal användare följer det kontot, så proxykontot används istället." +host: "Värd" +selectUser: "Välj användare" +recipient: "Mottagare" +annotation: "Kommentarer" +federation: "Federation" +instances: "Instanser" +registeredAt: "Registrerad på" +latestRequestSentAt: "Senaste förfrågan skickad" +latestRequestReceivedAt: "Senaste begäran mottagen" +latestStatus: "Senaste status" +storageUsage: "Använt lagringsutrymme" +charts: "Diagram" +perHour: "Per timme" +perDay: "Per dag" +stopActivityDelivery: "Sluta skicka aktiviteter" +blockThisInstance: "Blockera instans" +operations: "Operationer" +software: "Mjukvara" +version: "Version" +metadata: "Metadata" +monitor: "Övervakning" +jobQueue: "Jobbkö" +cpuAndMemory: "CPU och minne" +network: "Nätverk" +disk: "Disk" +instanceInfo: "Instansinformation" +statistics: "Statistik" +clearQueue: "Rensa kö" +clearQueueConfirmTitle: "Är du säker att du vill rensa kön?" +clearQueueConfirmText: "Om någon not är olevererad i kön kommer den inte federeras. Vanligtvis behövs inte denna handling." +clearCachedFiles: "Rensa cache" +clearCachedFilesConfirm: "Är du säker att du vill radera alla cachade externa filer?" +blockedInstances: "Blockerade instanser" +blockedInstancesDescription: "Lista adressnamn av instanser som du vill blockera. Listade instanser kommer inte längre kommunicera med denna instans." +muteAndBlock: "Tystningar och blockeringar" +mutedUsers: "Tystade användare" +blockedUsers: "Blockerade användare" +noUsers: "Det finns inga användare" +editProfile: "Redigera profil" +noteDeleteConfirm: "Är du säker på att du vill ta bort denna not?" +pinLimitExceeded: "Du kan inte fästa fler noter" +intro: "Calckey har installerats! Vänligen skapa en adminanvändare." +done: "Klar" +processing: "Bearbetar..." +preview: "Förhandsvisning" +default: "Standard" +defaultValueIs: "Standard: {value}" +noCustomEmojis: "Det finns ingen emoji" +noJobs: "Det finns inga jobb" +federating: "Federerar" +blocked: "Blockerad" +suspended: "Suspenderad" +all: "Allt" +subscribing: "Prenumererar" +publishing: "Publiceras" +notResponding: "Svarar inte" +instanceFollowing: "Följer på instans" +instanceFollowers: "Följare av instans" +instanceUsers: "Användare av denna instans" +changePassword: "Ändra lösenord" +security: "Säkerhet" +retypedNotMatch: "Inmatningen matchar inte" +currentPassword: "Nuvarande lösenord" +newPassword: "Nytt lösenord" +newPasswordRetype: "Bekräfta lösenord" +attachFile: "Bifoga filer" +more: "Mer!" +featured: "Utvalda" +usernameOrUserId: "Användarnamn eller användar-id" +noSuchUser: "Kan inte hitta användaren" +lookup: "Sökning" +announcements: "Nyheter" +imageUrl: "Bild-URL" +remove: "Radera" +removed: "Borttaget" +removeAreYouSure: "Är du säker att du vill radera \"{x}\"?" +deleteAreYouSure: "Är du säker att du vill radera \"{x}\"?" +resetAreYouSure: "Vill du återställa?" +saved: "Sparad" +messaging: "Chatt" +upload: "Ladda upp" +keepOriginalUploading: "Behåll originalbild" +nsfw: "Känsligt innehåll" +pinnedNotes: "Fästad not" +userList: "Listor" +smtpHost: "Värd" +smtpUser: "Användarnamn" +smtpPass: "Lösenord" +clearCache: "Rensa cache" +user: "Användare" +searchByGoogle: "Sök" +file: "Filer" +_email: + _follow: + title: "följde dig" +_mfm: + mention: "Nämn" + quote: "Citat" + emoji: "Anpassa emoji" + search: "Sök" +_theme: + keys: + mention: "Nämn" + renote: "Omnotera" +_sfx: + note: "Noter" + notification: "Notifikationer" + chat: "Chatt" +_widgets: + notifications: "Notifikationer" + timeline: "Tidslinje" + federation: "Federation" + jobQueue: "Jobbkö" +_cw: + show: "Ladda mer" +_visibility: + followers: "Följare" +_profile: + username: "Användarnamn" +_exportOrImport: + followingList: "Följer" + muteList: "Tysta" + blockingList: "Blockera" + userLists: "Listor" +_charts: + federation: "Federation" +_pages: + script: + categories: + list: "Listor" + blocks: + _join: + arg1: "Listor" + _randomPick: + arg1: "Listor" + _dailyRandomPick: + arg1: "Listor" + _seedRandomPick: + arg2: "Listor" + _pick: + arg1: "Listor" + _listLen: + arg1: "Listor" + types: + array: "Listor" +_notification: + youWereFollowed: "följde dig" + _types: + follow: "Följer" + mention: "Nämn" + renote: "Omnotera" + quote: "Citat" + reaction: "Reaktioner" + _actions: + reply: "Svara" + renote: "Omnotera" +_deck: + _columns: + notifications: "Notifikationer" + tl: "Tidslinje" + list: "Listor" + mentions: "Omnämningar" diff --git a/fe_calckey/frontend/locales/th-TH.yml b/fe_calckey/frontend/locales/th-TH.yml new file mode 100644 index 0000000..9666737 --- /dev/null +++ b/fe_calckey/frontend/locales/th-TH.yml @@ -0,0 +1,1193 @@ +--- +_lang_: "ภาษาไทย" +headlineMisskey: "เชื่อมต่อเครือข่ายโดยโน้ต" +introMisskey: "ยินดีต้อนรับจ้าาา! Calckey เป็นบริการไมโครบล็อกโอเพ่นซอร์ส แบบการกระจายอำนาจ\nสร้าง \"โน้ต\" เพื่อแบ่งปันความคิดของคุณกับทุกคนรอบตัวคุณกันเถอะ 📡\nด้วยการ \"รีแอคชั่นผู้คน\" คุณยังสามารถแสดงความรู้สึกของคุณเกี่ยวกับบันทึกของทุกคนได้อย่างรวดเร็ว 👍\n\nแล้วมาท่องสำรวจโลกใบใหม่กันเถอะ! 🚀" +monthAndDay: "{เดือน}/{วัน}" +search: "ค้นหา" +notifications: "การเเจ้งเตือน" +username: "ชื่อผู้ใช้" +password: "รหัสผ่าน" +forgotPassword: "ลืมรหัสผ่าน?" +fetchingAsApObject: "กำลังดึงข้อมูล จาก เฟดิเวิร์ส" +ok: "ตกลง" +gotIt: "เข้าใจแล้ว !" +cancel: "ยกเลิก" +enterUsername: "ใส่ชื่อผู้ใช้" +renotedBy: "รีโน้ตโดย {ผู้ใช้}" +noNotes: "ไม่มีโน้ต" +noNotifications: "ไม่มีการแจ้งเตือน" +instance: "ตัวอย่าง" +settings: "การตั้งค่า" +basicSettings: "การตั้งค่าพื้นฐาน" +otherSettings: "การตั้งค่าอื่นๆ" +openInWindow: "เปิดในหน้าต่าง" +profile: "โปรไฟล์" +timeline: "ไทม์ไลน์" +noAccountDescription: "ผู้ใช้รายนี้ยังไม่ได้เขียนลงประวัติของพวกเขา" +login: "เข้าสู่ระบบ" +loggingIn: "กำลังเข้าสู่ระบบ" +logout: "ออกจากระบบ" +signup: "สร้างบัญชีผู้ใช้" +uploading: "กำลังอัพโหลด..." +save: "บันทึก" +users: "ผู้ใช้งาน" +addUser: "เพิ่มผู้ใช้" +favorite: "รายการโปรด" +favorites: "รายการโปรด" +unfavorite: "ลบออกจากรายการโปรด" +favorited: "เพิ่มแล้วในรายการโปรด" +alreadyFavorited: "เพิ่มในรายการโปรดอยู่แล้ว" +cantFavorite: "ไม่สามารถเพิ่มในรายการโปรดได้" +pin: "ปักหมุดไปยังโปรไฟล์" +unpin: "เลิกปักหมุดจากโปรไฟล์" +copyContent: "คัดลอกเนื้อหา" +copyLink: "คัดลอกลิงก์" +delete: "ลบ" +deleteAndEdit: "ลบและแก้ไข" +deleteAndEditConfirm: "นายแน่ใจแล้วเหรอ? ว่าต้องการลบโน้ตนี้และแก้ไข คุณอาจจะสูญเสียการโต้ตอบ, โน้ต, และการตอบกลับทั้งหมดได้นะ" +addToList: "เพิ่มในลิสต์" +sendMessage: "ส่งข้อความ" +copyUsername: "คัดลอกชื่อผู้ใช้" +searchUser: "ค้นหาผู้ใช้งาน" +reply: "ตอบกลับ" +loadMore: "โหลดเพิ่มเติม" +showMore: "แสดงเพิ่มเติม" +showLess: "ปิด" +youGotNewFollower: "ได้ติดตามคุณ" +receiveFollowRequest: "คำขอผู้ติดตามที่ได้รับ" +followRequestAccepted: "ผู้ติดตามได้ตอบรับคำขอร้องของคุณแล้ว" +mention: "กล่าวถึง" +mentions: "พูดถึง" +directNotes: "ไดเร็คโน้ต" +importAndExport: "นำเข้า / ส่งออก" +import: "การนำเข้า" +export: "การนำออก" +files: "ไฟล์" +download: "ดาวน์โหลด" +driveFileDeleteConfirm: "นายแน่ใจแล้วหรอ? ว่าต้องการลบไฟล์ \"{name}\" โน้ตย่อที่แนบมากับไฟล์นี้ก็จะถูกลบด้วยนะ" +unfollowConfirm: "นายแน่ใจแล้วหรอว่าต้องการเลิกติดตาม {name}?" +exportRequested: "เมื่อคุณได้ร้องขอการส่งออก อาจจะต้องใช้เวลาสักครู่ และจะถูกเพิ่มในไดรฟ์ของคุณเมื่อเสร็จสิ้นแล้ว" +importRequested: "เมื่อคุณได้ร้องขอการนำเข้า อาจจะต้องใช้เวลาสักครู่นะ" +lists: "รายการ" +noLists: "คุณไม่มีลิสต์ใดๆนะ" +note: "ตัวโน้ต" +notes: "หมายเหตุ" +following: "กำลังติดตาม" +followers: "ผู้ติดตาม" +followsYou: "ติดตามคุณ" +createList: "สร้างลิสต์" +manageLists: "จัดการลิสต์" +error: "ผิดพลาด!" +somethingHappened: "อุ๊ย ! มีอะไรบางอย่างผิดพลาด" +retry: "ลองใหม่อีกครั้ง" +pageLoadError: "เกิดข้อผิดพลาดในการโหลดหน้านี้" +pageLoadErrorDescription: "โดยปกติแล้วมักจะเกิดจากข้อผิดพลาดของเครือข่ายหรือแคชของเบราว์เซอร์ ลองล้างแคชแล้วลองใหม่อีกครั้งหลังจากรอสักครู่ " +serverIsDead: "เซิร์ฟเวอร์นี้ไม่มีการตอบสนอง ได้โปรดกรุณารอสักครู่แล้วลองใหม่อีกครั้งนะ" +youShouldUpgradeClient: "หากต้องการดูหน้านี้ได้โปรดกรุณา รีเซ็ตเพื่ออัปเดตไคลเอ็นต์ของคุณนะ" +enterListName: "ใส่ชื่อสำหรับรายการลิสต์" +privacy: "ความเป็นส่วนตัว" +makeFollowManuallyApprove: "ติดตามคำขอที่ต้องได้รับการอนุมัติ" +defaultNoteVisibility: "การมองเห็นที่เป็นค่าเริ่มต้น" +follow: "กำลังติดตาม" +followRequest: "ส่งคำขอติดตาม" +followRequests: "ติดตามการร้องขอ" +unfollow: "เลิกติดตาม" +followRequestPending: "กำลังรอดำเนินการร้องขอติดตาม" +enterEmoji: "ใส่อีโมจิ" +renote: "รีโน้ต" +unrenote: "เลิกรีโน้ต" +renoted: "รีโน้ตเอาไว้" +cantRenote: "โพสต์นี้ไม่สามารถรีโน้ตไว้ใหม่ได้นะ" +cantReRenote: "ไม่สามารถรีโน้ตเอาไว้ใหม่ได้นะ" +quote: "อ้างคำพูด" +pinnedNote: "โน้ตที่ปักหมุดเอาไว้" +pinned: "ปักหมุดไปยังโปรไฟล์" +you: "ตัวเอง" +clickToShow: "คลิกเพื่อแสดง" +sensitive: "เนื้อหาที่ละเอียดอ่อน NSFW" +add: "เพิ่ม" +reaction: "รีแอคชั่น" +reactionSetting: "รีแอคชั่นไปยังแสดงผลในตัวเลือกการรีแอคชั่น" +reactionSettingDescription2: "กดลากเพื่อจัดลำดับใหม่ กดคลิกเพื่อลบ กด \"+\" เพื่อเพิ่ม" +rememberNoteVisibility: "จดจำการตั้งค่าการมองเห็นตัวโน้ต" +attachCancel: "ลบไฟล์ออกที่แนบมา" +markAsSensitive: "ทำเครื่องหมายว่าละเอียดอ่อน" +unmarkAsSensitive: "ยกเลิกทำเครื่องหมายเป็น NSFW" +enterFileName: "พิมพ์ชื่อไฟล์" +mute: "ปิดเสียง" +unmute: "ไม่ปิดเสียง" +block: "บล็อค" +unblock: "เลิกปิดกั้น" +suspend: "ถูกระงับ" +unsuspend: "ยกเลิกระงับ" +blockConfirm: "คุณแน่ใจแล้วเหรอ? ว่าต้องการบล็อกบัญชีนี้" +unblockConfirm: "คุณแน่ใจแล้วเหรอ? ว่าต้องการปลดบล็อคบัญชีนี้" +suspendConfirm: "นายแน่ใจแล้วเหรอว่าต้องการระงับบัญชีนี้อ่ะ?" +unsuspendConfirm: "นายแน่ใจแล้วหรอ? ว่าต้องการยกเลิกการระงับบัญชีนี้" +selectList: "เลือกรายการ (Automatic Translation)" +selectAntenna: "เลือกเสาอากาศ" +selectWidget: "เลือกวิดเจ็ต" +editWidgets: "แก้ไขวิดเจ็ต" +editWidgetsExit: "เรียบร้อย" +customEmojis: "กำหนดอีโมจิเอง" +emoji: "อีโมจิ" +emojis: "อีโมจิ" +emojiName: "ชื่ออิโมจิ" +emojiUrl: "อิโมจิ URL" +addEmoji: "แทรกอีโมจิ" +settingGuide: "การตั้งค่าที่แนะนำ" +cacheRemoteFiles: "แคชไฟล์ระยะไกล" +cacheRemoteFilesDescription: "เมื่อปิดใช้งานการตั้งค่านี้ ไฟล์ระยะไกลนั้นจะถูกโหลดโดยตรงจากอินสแตนซ์ระยะไกล แต่กรณีการปิดใช้งานนี้จะช่วยลดปริมาณการใช้พื้นที่จัดเก็บข้อมูล แต่เพิ่มปริมาณการใช้งาน เพราะเนื่องจากจะไม่มีการสร้างภาพขนาดย่อ" +flagAsBot: "ทำเครื่องหมายบอกว่าบัญชีนี้เป็นบอท" +flagAsBotDescription: "การเปิดใช้งานตัวเลือกนี้หากบัญชีนี้ถูกควบคุมโดยนักเขียนโปรแกรม หรือ ถ้าหากเปิดใช้งาน มันจะทำหน้าที่เป็นแฟล็กสำหรับนักพัฒนารายอื่นๆ และเพื่อป้องกันการโต้ตอบแบบไม่มีที่สิ้นสุดกับบอทตัวอื่นๆ และยังสามารถปรับเปลี่ยนระบบภายในของ Calckey เพื่อปฏิบัติต่อบัญชีนี้เป็นบอท" +flagAsCat: "ทำเครื่องหมายบอกว่าบัญชีนี้เป็นแมว" +flagAsCatDescription: "การเปิดใช้งานตัวเลือกนี้เพื่อทำเครื่องหมายบอกว่าบัญชีนี้เป็นแมว" +flagShowTimelineReplies: "แสดงตอบกลับ ในไทม์ไลน์" +flagShowTimelineRepliesDescription: "แสดงการตอบกลับของผู้ใช้งานไปยังโน้ตของผู้ใช้งานรายอื่นๆในไทม์ไลน์หากได้เปิดเอาไว้" +autoAcceptFollowed: "อนุมัติคำขอติดตามโดยอัตโนมัติทันที จากผู้ใช้งานที่คุณกำลังติดตาม" +addAccount: "เพิ่มบัญชี" +loginFailed: "การเข้าสู่ระบบไม่สำเร็จ" +showOnRemote: "ดูบนอินสแตนซ์ระยะไกล" +general: "ทั่วไป" +wallpaper: "วอลล์เปเปอร์" +setWallpaper: "ตั้งวอลเปเปอร์" +removeWallpaper: "นำวอลเปเปอร์ออก" +searchWith: "ค้นหา: {q}" +youHaveNoLists: "รายการนี้ว่างเปล่า" +followConfirm: "คุณแน่ใจแล้วหรอว่าต้องการที่จะติดตาม {name}?" +proxyAccount: "บัญชี พร็อกซี่" +proxyAccountDescription: "บัญชีพร็อกซี่ คือ บัญชีที่จะทำหน้าที่เป็นผู้ติดตามระยะไกลสำหรับผู้ใช้งานที่อยู่ภายใต้ด้วยเงื่อนไขบางอย่าง ยกตัวอย่าง เช่น เมื่อมีผู้ใช้งานนั้นได้เพิ่มผู้ใช้งานจากระยะไกลลงในรายการ แต่กิจกรรมของผู้ใช้ในระยะไกลนั้นจะไม่ถูกส่งไปยังอินสแตนซ์หากไม่มีผู้ใช้งานในพื้นที่ติดตามผู้ใช้รายนั้น ดังนั้นบัญชีพร็อกซีนี้จะติดตามแทน" +host: "โฮสต์" +selectUser: "เลือกผู้ใช้งาน" +recipient: "ผู้รับ" +annotation: "ความคิดเห็น" +federation: "สหพันธ์" +instances: "ตัวอย่าง" +registeredAt: "จดทะเบียนที่" +latestRequestSentAt: "ส่งคำขอล่าสุดไปแล้ว" +latestRequestReceivedAt: "ได้รับคำขอล่าสุดไปแล้ว" +latestStatus: "สถานะล่าสุด" +storageUsage: "พื้นที่จัดเก็บข้อมูลที่ใช้ไป" +charts: "โดดเด่น" +perHour: "ทุกชั่วโมง" +perDay: "ต่อวัน" +stopActivityDelivery: "หยุดส่งกิจกรรม" +blockThisInstance: "บล็อกอินสแตนซ์นี้" +operations: "ดำเนินการ" +software: "ซอฟต์แวร์" +version: "เวอร์ชั่น" +metadata: "ข้อมูลเมตา" +monitor: "มอนิเตอร์" +jobQueue: "คิวงาน" +cpuAndMemory: "ซีพียู และ หน่วยความจำ" +network: "เน็ตเวิร์ก" +disk: "ดิสก์" +instanceInfo: "ข้อมูล อินสแตนซ์" +statistics: "สถิติการใช้งาน" +clearQueue: "ล้างคิว" +clearQueueConfirmTitle: "คุณแน่ใจแล้วหรอว่าต้องการที่จะล้างคิว?" +clearQueueConfirmText: "บันทึกย่อที่ยังไม่ได้ส่งที่เหลืออยู่ในคิวนั้นมักจะ ไม่ถูกรวมเข้าด้วยกัน โดยปกติแล้วไม่จำเป็นต้องดำเนินการนี้" +clearCachedFiles: "ล้างแคช" +clearCachedFilesConfirm: "นายแน่ใจแล้วหรอว่าต้องการที่จะลบไฟล์ระยะไกลที่แคชไว้ทั้งหมด?" +blockedInstances: "อินสแตนซ์ที่ ถูกบล็อก" +blockedInstancesDescription: "ระบุชื่อโฮสต์ของอินสแตนซ์ที่คุณต้องการบล็อก อินสแตนซ์ที่อยู่ในรายการนั้นจะไม่สามารถพูดคุยกับอินสแตนซ์นี้ได้อีกต่อไป" +muteAndBlock: "ปิดเสียงและบล็อก" +mutedUsers: "ผู้ใช้ที่ถูกปิดเสียง" +blockedUsers: "ผู้ใช้ที่ถูกบล็อก" +noUsers: "ไม่พบผู้ใช้งาน" +editProfile: "แก้ไขโปรไฟล์" +noteDeleteConfirm: "นายแน่ใจแล้วหรอว่าต้องการลบโน้ตนี้นะ?" +pinLimitExceeded: "คุณไม่สามารถปักหมุดโน้ตเพิ่มเติมใดๆได้อีก" +intro: "การติดตั้ง Calckey เสร็จสิ้นแล้วนะ! โปรดสร้างผู้ใช้งานที่เป็นผู้ดูแลระบบ" +done: "เสร็จสิ้น" +processing: "กำลังประมวลผล..." +preview: "แสดงตัวอย่าง" +default: "ค่าตั้งต้น" +defaultValueIs: "ค่าเริ่มต้น: {value}" +noCustomEmojis: "ไม่มีอีโมจิ" +noJobs: "ไม่มีชิ้นงาน" +federating: "สหพันธ์" +blocked: "ถูกบล็อก" +suspended: "ถูกระงับ" +all: "ทั้งหมด" +subscribing: "สมัครแล้ว" +publishing: "กำลังเผยแพร่" +notResponding: "ไม่มีการตอบสนอง" +instanceFollowing: "กำลังติดตาม บน อินสแตนซ์" +instanceFollowers: "ผู้ติดตามของอินสแตนซ์" +instanceUsers: "ผู้ใช้งานของอินสแตนซ์นี้" +changePassword: "เปลี่ยนรหัสผ่าน" +security: "ความปลอดภัย" +retypedNotMatch: "อินพุตไม่ตรงกันนะ" +currentPassword: "รหัสผ่านปัจจุบัน" +newPassword: "รหัสผ่านใหม่" +newPasswordRetype: "ใส่รหัสผ่านใหม่อีกครั้ง" +attachFile: "แนบไฟล์" +more: "เพิ่มเติม!" +featured: "เป็นจุดเด่น" +usernameOrUserId: "ชื่อผู้ใช้หรือรหัสผู้ใช้งาน" +noSuchUser: "ไม่มีผู้ใช้นี้อยู่ในระบบ" +lookup: "ค้นหา" +announcements: "ประกาศ" +imageUrl: "url รูปภาพ" +remove: "ลบ" +removed: "ถูกลบไปแล้ว" +removeAreYouSure: "นายแน่ใจจริงหรอว่าต้องการที่จะลบออก \"{x}\"" +deleteAreYouSure: "นายแน่ใจจริงหรอว่าต้องการที่จะลบออก \"{x}\"" +resetAreYouSure: "รีเซ็ตเลยไหม" +saved: "บันทึกแล้ว" +messaging: "แชท" +upload: "อัพโหลด" +keepOriginalUploading: "เก็บภาพต้นฉบับ" +keepOriginalUploadingDescription: "บันทึกรูปภาพที่อัพโหลดต้นฉบับตามที่เป็นอยู่ ถ้าหากปิดอยู่ ระบบจะสร้างเวอร์ชั่นที่จะแสดงบนเว็บเมื่ออัพโหลดนะ" +fromDrive: "จากไดรฟ์" +fromUrl: "จาก URL" +uploadFromUrl: "อัพโหลดจาก URL" +uploadFromUrlDescription: "URL ของไฟล์ที่คุณต้องการอัปโหลด" +uploadFromUrlRequested: "อัพโหลดที่ร้องขอ" +uploadFromUrlMayTakeTime: "มันอาจจะต้องใช้เวลาสักครู่จนกว่าการอัพโหลดจะเสร็จสมบูรณ์นะ" +explore: "สำรวจ" +messageRead: "อ่านแล้ว" +noMoreHistory: "ในนั้นไม่มีประวัติอีกต่อไปแล้วนะ" +startMessaging: "เริ่มการสนทนา" +nUsersRead: "อ่านโดย {n}" +agreeTo: "ฉันยอมรับที่จะ {0}" +tos: "ข้อกำหนดและเงื่อนไข" +start: "เริ่มต้น​ใช้งาน​" +home: "หน้าแรก" +remoteUserCaution: "เนื่องจากผู้ใช้งานรายนี้นั้น มาจากอินสแตนซ์ระยะไกล ข้อมูลที่แสดงดังกล่าวนั้นอาจจะไม่สมบูรณ์ก็ได้นะ" +activity: "กิจกรรม" +images: "รูปภาพ" +birthday: "วันเกิด" +yearsOld: "{อายุ} ปี" +registeredDate: "วันที่สมัครสมาชิก" +location: "ตำแหน่งที่ตั้ง" +theme: "ธีม" +themeForLightMode: "ธีมที่จะใช้ในโหมดแสง" +themeForDarkMode: "ธีมที่จะใช้ในโหมดมืด" +light: "สว่าง" +dark: "มืด" +lightThemes: "ธีมสีสว่าง" +darkThemes: "ธีมมืด" +syncDeviceDarkMode: "ซิงค์โหมดมืดด้วยการตั้งค่ากับอุปกรณ์" +drive: "ไดรฟ์" +fileName: "ชื่อไฟล์" +selectFile: "เลือกไฟล์" +selectFiles: "เลือกไฟล์" +selectFolder: "เลือกโฟลเดอร์" +selectFolders: "เลือกโฟลเดอร์" +renameFile: "เปลี่ยนชื่อไฟล์" +folderName: "ชื่อแฟ้ม" +createFolder: "สร้างโฟลเดอร์" +renameFolder: "เปลี่ยนชื่อโฟลเดอร์" +deleteFolder: "ลบโฟลเดอร์" +addFile: "เพิ่มไฟล์" +emptyDrive: "ไดรฟ์ของคุณว่างเปล่านะ" +emptyFolder: "โฟลเดอร์นี้น่าจะว่างเปล่านะ" +unableToDelete: "ไม่สามารถลบออกได้นะ" +inputNewFileName: "ป้อนชื่อไฟล์ใหม่นะ" +inputNewDescription: "กรุณาใส่แคปชั่นใหม่" +inputNewFolderName: "กรุณาใส่ชื่อโฟลเดอร์ใหม่นะ\n" +circularReferenceFolder: "โฟลเดอร์ปลายทาง คือ โฟลเดอร์ย่อยของโฟลเดอร์ที่คุณต้องการที่จะย้ายล่ะนะ" +hasChildFilesOrFolders: "เนื่องจากโฟลเดอร์นี้ไม่ว่างเปล่า จึงไม่สามารถลบได้นะ" +copyUrl: "คัดลอก URL" +rename: "เปลี่ยนชื่อ" +avatar: "ไอคอน" +banner: "แบนเนอร์" +nsfw: "เนื้อหาที่ละเอียดอ่อน NSFW" +whenServerDisconnected: "สูญเสียการเชื่อมต่อกับเซิร์ฟเวอร์" +disconnectedFromServer: "ถูกตัดการเชื่อมต่อออกจากเซิร์ฟเวอร์" +reload: "รีโหลด" +doNothing: "เมิน" +reloadConfirm: "นายต้องการรีเฟรชไทม์ไลน์หรือป่าว?" +watch: "ดู" +unwatch: "หยุดดู" +accept: "ยอมรับ" +reject: "ปฏิเสธ" +normal: "โหมดปกติ" +instanceName: "ชื่อ อินสแตนซ์" +instanceDescription: "คำอธิบายอินสแตนซ์" +maintainerName: "ผู้ดูแล" +maintainerEmail: "อีเมล์แอดมิน" +tosUrl: "เงื่อนไขการให้บริการ URL" +thisYear: "ปีนี้" +thisMonth: "เดือนนี้" +today: "วันนี้" +dayX: "{วัน}" +monthX: "{เดือน}" +yearX: "{ปี}" +pages: "หน้า" +integration: "รวบรวม" +connectService: "เชื่อมต่อ" +disconnectService: "ตัดการเชื่อมต่อ" +enableLocalTimeline: "เปิดใช้งานไทม์ไลน์ในพื้นที่" +enableGlobalTimeline: "เปิดใช้งานไทม์ไลน์ทั่วโลก" +disablingTimelinesInfo: "ผู้ดูแลระบบและผู้ควบคุมจะสามารถเข้าถึงไทม์ไลน์ทั้งหมด ถึงแม้ว่าจะไม่ได้เปิดใช้งานก็ตาม" +registration: "ลงทะเบียน" +enableRegistration: "เปิดใช้งานการลงทะเบียนผู้ใช้ใหม่" +invite: "เชิญชวน" +driveCapacityPerLocalAccount: "ความจุของไดรฟ์ต่อผู้ใช้ภายในเครื่อง" +driveCapacityPerRemoteAccount: "ความจุของไดรฟ์ต่อผู้ใช้ระยะไกล" +inMb: "เป็นเมกะไบต์" +iconUrl: "ไอคอน URL" +bannerUrl: "URL รูปภาพแบนเนอร์" +backgroundImageUrl: "URL ภาพพื้นหลัง" +basicInfo: "ข้อมูลเบื้องต้น" +pinnedUsers: "ผู้ใช้งานที่ได้รับการปักหมุด" +pinnedUsersDescription: "ลิสต์ชื่อผู้ใช้โดยคั่นด้วยการขึ้นบรรทัดใหม่เพื่อปักหมุดในแท็บ \"สำรวจ\"" +pinnedPages: "หน้าที่ปักหมุด" +pinnedPagesDescription: "ป้อนเส้นทางของหน้าที่คุณต้องการตรึงไว้ที่หน้าแรกของอินสแตนซ์นี้ โดยคั่นด้วยตัวแบ่งบรรทัด" +pinnedClipId: "ID ของคลิปที่จะปักหมุด" +pinnedNotes: "โน้ตที่ปักหมุดเอาไว้" +hcaptcha: "hCaptcha" +enableHcaptcha: "เปิดใช้ hCaptcha" +hcaptchaSiteKey: "คีย์ไซต์" +hcaptchaSecretKey: "คีย์ลับ" +recaptcha: "reCAPTCHA" +enableRecaptcha: "เปิดใช้ reCAPTCHA" +recaptchaSiteKey: "คีย์ไซต์" +recaptchaSecretKey: "คีย์ลับ" +avoidMultiCaptchaConfirm: "การใช้ระบบ Captcha หลายระบบอาจทำให้เกิดการรบกวนหรืออาจจะเกิดข้อผิดพลาดได้ หากต้องการที่จะปิดการใช้งานระบบ Captcha อื่น ๆ แนะนำให้ปิดตัวอื่นๆก่อน ถ้าหากคุณต้องการให้เปิดใช้งานต่อไป ให้ กด ยกเลิก" +antennas: "เสาอากาศ" +manageAntennas: "จัดการเสาอากาศ" +name: "ชื่อ" +antennaSource: "แหล่งเสาอากาศ" +antennaKeywords: "คีย์เวิร์ดที่ควรฟัง" +antennaExcludeKeywords: "คีย์เวิร์ดที่จะยกเว้น" +antennaKeywordsDescription: "คั่นด้วยช่องว่างสำหรับเงื่อนไข AND หรือด้วยการขึ้นบรรทัดใหม่สำหรับเงื่อนไข OR นะ" +notifyAntenna: "แจ้งเตือนเกี่ยวกับโน้ตใหม่" +withFileAntenna: "เฉพาะโน้ตที่มีไฟล์" +enableServiceworker: "เปิดใช้งาน การแจ้งเตือนแบบพุชสำหรับเบราว์เซอร์ของคุณ" +antennaUsersDescription: "ระบุหนึ่งชื่อผู้ใช้ต่อบรรทัด" +caseSensitive: "กรณีที่สำคัญ" +withReplies: "รวมตอบกลับ" +connectedTo: "บัญชีดังต่อไปนี้มีการเชื่อมต่อกัน" +notesAndReplies: "โพสต์และการตอบกลับ" +withFiles: "รวบรวมไฟล์" +silence: "ถูกปิดปาก" +silenceConfirm: "นายแน่ใจแล้วหรอว่าต้องการที่จะ ปิดปาก ผู้ใช้งานรายนี้?" +unsilence: "ยกเลิกการปิดปาก" +unsilenceConfirm: "นายแน่ใจแล้วหรอว่าต้องการที่จะยกเลิกปิดปากผู้ใช้งานรายนี้?" +popularUsers: "ผู้ใช้ที่เป็นที่นิยม" +recentlyUpdatedUsers: "ผู้ใช้ที่เพิ่งใช้งานล่าสุด" +recentlyRegisteredUsers: "ผู้ใช้ที่เข้าร่วมใหม่" +recentlyDiscoveredUsers: "ผู้ใช้ที่เพิ่งค้นพบใหม่" +exploreUsersCount: "มีผู้ใช้ {จำนวน} ราย" +exploreFediverse: "สำรวจเฟดดิเวิร์ส" +popularTags: "แท็กยอดนิยม" +userList: "รายการ" +about: "เกี่ยวกับ" +aboutMisskey: "เกี่ยวกับ Calckey" +administrator: "ผู้ดูแลระบบ" +token: "โทเค็น" +twoStepAuthentication: "ยืนยันตัวตน 2 ชั้น" +moderator: "ผู้ควบคุม" +moderation: "การกลั่นกรอง" +nUsersMentioned: "กล่าวถึงโดยผู้ใช้ {n} รายนี้" +securityKey: "กุญแจความปลอดภัย" +securityKeyName: "ชื่อคีย์" +registerSecurityKey: "ลงทะเบียนรหัสความปลอดภัยคีย์" +lastUsed: "ใช้ล่าสุด" +unregister: "เลิกติดตาม" +passwordLessLogin: "เข้าสู่ระบบแบบไม่ใช้รหัสผ่าน" +resetPassword: "รีเซ็ตรหัสผ่าน" +newPasswordIs: "รหัสผ่านใหม่คือ \"{password}\"" +reduceUiAnimation: "ลดภาพเคลื่อนไหว UI" +share: "แชร์" +notFound: "ไม่พบหน้าที่ต้องการ" +notFoundDescription: "ไม่พบหน้าที่สอดคล้องตรงกันกับ URL นี้นะ" +uploadFolder: "โฟลเดอร์เริ่มต้นสำหรับอัพโหลด" +cacheClear: "ล้างแคช" +markAsReadAllNotifications: "ทำเครื่องหมายการแจ้งเตือนทั้งหมดว่าอ่านแล้ว" +markAsReadAllUnreadNotes: "ทำเครื่องหมายโน้ตทั้งหมดว่าอ่านแล้ว" +markAsReadAllTalkMessages: "ทำเครื่องหมายข้อความทั้งหมดว่าอ่านแล้ว" +help: "ช่วยเหลือ" +inputMessageHere: "พิมพ์ข้อความที่นี่" +close: "ปิด" +group: "กลุ่ม" +groups: "กลุ่ม" +createGroup: "สร้างกลุ่ม" +ownedGroups: "กลุ่มที่เป็นเจ้าของ" +joinedGroups: "เข้าร่วมกลุ่ม" +invites: "เชิญชวน" +groupName: "ชื่อกลุ่ม" +members: "สมาชิก" +transfer: "ถ่ายโอน" +messagingWithUser: "แชทส่วนตัว" +messagingWithGroup: "แชทกลุ่ม" +title: "หัวข้อ" +text: "ข้อความ" +enable: "เปิดใช้งาน" +next: "ถัด​ไป" +retype: "พิมพ์รหัสอีกครั้ง" +noteOf: "โน้ต โดย {ผู้ใช้งาน}" +inviteToGroup: "ชวนเข้ากลุ่ม" +quoteAttached: "อ้างอิง" +quoteQuestion: "นายต้องการที่จะอ้างอิงหรอ?" +noMessagesYet: "ยังไม่มีข้อความนะ" +newMessageExists: "คุณมีข้อความใหม่" +onlyOneFileCanBeAttached: "คุณสามารถแนบไฟล์กับข้อความได้เพียงไฟล์เดียวเท่านั้นนะ" +signinRequired: "กรุณาลงทะเบียนหรือลงชื่อเข้าใช้ก่อนดำเนินการต่อนะ" +invitations: "เชิญชวน" +invitationCode: "รหัสคำเชิญ" +checking: "Checking" +available: "พร้อมใช้งาน" +unavailable: "ไม่พร้อมใช้" +usernameInvalidFormat: "คุณสามารถใช้อักษรตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก ตัวเลข และขีดล่างได้นะ ( a-z , A-Z , 0-9 , รวมไปถึงอักษรพิเศษเช่น + * / , . - อื่นๆเป็นต้น )" +tooShort: "สั้นเกินไปนะ" +tooLong: "ยาวเกินไปนะ" +weakPassword: "รหัสผ่าน แย่มาก" +normalPassword: "รหัสผ่านปกติ" +strongPassword: "รหัสผ่านรัดกุมมาก" +passwordMatched: "ถูกต้อง!" +passwordNotMatched: "ไม่ถูกต้อง" +signinWith: "ลงชื่อเข้าใช้ด้วย {x}" +signinFailed: "ไม่สามารถลงชื่อผู้เข้าใช้ได้ เนื่องจาก ชื่อผู้ใช้หรือรหัสผ่านที่คุณป้อนนั้นไม่ถูกต้องนะ" +tapSecurityKey: "แตะคีย์ความปลอดภัย" +or: "หรือ" +language: "ภาษา" +uiLanguage: "ภาษาอินเทอร์เฟซผู้ใช้งาน" +groupInvited: "คุณได้รับเชิญให้เข้าร่วมกลุ่ม" +aboutX: "เกี่ยวกับ {x}" +useOsNativeEmojis: "ใช้อีโมจิ OS แบบดั้งเดิม" +disableDrawer: "อย่าใช้ลิ้นชักสไตล์เมนู" +youHaveNoGroups: "คุณยังไม่มีกลุ่ม" +joinOrCreateGroup: "รับเชิญเข้าร่วมกลุ่มหรือสร้างกลุ่มของคุณเองเลยนะ" +noHistory: "ไม่มีรายการ" +signinHistory: "ประวัติการเข้าสู่ระบบ" +disableAnimatedMfm: "ปิดการใช้งาน MFM ด้วยแอนิเมชั่น" +doing: "กำลังประมวลผล......" +category: "หมวดหมู่" +tags: "แท็ก" +docSource: "ที่มาของเอกสารนี้" +createAccount: "สร้างบัญชี" +existingAccount: "บัญชีที่มีอยู่" +regenerate: "สร้างอีกครั้ง" +fontSize: "ขนาดตัวอักษร" +noFollowRequests: "คุณไม่มีคำขอติดตามที่รอดำเนินการ" +openImageInNewTab: "เปิดรูปภาพในแท็บใหม่" +dashboard: "หน้ากระดานหลัก" +local: "ในพื้นที่" +remote: "ระยะไกล" +total: "รวมทั้งหมด" +weekOverWeekChanges: "เปลี่ยนแปลงไปเมื่อสัปดาห์ที่แล้ว" +dayOverDayChanges: "เปลี่ยนแปลงไปเมื่อวานนี้" +appearance: "ภาพลักษณ์" +clientSettings: "การตั้งค่าไคลเอนต์" +accountSettings: "ตั้งค่าบัญชี" +promotion: "โฆษณา" +promote: "โปรโมท" +numberOfDays: "จำนวนวัน" +hideThisNote: "ซ่อนโน้ตนี้" +showFeaturedNotesInTimeline: "แสดงโน้ตเด่นในไทม์ไลน์" +objectStorage: "อ็อบเจ็กต์ ที่จัดเก็บ" +useObjectStorage: "ใช้ อ็อบเจ็กต์ ที่จัดเก็บ" +objectStorageBaseUrl: "URL ฐาน" +objectStorageBaseUrlDesc: "URL ที่ใช้เป็นข้อมูลอ้างอิง ระบุ URL ของ CDN หรือ Proxy ถ้าหากคุณใช้อย่างใดอย่างหนึ่ง\n สำหรับการใช้งาน S3 'https://.s3.amazonaws.com' และสำหรับ GCS หรือบริการที่เทียบเท่าใช้ 'https://storage.googleapis.com/', เป็นต้น" +objectStorageBucket: "Bucket" +objectStorageBucketDesc: "โปรดระบุชื่อที่เก็บข้อมูลที่ใช้กับผู้ให้บริการของคุณ" +objectStoragePrefix: "คำนำหน้า" +objectStoragePrefixDesc: "ไฟล์ทั้งหมดจะถูกเก็บไว้ภายใต้ไดเร็กทอรีที่มีคำนำหน้านี้นะ" +objectStorageEndpoint: "ปลายทาง" +objectStorageEndpointDesc: "เว้นว่างไว้หากคุณใช้ AWS S3 หรือระบุปลายทางเป็น '' หรือ ':' ทั้งนี้ขึ้นอยู่กับผู้ให้บริการที่คุณใช้อยู่ด้วย" +objectStorageRegion: "ภูมิภาค" +objectStorageRegionDesc: "ระบุภูมิภาค เช่น 'xx-east-1' ถ้าหากบริการของคุณไม่ได้แยกความแตกต่างระหว่างภูมิภาคก็ให้ เว้นว่างไว้หรือป้อน 'us-east-1'" +objectStorageUseSSL: "ใช้ SSL" +objectStorageUseSSLDesc: "ปิดการทำงานนี้ไว้ ถ้าหากคุณจะไม่ใช้ HTTPS สำหรับการเชื่อมต่อ API" +objectStorageUseProxy: "เชื่อมต่อผ่านพร็อกซี" +objectStorageUseProxyDesc: "ปิดสิ่งนี้ไว้ถ้าหากคุณจะไม่ใช้ Proxy สำหรับการเชื่อมต่อ API" +objectStorageSetPublicRead: "ตั้งค่า \"public-read\" ในการอัปโหลด" +serverLogs: "บันทึกของเซิร์ฟเวอร์" +deleteAll: "ลบทั้งหมด" +showFixedPostForm: "แสดงแบบฟอร์มการโพสต์ที่ด้านบนสุดของไทม์ไลน์" +newNoteRecived: "มีโน้ตใหม่" +sounds: "เสียง" +listen: "ฟัง" +none: "ไม่มี" +showInPage: "แสดงในเพจ" +popout: "ป๊อปเอาต์" +volume: "ความดัง" +masterVolume: "มาสเตอร์วอลุ่ม" +details: "รายละเอียด" +chooseEmoji: "เลือกโมจิของเธอ" +unableToProcess: "ไม่สามารถดำเนินการให้เสร็จสิ้นได้" +recentUsed: "ใช้ล่าสุด" +install: "ติดตั้ง" +uninstall: "ถอนการติดตั้ง" +installedApps: "แอปที่ติดตั้งแล้ว" +nothing: "ไม่พบผลลัพธ์" +installedDate: "วันที่ติดตั้ง" +lastUsedDate: "ใช้งานครั้งล่าสุด" +state: "สถานะ" +sort: "เรียงลำดับ" +ascendingOrder: "เรียงจากน้อยไปมาก" +descendingOrder: "เรียงจากมากไปน้อย" +scratchpad: "กระดานทดลอง" +scratchpadDescription: "Scratchpad เป็นการจัดเตรียมสภาพแวดล้อมสำหรับการทดลอง AiScript แต่คุณสามารถเขียน ดำเนินการ และตรวจสอบผลลัพธ์ของการโต้ตอบกับ Calckey มันได้ด้วยนะ" +output: "เอาท์พุต" +script: "สคริปต์" +disablePagesScript: "ปิดการใช้งาน AiScript บนเพจ" +updateRemoteUser: "อัปเดตข้อมูลผู้ใช้งานระยะไกล" +deleteAllFiles: "ลบไฟล์ทั้งหมด" +deleteAllFilesConfirm: "นายแน่ใจแล้วหรอว่าต้องการที่จะลบไฟล์ทั้งหมด?" +removeAllFollowing: "เลิกติดตามผู้ใช้ที่ติดตามทั้งหมด" +removeAllFollowingDescription: "การที่คุณดำเนินการนี้จะเลิกติดตามบัญชีทั้งหมดจาก {host} โปรดเรียกใช้คำสั่งสิ่งนี้หากต้องการยกเลิกอินสแตนซ์ เช่น ไม่มีอยู่แล้ว" +userSuspended: "ผู้ใช้รายนี้ถูกระงับการใช้งาน" +userSilenced: "ผู้ใช้รายนี้กำลังถูกปิดกั้น" +yourAccountSuspendedTitle: "บัญชีนี้นั้นถูกระงับ" +yourAccountSuspendedDescription: "บัญชีนี้ถูกระงับ เนื่องจากละเมิดข้อกำหนดในการให้บริการของเซิร์ฟเวอร์หรืออาจจะละเมิดหลักเกณฑ์ชุมชน หรือ อาจจะโดนร้องเรียนเรื่องการละเมิดลิขสิทธิ์และอื่นๆอย่างต่อเนื่องซ้ำๆ หากคุณคิดว่าไม่ได้ทำผิดจริงๆหรือตัดสินผิดพลาด ได้โปรดกรุณาติดต่อผู้ดูแลระบบหากคุณต้องการทราบเหตุผลโดยละเอียดเพิ่มเติม และขอความกรุณาอย่าสร้างบัญชีใหม่" +menu: "เมนู" +divider: "ตัวแบ่ง" +addItem: "เพิ่มรายการ" +relays: "รีเลย์" +addRelay: "เพิ่มรีเลย์" +inboxUrl: "อินบ็อกซ์ URL" +addedRelays: "เพิ่มรีเลย์แล้ว" +serviceworkerInfo: "ต้องเปิดใช้งานสำหรับการแจ้งเตือนแบบพุช" +deletedNote: "โน้ตที่ถูกลบ" +invisibleNote: "โน้ตที่มองไม่เห็น" +enableInfiniteScroll: "โหลดเพิ่มเติมโดยอัตโนมัติ" +visibility: "การมองเห็น" +poll: "โพล" +useCw: "ซ่อนเนื้อหา" +enablePlayer: "เปิดเครื่องเล่นวิดีโอ" +disablePlayer: "ปิดเครื่องเล่นวิดีโอ" +expandTweet: "ขยายทวีต" +themeEditor: "ตัวแก้ไขธีม" +description: "รายละเอียด" +describeFile: "เพิ่มแคปชั่น" +enterFileDescription: "ใส่แคปชั่น" +author: "ผู้เขียน" +leaveConfirm: "คุณมีการเปลี่ยนแปลงที่ไม่ได้บันทึกนะ นายต้องการทิ้งการเปลี่ยนแปลงเหล่านั้นหรอ?" +manage: "การจัดการ" +plugins: "ปลั๊กอิน" +preferencesBackups: "ตั้งค่าการสำรองข้อมูล" +deck: "เด็ค" +undeck: "ออกจากเด็ค" +useBlurEffectForModal: "ใช้เอฟเฟกต์เบลอสำหรับโมดอล" +useFullReactionPicker: "ใช้เครื่องมือเลือกปฏิกิริยาขนาดเต็ม" +width: "ความกว้าง" +height: "ความสูง" +large: "ใหญ่" +medium: "ปานกลาง" +small: "เล็ก" +generateAccessToken: "สร้างการเข้าถึงโทเค็น" +permission: "การอนุญาต" +enableAll: "เปิดใช้งานทั้งหมด" +disableAll: "ปิดการใช้งานทั้งหมด" +tokenRequested: "ให้สิทธิ์การเข้าถึงบัญชี" +pluginTokenRequestedDescription: "ปลั๊กอินนี้จะสามารถใช้การอนุญาตที่ตั้งค่าไว้ที่นี่นะ" +notificationType: "ประเภทการแจ้งเตือน" +edit: "แก้ไข" +emailServer: "อีเมล์เซิร์ฟเวอร์" +enableEmail: "เปิดใช้งานการกระจายอีเมล" +emailConfigInfo: "ใช้เพื่อยืนยันอีเมลของคุณระหว่างการสมัครหรือถ้าหากคุณลืมรหัสผ่าน" +email: "อีเมล์" +emailAddress: "ที่อยู่อีเมล์" +smtpConfig: "กำหนดค่าเซิร์ฟเวอร์ SMTP" +smtpHost: "โฮสต์" +smtpPort: "พอร์ต" +smtpUser: "ชื่อผู้ใช้" +smtpPass: "รหัสผ่าน" +emptyToDisableSmtpAuth: "ปล่อยชื่อผู้ใช้และรหัสผ่านว่างไว้เพื่อปิดใช้งานการยืนยัน SMTP" +smtpSecure: "ใช้โดยนัย SSL/TLS สำหรับการเชื่อมต่อ SMTP" +smtpSecureInfo: "ปิดสิ่งนี้เมื่อใช้ STARTTLS" +testEmail: "ทดสอบการส่งอีเมล" +wordMute: "ปิดเสียงคำ" +regexpError: "ข้อผิดพลาดของนิพจน์ทั่วไป" +regexpErrorDescription: "เกิดข้อผิดพลาดในนิพจน์ทั่วไปในบรรทัดที่ {line} ของการปิดเสียงคำ {tab} ของคุณ:" +instanceMute: "ปิดเสียง อินสแตนซ์" +userSaysSomething: "{name} พูดอะไรบางอย่าง" +makeActive: "เปิดใช้งาน" +display: "แสดงผล" +copy: "คัดลอก" +metrics: "เมตริก" +overview: "ภาพรวม" +logs: "บันทึกข้อมูลระบบ" +delayed: "ดีเลย์" +database: "ฐานข้อมูล" +channel: "แชนแนล" +create: "สร้าง" +notificationSetting: "ตั้งค่าการแจ้งเตือน" +notificationSettingDesc: "เลือกประเภทการแจ้งเตือนที่ต้องการจะแสดง" +useGlobalSetting: "ใช้การตั้งค่าส่วนกลาง" +useGlobalSettingDesc: "หากเปิดไว้ ระบบจะใช้การตั้งค่าการแจ้งเตือนของบัญชีของคุณ หากปิดอยู่ สามารถทำการกำหนดค่าแต่ละรายการได้นะ" +other: "อื่น ๆ" +regenerateLoginToken: "สร้างโทเค็นการเข้าสู่ระบบอีกครั้ง" +regenerateLoginTokenDescription: "สร้างโทเค็นใหม่ที่ใช้ภายในระหว่างการเข้าสู่ระบบ โดยตามหลักปกติแล้วการดำเนินการนี้ไม่จำเป็น หากสร้างใหม่ อุปกรณ์ทั้งหมดจะถูกออกจากระบบนะ" +setMultipleBySeparatingWithSpace: "คั่นหลายรายการด้วยช่องว่าง" +fileIdOrUrl: "ไฟล์ ID หรือ URL" +behavior: "พฤติกรรม" +sample: "ตัวอย่าง" +abuseReports: "รายงาน" +reportAbuse: "รายงาน" +reportAbuseOf: "รายงาน {ชื่อ}" +fillAbuseReportDescription: "กรุณากรอกรายละเอียดเกี่ยวกับรายงานนี้ หากเป็นเรื่องเกี่ยวกับโน้ตโดยเฉพาะ ได้โปรดระบุ URL" +abuseReported: "เราได้ส่งรายงานของคุณไปแล้ว ขอบคุณมากๆนะ" +reporter: "นักข่าว" +reporteeOrigin: "รายงานต้นทาง" +reporterOrigin: "นักข่าวต้นทาง" +forwardReport: "ส่งต่อรายงานไปยังอินสแตนซ์ระยะไกล" +forwardReportIsAnonymous: "แทนที่จะเป็นบัญชีของคุณ บัญชีระบบที่ไม่ระบุตัวตนจะแสดงเป็นนักข่าวที่อินสแตนซ์ระยะไกล" +send: "ส่ง" +abuseMarkAsResolved: "ทำเครื่องหมายรายงานว่าแก้ไขแล้ว" +openInNewTab: "เปิดในแท็บใหม่" +openInSideView: "เปิดในมุมมองด้านข้าง" +defaultNavigationBehaviour: "พฤติกรรมการนำทางที่เป็นค่าเริ่มต้น" +editTheseSettingsMayBreakAccount: "การแก้ไขการตั้งค่าเหล่านี้อาจทำให้บัญชีของคุณเสียหายนะ" +instanceTicker: "ข้อมูลอินสแตนซ์ของบันทึกย่อ" +waitingFor: "กำลังรอคอย {x}" +random: "สุ่มค่า" +system: "ระบบ" +switchUi: "สลับ UI" +desktop: "เดสก์ท็อป" +clip: "คลิป" +createNew: "สร้างใหม่" +optional: "ไม่บังคับ" +createNewClip: "สร้างคลิปใหม่" +unclip: "ลบคลิป" +confirmToUnclipAlreadyClippedNote: "โน้ตนี้เป็นส่วนหนึ่งของคลิป \"{name}\" แล้ว คุณต้องการลบออกจากคลิปนี้แทนอย่างงั้นหรอ?" +public: "สาธารณะ" +i18nInfo: "Calckey กำลังได้รับการแปลเป็นภาษาต่างๆ โดยอาสาสมัคร คุณสามารถช่วยเหลือได้ที่ {link}" +manageAccessTokens: "การจัดการโทเค็นการเข้าถึง" +accountInfo: "ข้อมูลบัญชี" +notesCount: "จำนวนของโน้ต" +repliesCount: "จำนวนการตอบกลับที่ส่ง" +renotesCount: "จำนวนรีโน้ตที่ส่ง" +repliedCount: "จำนวนของการตอบกลับที่ได้รับ" +renotedCount: "จำนวนรีโน้ตที่ได้รับ" +followingCount: "จำนวนบัญชีที่ติดตาม" +followersCount: "จำนวนผู้ติดตาม" +sentReactionsCount: "จำนวนปฏิกิริยาที่ส่ง" +receivedReactionsCount: "จำนวนปฏิกิริยาที่ได้รับ" +pollVotesCount: "จำนวนโหวตที่ส่งไป" +pollVotedCount: "จำนวนโหวตที่ได้รับ" +yes: "ใช่" +no: "ไม่" +driveFilesCount: "จำนวนไฟล์ไดรฟ์" +driveUsage: "การใช้พื้นที่ไดรฟ์" +noCrawle: "ปฏิเสธการจัดทำดัชนีของโปรแกรมรวบรวมข้อมูล" +noCrawleDescription: "ขอให้เครื่องมือค้นหาไม่จัดทำดัชนีหน้าโปรไฟล์ บันทึกย่อ หน้า ฯลฯ" +lockedAccountInfo: "เว้นแต่ว่าคุณจะต้องตั้งค่าการเปิดเผยโน้ตเป็น \"ผู้ติดตามเท่านั้น\" โน้ตย่อของคุณจะปรากฏแก่ทุกคน ถึงแม้ว่าคุณจะเป็นกำหนดให้ผู้ติดตามต้องได้รับการอนุมัติด้วยตนเองก็ตาม" +alwaysMarkSensitive: "ทำเครื่องหมายเป็น NSFW เป็นค่าเริ่มต้น" +loadRawImages: "โหลดภาพต้นฉบับแทนการแสดงภาพขนาดย่อ" +disableShowingAnimatedImages: "ไม่ต้องเล่นภาพเคลื่อนไหว" +verificationEmailSent: "ส่งอีเมลยืนยันแล้วนะ ได้โปรดกรุณาไปที่ลิงก์ที่รวมไว้เพื่อทำการตรวจสอบให้เสร็จสิ้น" +notSet: "ไม่ได้ตั้งค่า" +emailVerified: "อีเมลได้รับการยืนยันแล้ว" +noteFavoritesCount: "จำนวนโน้ตที่ชื่นชอบ" +pageLikesCount: "จำนวนเพจที่ชอบ" +pageLikedCount: "จำนวนการกดถูกใจเพจที่ได้รับแล้ว" +contact: "ติดต่อ" +useSystemFont: "ใช้ฟอนต์เริ่มต้นของระบบ" +clips: "คลิป" +experimentalFeatures: "ฟังก์ชั่นทดสอบ" +developer: "สำหรับนักพัฒนา" +makeExplorable: "ทำให้บัญชีมองเห็นใน \"สำรวจ\"" +makeExplorableDescription: "ถ้าหากคุณปิดการทำงานนี้ บัญชีของคุณนั้นจะไม่แสดงในส่วน \"สำรวจ\" นะ" +showGapBetweenNotesInTimeline: "แสดงช่องว่างระหว่างโพสต์บนไทม์ไลน์" +duplicate: "ทำซ้ำ" +left: "ซ้าย" +center: "ศูนย์กลาง" +wide: "กว้าง" +narrow: "ชิด" +reloadToApplySetting: "การตั้งค่านี้จะมีผลหลังจากโหลดหน้าซ้ำเท่านั้น ต้องการที่จะโหลดใหม่เลยมั้ย" +needReloadToApply: "จำเป็นต้องโหลดซ้ำถึงจะมีผลนะ" +showTitlebar: "แสดงแถบชื่อ" +clearCache: "ล้างแคช" +onlineUsersCount: "{n} ผู้ใช้คนนี้กำลังออนไลน์" +nUsers: "{n} ผู้ใช้งาน" +nNotes: "{n} โน้ต" +sendErrorReports: "ส่งรายงานว่าข้อผิดพลาด" +sendErrorReportsDescription: "เมื่อเปิดใช้งาน ข้อมูลข้อผิดพลาดโดยรายละเอียดนั้นจะถูกแชร์ให้กับ Calckey เมื่อเกิดปัญหา ซึ่งช่วยปรับปรุงคุณภาพของ Calckey\nซึ่งจะรวมถึงข้อมูล เช่น เวอร์ชั่นของระบบปฏิบัติการ เบราว์เซอร์ที่คุณใช้ กิจกรรมของคุณใน Calckey เป็นต้น" +myTheme: "ธีมของฉัน" +backgroundColor: "ภาพพื้นหลัง" +accentColor: "รูปแบบสี" +textColor: "สีข้อความ" +saveAs: "บันทึกเป็น..." +advanced: "ขั้นสูง" +value: "ค่า" +createdAt: "สร้างเมื่อ" +updatedAt: "อัพเดทล่าสุด" +saveConfirm: "บันทึกเปลี่ยนแปลงมั้ย?" +deleteConfirm: "ลบจริงๆเหรอ?" +invalidValue: "ค่านี้ไม่ถูกต้อง" +registry: "ทะเบียน" +closeAccount: "ปิด บัญชี" +currentVersion: "เวอร์ชั่นปัจจุบัน" +latestVersion: "รุ่นปัจจุบัน" +youAreRunningUpToDateClient: "คุณกำลังใช้ไคลเอ็นต์เวอร์ชันใหม่ล่าสุดนะ" +newVersionOfClientAvailable: "มีไคลเอ็นต์เวอร์ชันใหม่กว่าของคุณพร้อมใช้งานนะ" +usageAmount: "การใช้งาน" +capacity: "ความจุ" +inUse: "ใช้แล้ว" +editCode: "แก้ไขโค้ด" +apply: "ตกลง" +receiveAnnouncementFromInstance: "รับการแจ้งเตือนจากอินสแตนซ์นี้" +emailNotification: "การแจ้งเตือนทางอีเมล์" +publish: "เผยแพร่" +inChannelSearch: "ค้นหาในช่อง" +useReactionPickerForContextMenu: "เปิดตัวเลือกปฏิกิริยาเมื่อคลิกขวา" +typingUsers: "{users} กำลัง" +jumpToSpecifiedDate: "ข้ามไปยังวันที่เฉพาะเจาะจง" +showingPastTimeline: "กำลังแสดงผลไทม์ไลน์เก่า" +clear: "ล้าง" +markAllAsRead: "ทำเครื่องหมายทั้งหมดว่าอ่านแล้ว" +goBack: "ย้อนกลับ" +unlikeConfirm: "ลบไลค์ของคุณออกจริงๆหรอ" +fullView: "มุมมองแบบเต็ม" +quitFullView: "ออกจากมุมมองแบบเต็ม" +addDescription: "เพิ่มคำอธิบาย" +userPagePinTip: "คุณสามารถแสดงผลโน้ตย่อได้ที่นี่โดยเลือก \"ปักหมุดที่โปรไฟล์\" จากเมนูของโน้ตย่อแต่ละรายการนะ" +notSpecifiedMentionWarning: "โน้ตนี้มีการกล่าวถึงผู้ใช้งานที่ไม่รวมอยู่ในผู้รับ" +info: "เกี่ยวกับ" +userInfo: "ข้อมูลผู้ใช้" +unknown: "ไม่ทราบสถานะ" +onlineStatus: "สถานะออนไลน์" +hideOnlineStatus: "ซ่อนสถานะออนไลน์" +hideOnlineStatusDescription: "การซ่อนสถานะออนไลน์ของคุณช่วยลดความสะดวกของคุณสมบัติบางอย่าง เช่น การค้นหา อ่ะนะ" +online: "ออนไลน์" +active: "ใช้งานอยู่" +offline: "ออฟไลน์" +notRecommended: "ไม่ใช้งาน" +botProtection: "การป้องกัน Bot (or AI)" +instanceBlocking: "อินสแตนซ์ที่ถูกบล็อก" +selectAccount: "เลือกบัญชี" +switchAccount: "สลับบัญชีผู้ใช้" +enabled: "เปิดใช้งาน" +disabled: "ปิดการใช้งาน" +quickAction: "ปุ่มลัด" +user: "ผู้ใช้งาน" +administration: "การจัดการ" +accounts: "บัญชีผู้ใช้" +switch: "สลับ" +noMaintainerInformationWarning: "ข้อมูลผู้ดูแลไม่ได้รับการกำหนดค่านะ" +noBotProtectionWarning: "ไม่ได้กำหนดค่าการป้องกันบอทนะ" +configure: "กำหนดค่า" +postToGallery: "สร้างโพสต์แกลเลอรี่ใหม่" +gallery: "แกลเลอรี่" +recentPosts: "โพสต์ล่าสุด" +popularPosts: "โพสต์ติดอันดับ" +shareWithNote: "แบ่งปันด้วยโน้ต" +ads: "โฆษณา" +expiration: "กำหนดเวลา" +memo: "ข้อควรจำ" +priority: "ลำดับความสำคัญ" +high: "สูง" +middle: "ปานกลาง" +low: "ต่ำ" +emailNotConfiguredWarning: "ไม่ได้ตั้งค่าที่อยู่อีเมลนะ" +ratio: "อัตราส่วน" +previewNoteText: "แสดงตัวอย่าง" +customCss: "CSS ที่กำหนดเอง" +customCssWarn: "ควรใช้การตั้งค่านี้เฉพาะต่อเมื่อคุณรู้ว่าการตั้งค่านี้ใช้ทำอะไร การป้อนค่าที่ไม่เหมาะสมอาจทำให้ไคลเอ็นต์หยุดทำงานตามปกติได้นะ" +global: "ทั่วโลก" +squareAvatars: "แสดงผลอวตารสี่เหลี่ยม" +sent: "ส่ง" +received: "ได้รับแล้ว" +searchResult: "ผลการค้นหา" +hashtags: "แฮชแท็ก" +troubleshooting: "แก้ปัญหา" +useBlurEffect: "ใช้เอฟเฟกต์เบลอใน UI" +learnMore: "แสดงให้ดูหน่อย" +misskeyUpdated: "Calckey ได้รับการอัปเดตแล้ว!" +whatIsNew: "แสดงการเปลี่ยนแปลง" +translate: "แปลภาษา" +translatedFrom: "แปลมาจาก {x}" +accountDeletionInProgress: "กำลังดำเนินการลบบัญชีอยู่" +usernameInfo: "ชื่อที่ระบุบัญชีของคุณจากผู้อื่นในเซิร์ฟเวอร์นี้ คุณสามารถใช้ตัวอักษร (a~z, A~Z), ตัวเลข (0~9) หรือขีดล่าง (_) ชื่อผู้ใช้ไม่สามารถเปลี่ยนแปลงได้ในภายหลัง" +aiChanMode: "โหมด Ai " +keepCw: "เก็บคำเตือนเนื้อหา" +pubSub: "บัญชีผับ/ย่อย" +lastCommunication: "การสื่อสารครั้งสุดท้ายล่าสุด" +resolved: "คลี่คลายแล้ว" +unresolved: "รอการเฉลย" +breakFollow: "ลบผู้ติดตาม" +itsOn: "เปิดใช้งาน" +itsOff: "ปิดใช้งาน" +emailRequiredForSignup: "จำเป็นต้องการใช้ที่อยู่อีเมลสำหรับการสมัคร" +unread: "ไม่ได้อ่าน" +filter: "กรอง" +controlPanel: "แผงควบคุม" +manageAccounts: "จัดการบัญชี" +makeReactionsPublic: "ตั้งค่าประวัติปฏิกิริยาต่อสาธารณะ" +makeReactionsPublicDescription: "การทำเช่นนี้จะทำให้รายการปฏิกิริยาที่ผ่านมาของคุณจะปรากฏต่อสาธารณะนะ" +classic: "คลาสสิค" +muteThread: "ปิดเสียงเธรด" +unmuteThread: "เปิดเสียงเธรด" +ffVisibility: "การมองเห็นผู้ติดตาม/ผู้ติดตาม" +ffVisibilityDescription: "ช่วยให้คุณสามารถกำหนดค่าได้ว่าใครสามารถดูได้ว่าคุณติดตามใครและใครติดตามคุณบ้าง" +continueThread: "ดูความต่อเนื่องเธรด" +deleteAccountConfirm: "การดำเนินการนี้จะลบบัญชีของคุณอย่างถาวรเลยนะ แน่ใจหรอดำเนินการ?" +incorrectPassword: "รหัสผ่านไม่ถูกต้อง" +voteConfirm: "ยืนยันการโหวต \"{choice}\" มั้ย?" +hide: "ซ่อน" +leaveGroup: "ออกจากกลุ่ม" +leaveGroupConfirm: "คุณแน่ใจหรอว่าต้องการออกจาก \"{name}\"" +useDrawerReactionPickerForMobile: "แสดงผล ตัวเลือกปฏิกิริยาเป็นลิ้นชักบนมือถือ" +welcomeBackWithName: "ยินดีต้อนรับการกลับมานะค่ะ, {name}" +clickToFinishEmailVerification: "กรุณาคลิก [{ok}] เพื่อดำเนินการยืนยันอีเมลให้เสร็จสมบูรณ์นะ" +overridedDeviceKind: "ประเภทอุปกรณ์" +smartphone: "สมาร์ทโฟน" +tablet: "แท็บเล็ต" +auto: "อัตโนมัติ" +themeColor: "อินสแตนซ์ Ticker Color" +size: "ขนาด" +numberOfColumn: "จำนวนคอลัมน์" +searchByGoogle: "ค้นหา" +instanceDefaultLightTheme: "ธีมสว่างค่าเริ่มต้นสำหรับอินสแตนซ์" +instanceDefaultDarkTheme: "ธีมมืดค่าเริ่มต้นอินสแตนซ์" +instanceDefaultThemeDescription: "ป้อนรหัสธีมในรูปแบบออบเจ็กต์" +mutePeriod: "ระยะเวลาปิดเสียง" +indefinitely: "ตลอดไป" +tenMinutes: "10 นาที" +oneHour: "1 ชั่วโมง" +oneDay: "1 วัน" +oneWeek: "1 สัปดาห์" +reflectMayTakeTime: "อาจจำเป็นต้องใช้เวลาสักระยะหนึ่งจึงจะเห็นแสดงผลได้นะ" +failedToFetchAccountInformation: "ไม่สามารถเรียกดึงข้อมูลบัญชีได้" +rateLimitExceeded: "เกินขีดจำกัดอัตรา" +cropImage: "ครอบตัดรูปภาพ" +cropImageAsk: "คุณต้องการครอบตัดรูปภาพนี้อย่างงั้นหรือ?" +file: "ไฟล์" +recentNHours: "ล่าสุด {n} ชั่วโมงที่แล้ว" +recentNDays: "ล่าสุด {n} วันที่แล้ว" +noEmailServerWarning: "ไม่ได้กำหนดค่าเซิร์ฟเวอร์อีเมลนี้" +thereIsUnresolvedAbuseReportWarning: "มีรายงานที่ยังไม่ได้แก้ไข" +recommended: "แนะนำ" +check: "ตรวจสอบ" +driveCapOverrideLabel: "เปลี่ยนความจุของไดรฟ์สำหรับผู้ใช้รายนี้" +driveCapOverrideCaption: "รีเซ็ตความจุเป็นค่าเริ่มต้นโดยการป้อนค่าเป็น 0 หรือ ต่ำกว่า" +requireAdminForView: "คุณจำเป็นต้องเข้าสู่ระบบด้วยบัญชีผู้ดูแลระบบเพื่อเข้าดูสิ่งนี้" +isSystemAccount: "บัญชีที่ถูกสร้างมานั้น และถูกดำเนินการโดยอัตโนมัติด้วยระบบ" +typeToConfirm: "โปรดป้อน {x} เพื่อยืนยัน" +deleteAccount: "ลบบัญชี" +document: "เอกสาร" +numberOfPageCache: "จำนวนหน้าเพจที่แคช" +numberOfPageCacheDescription: "การเพิ่มจำนวนนี้จะช่วยเพิ่มความสะดวกให้กับผู้ใช้งาน แต่จะทำให้เซิร์ฟเวอร์โหลดมากขึ้นและต้องใช้หน่วยความจำมากขึ้นอีกด้วย" +logoutConfirm: "คุณแน่ใจว่าต้องการออกจากระบบ?" +lastActiveDate: "ใช้งานล่าสุดที่" +statusbar: "ไอคอนบนแถบสถานะ" +pleaseSelect: "ตัวเลือก" +reverse: "ย้อนกลับ" +colored: "สี" +refreshInterval: "รอบการอัพเดต" +label: "ป้ายชื่อ" +type: "รูปแบบ" +speed: "ความเร็ว" +slow: "ช้า" +fast: "เร็ว" +sensitiveMediaDetection: "การตรวจจับของสื่อ NSFW" +localOnly: "เฉพาะท้องถิ่น" +remoteOnly: "รีโมทเท่านั้น" +failedToUpload: "การอัปโหลดล้มเหลว" +cannotUploadBecauseInappropriate: "ไม่สามารถอัปโหลดไฟล์นี้ได้เนื่องจากระบบตรวจพบบางส่วนของไฟล์ว่านี้อาจจะเป็น NSFW" +cannotUploadBecauseNoFreeSpace: "การอัปโหลดนั้นล้มเหลวเนื่องจากไม่มีความจุของไดรฟ์" +beta: "เบต้า" +enableAutoSensitive: "ทำเครื่องหมาย NSFW อัตโนมัติ" +enableAutoSensitiveDescription: "อนุญาตให้ตรวจหาและทำเครื่องหมายสื่อ NSFW โดยอัตโนมัติผ่านการเรียนรู้ของเครื่องหากเป็นไปได้ แม้ว่าตัวเลือกนี้จะถูกปิดใช้งาน แต่ก็สามารถเปิดใช้งานได้ทั้งอินสแตนซ์นี้" +activeEmailValidationDescription: "เปิดใช้งานการตรวจสอบที่อยู่อีเมลให้มีความเข้มงวดยิ่งขึ้น ซึ่งอาจจะรวมไปถึงการตรวจสอบที่อยู่อีเมล์ที่ใช้แล้วทิ้งและโดยให้พิจารณาว่าสามารถสื่อสารด้วยได้หรือไม่ เมื่อไม่เลือกระบบจะตรวจสอบเฉพาะรูปแบบของอีเมลเท่านั้น" +navbar: "แถบนำทาง" +shuffle: "สลับ" +account: "บัญชีผู้ใช้" +move: "ย้าย" +_sensitiveMediaDetection: + description: "ลดความพยายามในการดูแลเซิร์ฟเวอร์ผ่านการจดจำสื่อ NSFW โดยอัตโนมัติผ่านการเรียนรู้ของเครื่อง การทำสิ่งนี้อาจจะเพิ่มภาระบนเซิร์ฟเวอร์เล็กน้อย" + sensitivity: "การตรวจจับความไว" + sensitivityDescription: "การลดความไวนั้นจะนำไปสู่การตรวจจับที่ผิดพลาดน้อยลง (ผลบวกที่ผิดพลาด) แต่ในขณะที่การเพิ่มนั้นจะนำไปสู่การตรวจหาที่พลาดน้อยลง (ผลลบเท็จ)" + setSensitiveFlagAutomatically: "ทำเครื่องหมายว่าเป็น NSFW" + setSensitiveFlagAutomaticallyDescription: "ผลลัพธ์ของการตรวจจับภายในนั้นจะยังคงอยู่ ถึงแม้ว่าจะปิดตัวเลือกนี้" + analyzeVideos: "เปิดใช้งานวิเคราะห์ของวิดีโอ" + analyzeVideosDescription: "การวิเคราะห์วิดีโอนอกเหนือจากรูปภาพนั้น การทำสิ่งนี้จะทำให้เพิ่มภาระบนเซิร์ฟเวอร์เล็กน้อย" +_emailUnavailable: + used: "ที่อยู่อีเมลนี้ได้ถูกใช้ไปแล้ว" + format: "รูปแบบของที่อยู่อีเมลนี้ไม่ถูกต้อง" + disposable: "ที่อยู่อีเมลที่ใช้แล้วทิ้งนั้นไม่สามารถใช้ได้" + mx: "เซิร์ฟเวอร์อีเมลนี้ไม่ถูกต้อง" + smtp: "เซิร์ฟเวอร์อีเมลนี้ไม่มีการตอบสนอง" +_ffVisibility: + public: "เผยแพร่" + followers: "ปรากฏให้แก่ผู้ติดตามเท่านั้น" + private: "ส่วนตัว" +_signup: + almostThere: "เกือบจะมี" + emailAddressInfo: "โปรดกรอกอีเมลของคุณ มันจะไม่เปิดเผยต่อสาธารณะ" + emailSent: "เราได้ส่งอีเมลยืนยันไปยังที่อยู่อีเมลของคุณแล้วนะ ({email}) โปรดคลิกลิงก์ที่รวมไว้เพื่อสร้างบัญชีให้เสร็จสิ้น" +_accountDelete: + accountDelete: "ลบบัญชีผู้ใช้" + mayTakeTime: "เนื่องจากการลบบัญชีนี้จะเป็นกระบวนการที่ต้องใช้ทรัพยากรมาก จึงอาจจะต้องใช้เวลาสักครู่ถึงจะเสร็จสมบูรณ์ ทั้งนี้ขึ้นอยู่กับจำนวนเนื้อหาที่คุณสร้างและจำนวนไฟล์ที่คุณอัปโหลดนะ" + sendEmail: "เมื่อการลบบัญชีนี้เสร็จสิ้น เราอาจจะส่งอีเมลไปยังที่อยู่อีเมลของคุณที่เคยลงทะเบียนไว้กับบัญชีนี้นะ" + requestAccountDelete: "ร้องขอให้ลบบัญชี" + started: "การลบได้เริ่มต้นขึ้น" + inProgress: "ปัจจุบันกำลังดำเนินการลบอยู่" +_ad: + back: "ย้อนกลับ" + reduceFrequencyOfThisAd: "แสดงโฆษณานี้ให้น้อยลง" +_forgotPassword: + enterEmail: "ป้อนที่อยู่อีเมลที่คุณเคยใช้ในการลงทะเบียนไว้ ลิงก์ที่คุณสามารถรีเซ็ตรหัสผ่านได้นั้นจะถูกส่งไปนะ" + ifNoEmail: "ถ้าหากคุณไม่ได้ใช้อีเมลระหว่างการลงทะเบียน กรุณาติดต่อผู้ดูแลระบบอินสแตนซ์แทนนะ" + contactAdmin: "อินสแตนซ์นี้ไม่รองรับการใช้งานที่อยู่อีเมลนี้ กรุณาติดต่อผู้ดูแลระบบอินสแตนซ์เพื่อรีเซ็ตรหัสผ่านของคุณแทน" +_gallery: + my: "แกลลอรี่ของฉัน" + liked: "โพสต์ที่ถูกใจ" + like: "ชื่นชอบ" + unlike: "ลบไลค์" +_email: + _follow: + title: "ได้ติดตามคุณ" + _receiveFollowRequest: + title: "คุณได้รับคำขอติดตาม" +_plugin: + install: "ติดตั้งปลั๊กอิน" + installWarn: "กรุณาอย่าติดตั้งปลั๊กอินที่ไม่น่าเชื่อถือนะคะ" + manage: "จัดการปลั๊กอิน" +_preferencesBackups: + list: "สร้างการสำรองข้อมูล" + saveNew: "บันทึกใหม่" + loadFile: "โหลดจากไฟล์" + apply: "นำไปใช้กับอุปกรณ์นี้" + save: "บันทึก" + inputName: "กรุณาป้อนชื่อสำหรับข้อมูลสำรองนี้" + cannotSave: "การบันทึกล้มเหลว" + nameAlreadyExists: "มีข้อมูลสำรองชื่อ \"{name}\" นี้อยู่แล้ว กรุณาป้อนชื่ออื่นนะ" + applyConfirm: "คุณต้องการใช้ข้อมูลสำรอง \"{name}\" กับอุปกรณ์นี้อย่างงั้นจริงหรอ การตั้งค่าที่มีอยู่ของอุปกรณ์นี้จะถูกเขียนทับนะ" + saveConfirm: "บันทึกข้อมูลสำรองเป็น {name} มั้ย?" + deleteConfirm: "ลบข้อมูลสำรอง {name} มั้ย?" + renameConfirm: "เปลี่ยนชื่อข้อมูลสำรองนี้จาก \"{old}\" เป็น \"{new}\" หรือป่าว" + noBackups: "ไม่มีข้อมูลสำรองนะ คุณสามารถสำรองข้อมูลการตั้งค่าไคลเอนต์ของคุณบนเซิร์ฟเวอร์นี้โดยใช้ \"สร้างการสำรองข้อมูลใหม่\"ได้นะ" + createdAt: "สร้างเมื่อ: {date} {time}" + updatedAt: "อัปเดตเมื่อ: {date} {time}" + cannotLoad: "การโหลดล้มเหลว" + invalidFile: "รูปแบบไฟล์ไม่ถูกต้องนะ" +_registry: + scope: "สโคป" + key: "คีย์" + keys: "คีย์" + domain: "โดเมน" + createKey: "สร้างคีย์" +_aboutMisskey: + about: "Misskey เป็นซอฟต์แวร์โอเพ่นซอร์สที่ถูกพัฒนาโดย Syuilo ตั้งแต่ปี 2014" + contributors: "ผู้สนับสนุนหลัก" + allContributors: "ผู้มีส่วนร่วมทั้งหมด" + source: "ซอร์สโค้ด" + translation: "รับแปลภาษา Calckey" + donate: "บริจาคให้กับ Calckey" + morePatrons: "เราขอขอบคุณสำหรับความช่วยเหลือจากผู้ช่วยอื่นๆ ที่ไม่ได้ระบุไว้ที่นี่นะ ขอขอบคุณ! 🥰" + patrons: "สมาชิกพันธมิตร" +_nsfw: + respect: "ซ่อนสื่อ NSFW" + ignore: "อย่าซ่อนสื่อ NSFW" + force: "ซ่อนสื่อทั้งหมด" +_mfm: + cheatSheet: "โค้ด MFM Cheat Sheet" + intro: "MFM เป็นภาษามาร์กอัปพิเศษเฉพาะของ Calckey ที่สามารถใช้ได้ในหลายที่ คุณยังสามารถดูรายการไวยากรณ์ MFM ที่มีอยู่ทั้งหมดได้ที่นี่นะ" + dummy: "Calckey ขยายโลกของ Fediverse" + mention: "กล่าวถึง" + mentionDescription: "คุณสามารถระบุผู้ใช้โดยใช้ At-Symbol และชื่อผู้ใช้ได้นะ" + hashtag: "แฮชแท็ก" + hashtagDescription: "คุณสามารถระบุชื่อแฮชแท็กได้โดยใช้เครื่องหมายตัวเลขและข้อความได้นะ" + url: "URL" + urlDescription: "สามารถแสดง URL ได้นะ" + link: "ลิงก์" + linkDescription: "เจาะจงเฉพาะ ส่วนของข้อความที่สามารถแสดงเป็น URL ได้" + bold: "ตัวหนา" + boldDescription: "ไฮไลท์ตัวอักษรโดยทำให้หนาขึ้น" + small: "ขนาดเล็ก" + smallDescription: "แสดงผลเนื้อหาขนาดเล็กและบาง" + center: "เซ็นเตอร์" + centerDescription: "แสดงผลเนื้อหาเป็นศูนย์กลาง" + inlineCode: "โค้ด (อินไลน์)" + inlineCodeDescription: "แสดงผลการเน้นไวยากรณ์แบบอินไลน์สำหรับโค้ด (โปรแกรม)" + blockCode: "โค้ด (บล็อก)" + blockCodeDescription: "แสดงผลการเน้นไวยากรณ์สำหรับโค้ดหลายบรรทัด (โปรแกรม) ในบล็อก" + inlineMath: "คณิต (อินไลน์)" + inlineMathDescription: "แสดงผลสูตรคณิต (KaTeX) ในบรรทัด" + blockMath: "คณิต (บล็อก)" + blockMathDescription: "แสดงผลสูตรคณิตหลายบรรทัด (KaTeX) ในบล็อก" + quote: "อ้างคำพูด" + quoteDescription: "แสดงผลเนื้อหาเป็นใบเสนอราคา" + emoji: "กำหนดอีโมจิเอง" + emojiDescription: "โดยล้อมรอบชื่ออีโมจิที่กำหนดเองด้วยเครื่องหมายทวิภาค จะสามารถแสดงผลอีโมจิที่กำหนดเองได้" + search: "ค้นหา" + searchDescription: "แสดงผลกล่องค้นหาพร้อมกับข้อความที่ป้อนไว้ล่วงหน้า" + flip: "พลิก" + flipDescription: "พลิกเนื้อหาในแนวนอนหรือแนวตั้ง" + jelly: "แอนิเมชั่น (เยลลี่)" + jellyDescription: "ให้เนื้อหาเป็นแอนิเมชั่นเหมือนเยลลี่" + tada: "แอนิเมชั่น (ธาดา)" + tadaDescription: "ให้เนื้อหาเป็นแอนิเมชั่นเหมือน \"ทาด้า!\"" + jump: "อนิเมชั่น (กระโดด)" + jumpDescription: "ให้เนื้อหามีภาพเคลื่อนไหวแบบกระโดด" + bounce: "อนิเมชั่น (เด้ง)" + bounceDescription: "ให้เนื้อหามีอนิเมชั่นเด้ง" + shake: "อนิเมชั่น (เขย่า)" + shakeDescription: "ให้เนื้อหามีภาพเคลื่อนไหวสั่น" + twitch: "แอนิเมชั่น (Twitch)" + twitchDescription: "ให้เนื้อหามีแอนิเมชั่นกระตุกอย่างแรง" + spin: "แอนิเมชั่น (สปิน)" + spinDescription: "ให้เนื้อหาเป็นภาพเคลื่อนไหวแบบหมุน" + x2: "ขนาดใหญ่" + x2Description: "แสดงเนื้อหาที่ใหญ่ขึ้น" + x3: "ใหญ่มาก" + x3Description: "แสดงเนื้อหาอีเว้นท์ที่ใหญ่ขึ้น" + x4: "ใหญ่อย่างไม่น่าเชื่อ" + x4Description: "แสดงผลเนื้อหาที่ใหญ่กว่าใหญ่กว่าขนาดใหญ่" + blur: "เบลอ" + blurDescription: "เบลอเนื้อหา จะแสดงผลอย่างชัดเจนต่อเมื่อวางเมาส์เหนือ" + font: "ตัวอักษร" + fontDescription: "ตั้งค่าตัวอักษรเพื่อแสดงเนื้อหาใน" + rainbow: "สายรุ้ง" + rainbowDescription: "ทำให้เนื้อหานั้นปรากฏเป็นสีรุ้ง" + sparkle: "กลิตเตอร์" + sparkleDescription: "ให้เนื้อหานั้นมีเอฟเฟกต์แบบอนุภาคประกาย" + rotate: "หมุนหน้าจอ" + rotateDescription: "เปลี่ยนเนื้อหาตามด้วยมุมที่ระบุไว้" + plain: "เรียบง่าย" + plainDescription: "ปิดการใช้งานเอฟเฟกต์ของ MFM ทั้งหมดที่มีอยู่ในเอฟเฟกต์ MFM นี้" +_instanceTicker: + none: "ไม่ต้องแสดง" + remote: "แสดงสำหรับผู้ใช้ระยะไกล" + always: "แสดงเสมอ" +_serverDisconnectedBehavior: + reload: "โหลดใหม่โดยอัตโนมัติ" + dialog: "แสดงกล่องโต้ตอบคำเตือน" + quiet: "แสดงคำเตือนที่ไม่เป็นการรบกวน" +_channel: + create: "สร้างแชนแนลใหม่" + edit: "แก้ไขแชนแนล" + setBanner: "เซตแบนเนอร์" + removeBanner: "ลบแบนเนอร์" + featured: "เทรนด์" + owned: "เจ้าของ" + following: "ติดตามแล้ว" + usersCount: "{n} ผู้เข้าร่วม" + notesCount: "{n} โน้ต" +_menuDisplay: + sideFull: "ด้านข้าง" + sideIcon: "ด้านข้าง (ไอคอน)" + top: "ท็อป" + hide: "ซ่อน" +_wordMute: + muteWords: "ปิดเสียงคำ" + muteWordsDescription: "คั่นด้วยช่องว่างสำหรับเงื่อนไข AND หรือด้วยการขึ้นบรรทัดใหม่สำหรับเงื่อนไข OR นะ" + muteWordsDescription2: "ล้อมรอบคีย์เวิร์ดด้วยเครื่องหมายทับเพื่อใช้นิพจน์ทั่วไป" + softDescription: "ซ่อนโน้ตให้ตรงตามเงื่อนไขที่ตั้งไว้จากไทม์ไลน์" + hardDescription: "ป้องกันไม่ให้โน้ตย่อที่ตรงตามเงื่อนไขที่ตั้งไว้ไม่ให้ถูกเพิ่มลงในไทม์ไลน์ นอกจากนี้ โน้ตเหล่านี้จะไม่ถูกเพิ่มลงในไทม์ไลน์แม้ว่าจะมีการเปลี่ยนแปลงเงื่อนไขยังไงก็ตาม" + soft: "ซอฟ" + hard: "ยาก" + mutedNotes: "ปิดเสียงโน้ต" +_instanceMute: + instanceMuteDescription: "การดำเนินการนี้จะปิดเสียง\"โน้ต/รีโน้ต\"จากอินสแตนซ์ที่อยู่ในรายการ รวมถึงบันทึกของผู้ใช้ที่ตอบกลับผู้ใช้จากอินสแตนซ์ที่ปิดเสียง" + instanceMuteDescription2: "คั่นด้วยการขึ้นบรรทัดใหม่" + title: "ซ่อนโน้ตจากอินสแตนซ์ที่มีอยู่ในรายการ" + heading: "รายชื่ออินสแตนซ์ที่ถูกปิดเสียง" +_theme: + explore: "สำรวจธีม" + install: "ติดตั้งธีม" + manage: "จัดการธีม" + code: "โค้ดธีม" + description: "รายละเอียด" + installed: "{name} ได้รับการติดตั้ง" + installedThemes: "ธีมที่ติดตั้ง" + builtinThemes: "ธีมในตัว" + alreadyInstalled: "ธีมนี้ได้รับการติดตั้งแล้ว" + invalid: "รูปแบบของธีมนี้ไม่ถูกต้องนะ" + make: "ทำธีม" + base: "ฐาน" + addConstant: "เพิ่มค่าคงที่" + constant: "ตัวแปร" + defaultValue: "ค่าเริ่มต้น" + color: "สี" + refProp: "อ้างอิงคุณสมบัติ" + refConst: "อ้างอิงค่าคงที่" + key: "คีย์" + func: "ฟังก์ชัน" + funcKind: "ประเภทฟังก์ชัน" + argument: "อากิวเม้นต์" + basedProp: "ทรัพย์สินอ้างอิง" + alpha: "ความทึบแสง" + darken: "มืดลง" + lighten: "สว่าง" + inputConstantName: "ป้อนชื่อสำหรับค่าคงที่นี้" + importInfo: "ถ้าหากต้องการป้อนโค้ดที่นี่ คุณยังสามารถนำเข้าไปยังโปรแกรมแก้ไขธีมได้" + deleteConstantConfirm: "คุณต้องการลบค่าคงที่ {const} หรือป่าว?" + keys: + accent: "เน้น" + bg: "ภาพพื้นหลัง" + fg: "ข้อความ" + focus: "โฟกัส" + indicator: "ตัวบ่งชี้" + panel: "แผงควบคุม" + shadow: "เงา" + header: "ส่วนหัว" + navBg: "พื้นหลังแถบด้านข้าง" + navFg: "ข้อความแถบด้านข้าง" + mention: "กล่าวถึง" + renote: "รีโน้ต" + divider: "ตัวแบ่ง" +_sfx: + note: "หมายเหตุ" + notification: "การเเจ้งเตือน" + chat: "แชท" +_widgets: + notifications: "การเเจ้งเตือน" + timeline: "ไทม์ไลน์" + activity: "กิจกรรม" + federation: "สหพันธ์" + jobQueue: "คิวงาน" +_cw: + show: "โหลดเพิ่มเติม" +_visibility: + home: "หน้าแรก" + followers: "ผู้ติดตาม" +_profile: + name: "ชื่อ" + username: "ชื่อผู้ใช้" +_exportOrImport: + followingList: "กำลังติดตาม" + muteList: "ปิดเสียง" + blockingList: "บล็อค" + userLists: "รายการ" +_charts: + federation: "สหพันธ์" +_timelines: + home: "หน้าแรก" +_pages: + blocks: + image: "รูปภาพ" + script: + categories: + list: "รายการ" + blocks: + _join: + arg1: "รายการ" + _randomPick: + arg1: "รายการ" + _dailyRandomPick: + arg1: "รายการ" + _seedRandomPick: + arg2: "รายการ" + _pick: + arg1: "รายการ" + _listLen: + arg1: "รายการ" + types: + array: "รายการ" +_notification: + youWereFollowed: "ได้ติดตามคุณ" + _types: + follow: "กำลังติดตาม" + mention: "กล่าวถึง" + renote: "รีโน้ต" + quote: "อ้างคำพูด" + reaction: "รีแอคชั่น" + _actions: + reply: "ตอบกลับ" + renote: "รีโน้ต" +_deck: + _columns: + notifications: "การเเจ้งเตือน" + tl: "ไทม์ไลน์" + antenna: "เสาอากาศ" + list: "รายการ" + mentions: "พูดถึง" diff --git a/fe_calckey/frontend/locales/tr-TR.yml b/fe_calckey/frontend/locales/tr-TR.yml new file mode 100644 index 0000000..7dee4fd --- /dev/null +++ b/fe_calckey/frontend/locales/tr-TR.yml @@ -0,0 +1,63 @@ +--- +_lang_: "Türkçe" +introMisskey: "Açık kaynaklı bir dağıtılmış mikroblog hizmeti olan Calckey'e hoş geldiniz.\nMisskey, neler olup bittiğini paylaşmak ve herkese sizden bahsetmek için \"notlar\" oluşturmanıza olanak tanıyan, açık kaynaklı, dağıtılmış bir mikroblog hizmetidir.\nHerkesin notlarına kendi tepkilerinizi hızlıca eklemek için \"Tepkiler\" özelliğini de kullanabilirsiniz👍.\nYeni bir dünyayı keşfedin🚀." +monthAndDay: "{month}Ay {day}Gün" +search: "Arama" +notifications: "Bildirim" +username: "Kullanıcı Adı" +password: "Şifre" +forgotPassword: "şifremi unuttum" +ok: "TAMAM" +gotIt: "Anladım" +cancel: "İptal" +enterUsername: "Kullanıcı adınızı giriniz" +noNotes: "Notlar mevcut değil." +noNotifications: "Bildirim bulunmuyor" +settings: "Ayarlar" +basicSettings: "Temel Ayarlar" +otherSettings: "Diğer Ayarlar" +openInWindow: "Bir pencere ile aç" +profile: "Profil" +timeline: "Zaman çizelgesi" +noAccountDescription: "Bu kullanıcı henüz biyografisini yazmadı" +login: "Giriş Yap " +logout: "Çıkış Yap" +signup: "Kayıt Ol" +uploading: "Yükleniyor" +users: "Kullanıcı" +addUser: "Kullanıcı Ekle" +favorite: "Favoriler" +favorites: "Favoriler" +unfavorite: "Favorilerden Kaldır" +favorited: "Favorilerime eklendi." +alreadyFavorited: "Zaten favorilerinizde kayıtlı." +pin: "Sabitlenmiş" +unpin: "Sabitlemeyi kaldır" +copyContent: "İçeriği kopyala" +copyLink: "Bağlantıyı Kopyala" +delete: "Sil" +deleteAndEdit: "Sil ve yeniden düzenle" +deleteAndEditConfirm: "Bu notu silip yeniden düzenlemek istiyor musunuz? Bu nota ilişkin tüm Tepkiler, Yeniden Notlar ve Yanıtlar da silinecektir." +addToList: "Listeye ekle" +sendMessage: "Mesaj Gönder" +copyUsername: "Kullanıcı Adını Kopyala" +searchUser: "Kullanıcıları ara" +pinned: "Sabitlenmiş" +remove: "Sil" +smtpUser: "Kullanıcı Adı" +smtpPass: "Şifre" +user: "Kullanıcı" +searchByGoogle: "Arama" +_mfm: + search: "Arama" +_sfx: + notification: "Bildirim" +_widgets: + notifications: "Bildirim" + timeline: "Zaman çizelgesi" +_profile: + username: "Kullanıcı Adı" +_deck: + _columns: + notifications: "Bildirim" + tl: "Zaman çizelgesi" diff --git a/fe_calckey/frontend/locales/ug-CN.yml b/fe_calckey/frontend/locales/ug-CN.yml new file mode 100644 index 0000000..a750454 --- /dev/null +++ b/fe_calckey/frontend/locales/ug-CN.yml @@ -0,0 +1,6 @@ +--- +_lang_: "ياپونچە" +search: "ئىزدەش" +searchByGoogle: "ئىزدەش" +_mfm: + search: "ئىزدەش" diff --git a/fe_calckey/frontend/locales/uk-UA.yml b/fe_calckey/frontend/locales/uk-UA.yml new file mode 100644 index 0000000..712c0fd --- /dev/null +++ b/fe_calckey/frontend/locales/uk-UA.yml @@ -0,0 +1,1455 @@ +--- +_lang_: "Українська" +headlineMisskey: "Мережа об'єднана записами" +introMisskey: "Ласкаво просимо! Calckey - децентралізована служба мікроблогів з відкритим кодом.\nСтворюйте \"нотатки\", щоб поділитися тим, що відбувається, і розповісти всім про себе 📡\nЗа допомогою \"реакцій\" ви також можете швидко висловити свої почуття щодо нотаток інших 👍\nДосліджуймо новий світ! 🚀" +monthAndDay: "{month}/{day}" +search: "Пошук" +notifications: "Сповіщення" +username: "Ім'я користувача" +password: "Пароль" +forgotPassword: "Я забув пароль" +fetchingAsApObject: "Отримуємо з федіверсу" +ok: "OK" +gotIt: "Зрозуміло!" +cancel: "Скасувати" +enterUsername: "Введіть ім'я користувача" +renotedBy: "Поширено {user}" +noNotes: "Немає нотаток" +noNotifications: "Немає сповіщень" +instance: "Інстанс" +settings: "Налаштування" +basicSettings: "Основні налаштування" +otherSettings: "Інші налаштування" +openInWindow: "Відкрити у вікні" +profile: "Профіль" +timeline: "Стрічка" +noAccountDescription: "Цей користувач ще нічого не написав про себе" +login: "Увійти" +loggingIn: "Здійснюємо вхід..." +logout: "Вийти" +signup: "Реєстрація" +uploading: "Завантаження..." +save: "Зберегти" +users: "Користувачі" +addUser: "Додати користувача" +favorite: "Обране" +favorites: "Обране" +unfavorite: "Видалити з обраного" +favorited: "Додано до вподобаних." +alreadyFavorited: "Вже додано до вподобаних." +cantFavorite: "Неможливо вподобати." +pin: "Закріпити" +unpin: "Відкріпити" +copyContent: "Скопіювати контент" +copyLink: "Скопіювати посилання" +delete: "Видалити" +deleteAndEdit: "Видалити й редагувати" +deleteAndEditConfirm: "Ви впевнені, що хочете видалити цю нотатку та відредагувати її? Ви втратите всі реакції, поширення та відповіді на неї." +addToList: "Додати до списку" +sendMessage: "Надіслати повідомлення" +copyUsername: "Скопіювати ім’я користувача" +searchUser: "Пошук користувачів" +reply: "Відповісти" +loadMore: "Показати більше" +showMore: "Показати більше" +showLess: "Закрити" +youGotNewFollower: "Новий підписник" +receiveFollowRequest: "Отримано запит на підписку" +followRequestAccepted: "Підписка прийнята" +mention: "Згадка" +mentions: "Згадки" +directNotes: "Прямі повідомлення" +importAndExport: "Імпорт та експорт" +import: "Імпорт" +export: "Експорт" +files: "Файли" +download: "Завантажити" +driveFileDeleteConfirm: "Ви впевнені, що хочете видалити файл {name}? Нотатки із цим файлом також буде видалено." +unfollowConfirm: "Ви впевнені, що хочете відписатися від {name}?" +exportRequested: "Експортування розпочато. Це може зайняти деякий час. Після завершення експорту отриманий файл буде додано на диск." +importRequested: "Імпортування розпочато. Це може зайняти деякий час." +lists: "Списки" +noLists: "Немає списків" +note: "Запис" +notes: "Записи" +following: "Підписки" +followers: "Підписники" +followsYou: "Підписаний(-а) на вас" +createList: "Створити список" +manageLists: "Управління списками" +error: "Помилка" +somethingHappened: "Щось пішло не так" +retry: "Спробувати знову" +pageLoadError: "Помилка при завантаженні сторінки" +pageLoadErrorDescription: "Зазвичай це пов’язано з помилками мережі або кешем браузера. Очистіть кеш або почекайте трохи й спробуйте ще раз." +serverIsDead: "Відповіді від сервера немає. Зачекайте деякий час і повторіть спробу." +youShouldUpgradeClient: "Перезавантажте та використовуйте нову версію клієнта, щоб переглянути цю сторінку." +enterListName: "Введіть назву списку" +privacy: "Конфіденційність" +makeFollowManuallyApprove: "Підтверджувати підписників уручну" +defaultNoteVisibility: "Видимість за замовчуванням" +follow: "Підписатись" +followRequest: "Запит на підписку" +followRequests: "Запити на підписку" +unfollow: "Відписатись" +followRequestPending: "Очікуючі запити на підписку" +enterEmoji: "Введіть емодзі" +renote: "Поширити" +unrenote: "Відміна поширення" +renoted: "Поширити запис." +cantRenote: "Неможливо поширити." +cantReRenote: "Поширення не можливо поширити." +quote: "Цитата" +pinnedNote: "Закріплений запис" +pinned: "Закріпити" +you: "Ви" +clickToShow: "Натисніть для перегляду" +sensitive: "NSFW" +add: "Додати" +reaction: "Реакції" +reactionSetting: "Налаштування реакцій" +reactionSettingDescription2: "Перемістити щоб змінити порядок, Клацнути мишою щоб видалити, Натиснути \"+\" щоб додати." +rememberNoteVisibility: "Пам’ятати параметри видимісті" +attachCancel: "Видалити вкладення" +markAsSensitive: "Позначити як NSFW" +unmarkAsSensitive: "Зняти позначку NSFW" +enterFileName: "Введіть ім'я файлу" +mute: "Ігнорувати" +unmute: "Показувати" +block: "Заблокувати" +unblock: "Розблокувати" +suspend: "Призупинити" +unsuspend: "Відновити" +blockConfirm: "Ви впевнені, що хочете заблокувати цей акаунт?" +unblockConfirm: "Ви впевнені, що хочете розблокувати цей акаунт?" +suspendConfirm: "Ви впевнені, що хочете призупинити цей акаунт?" +unsuspendConfirm: "Ви впевнені, що хочете відновити цей акаунт?" +selectList: "Виберіть список" +selectAntenna: "Виберіть антену" +selectWidget: "Виберіть віджет" +editWidgets: "Редагувати віджети" +editWidgetsExit: "Готово" +customEmojis: "Кастомні емоджі" +emoji: "Емоджі" +emojis: "Емоджі" +emojiName: "Назва емоджі" +emojiUrl: "URL емодзі" +addEmoji: "Додати емодзі" +settingGuide: "Рекомендована конфігурація" +cacheRemoteFiles: "Кешувати дані з інших інстансів" +cacheRemoteFilesDescription: "Якщо кешування вимкнено, віддалені файли завантажуються безпосередньо з віддаленого інстансу. Це зменшує використання сховища, але збільшує трафік, оскільки не генеруются ескізи." +flagAsBot: "Акаунт бота" +flagAsBotDescription: "Ввімкніть якщо цей обліковий запис використовується ботом. Ця опція позначить обліковий запис як бота. Це потрібно щоб виключити безкінечну інтеракцію між ботами а також відповідного підлаштування Calckey." +flagAsCat: "Акаунт кота" +flagAsCatDescription: "Ввімкніть, щоб позначити, що обліковий запис є котиком." +flagShowTimelineReplies: "Показувати відповіді на нотатки на часовій шкалі" +flagShowTimelineRepliesDescription: "Показує відповіді користувачів на нотатки інших користувачів на часовій шкалі." +autoAcceptFollowed: "Автоматично приймати запити на підписку від користувачів, на яких ви підписані" +addAccount: "Додати акаунт" +loginFailed: "Не вдалося увійти" +showOnRemote: "Переглянути в оригіналі" +general: "Загальне" +wallpaper: "Шпалери" +setWallpaper: "Встановити шпалери" +removeWallpaper: "Прибрати шпалери" +searchWith: "Пошук: {q}" +youHaveNoLists: "У вас немає списків" +followConfirm: "Підписатися на {name}?" +proxyAccount: "Проксі-акаунт" +proxyAccountDescription: "Обліковий запис проксі – це обліковий запис, який діє як віддалений підписник для користувачів за певних умов. Наприклад, коли користувач додає віддаленого користувача до списку, активність віддаленого користувача не буде доставлена на сервер, якщо жоден локальний користувач не стежить за цим користувачем, то замість нього буде використовуватися обліковий запис проксі-сервера." +host: "Хост" +selectUser: "Виберіть користувача" +recipient: "Отримувач" +annotation: "Коментарі" +federation: "Федіверс" +instances: "Інстанс" +registeredAt: "Приєднався(лась)" +latestRequestSentAt: "Останній запит надіслано" +latestRequestReceivedAt: "Останній запит прийнято" +latestStatus: "Останній статус" +storageUsage: "Використання простору" +charts: "Графіки" +perHour: "Щогодинно" +perDay: "Щоденно" +stopActivityDelivery: "Припинити розсилання активності" +blockThisInstance: "Заблокувати цей інстанс" +operations: "Операції" +software: "Програмне забезпечення" +version: "Версія" +metadata: "Метадані" +monitor: "Монітор" +jobQueue: "Черга завдань" +cpuAndMemory: "ЦП та пам'ять" +network: "Мережа" +disk: "Диск" +instanceInfo: "Про цей інстанс" +statistics: "Статистика" +clearQueue: "Очистити чергу" +clearQueueConfirmTitle: "Ви впевнені, що хочете очистити чергу?" +clearQueueConfirmText: "Будь-які невідправлені нотатки, що залишилися в черзі, не будуть передані. Зазвичай ця операція НЕ потрібна." +clearCachedFiles: "Очистити кеш" +clearCachedFilesConfirm: "Ви впевнені, що хочете видалити всі кешовані файли?" +blockedInstances: "Заблоковані інстанси" +blockedInstancesDescription: "Вкажіть інстанси, які потрібно заблокувати. Перелічені інстанси більше не зможуть спілкуватися з цим інстансом." +muteAndBlock: "Заглушення і блокування" +mutedUsers: "Заглушені користувачі" +blockedUsers: "Заблоковані користувачі" +noUsers: "Немає користувачів" +editProfile: "Редагувати обліковий запис" +noteDeleteConfirm: "Ви дійсно хочете видалити цей запис?" +pinLimitExceeded: "Більше записів не можна закріпити" +intro: "Встановлення Calckey завершено! Будь ласка, створіть обліковий запис адміністратора." +done: "Готово" +processing: "Обробка" +preview: "Попередній перегляд" +default: "За умовчанням" +noCustomEmojis: "Немає нетипових емоджі" +noJobs: "Немає завдань" +federating: "Федерується" +blocked: "Заблоковано" +suspended: "Призупинено" +all: "Всі" +subscribing: "Підписка" +publishing: "Публікація" +notResponding: "Не відповідає" +instanceFollowing: "Підписка на інстанс" +instanceFollowers: "Підписники інстансу" +instanceUsers: "Користувачі цього інстансу" +changePassword: "Змінити пароль" +security: "Безпека" +retypedNotMatch: "Введені дані не збігаються." +currentPassword: "Поточний пароль" +newPassword: "Новий пароль" +newPasswordRetype: "Новий пароль (повторно)" +attachFile: "Прикріпити файл" +more: "Бiльше!" +featured: "Популярні" +usernameOrUserId: "Ім'я або ID користувача" +noSuchUser: "Користувача не знайдено" +lookup: "Пошук" +announcements: "Оголошення" +imageUrl: "Посилання на зображення" +remove: "Видалити" +removed: "Видалено" +removeAreYouSure: "Ви впевнені, що хочете видалити \"{x}\"?" +deleteAreYouSure: "Ви впевнені, що хочете видалити \"{x}\"?" +resetAreYouSure: "Справді скинути?" +saved: "Збережено" +messaging: "Чати" +upload: "Завантажити" +keepOriginalUploading: "Зберегти оригінальне зображення" +keepOriginalUploadingDescription: "Зберігає початково завантажене зображення як є. Якщо вимкнено, версія для відображення в Інтернеті буде створена під час завантаження." +fromDrive: "З диска" +fromUrl: "З посилання" +uploadFromUrl: "Завантажити з посилання" +uploadFromUrlDescription: "Посилання на файл для завантаження" +uploadFromUrlRequested: "Завантаження розпочалось" +uploadFromUrlMayTakeTime: "Завантаження може зайняти деякий час." +explore: "Огляд" +messageRead: "Прочитано" +noMoreHistory: "Подальшої історії немає" +startMessaging: "Розпочати діалог" +nUsersRead: "Прочитали {n}" +agreeTo: "Я погоджуюсь з {0}" +tos: "Умови використання" +start: "Розпочати" +home: "Домівка" +remoteUserCaution: "Інформація може бути неповною, оскільки це віддалений користувач." +activity: "Активність" +images: "Зображення" +birthday: "День народження" +yearsOld: "{age} років" +registeredDate: "Приєднався(лась)" +location: "Локація" +theme: "Тема" +themeForLightMode: "Світла тема" +themeForDarkMode: "Темна тема" +light: "Світла" +dark: "Темна" +lightThemes: "Світлі теми" +darkThemes: "Темні теми" +syncDeviceDarkMode: "Синхронізувати темний режим із налаштуваннями вашого пристрою" +drive: "Диск" +fileName: "Ім'я файлу" +selectFile: "Вибрати файл" +selectFiles: "Вибрати файли" +selectFolder: "Вибрати теку" +selectFolders: "Вибрати теки" +renameFile: "Перейменувати файл" +folderName: "Ім'я теки" +createFolder: "Створити теку" +renameFolder: "Перейменувати теку" +deleteFolder: "Видалити теку" +addFile: "Додати файл" +emptyDrive: "Диск порожній" +emptyFolder: "Тека порожня" +unableToDelete: "Видалення неможливе" +inputNewFileName: "Введіть ім'я нового файлу" +inputNewDescription: "Введіть новий заголовок" +inputNewFolderName: "Введіть ім'я нової теки" +circularReferenceFolder: "Ви намагаєтесь перемістити папку в її підпапку." +hasChildFilesOrFolders: "Ця тека не порожня і не може бути видалена" +copyUrl: "Копіювати URL" +rename: "Перейменувати" +avatar: "Аватар" +banner: "Банер" +nsfw: "NSFW" +whenServerDisconnected: "Коли зв’язок із сервером втрачено" +disconnectedFromServer: "Зв’язок із сервером було перервано" +reload: "Оновити" +doNothing: "Нічого не робити" +reloadConfirm: "Перезавантажити стрічку?" +watch: "Стежити" +unwatch: "Не стежити" +accept: "Прийняти" +reject: "Відхилити" +normal: "Нормальний" +instanceName: "Назва інстансу" +instanceDescription: "Описання інстансу" +maintainerName: "Ім'я адміністратора" +maintainerEmail: "Email адміністратора" +tosUrl: "URL умов використання" +thisYear: "Рік" +thisMonth: "Місяць" +today: "День" +dayX: "{day}" +monthX: "{month}" +yearX: "{year}" +pages: "Сторінки" +integration: "Інтеграція" +connectService: "Під’єднати" +disconnectService: "Відключитися" +enableLocalTimeline: "Увімкнути локальну стрічку" +enableGlobalTimeline: "Увімкнути глобальну стрічку" +disablingTimelinesInfo: "Адміністратори та модератори завжди мають доступ до всіх стрічок, навіть якщо вони вимкнуті." +registration: "Реєстрація" +enableRegistration: "Дозволити реєстрацію" +invite: "Запросити" +driveCapacityPerLocalAccount: "Об'єм диска на одного локального користувача" +driveCapacityPerRemoteAccount: "Об'єм диска на одного віддаленого користувача" +inMb: "В мегабайтах" +iconUrl: "URL аватара" +bannerUrl: "URL банера" +backgroundImageUrl: "URL-адреса фонового зображення" +basicInfo: "Основна інформація" +pinnedUsers: "Закріплені користувачі" +pinnedUsersDescription: "Впишіть в список користувачів, яких хочете закріпити на сторінці \"Знайти\", ім'я в стовпчик." +pinnedPages: "Закріплені сторінки" +pinnedPagesDescription: "Введіть шляхи сторінок, які ви бажаєте закріпити на головній сторінці цього інстанса, розділені новими рядками." +pinnedClipId: "Ідентифікатор закріпленої замітки." +pinnedNotes: "Закріплена нотатка" +hcaptcha: "hCaptcha" +enableHcaptcha: "Увімкнути hCaptcha" +hcaptchaSiteKey: "Ключ сайту" +hcaptchaSecretKey: "Секретний ключ" +recaptcha: "reCAPTCHA" +enableRecaptcha: "Увімкнути reCAPTCHA" +recaptchaSiteKey: "Ключ сайту" +recaptchaSecretKey: "Секретний ключ" +avoidMultiCaptchaConfirm: "Використання кількох систем Captcha може спричинити перешкоди між ними. Бажаєте вимкнути інші активні системи Captcha? Якщо ви хочете, щоб вони залишалися ввімкненими, натисніть «Скасувати»." +antennas: "Антени" +manageAntennas: "Налаштування антен" +name: "Ім'я" +antennaSource: "Джерело антени" +antennaKeywords: "Ключові слова антени" +antennaExcludeKeywords: "Винятки" +antennaKeywordsDescription: "Розділення ключових слів пробілами для \"І\" або з нової лінійки для \"АБО\"" +notifyAntenna: "Сповіщати про нові нотатки" +withFileAntenna: "Тільки нотатки з вкладеними файлами" +enableServiceworker: "Ввімкнути ServiceWorker" +antennaUsersDescription: "Список імя користувачів в стопчик" +caseSensitive: "З урахуванням регістру" +withReplies: "Включаючи відповіді" +connectedTo: "Наступні акаунти під'єднані" +notesAndReplies: "Нотатки та відповіді" +withFiles: "Файли" +silence: "Заглушити" +silenceConfirm: "Ви впевнені, що хочете заглушити цього користувача?" +unsilence: "Не глушити" +unsilenceConfirm: "Ви впевнені, що хочете скасувати глушіння цього користувача?" +popularUsers: "Популярні користувачі" +recentlyUpdatedUsers: "Нещодавно активні користувачі" +recentlyRegisteredUsers: "Нещодавно зареєстровані користувачі" +recentlyDiscoveredUsers: "Нещодавно знайдені користувачі" +exploreUsersCount: "{count} користувачів" +exploreFediverse: "Огляд федіверсу" +popularTags: "Популярні теги" +userList: "Списки" +about: "Інформація" +aboutMisskey: "Про Calckey" +administrator: "Адмін" +token: "Токен" +twoStepAuthentication: "Двохфакторна аутентифікація" +moderator: "Модератор" +nUsersMentioned: "Згадали: {n}" +securityKey: "Ключ захисту" +securityKeyName: "Назва ключа" +registerSecurityKey: "Зареєструвати ключ захисту" +lastUsed: "Востаннє використано" +unregister: "Скасувати реєстрацію" +passwordLessLogin: "Налаштувати вхід без пароля" +resetPassword: "Скинути пароль" +newPasswordIs: "Новий пароль: {password}" +reduceUiAnimation: "Зменшити анімацію інтерфейсу" +share: "Поділитись" +notFound: "Не знайдено" +notFoundDescription: "Сторінка за вказаною адресою не знайдена." +uploadFolder: "Місце для завантаження за замовчуванням" +cacheClear: "Очистити кеш" +markAsReadAllNotifications: "Позначити всі сповіщення як прочитані" +markAsReadAllUnreadNotes: "Позначити всі нотатки як прочитані" +markAsReadAllTalkMessages: "Позначити всі повідомлення як прочитані" +help: "Допомога" +inputMessageHere: "Введіть повідомлення тут" +close: "Закрити" +group: "Група" +groups: "Групи" +createGroup: "Створити групу" +ownedGroups: "Власні групи" +joinedGroups: "Членство в групах" +invites: "Запросити" +groupName: "Назва групи" +members: "Учасники" +transfer: "Передача" +messagingWithUser: "Чат з користувачами" +messagingWithGroup: "Чат з групою" +title: "Тема" +text: "Текст" +enable: "Увімкнути" +next: "Далі" +retype: "Введіть ще раз" +noteOf: "Нотатка {user}" +inviteToGroup: "Запрошення до групи" +quoteAttached: "Цитата" +quoteQuestion: "Ви хочете додати цитату?" +noMessagesYet: "Ще немає повідомлень" +newMessageExists: "Є нові повідомлення" +onlyOneFileCanBeAttached: "До повідомлення можна вкласти лише один файл" +signinRequired: "Будь ласка, авторизуйтесь" +invitations: "Запрошення" +invitationCode: "Код запрошення" +checking: "Перевірка…" +available: "Доступно" +unavailable: "Недоступно" +usernameInvalidFormat: "літери, цифри та _ є прийнятними" +tooShort: "Занадто короткий" +tooLong: "Занадто довгий" +weakPassword: "Слабкий пароль" +normalPassword: "Достатній пароль" +strongPassword: "Міцний пароль" +passwordMatched: "Все вірно" +passwordNotMatched: "Паролі не співпадають" +signinWith: "Увійти за допомогою {x}" +signinFailed: "Не вдалося увійти. Введені ім’я користувача або пароль неправильнi." +tapSecurityKey: "Торкніться ключа безпеки" +or: "або" +language: "Мова" +uiLanguage: "Мова інтерфейсу" +groupInvited: "Запрошення до групи" +aboutX: "Про {x}" +useOsNativeEmojis: "Використовувати емодзі ОС" +disableDrawer: "Не використовувати висувні меню" +youHaveNoGroups: "Немає груп" +joinOrCreateGroup: "Отримуйте запрошення до груп або створюйте свої власні групи." +noHistory: "Історія порожня" +signinHistory: "Історія входів" +disableAnimatedMfm: "Відключити анімації MFM" +doing: "Виконується" +category: "Категорія" +tags: "Теги" +docSource: "Джерело цього документа" +createAccount: "Створити акаунт" +existingAccount: "Існуючий обліковий запис" +regenerate: "Оновити" +fontSize: "Розмір шрифту" +noFollowRequests: "Немає запитів на підписку" +openImageInNewTab: "Відкрити зображення в новій вкладці" +dashboard: "Панель приладів" +local: "Локальні" +remote: "Віддалені" +total: "Всього" +weekOverWeekChanges: "Тиждень" +dayOverDayChanges: "Доба" +appearance: "Вигляд" +clientSettings: "Налаштування клієнта" +accountSettings: "Налаштування акаунта" +promotion: "Виділене" +promote: "Виділити" +numberOfDays: "Кількість днів" +hideThisNote: "Сховати цю нотатку" +showFeaturedNotesInTimeline: "Показувати популярні нотатки у стрічці" +objectStorage: "Object Storage" +useObjectStorage: "Використовувати object storage" +objectStorageBaseUrl: "Base URL" +objectStorageBaseUrlDesc: "Це початкова частина адреси, що використовується CDN або проксі, наприклад для S3: https://.s3.amazonaws.com, або GCS: 'https://storage.googleapis.com/'" +objectStorageBucket: "Bucket" +objectStorageBucketDesc: "Будь ласка вкажіть назву відра в налаштованому сервісі." +objectStoragePrefix: "Prefix" +objectStoragePrefixDesc: "Файли будуть зберігатись у розташуванні з цим префіксом." +objectStorageEndpoint: "Endpoint" +objectStorageEndpointDesc: "Залиште пустим при використанні AWS S3. Інакше введіть кінцевий пункт як '' або ':' слідуючи інструкціям сервісу, який використовується." +objectStorageRegion: "Region" +objectStorageRegionDesc: "Введіть регіон у формі 'xx-east-1'. Залиште пустим, якщо ваш сервіс не різниться відповідно до регіонів, або введіть 'us-east-1'." +objectStorageUseSSL: "Використовувати SSL" +objectStorageUseSSLDesc: "Вимкніть коли не використовується HTTPS для з'єднання API" +objectStorageUseProxy: "Використовувати Proxy" +objectStorageUseProxyDesc: "Вимкніть коли проксі не використовується для з'єднання ObjectStorage" +objectStorageSetPublicRead: "Встановіть 'публічне читання' при завантаженні" +serverLogs: "Журнал сервера" +deleteAll: "Видалити все" +showFixedPostForm: "Показати форму запису над стрічкою новин." +newNoteRecived: "Є нові нотатки" +sounds: "Звуки" +listen: "Слухати" +none: "Відсутній" +showInPage: "Показати на сторінці" +popout: "Від'єднати" +volume: "Гучність" +masterVolume: "Загальна гучність" +details: "Детальніше" +chooseEmoji: "Виберіть емодзі" +unableToProcess: "Не вдається завершити операцію" +recentUsed: "Нещодавні" +install: "Встановити" +uninstall: "Видалити" +installedApps: "Встановлені аплікації" +nothing: "Тут нічого немає" +installedDate: "Дата встановлення" +lastUsedDate: "Дата використання" +state: "Стан" +sort: "Сортування" +ascendingOrder: "За зростанням" +descendingOrder: "За спаданням" +scratchpad: "Чернетка" +scratchpadDescription: "Scratchpad надає середовище для експериментів з AiScript. Ви можете писати, виконувати його і тестувати взаємодію з Calckey." +output: "Вихід" +script: "Скрипт" +disablePagesScript: "Вимкнути AiScript на Сторінках" +updateRemoteUser: "Оновити інформацію про віддаленого користувача" +deleteAllFiles: "Видалити всі файли" +deleteAllFilesConfirm: "Ви дійсно хочете видалити всі файли?" +removeAllFollowing: "Скасувати всі підписки" +removeAllFollowingDescription: "Скасувати підписку на всі акаунти з {host}. Будь ласка, робіть це, якщо інстанс більше не існує." +userSuspended: "Обліковий запис заблокований." +userSilenced: "Обліковий запис приглушений." +yourAccountSuspendedTitle: "Цей обліковий запис заблоковано" +yourAccountSuspendedDescription: "Цей обліковий запис було заблоковано через порушення умов надання послуг сервера. Зв'яжіться з адміністратором, якщо ви хочете дізнатися докладнішу причину. Будь ласка, не створюйте новий обліковий запис." +menu: "Меню" +divider: "Розділювач" +addItem: "Додати елемент" +relays: "Ретранслятори" +addRelay: "Додати ретранслятор" +inboxUrl: "Inbox URL" +addedRelays: "Додані ретранслятори" +serviceworkerInfo: "Повинен бути ввімкнений для push-сповіщень." +deletedNote: "Видалена нотатка" +invisibleNote: "Приховані записи" +enableInfiniteScroll: "Увімкнути нескінченну прокрутку" +visibility: "Видимість" +poll: "Опитування" +useCw: "Приховати вміст" +enablePlayer: "Відкрити відеоплеєр" +disablePlayer: "Закрити відеоплеєр" +expandTweet: "Розгорнути твіт" +themeEditor: "Редактор тем" +description: "Опис" +describeFile: "Додати підпис" +enterFileDescription: "Введіть підпис" +author: "Автор" +leaveConfirm: "Зміни не збережені. Ви дійсно хочете скасувати зміни?" +manage: "Управління" +plugins: "Плагіни" +deck: "Дек" +undeck: "Залишити Дек" +useBlurEffectForModal: "Ефект розмиття під модальними діалогами" +useFullReactionPicker: "Повнорозмірний селектор реакцій" +width: "Ширина" +height: "Висота" +large: "Крупний" +medium: "Середній" +small: "Маленький" +generateAccessToken: "Згенерувати токен доступу" +permission: "Права" +enableAll: "Увімкнути все" +disableAll: "Вимкнути все" +tokenRequested: "Надати доступ до акаунту" +pluginTokenRequestedDescription: "Цей плагін зможе використовувати дозволи які тут вказані." +notificationType: "Тип сповіщення" +edit: "Редагувати" +emailServer: "Сервер електронної пошти" +enableEmail: "Увімкнути функцію доставки пошти" +emailConfigInfo: "Використовується для підтвердження електронної пошти підчас реєстрації, а також для відновлення паролю." +email: "E-mail" +emailAddress: "E-mail адреса" +smtpConfig: "Налаштування сервера SMTP" +smtpHost: "Хост" +smtpPort: "Порт" +smtpUser: "Ім'я користувача" +smtpPass: "Пароль" +emptyToDisableSmtpAuth: "Залиште назву користувача і пароль пустими для вимкнення підтвердження SMTP" +smtpSecure: "Використовувати безумовне шифрування SSL/TLS для з'єднань SMTP" +smtpSecureInfo: "Вимкніть при використанні STARTTLS " +testEmail: "Тестовий email" +wordMute: "Блокування слів" +regexpError: "Помилка регулярного виразу" +regexpErrorDescription: "Сталася помилка в регулярному виразі в рядку {line} вашого слова {tab} слова що ігноруються:" +instanceMute: "Приглушення інстансів" +userSaysSomething: "{name} щось сказав(ла)" +makeActive: "Активувати" +display: "Відображення" +copy: "Скопіювати" +metrics: "Показники" +overview: "Огляд" +logs: "Журнал" +delayed: "Затримка" +database: "База даних" +channel: "Канали" +create: "Створити" +notificationSetting: "Параметри сповіщень" +notificationSettingDesc: "Виберіть типи сповіщень для відображення" +useGlobalSetting: "Застосувати глобальнi параметри" +useGlobalSettingDesc: "Якщо увімкнено, то будуть використовуватись налаштування повідомлень облікового запису, інакше можливо налаштувати індивідуально." +other: "Інше" +regenerateLoginToken: "Оновити Login Token" +regenerateLoginTokenDescription: "Регенерувати внутрішній ключ використовуваний під час входу. Зазвичай цього не потрібно робити. При регенерації всі пристрої вийдуть з системи." +setMultipleBySeparatingWithSpace: "Можна вказати кілька значень, відділивши їх пробілом." +fileIdOrUrl: "Ідентифікатор файлу або посилання" +behavior: "Поведінка" +sample: "Приклад" +abuseReports: "Скарги" +reportAbuse: "Поскаржитись" +reportAbuseOf: "Поскаржитись на {name}" +fillAbuseReportDescription: "Будь ласка вкажіть подробиці скарги. Якщо скарга стосується запису, вкажіть посилання на нього." +abuseReported: "Дякуємо, вашу скаргу було відправлено. " +reporter: "Репортер" +reporteeOrigin: "Про кого повідомлено" +reporterOrigin: "Хто повідомив" +forwardReport: "Переслати звіт на віддалений інстанс" +forwardReportIsAnonymous: "Замість вашого облікового запису анонімний системний обліковий запис буде відображатися як доповідач на віддаленому інстансі" +send: "Відправити" +abuseMarkAsResolved: "Позначити скаргу як вирішену" +openInNewTab: "Відкрити в новій вкладці" +openInSideView: "Відкрити збоку" +defaultNavigationBehaviour: "Поведінка навігації за замовчуванням" +editTheseSettingsMayBreakAccount: "Зміна цих параметрів може призвести до пошкодження вашого акаунта." +instanceTicker: "Мітка з назвою інстанса в нотатках" +waitingFor: "Чекаємо на {x}" +random: "Випадковий" +system: "Система" +switchUi: "Інтерфейс" +desktop: "Десктоп" +clip: "Добірка" +createNew: "Створити новий" +optional: "Необов'язково" +createNewClip: "Створити нотатку" +public: "Публічний" +i18nInfo: "Calckey перекладається на різні мови волонтерами. Ви можете допомогти: {link}" +manageAccessTokens: "Керування токенами доступу" +accountInfo: "Інформація про акаунт" +notesCount: "Кількість нотаток" +repliesCount: "Кількість надісланих відповідей" +renotesCount: "Кількість поширень" +repliedCount: "Кількість отриманих відповідей" +renotedCount: "Кількість отриманих поширень" +followingCount: "Кількість підписок" +followersCount: "Кількість підписників" +sentReactionsCount: "Кількість надісланих реакцій" +receivedReactionsCount: "Кількість отриманих реакцій" +pollVotesCount: "Кількість надісланих голосів" +pollVotedCount: "Кількість отриманих голосів" +yes: "Так" +no: "Ні" +driveFilesCount: "Кількість файлів на диску" +driveUsage: "Використання місця на диску" +noCrawle: "Заборонити індексацію" +noCrawleDescription: "Просити пошукові системи не індексувати ваш профіль, нотатки, сторінки тощо." +lockedAccountInfo: "Якщо видимість вашого запису не встановлена як \"Тільки підписники\", то кожен зможе побачити ваш запис, навіть якщо ви вимагаєте підтвердження підписок вручну." +alwaysMarkSensitive: "Позначати NSFW за замовчуванням" +loadRawImages: "Відображати вкладені зображення повністю замість ескізів" +disableShowingAnimatedImages: "Не програвати анімовані зображення" +verificationEmailSent: "Електронний лист з підтвердженням відісланий. Будь ласка перейдіть по посиланню в листі для підтвердження." +notSet: "Не налаштовано" +emailVerified: "Електронну пошту підтверджено." +noteFavoritesCount: "Кількість улюблених нотаток" +pageLikesCount: "Кількість отриманих вподобань сторінки" +pageLikedCount: "Кількість вподобаних сторінок" +contact: "Контакт" +useSystemFont: "Використовувати стандартний шрифт системи" +clips: "Добірка" +experimentalFeatures: "Експериментальні функції" +developer: "Розробник" +makeExplorable: "Зробіть обліковий запис видимим у розділі \"Огляд\"" +makeExplorableDescription: "Вимкніть, щоб обліковий запис не показувався у розділі \"Огляд\"." +showGapBetweenNotesInTimeline: "Показувати розрив між записами у стрічці новин" +duplicate: "Дублікат" +left: "Лівий" +center: "Центр" +wide: "Широкий" +narrow: "Вузький" +reloadToApplySetting: "Налаштування ввійде в дію при перезавантаженні. Перезавантажити?" +needReloadToApply: "Зміни набудуть чинності після перезавантаження сторінки." +showTitlebar: "Показати титульний рядок" +clearCache: "Очистити кеш" +onlineUsersCount: "{n} користувачів онлайн" +nUsers: "{n} Користувачів" +nNotes: "{n} Записів" +sendErrorReports: "Надіслати звіт про помилки" +sendErrorReportsDescription: "При увімкненні детальна інформація про помилки буде надана Calckey у разі виникнення проблем, що дасть можливість покращити Calckey." +myTheme: "Моя тема" +backgroundColor: "Фон" +accentColor: "Акцент" +textColor: "Текст" +saveAs: "Зберегти як…" +advanced: "Розширені" +value: "Значення" +createdAt: "Створено" +updatedAt: "Останнє оновлення" +saveConfirm: "Зберегти зміни?" +deleteConfirm: "Ви дійсно бажаєте це видалити?" +invalidValue: "Некоректне значення." +registry: "Реєстр" +closeAccount: "Закрити обліковий запис" +currentVersion: "Версія, що використовується" +latestVersion: "Сама свіжа версія" +youAreRunningUpToDateClient: "У вас найсвіжіша версія клієнта." +newVersionOfClientAvailable: "Доступніша свіжа версія клієнта." +usageAmount: "Використане" +capacity: "Ємність" +inUse: "Зайнято" +editCode: "Редагувати вихідний текст" +apply: "Застосувати" +receiveAnnouncementFromInstance: "Отримувати оповіщення з інстансу" +emailNotification: "Сповіщення електронною поштою" +publish: "Опублікувати" +inChannelSearch: "Пошук за каналом" +useReactionPickerForContextMenu: "Відкривати палітру реакцій правою кнопкою" +typingUsers: "Стук клавіш. Це {users}…" +goBack: "Назад" +info: "Інформація" +user: "Користувачі" +administration: "Управління" +expiration: "Опитування закінчується" +middle: "Середній" +global: "Глобальна" +sent: "Відправити" +hashtags: "Хештеґ" +hide: "Сховати" +searchByGoogle: "Пошук" +indefinitely: "Ніколи" +file: "Файли" +reverse: "Перевернути" +colored: "Кольоровий" +label: "Назва" +localOnly: "Локально" +_ffVisibility: + public: "Опублікувати" +_ad: + back: "Назад" +_gallery: + unlike: "Не вподобати" +_email: + _follow: + title: "Новий підписник" +_registry: + key: "Ключ" + keys: "Ключі" + domain: "Домен" + createKey: "Створити ключ" +_aboutMisskey: + about: "Misskey - це програмне забезпечення з відкритим кодом, яке розробляє syuilo з 2014 року." + contributors: "Головні помічники" + allContributors: "Всі помічники" + source: "Вихідний код" + translation: "Перекладати Calckey" + donate: "Пожертвувати Calckey" + morePatrons: "Ми дуже цінуємо підтримку багатьох інших помічників, не перелічених тут. Дякуємо! 🥰" + patrons: "Підтримали" +_nsfw: + respect: "Приховувати NSFW медіа" + ignore: "Не приховувати NSFW медіа" + force: "Приховувати всі медіа файли" +_mfm: + cheatSheet: " Довідка MFM" + intro: "MFM це ексклюзивна мова розмітки тексту в Calckey, яку можна використовувати в багатьох місцях. Тут ви можете переглянути приклади її синтаксису." + dummy: "Calckey розширює світ Федіверсу" + mention: "Згадка" + mentionDescription: "За допомогою знака \"@\" перед ім'ям можна згадати конкретного користувача." + hashtag: "Хештеґ" + hashtagDescription: "За допомогою знака \"решітка\" перед словом задається хештег." + url: "URL" + urlDescription: "Відображаються URL-адреси." + link: "Посилання" + linkDescription: "Окремі частини тексту можуть містити посилання" + bold: "Жирний шрифт" + boldDescription: "Виділяє літери, роблячи їх товще" + small: "Дрібний шрифт" + smallDescription: "Робить текст маленьким і тонким" + center: "По центру" + centerDescription: "Показує вміст у центрі" + inlineCode: "Код (у рядку)" + inlineCodeDescription: "Показує фрагмент тексту у рядку як програмний код" + blockCode: "Код (блок)" + blockCodeDescription: "Показує кілька рядків тексту як блок програмного кода" + inlineMath: "Формула (у рядку)" + inlineMathDescription: "Відображення математичних формул (KaTeX) у рядку" + blockMath: "Формули (блок)" + blockMathDescription: "Відображати багаторядкові формули (KaTeX) блоками" + quote: "Цитата" + quoteDescription: "Відображає зміст як цитату." + emoji: "Кастомні емоджі" + emojiDescription: "Щоб показати нетиповий емоджі, потрібно ввести його назву в двокрапках." + search: "Пошук" + searchDescription: "Відображає вікно пошуку з попередньо введеним текстом" + flip: "Перевернути" + flipDescription: "Віддзеркалює вміст по горизонталі або вертикалі" + jelly: "Анімація (желе)" + jellyDescription: "Створює желеподібну анімацію" + tada: "Анімація (Тада!)" + tadaDescription: "Створює анімацію з відчуттям \"Тада!\"" + jump: "Анімація (стрибки)" + jumpDescription: "Показує стрибаючу анімацію" + bounce: "Анімація (пружина)" + shake: "Анімація (Shake)" + twitch: "Анімація (Twitch)" + spin: "Анімація (Spin)" + x2: "Великий" + x2Description: "Показує контент збільшеним." + x3: "Дуже великий" + x3Description: "Показує контент ще більшим." + x4: "Надзвичайно великий" + x4Description: "Показує контент надзвичайно великим." + blur: "Розмиття" + blurDescription: "Цей ефект зробить контент розмитим. Контент можна зробити чітким, якщо навести на нього вказівник миші." + font: "Шрифт" + fontDescription: "Встановлює шрифт для контенту." + rotate: "Обертати" +_instanceTicker: + none: "Не відображати" + remote: "Відображати для віддалених користувачів" + always: "Відображати завжди" +_serverDisconnectedBehavior: + reload: "Автоматично перезавантажити" + dialog: "Показати діалогове вікно" + quiet: "Показати ненав’язливе попередження" +_channel: + create: "Створити канал" + edit: "Редагувати канал" + setBanner: "Встановити банер" + removeBanner: "Видалити банер" + featured: "Тренди" + following: "Підписки" + usersCount: "{n} учасників" + notesCount: "{n} дописів" +_menuDisplay: + hide: "Сховати" +_wordMute: + muteWords: "Заглушені слова" + muteWordsDescription: "Розділення ключових слів пробілами для \"І\" або з нової лінійки для \"АБО\"" + muteWordsDescription2: "Для використання RegEx, ключові слова потрібно вписати поміж слешів \"/\"." + softDescription: "Приховати записи які відповідають критеріям зі стрічки подій." + hardDescription: "Приховати записи які відповідають критеріям зі стрічки подій. Також приховані записи не будуть додані до стрічки подій навіть якщо критерії буде змінено." + soft: "М'яко" + hard: "Жорстко" + mutedNotes: "Заблоковані нотатки" +_theme: + explore: "Оглянути теми" + install: "Встановити тему" + manage: "Керування темами" + code: "Код теми" + description: "Опис" + installed: "Тему {name} встановлено" + installedThemes: "Встановлені теми" + builtinThemes: "Вбудоваі теми" + alreadyInstalled: "Тему вже встановлено" + invalid: "Неправильний формат теми" + make: "Створити тему" + base: "Основа" + defaultValue: "Значення за замовчуванням" + func: "Функції" + lighten: "Яскравість" + inputConstantName: "Введіть назву константи" + importInfo: "Вставляючи сюди код теми, ви можете добавити її до редактору тем" + deleteConstantConfirm: "Ви дійсно бажаєте видалити константу \"{const}\"?" + keys: + accent: "Акцент" + bg: "Фон" + fg: "Текст" + focus: "Фокус" + indicator: "Індикатор" + panel: "Панель" + shadow: "Тінь" + header: "Заголовок" + navBg: "Фон бокової панелі" + navFg: "Текст бокової панелі" + navHoverFg: "Текст бокової панелі (під курсором)" + navActive: "Текст бокової панелі (активне)" + navIndicator: "Індикатор бокової панелі" + link: "Посилання" + hashtag: "Хештеґ" + mention: "Згадка" + mentionMe: "Згадки (мене)" + renote: "Поширити" + modalBg: "Модальний фон" + divider: "Розділювач" + scrollbarHandle: "Ручка смуги прокрутки" + scrollbarHandleHover: "Ручка смуги прокрутки (при наведенні)" + dateLabelFg: "Текст позначок дати" + infoBg: "Фон інформації" + infoFg: "Текст інформації" + infoWarnBg: "Фон попередження" + infoWarnFg: "Текст попередження" + cwBg: "Фон чутливого змісту" + cwFg: "Текст чутливого змісту" + cwHoverBg: "Фон чутливого змісту (при наведенні)" + toastBg: "Фон повідомлення" + toastFg: "Текст повідомлення" + buttonBg: "Фон кнопки" + buttonHoverBg: "Фон кнопки (при наведенні)" + inputBorder: "Край поля вводу" + listItemHoverBg: "Фон елементу в списку (при наведенні)" + driveFolderBg: "Фон папки на диску" + wallpaperOverlay: "Накладання шпалер" + badge: "Значок" + messageBg: "Фон переписки" + accentDarken: "Акцент (Затемлений)" + accentLighten: "Акцент (Освітлений)" + fgHighlighted: "Виділений текст" +_sfx: + note: "Нотатки" + noteMy: "Мої нотатки" + notification: "Сповіщення" + chat: "Чати" + chatBg: "Чати (фон)" + antenna: "Прийом антени" + channel: "Повідомлення каналу" +_ago: + future: "Майбутнє" + justNow: "Щойно" + secondsAgo: "{n}с тому" + minutesAgo: "{n}х тому" + hoursAgo: "{n}г тому" + daysAgo: "{n}д тому" + weeksAgo: "{n} тиж. тому" + monthsAgo: "{n} міс. тому" + yearsAgo: "{n} р. тому" +_time: + second: "с" + minute: "х" + hour: "г" + day: "д" +_tutorial: + title: "Як використовувати Calckey" + step1_1: "Ласкаво просимо!" + step1_2: "Давайте налаштуємо вас. Ви будете працювати в найкоротші терміни!" + step2_1: "Спочатку, будь ласка, заповніть свій профіль" + step2_2: "Надавши деяку інформацію про себе, іншим людям буде легше зрозуміти, чи хочуть вони бачити ваші записи або стежити за вами." + step3_1: "Тепер настав час стежити за деякими людьми!" + step3_2: "Ваша домашня і соціальна стрічки ґрунтуються на тому, за ким ви стежите, тому для початку спробуйте стежити за кількома акаунтами.\nНатисніть на гурток із плюсом у правому верхньому кутку профілю, щоб стежити за ним." + step4_1: "Давайте вийдемо на вас" + step4_2: "Для свого першого повідомлення деякі люди люблять робити {introduction} повідомлення або просте \"Hello world!\"" + step5_1: "Тимчасові рамки, скрізь тимчасові рамки!" + step5_2: "У вашому екземплярі включені {timelines} різних часових ліній." + step5_3: "Головна {icon} часова шкала - це шкала, де ви можете бачити повідомлення ваших підписників." + step5_4: "Місцева {icon} тимчасова шкала - це шкала, де ви можете бачити повідомлення всіх інших користувачів даного екземпляра" + step5_5: "Тимчасова шкала Рекомендовані {icon} - це шкала, де ви можете бачити повідомлення від інстанцій, рекомендованих адміністраторами." + step5_6: "На часовій шкалі Social {icon} відображаються повідомлення від друзів ваших підписників" + step5_7: "Глобальна {icon} часова шкала - це місце, де ви можете бачити повідомлення від усіх інших підключених екземплярів" + step6_1: "Отже, що це за місце?" + step6_2: "Ну, ви не просто приєдналися до Кальки. Ви приєдналися до порталу в Fediverse, взаємопов'язаної мережі з тисяч серверів, званих \"інстансами\"." + step6_3: "Кожен сервер працює по-своєму, і не на всіх серверах працює Calckey. Але цей працює! Це трохи складно, але ви швидко розберетеся" + step6_4: "Тепер ідіть, вивчайте і розважайтеся!" +_2fa: + registerSecurityKey: "Зареєструвати новий ключ безпеки" +_permissions: + "read:account": "Переглядати дані профілю" + "write:account": "Змінити дані акаунту" + "read:blocks": "Переглянути список заблокованих" + "write:blocks": "Редагувати список заблокованих" + "read:drive": "Переглянути вміст Диска" + "write:drive": "Змінювати вміст Диска" + "read:favorites": "Переглядати обране" + "write:favorites": "Змінювати обране" + "read:following": "Переглядати підписки" + "write:following": "Змінювати підписки" + "read:messaging": "Переглядати повідомлення" + "write:messaging": "Створювати та видаляти повідомлення" + "read:mutes": "Переглядати список ігнорованих" + "write:mutes": "Змінювати список ігнорованих" + "write:notes": "Писати і видаляти нотатки" + "read:notifications": "Переглядати сповіщення" + "read:reactions": "Переглядати реакції" + "write:reactions": "Змінювати реакції" + "write:votes": "Голосувати в опитуваннях" + "read:pages": "Переглядати сторінки" + "write:pages": "Змінювати і видаляти сторінки" + "read:page-likes": "Переглядати вподобання сторінок" + "write:page-likes": "Змінювати вподобання сторінок" + "read:user-groups": "Переглядати групи користувача" + "write:user-groups": "Змінювати групи користувача" + "read:channels": "Переглядати канали" + "write:channels": "Змінювати канали" +_auth: + shareAccess: "Ви хочете надати \"{name}\" доступ до цього акаунту?" + shareAccessAsk: "Ви впевнені, що хочете надати цій програмі доступ до вашого акаунту?" + denied: "У доступі відмовлено" +_antennaSources: + all: "Всі нотатки" + homeTimeline: "Нотатки тих, на кого ви підписані" +_weekday: + sunday: "Неділя" + monday: "Понеділок" + tuesday: "Вівторок" + wednesday: "Середа" + thursday: "Четвер" + friday: "П'ятниця" + saturday: "Субота" +_widgets: + memo: "Нагадування" + notifications: "Сповіщення" + timeline: "Стрічка" + calendar: "Календар" + trends: "Тенденції" + clock: "Годинник" + rss: "RSS-читач" + activity: "Активність" + photos: "Фото" + digitalClock: "Цифровий годинник" + federation: "Федіверс" + postForm: "Створення нотатки" + slideshow: "Слайд-шоу" + button: "Кнопка" + onlineUsers: "Користувачі онлайн" + jobQueue: "Черга завдань" + serverMetric: "Показники сервера " + aiscript: "Консоль AiScript" +_cw: + hide: "Сховати" + show: "Показати більше" + chars: "{count} символів" + files: "{count} файлів" +_poll: + noOnlyOneChoice: "Потрібні принаймні два варіанти." + choiceN: "Варіант {n}" + noMore: "Більше варіантів додати не можна" + canMultipleVote: "Можна вибрати кілька варіантів" + expiration: "Опитування закінчується" + infinite: "Ніколи" + at: "На даті..." + after: "Через..." + deadlineDate: "Дата закінчення" + deadlineTime: "г" + duration: "Тривалість" + votesCount: "{n} голосів" + totalVotes: "Всього {n} голосів" + vote: "Голосувати" + showResult: "Переглянути результати" + voted: "Проголосовано" + closed: "Завершено" + remainingDays: "Залишилось {d} днів {h} годин" + remainingHours: "Залишилось {h} годин {m} хвилин" + remainingMinutes: "Залишилось {m} хвилин {s} секунд" + remainingSeconds: "Залишилось {s} секунд" +_visibility: + public: "Публічний" + publicDescription: "Для всіх користувачів" + home: "Домівка" + homeDescription: "Лише на домашній стрічці" + followers: "Підписники" + followersDescription: "Тільки для підписників" + specified: "Особисто" + specifiedDescription: "Лише для певних користувачів" + localOnly: "Локально" + localOnlyDescription: "Приховано для віддалених користувачів" +_postForm: + replyPlaceholder: "Відповідь на цю нотатку..." + quotePlaceholder: "Прокоментуйте цю нотатку..." + channelPlaceholder: "Опублікувати в каналі" + _placeholders: + a: "Чим займаєтесь?" + b: "Що відбувається навколо вас?" + c: "Що у вас на думці?" + d: "Що ви хочете висловити?" + e: "Напишіть тут, будь ласка..." + f: "Чекаю коли ви напишете..." +_profile: + name: "Ім'я" + username: "Ім'я користувача" + description: "Про себе" + youCanIncludeHashtags: "Ви також можете включити хештеги у свій опис." + metadata: "Додаткова інформація" + metadataEdit: "Редагувати додаткову інформацію" + metadataDescription: "Ви можете вказати до чотирьох пунктів додаткової інформації у своєму профілі." + metadataLabel: "Назва" + metadataContent: "Вміст" + changeAvatar: "Змінити аватар" + changeBanner: "Змінити банер" +_exportOrImport: + allNotes: "Всі нотатки" + followingList: "Підписки" + muteList: "Ігнорувати" + blockingList: "Заблокувати" + userLists: "Списки" +_charts: + federation: "Федіверс" + apRequest: "Запити" + usersTotal: "Загальна кількість користувачів" + activeUsers: "Активні користувачі" + notesTotal: "Загальна кількість нотаток" + filesIncDec: "Зміни кількості файлів" + filesTotal: "Загальна кількість файлів" +_instanceCharts: + requests: "Запити" + usersTotal: "Сумарна кількість користувачів" + notes: "Різниця кількості зроблених записів" + notesTotal: "Сумарна кількість нотаток" + ff: "Різниця кількості підписників" + ffTotal: "Кількість підписників" + cacheSizeTotal: "Сумарний розмір кешу" + files: "Різниця в кількості файлів" + filesTotal: "Сумарна кількість файлів" +_timelines: + home: "Домівка" + local: "Локальна" + social: "Соціальна" + global: "Глобальна" +_pages: + newPage: "Створити сторінку" + editPage: "Редагувати сторінку" + readPage: "Перегляд вихідного коду" + created: "Сторінка успішно створена." + updated: "Сторінка успішно оновлена." + deleted: "Сторінку видалено" + pageSetting: "Налаштування сторінки" + nameAlreadyExists: "Вказана адреса сторінки вже існує." + invalidNameTitle: "Вказана адреса сторінки неприпустима." + invalidNameText: "Переконайтеся, що не залишили порожнім." + editThisPage: "Редагувати цю сторінку" + viewSource: "Переглянути вихідний код" + viewPage: "Переглянути свої сторінки" + like: "Вподобати" + unlike: "Не вподобати" + my: "Мої сторінки" + liked: "Вподобані сторінки" + featured: "Популярні" + inspector: "Інспектор" + contents: "Вміст" + content: "Блок сторінки" + variables: "Змінні" + title: "Заголовок" + url: "URL сторінки" + summary: "Короткий зміст" + alignCenter: "Рівняти елементи по центру" + hideTitleWhenPinned: "Приховати заголовок сторінки при закріпленні в профілі" + font: "Шрифт" + fontSerif: "Serif" + fontSansSerif: "Sans serif" + eyeCatchingImageSet: "Встановити привабливе зображення" + eyeCatchingImageRemove: "Видалити привабливе зображення" + chooseBlock: "Додати блок" + selectType: "Виберіть тип" + enterVariableName: "Введіть назву для змінної" + variableNameIsAlreadyUsed: "Ця назва вже використовується іншою змінною" + contentBlocks: "Контент" + inputBlocks: "Ввід" + specialBlocks: "Особливе" + blocks: + text: "Текст" + textarea: "Текстова область" + section: "Розділ" + image: "Зображення" + button: "Кнопка" + if: "Якщо" + _if: + variable: "Змінні" + post: "Створення нотатки" + _post: + text: "Вміст" + canvasId: "Ідентифікатор полотна" + textInput: "Введення тексту" + _textInput: + name: "Ім'я змінної" + text: "Назва" + default: "Значення за замовчуванням" + textareaInput: "Багаторядкове введення тексту" + _textareaInput: + name: "Ім'я змінної" + text: "Назва" + default: "Значення за замовчуванням" + numberInput: "Числове введення" + _numberInput: + name: "Ім'я змінної" + text: "Назва" + default: "Значення за замовчуванням" + canvas: "Полотно" + _canvas: + id: "Ідентифікатор полотна" + width: "Ширина" + height: "Висота" + note: "Вбудована нотатка" + _note: + id: "Ідентифікатор нотатки" + idDescription: "Також можна вказати посилання на нотатку" + detailed: "Детальний вигляд" + switch: "Перемикач" + _switch: + name: "Ім'я змінної" + text: "Назва" + default: "Значення за замовчуванням" + counter: "Лічильник" + _counter: + name: "Ім'я змінної" + text: "Назва" + inc: "Збільшити на" + _button: + text: "Напис" + colored: "Кольоровий" + action: "Дія кнопки" + _action: + dialog: "Показати повідомлення" + _dialog: + content: "Вміст" + resetRandom: "Скидання генератора випадковості" + pushEvent: "Надіслати подію" + _pushEvent: + event: "Назві події" + message: "Повідомлення для відображення при активації" + variable: "Змінна для надсилання" + no-variable: "Відсутньо" + callAiScript: "Виклик AiScript" + _callAiScript: + functionName: "Ім'я функції" + radioButton: "Вибір" + _radioButton: + name: "Ім'я змінної" + title: "Напис" + values: "Варіанти, розділені розривами рядків" + default: "Значення за замовчуванням" + script: + categories: + flow: "Керування потоком" + logical: "Логічні операції" + operation: "Обчислення" + comparison: "Порівняння" + random: "Випадковість" + value: "Значення" + fn: "Функції" + text: "Дії з текстом" + convert: "Перетворення" + list: "Списки" + blocks: + text: "Текст" + multiLineText: "Текст (багаторядковий)" + textList: "Текстовий список" + _textList: + info: "Використовувати новий рядок як роздільник для вводу" + strLen: "Довжина тексту" + _strLen: + arg1: "Текст" + strPick: "Вибрати символ" + _strPick: + arg1: "Текст" + arg2: "Розташування символу" + strReplace: "Заміна тексту" + _strReplace: + arg1: "Текст" + arg2: "Текст, який потрібно замінити" + arg3: "Заміняти на" + strReverse: "Перевернути текст" + _strReverse: + arg1: "Текст" + join: "Конкатенація тексту" + _join: + arg1: "Списки" + arg2: "Розділювач" + add: "Додати" + _add: + arg1: "A" + arg2: "B" + subtract: "Відняти" + _subtract: + arg1: "A" + arg2: "B" + multiply: "Помножити" + _multiply: + arg1: "A" + arg2: "B" + divide: "Поділити" + _divide: + arg1: "A" + arg2: "B" + mod: "Остача" + _mod: + arg1: "A" + arg2: "B" + round: "Десяткове округлення" + _round: + arg1: "Число" + eq: "A дорівнює B" + _eq: + arg1: "A" + arg2: "B" + notEq: "A не дорівнює B" + _notEq: + arg1: "A" + arg2: "B" + and: "А І Б" + _and: + arg1: "A" + arg2: "B" + or: "A АБО B" + _or: + arg1: "A" + arg2: "B" + lt: "< A менше, ніж B" + _lt: + arg1: "A" + arg2: "B" + gt: "> A більше, ніж B" + _gt: + arg1: "A" + arg2: "B" + ltEq: "<= A менше або дорівнює B" + _ltEq: + arg1: "A" + arg2: "B" + gtEq: ">= A більше або дорівнює B" + _gtEq: + arg1: "A" + arg2: "B" + if: "Умова" + _if: + arg1: "Якщо" + arg2: "Якщо так" + arg3: "Якщо ні" + not: "НЕ" + _not: + arg1: "НЕ" + random: "Випадково" + _random: + arg1: "Імовірність" + rannum: "Випадкове число" + _rannum: + arg1: "Мінімальне значення" + arg2: "Максимальне значення" + randomPick: "Випадковий вибір зі списку" + _randomPick: + arg1: "Списки" + dailyRandom: "Випадково (триває добу)" + _dailyRandom: + arg1: "Імовірність" + dailyRannum: "Випадкове число (триває добу)" + _dailyRannum: + arg1: "Мінімальне значення" + arg2: "Максимальне значення" + dailyRandomPick: "Випадково вибрати зі списку (триває добу)" + _dailyRandomPick: + arg1: "Списки" + seedRandom: "Випадковість (з насінням)" + _seedRandom: + arg1: "Насіння" + arg2: "Імовірність" + seedRannum: "Випадкове число (з насінням)" + _seedRannum: + arg1: "Насіння" + arg2: "Мінімальне значення" + arg3: "Максимальне значення" + seedRandomPick: "Випадково вибрати зі списку (з насінням)" + _seedRandomPick: + arg1: "Насіння" + arg2: "Списки" + DRPWPM: "Випадково вибрати зі зваженого списку (триває добу)" + _DRPWPM: + arg1: "Текстовий список" + pick: "Вибір зі списку" + _pick: + arg1: "Списки" + arg2: "Позиція" + listLen: "Отримати довжину списку" + _listLen: + arg1: "Списки" + number: "Число" + stringToNumber: "Текст на число" + _stringToNumber: + arg1: "Текст" + numberToString: "Число на текст" + _numberToString: + arg1: "Число" + splitStrByLine: "Розбиття тексту на рядки" + _splitStrByLine: + arg1: "Текст" + ref: "Змінні" + aiScriptVar: "Змінна AiScript" + fn: "Функції" + _fn: + slots: "Паз" + slots-info: "Використовувати нову лінію як роздільник пазів" + arg1: "Вивід" + for: "Повторення" + _for: + arg1: "Кількість повторень" + arg2: "Дія" + typeError: "Паз {slot} приймає \"{expect}\" тип, але надана змінна має тип \"{actual}\"!" + thereIsEmptySlot: "Паз {slot} пустий!" + types: + string: "Текст" + number: "Число" + boolean: "Прапорець" + array: "Списки" + stringArray: "Текстовий список" + emptySlot: "Пустий паз" + enviromentVariables: "Змінні середовища" + pageVariables: "Елемент сторінки" + argVariables: "Стрічка вводу" +_relayStatus: + requesting: "Очікує затвердження" + accepted: "Затверджено" + rejected: "Відхилено" +_notification: + fileUploaded: "Файл успішно завантажено" + youGotMention: "{name} згадує вас" + youGotReply: "{name} відповідає" + youGotQuote: "{name} цитує вас" + youRenoted: "{name} поширює" + youGotPoll: "{name} бере участь в опитуванні" + youGotMessagingMessageFromUser: "Повідомлення від {name}" + youGotMessagingMessageFromGroup: "Нове повідомлення в групі {name}" + youWereFollowed: "Новий підписник" + youReceivedFollowRequest: "Ви отримали запит на підписку" + yourFollowRequestAccepted: "Запит на підписку прийнято" + youWereInvitedToGroup: "Запрошення до групи" + _types: + all: "Все" + follow: "Підписки" + mention: "Згадка" + reply: "Відповіді" + renote: "Поширення" + quote: "Цитування" + reaction: "Реакції" + pollVote: "Опитування" + receiveFollowRequest: "Запити на підписку" + followRequestAccepted: "Прийняті підписки" + groupInvited: "Запрошення до груп" + app: "Сповіщення від додатків" + _actions: + reply: "Відповісти" + renote: "Поширити" +_deck: + alwaysShowMainColumn: "Завжди показувати головну колонку" + columnAlign: "Вирівняти стовпці" + addColumn: "Додати стовпець" + swapLeft: "Пересунути ліворуч" + swapRight: "Пересунути праворуч" + swapUp: "Пересунути вгору" + swapDown: "Пересунути вниз" + stackLeft: "У стовпчик вліво" + popRight: "Витягнути вправо" + profile: "Обліковий запис" + _columns: + main: "Головна" + widgets: "Віджети" + notifications: "Сповіщення" + tl: "Стрічка" + antenna: "Антени" + list: "Списки" + mentions: "Згадки" + direct: "Особисте" diff --git a/fe_calckey/frontend/locales/vi-VN.yml b/fe_calckey/frontend/locales/vi-VN.yml new file mode 100644 index 0000000..ddd7908 --- /dev/null +++ b/fe_calckey/frontend/locales/vi-VN.yml @@ -0,0 +1,1740 @@ +--- +_lang_: "Tiếng Việt" +headlineMisskey: "Mạng xã hội liên hợp" +introMisskey: "Xin chào! Calckey là một nền tảng tiểu blog phi tập trung mã nguồn mở.\nViết \"tút\" để chia sẻ những suy nghĩ của bạn 📡\nBằng \"biểu cảm\", bạn có thể bày tỏ nhanh chóng cảm xúc của bạn với các tút 👍\nHãy khám phá một thế giới mới! 🚀" +monthAndDay: "{day} tháng {month}" +search: "Tìm kiếm" +notifications: "Thông báo" +username: "Tên người dùng" +password: "Mật khẩu" +forgotPassword: "Quên mật khẩu" +fetchingAsApObject: "Đang nạp dữ liệu từ Fediverse" +ok: "Đồng ý" +gotIt: "Đã hiểu!" +cancel: "Hủy" +enterUsername: "Nhập tên người dùng" +renotedBy: "Chia sẻ bởi {user}" +noNotes: "Chưa có tút nào." +noNotifications: "Không có thông báo" +instance: "Máy chủ" +settings: "Cài đặt" +basicSettings: "Thiết lập chung" +otherSettings: "Thiết lập khác" +openInWindow: "Mở trong cửa sổ mới" +profile: "Trang cá nhân" +timeline: "Bảng tin" +noAccountDescription: "Người này chưa viết mô tả." +login: "Đăng nhập" +loggingIn: "Đang đăng nhập..." +logout: "Đăng xuất" +signup: "Đăng ký" +uploading: "Đang tải lên…" +save: "Lưu" +users: "Người dùng" +addUser: "Thêm người dùng" +favorite: "Thêm vào yêu thích" +favorites: "Lượt thích" +unfavorite: "Bỏ thích" +favorited: "Đã thêm vào yêu thích." +alreadyFavorited: "Đã thêm vào yêu thích rồi." +cantFavorite: "Không thể thêm vào yêu thích." +pin: "Ghim" +unpin: "Bỏ ghim" +copyContent: "Chép nội dung" +copyLink: "Chép liên kết" +delete: "Xóa" +deleteAndEdit: "Sửa" +deleteAndEditConfirm: "Bạn có chắc muốn sửa tút này? Những biểu cảm, lượt trả lời và đăng lại sẽ bị mất." +addToList: "Thêm vào danh sách" +sendMessage: "Gửi tin nhắn" +copyUsername: "Chép tên người dùng" +searchUser: "Tìm kiếm người dùng" +reply: "Trả lời" +loadMore: "Tải thêm" +showMore: "Xem thêm" +showLess: "Đóng" +youGotNewFollower: "đã theo dõi bạn" +receiveFollowRequest: "Đã yêu cầu theo dõi" +followRequestAccepted: "Đã chấp nhận yêu cầu theo dõi" +mention: "Nhắc đến" +mentions: "Lượt nhắc" +directNotes: "Nhắn riêng" +importAndExport: "Nhập và xuất dữ liệu" +import: "Nhập dữ liệu" +export: "Xuất dữ liệu" +files: "Tập tin" +download: "Tải xuống" +driveFileDeleteConfirm: "Bạn có chắc muốn xóa tập tin \"{name}\"? Tút liên quan cũng sẽ bị xóa theo." +unfollowConfirm: "Bạn có chắc muốn ngưng theo dõi {name}?" +exportRequested: "Đang chuẩn bị xuất tập tin. Quá trình này có thể mất ít phút. Nó sẽ được tự động thêm vào Drive sau khi hoàn thành." +importRequested: "Bạn vừa yêu cầu nhập dữ liệu. Quá trình này có thể mất ít phút." +lists: "Danh sách" +noLists: "Bạn chưa có danh sách nào" +note: "Tút" +notes: "Tút" +following: "Đang theo dõi" +followers: "Người theo dõi" +followsYou: "Theo dõi bạn" +createList: "Tạo danh sách" +manageLists: "Quản lý danh sách" +error: "Lỗi" +somethingHappened: "Xảy ra lỗi" +retry: "Thử lại" +pageLoadError: "Xảy ra lỗi khi tải trang." +pageLoadErrorDescription: "Có thể là do bộ nhớ đệm của trình duyệt. Hãy thử xóa bộ nhớ đệm và thử lại sau ít phút." +serverIsDead: "Máy chủ không phản hồi. Vui lòng thử lại sau giây lát." +youShouldUpgradeClient: "Để xem trang này, hãy làm tươi để cập nhật ứng dụng." +enterListName: "Đặt tên cho danh sách" +privacy: "Bảo mật" +makeFollowManuallyApprove: "Yêu cầu theo dõi cần được duyệt" +defaultNoteVisibility: "Kiểu tút mặc định" +follow: "Đang theo dõi" +followRequest: "Gửi yêu cầu theo dõi" +followRequests: "Yêu cầu theo dõi" +unfollow: "Ngưng theo dõi" +followRequestPending: "Yêu cầu theo dõi đang chờ" +enterEmoji: "Chèn emoji" +renote: "Đăng lại" +unrenote: "Hủy đăng lại" +renoted: "Đã đăng lại." +cantRenote: "Không thể đăng lại tút này." +cantReRenote: "Không thể đăng lại một tút đăng lại." +quote: "Trích dẫn" +pinnedNote: "Tút ghim" +pinned: "Ghim" +you: "Bạn" +clickToShow: "Nhấn để xem" +sensitive: "Nhạy cảm" +add: "Thêm" +reaction: "Biểu cảm" +reactionSetting: "Chọn những biểu cảm hiển thị" +reactionSettingDescription2: "Kéo để sắp xếp, nhấn để xóa, nhấn \"+\" để thêm." +rememberNoteVisibility: "Lưu kiểu tút mặc định" +attachCancel: "Gỡ tập tin đính kèm" +markAsSensitive: "Đánh dấu là nhạy cảm" +unmarkAsSensitive: "Bỏ đánh dấu nhạy cảm" +enterFileName: "Nhập tên tập tin" +mute: "Ẩn" +unmute: "Bỏ ẩn" +block: "Chặn" +unblock: "Bỏ chặn" +suspend: "Vô hiệu hóa" +unsuspend: "Bỏ vô hiệu hóa" +blockConfirm: "Bạn có chắc muốn chặn người này?" +unblockConfirm: "Bạn có chắc muốn bỏ chặn người này?" +suspendConfirm: "Bạn có chắc muốn vô hiệu hóa người này?" +unsuspendConfirm: "Bạn có chắc muốn bỏ vô hiệu hóa người này?" +selectList: "Chọn danh sách" +selectAntenna: "Chọn một antenna" +selectWidget: "Chọn tiện ích" +editWidgets: "Sửa tiện ích" +editWidgetsExit: "Xong" +customEmojis: "Tùy chỉnh emoji" +emoji: "Emoji" +emojis: "Emoji" +emojiName: "Tên emoji" +emojiUrl: "URL Emoji" +addEmoji: "Thêm emoji" +settingGuide: "Cài đặt đề xuất" +cacheRemoteFiles: "Tập tin cache từ xa" +cacheRemoteFilesDescription: "Khi tùy chọn này bị tắt, các tập tin từ xa sẽ được tải trực tiếp từ máy chủ khác. Điều này sẽ giúp giảm dung lượng lưu trữ nhưng lại tăng lưu lượng truy cập, vì hình thu nhỏ sẽ không được tạo." +flagAsBot: "Đánh dấu đây là tài khoản bot" +flagAsBotDescription: "Bật tùy chọn này nếu tài khoản này được kiểm soát bởi một chương trình. Nếu được bật, nó sẽ được đánh dấu để các nhà phát triển khác ngăn chặn chuỗi tương tác vô tận với các bot khác và điều chỉnh hệ thống nội bộ của Calckey để coi tài khoản này như một bot." +flagAsCat: "Tài khoản này là mèo" +flagAsCatDescription: "Bật tùy chọn này để đánh dấu tài khoản là một con mèo." +flagShowTimelineReplies: "Hiện lượt trả lời trong bảng tin" +flagShowTimelineRepliesDescription: "Hiện lượt trả lời của người bạn theo dõi trên tút của những người khác." +autoAcceptFollowed: "Tự động phê duyệt theo dõi từ những người mà bạn đang theo dõi" +addAccount: "Thêm tài khoản" +loginFailed: "Đăng nhập không thành công" +showOnRemote: "Truy cập trang của người này" +general: "Tổng quan" +wallpaper: "Ảnh bìa" +setWallpaper: "Đặt ảnh bìa" +removeWallpaper: "Xóa ảnh bìa" +searchWith: "Tìm kiếm: {q}" +youHaveNoLists: "Bạn chưa có danh sách nào" +followConfirm: "Bạn có chắc muốn theo dõi {name}?" +proxyAccount: "Tài khoản proxy" +proxyAccountDescription: "Tài khoản proxy là tài khoản hoạt động như một người theo dõi từ xa cho người dùng trong những điều kiện nhất định. Ví dụ: khi người dùng thêm người dùng từ xa vào danh sách, hoạt động của người dùng từ xa sẽ không được chuyển đến phiên bản nếu không có người dùng cục bộ nào theo dõi người dùng đó, vì vậy tài khoản proxy sẽ theo dõi." +host: "Host" +selectUser: "Chọn người dùng" +recipient: "Người nhận" +annotation: "Bình luận" +federation: "Liên hợp" +instances: "Máy chủ" +registeredAt: "Đăng ký vào" +latestRequestSentAt: "Yêu cầu cuối gửi lúc" +latestRequestReceivedAt: "Yêu cầu cuối nhận lúc" +latestStatus: "Trạng thái cuối cùng" +storageUsage: "Dung lượng lưu trữ" +charts: "Đồ thị" +perHour: "Mỗi Giờ" +perDay: "Mỗi Ngày" +stopActivityDelivery: "Ngưng gửi hoạt động" +blockThisInstance: "Chặn máy chủ này" +operations: "Vận hành" +software: "Phần mềm" +version: "Phiên bản" +metadata: "Metadata" +monitor: "Giám sát" +jobQueue: "Công việc chờ xử lý" +cpuAndMemory: "CPU và Dung lượng" +network: "Mạng" +disk: "Ổ đĩa" +instanceInfo: "Thông tin máy chủ" +statistics: "Thống kê" +clearQueue: "Xóa hàng đợi" +clearQueueConfirmTitle: "Bạn có chắc muốn xóa hàng đợi?" +clearQueueConfirmText: "Mọi tút chưa được gửi còn lại trong hàng đợi sẽ không được liên hợp. Thông thường thao tác này không cần thiết." +clearCachedFiles: "Xóa bộ nhớ đệm" +clearCachedFilesConfirm: "Bạn có chắc muốn xóa sạch bộ nhớ đệm?" +blockedInstances: "Máy chủ đã chặn" +blockedInstancesDescription: "Danh sách những máy chủ bạn muốn chặn. Chúng sẽ không thể giao tiếp với máy chủy này nữa." +muteAndBlock: "Ẩn và Chặn" +mutedUsers: "Người đã ẩn" +blockedUsers: "Người đã chặn" +noUsers: "Chưa có ai" +editProfile: "Sửa hồ sơ" +noteDeleteConfirm: "Bạn có chắc muốn xóa tút này?" +pinLimitExceeded: "Bạn đã đạt giới hạn số lượng tút có thể ghim" +intro: "Đã cài đặt Calckey! Xin hãy tạo tài khoản admin." +done: "Xong" +processing: "Đang xử lý" +preview: "Xem trước" +default: "Mặc định" +defaultValueIs: "Mặc định: {value}" +noCustomEmojis: "Không có emoji" +noJobs: "Không có công việc" +federating: "Đang liên hợp" +blocked: "Đã chặn" +suspended: "Đã vô hiệu hóa" +all: "Tất cả" +subscribing: "Đang đăng ký" +publishing: "Đang đăng" +notResponding: "Không có phản hồi" +instanceFollowing: "Đang theo dõi máy chủ" +instanceFollowers: "Người theo dõi của máy chủ" +instanceUsers: "Người dùng trên máy chủ này" +changePassword: "Đổi mật khẩu" +security: "Bảo mật" +retypedNotMatch: "Mật khẩu không trùng khớp." +currentPassword: "Mật khẩu hiện tại" +newPassword: "Mật khẩu mới" +newPasswordRetype: "Nhập lại mật khẩu mới" +attachFile: "Đính kèm tập tin" +more: "Thêm nữa!" +featured: "Nổi bật" +usernameOrUserId: "Tên người dùng hoặc ID" +noSuchUser: "Không tìm thấy người dùng" +lookup: "Tìm kiếm" +announcements: "Thông báo" +imageUrl: "URL ảnh" +remove: "Xóa" +removed: "Đã xóa" +removeAreYouSure: "Bạn có chắc muốn gỡ \"{x}\"?" +deleteAreYouSure: "Bạn có chắc muốn xóa \"{x}\"?" +resetAreYouSure: "Bạn có chắc muốn đặt lại?" +saved: "Đã lưu" +messaging: "Trò chuyện" +upload: "Tải lên" +keepOriginalUploading: "Giữ hình ảnh gốc" +keepOriginalUploadingDescription: "Giữ nguyên như hình ảnh được tải lên ban đầu. Nếu tắt, một phiên bản để hiển thị trên web sẽ được tạo khi tải lên." +fromDrive: "Từ ổ đĩa" +fromUrl: "Từ URL" +uploadFromUrl: "Tải lên bằng một URL" +uploadFromUrlDescription: "URL của tập tin bạn muốn tải lên" +uploadFromUrlRequested: "Đã yêu cầu tải lên" +uploadFromUrlMayTakeTime: "Sẽ mất một khoảng thời gian để tải lên xong." +explore: "Khám phá" +messageRead: "Đã đọc" +noMoreHistory: "Không còn gì để đọc" +startMessaging: "Bắt đầu trò chuyện" +nUsersRead: "đọc bởi {n}" +agreeTo: "Tôi đồng ý {0}" +tos: "Điều khoản dịch vụ" +start: "Bắt đầu" +home: "Trang chính" +remoteUserCaution: "Vì người dùng này ở máy chủ khác, thông tin hiển thị có thể không đầy đủ." +activity: "Hoạt động" +images: "Hình ảnh" +birthday: "Sinh nhật" +yearsOld: "{age} tuổi" +registeredDate: "Tham gia" +location: "Đến từ" +theme: "Chủ đề" +themeForLightMode: "Chủ đề dùng trong trong chế độ Sáng" +themeForDarkMode: "Chủ đề dùng trong chế độ Tối" +light: "Sáng" +dark: "Tối" +lightThemes: "Những chủ đề sáng" +darkThemes: "Những chủ đề tối" +syncDeviceDarkMode: "Đồng bộ với thiết bị" +drive: "Ổ đĩa" +fileName: "Tên tập tin" +selectFile: "Chọn tập tin" +selectFiles: "Chọn nhiều tập tin" +selectFolder: "Chọn thư mục" +selectFolders: "Chọn nhiều thư mục" +renameFile: "Đổi tên tập tin" +folderName: "Tên thư mục" +createFolder: "Tạo thư mục" +renameFolder: "Đổi tên thư mục" +deleteFolder: "Xóa thư mục" +addFile: "Thêm tập tin" +emptyDrive: "Ổ đĩa của bạn trống trơn" +emptyFolder: "Thư mục trống" +unableToDelete: "Không thể xóa" +inputNewFileName: "Nhập tên mới cho tập tin" +inputNewDescription: "Nhập mô tả mới" +inputNewFolderName: "Nhập tên mới cho thư mục" +circularReferenceFolder: "Thư mục đích là một thư mục con của thư mục bạn muốn di chuyển." +hasChildFilesOrFolders: "Không thể xóa cho đến khi không còn gì trong thư mục." +copyUrl: "Sao chép URL" +rename: "Đổi tên" +avatar: "Ảnh đại diện" +banner: "Ảnh bìa" +nsfw: "Nhạy cảm" +whenServerDisconnected: "Khi mất kết nối tới máy chủ" +disconnectedFromServer: "Mất kết nối tới máy chủ" +reload: "Tải lại" +doNothing: "Bỏ qua" +reloadConfirm: "Bạn có muốn thử tải lại bảng tin?" +watch: "Xem" +unwatch: "Ngừng xem" +accept: "Đồng ý" +reject: "Từ chối" +normal: "Bình thường" +instanceName: "Tên máy chủ" +instanceDescription: "Mô tả máy chủ" +maintainerName: "Đội ngũ vận hành" +maintainerEmail: "Email đội ngũ" +tosUrl: "URL Điều khoản dịch vụ" +thisYear: "Năm" +thisMonth: "Tháng" +today: "Hôm nay" +dayX: "{day}" +monthX: "{month}" +yearX: "{year}" +pages: "Trang" +integration: "Tương tác" +connectService: "Kết nối" +disconnectService: "Ngắt kết nối" +enableLocalTimeline: "Bật bảng tin máy chủ" +enableGlobalTimeline: "Bật bảng tin liên hợp" +disablingTimelinesInfo: "Quản trị viên và Kiểm duyệt viên luôn có quyền truy cập mọi bảng tin, kể cả khi chúng không được bật." +registration: "Đăng ký" +enableRegistration: "Cho phép đăng ký mới" +invite: "Mời" +driveCapacityPerLocalAccount: "Dung lượng ổ đĩa tối đa cho mỗi người dùng" +driveCapacityPerRemoteAccount: "Dung lượng ổ đĩa tối đa cho mỗi người dùng từ xa" +inMb: "Tính bằng MB" +iconUrl: "URL Icon" +bannerUrl: "URL Ảnh bìa" +backgroundImageUrl: "URL Ảnh nền" +basicInfo: "Thông tin cơ bản" +pinnedUsers: "Những người thú vị" +pinnedUsersDescription: "Liệt kê mỗi hàng một tên người dùng xuống dòng để ghim trên tab \"Khám phá\"." +pinnedPages: "Trang đã ghim" +pinnedPagesDescription: "Liệt kê các trang thú vị để ghim trên máy chủ." +pinnedClipId: "ID của clip muốn ghim" +pinnedNotes: "Tút ghim" +hcaptcha: "hCaptcha" +enableHcaptcha: "Bật hCaptcha" +hcaptchaSiteKey: "Khóa của trang" +hcaptchaSecretKey: "Khóa bí mật" +recaptcha: "reCAPTCHA" +enableRecaptcha: "Bật reCAPTCHA" +recaptchaSiteKey: "Khóa của trang" +recaptchaSecretKey: "Khóa bí mật" +avoidMultiCaptchaConfirm: "Dùng nhiều hệ thống Captcha có thể gây nhiễu giữa chúng. Bạn có muốn tắt các hệ thống Captcha khác hiện đang hoạt động không? Nếu bạn muốn chúng tiếp tục được bật, hãy nhấn hủy." +antennas: "Trạm phát sóng" +manageAntennas: "Quản lý trạm phát sóng" +name: "Tên" +antennaSource: "Nguồn trạm phát sóng" +antennaKeywords: "Từ khóa để nghe" +antennaExcludeKeywords: "Từ khóa để lọc ra" +antennaKeywordsDescription: "Phân cách bằng dấu cách cho điều kiện AND hoặc bằng xuống dòng cho điều kiện OR." +notifyAntenna: "Thông báo có tút mới" +withFileAntenna: "Chỉ những tút có media" +enableServiceworker: "Bật ServiceWorker" +antennaUsersDescription: "Liệt kê mỗi hàng một tên người dùng" +caseSensitive: "Trường hợp nhạy cảm" +withReplies: "Bao gồm lượt trả lời" +connectedTo: "Những tài khoản sau đã kết nối" +notesAndReplies: "Tút kèm trả lời" +withFiles: "Media" +silence: "Ẩn" +silenceConfirm: "Bạn có chắc muốn ẩn người này?" +unsilence: "Bỏ ẩn" +unsilenceConfirm: "Bạn có chắc muốn bỏ ẩn người này?" +popularUsers: "Những người nổi tiếng" +recentlyUpdatedUsers: "Hoạt động gần đây" +recentlyRegisteredUsers: "Mới tham gia" +recentlyDiscoveredUsers: "Mới khám phá" +exploreUsersCount: "Có {count} người" +exploreFediverse: "Khám phá Fediverse" +popularTags: "Hashtag thông dụng" +userList: "Danh sách" +about: "Giới thiệu" +aboutMisskey: "Về Misskey" +administrator: "Quản trị viên" +token: "Token" +twoStepAuthentication: "Xác minh 2 bước" +moderator: "Kiểm duyệt viên" +moderation: "Kiểm duyệt" +nUsersMentioned: "Dùng bởi {n} người" +securityKey: "Khóa bảo mật" +securityKeyName: "Tên khoá" +registerSecurityKey: "Đăng ký khóa bảo mật" +lastUsed: "Dùng lần cuối" +unregister: "Hủy đăng ký" +passwordLessLogin: "Đăng nhập không mật khẩu" +resetPassword: "Đặt lại mật khẩu" +newPasswordIs: "Mật khẩu mới là \"{password}\"" +reduceUiAnimation: "Giảm chuyển động UI" +share: "Chia sẻ" +notFound: "Không tìm thấy" +notFoundDescription: "Không tìm thấy trang nào tương ứng với URL này." +uploadFolder: "Thư mục tải lên mặc định" +cacheClear: "Xóa bộ nhớ đệm" +markAsReadAllNotifications: "Đánh dấu tất cả các thông báo là đã đọc" +markAsReadAllUnreadNotes: "Đánh dấu tất cả các tút là đã đọc" +markAsReadAllTalkMessages: "Đánh dấu tất cả các tin nhắn là đã đọc" +help: "Trợ giúp" +inputMessageHere: "Nhập nội dung tin nhắn" +close: "Đóng" +group: "Nhóm" +groups: "Các nhóm" +createGroup: "Tạo nhóm" +ownedGroups: "Nhóm tôi quản lý" +joinedGroups: "Nhóm tôi tham gia" +invites: "Mời" +groupName: "Tên nhóm" +members: "Thành viên" +transfer: "Chuyển giao" +messagingWithUser: "Nhắn riêng" +messagingWithGroup: "Chat nhóm" +title: "Tựa đề" +text: "Nội dung" +enable: "Bật" +next: "Kế tiếp" +retype: "Nhập lại" +noteOf: "Tút của {user}" +inviteToGroup: "Mời vào nhóm" +quoteAttached: "Trích dẫn" +quoteQuestion: "Trích dẫn lại?" +noMessagesYet: "Chưa có tin nhắn" +newMessageExists: "Bạn có tin nhắn mới" +onlyOneFileCanBeAttached: "Bạn chỉ có thể đính kèm một tập tin" +signinRequired: "Vui lòng đăng nhập" +invitations: "Mời" +invitationCode: "Mã mời" +checking: "Đang kiểm tra..." +available: "Khả dụng" +unavailable: "Không khả dụng" +usernameInvalidFormat: "Bạn có thể dùng viết hoa/viết thường, chữ số, và dấu gạch dưới." +tooShort: "Quá ngắn" +tooLong: "Quá dài" +weakPassword: "Mật khẩu yếu" +normalPassword: "Mật khẩu tạm được" +strongPassword: "Mật khẩu mạnh" +passwordMatched: "Trùng khớp" +passwordNotMatched: "Không trùng khớp" +signinWith: "Đăng nhập bằng {x}" +signinFailed: "Không thể đăng nhập. Vui lòng kiểm tra tên người dùng và mật khẩu của bạn." +tapSecurityKey: "Nhấn mã bảo mật của bạn" +or: "Hoặc" +language: "Ngôn ngữ" +uiLanguage: "Ngôn ngữ giao diện" +groupInvited: "Bạn đã được mời tham gia nhóm" +aboutX: "Giới thiệu {x}" +useOsNativeEmojis: "Dùng emoji hệ thống" +disableDrawer: "Không dùng menu thanh bên" +youHaveNoGroups: "Không có nhóm nào" +joinOrCreateGroup: "Tham gia hoặc tạo một nhóm mới." +noHistory: "Không có dữ liệu" +signinHistory: "Lịch sử đăng nhập" +disableAnimatedMfm: "Tắt MFM với chuyển động" +doing: "Đang xử lý..." +category: "Phân loại" +tags: "Thẻ" +docSource: "Nguồn tài liệu" +createAccount: "Tạo tài khoản" +existingAccount: "Tài khoản hiện có" +regenerate: "Tạo lại" +fontSize: "Cỡ chữ" +noFollowRequests: "Bạn không có yêu cầu theo dõi nào" +openImageInNewTab: "Mở ảnh trong tab mới" +dashboard: "Trang chính" +local: "Máy chủ này" +remote: "Máy chủ khác" +total: "Tổng cộng" +weekOverWeekChanges: "Thay đổi tuần rồi" +dayOverDayChanges: "Thay đổi hôm qua" +appearance: "Giao diện" +clientSettings: "Cài đặt Client" +accountSettings: "Cài đặt tài khoản" +promotion: "Quảng cáo" +promote: "Quảng cáo" +numberOfDays: "Số ngày" +hideThisNote: "Ẩn tút này" +showFeaturedNotesInTimeline: "Hiện tút nổi bật trong bảng tin" +objectStorage: "Đối tượng lưu trữ" +useObjectStorage: "Dùng đối tượng lưu trữ" +objectStorageBaseUrl: "Base URL" +objectStorageBaseUrlDesc: "URL được sử dụng làm tham khảo. Chỉ định URL của CDN hoặc Proxy của bạn nếu bạn đang sử dụng. Với S3 dùng 'https://.s3.amazonaws.com', còn GCS hoặc dịch vụ tương tự dùng 'https://storage.googleapis.com/', etc." +objectStorageBucket: "Bucket" +objectStorageBucketDesc: "Nhập tên bucket dùng ở nhà cung cấp của bạn." +objectStoragePrefix: "Tiền tố" +objectStoragePrefixDesc: "Các tập tin sẽ được lưu trữ trong các thư mục có tiền tố này." +objectStorageEndpoint: "Đầu cuối" +objectStorageEndpointDesc: "Để trống nếu bạn đang dùng AWS S3, nếu không thì chỉ định đầu cuối là '' hoặc ':', tùy thuộc vào nhà cung cấp dịch vụ." +objectStorageRegion: "Khu vực" +objectStorageRegionDesc: "Nhập một khu vực cụ thể như 'xx-east-1'. Nếu nhà cung cấp dịch vụ của bạn không phân biệt giữa các khu vực, hãy để trống hoặc nhập 'us-east-1'." +objectStorageUseSSL: "Dùng SSL" +objectStorageUseSSLDesc: "Tắt nếu bạn không dùng HTTPS để kết nối API" +objectStorageUseProxy: "Kết nối thông qua Proxy" +objectStorageUseProxyDesc: "Tắt nếu bạn không dùng Proxy để kết nối API" +objectStorageSetPublicRead: "Đặt \"public-read\" khi tải lên" +serverLogs: "Nhật ký máy chủ" +deleteAll: "Xóa tất cả" +showFixedPostForm: "Hiện khung soạn tút ở phía trên bảng tin" +newNoteRecived: "Đã nhận tút mới" +sounds: "Âm thanh" +listen: "Nghe" +none: "Không" +showInPage: "Hiện trong trang" +popout: "Pop-out" +volume: "Âm lượng" +masterVolume: "Âm thanh chung" +details: "Chi tiết" +chooseEmoji: "Chọn emoji" +unableToProcess: "Không thể hoàn tất hành động" +recentUsed: "Sử dụng gần đây" +install: "Cài đặt" +uninstall: "Gỡ bỏ" +installedApps: "Ứng dụng đã cài đặt" +nothing: "Không có gì ở đây" +installedDate: "Cho phép vào" +lastUsedDate: "Dùng gần nhất" +state: "Trạng thái" +sort: "Sắp xếp" +ascendingOrder: "Tăng dần" +descendingOrder: "Giảm dần" +scratchpad: "Scratchpad" +scratchpadDescription: "Scratchpad cung cấp môi trường cho các thử nghiệm AiScript. Bạn có thể viết, thực thi và kiểm tra kết quả tương tác với Calckey trong đó." +output: "Nguồn ra" +script: "Kịch bản" +disablePagesScript: "Tắt AiScript trên Trang" +updateRemoteUser: "Cập nhật thông tin người dùng ở máy chủ khác" +deleteAllFiles: "Xóa toàn bộ tập tin" +deleteAllFilesConfirm: "Bạn có chắc xóa toàn bộ tập tin?" +removeAllFollowing: "Ngưng theo dõi tất cả mọi người" +removeAllFollowingDescription: "Thực hiện điều này sẽ ngưng theo dõi tất cả các tài khoản khỏi {host}. Chỉ thực hiện điều này nếu máy chủ không còn tồn tại." +userSuspended: "Người này đã bị vô hiệu hóa." +userSilenced: "Người này đã bị ẩn" +yourAccountSuspendedTitle: "Tài khoản bị vô hiệu hóa" +yourAccountSuspendedDescription: "Tài khoản này đã bị vô hiệu hóa do vi phạm quy tắc máy chủ hoặc điều tương tự. Liên hệ với quản trị viên nếu bạn muốn biết lý do chi tiết hơn. Vui lòng không tạo tài khoản mới." +menu: "Menu" +divider: "Phân chia" +addItem: "Thêm mục" +relays: "Chuyển tiếp" +addRelay: "Thêm chuyển tiếp" +inboxUrl: "URL Hộp thư đến" +addedRelays: "Đã thêm các chuyển tiếp" +serviceworkerInfo: "Phải được bật cho thông báo đẩy." +deletedNote: "Tút đã bị xóa" +invisibleNote: "Tút ẩn" +enableInfiniteScroll: "Tự động tải tút mới" +visibility: "Hiển thị" +poll: "Bình chọn" +useCw: "Ẩn nội dung" +enablePlayer: "Mở trình phát video" +disablePlayer: "Đóng trình phát video" +expandTweet: "Mở rộng tweet" +themeEditor: "Công cụ thiết kế theme" +description: "Mô tả" +describeFile: "Thêm mô tả" +enterFileDescription: "Nhập mô tả" +author: "Tác giả" +leaveConfirm: "Có những thay đổi chưa được lưu. Bạn có muốn bỏ chúng không?" +manage: "Quản lý" +plugins: "Plugin" +preferencesBackups: "Sao lưu thiết lập" +deck: "Deck" +undeck: "Bỏ Deck" +useBlurEffectForModal: "Sử dụng hiệu ứng mờ cho các hộp thoại" +useFullReactionPicker: "Dùng bộ chọn biểu cảm cỡ lớn" +width: "Chiều rộng" +height: "Chiều cao" +large: "Lớn" +medium: "Vừa" +small: "Nhỏ" +generateAccessToken: "Tạo mã truy cập" +permission: "Cho phép " +enableAll: "Bật toàn bộ" +disableAll: "Tắt toàn bộ" +tokenRequested: "Cấp quyền truy cập vào tài khoản" +pluginTokenRequestedDescription: "Plugin này sẽ có thể sử dụng các quyền được đặt ở đây." +notificationType: "Loại thông báo" +edit: "Sửa" +emailServer: "Email máy chủ" +enableEmail: "Bật phân phối email" +emailConfigInfo: "Được dùng để xác minh email của bạn lúc đăng ký hoặc nếu bạn quên mật khẩu của mình" +email: "Email" +emailAddress: "Địa chỉ email" +smtpConfig: "Cấu hình máy chủ SMTP" +smtpHost: "Host" +smtpPort: "Cổng" +smtpUser: "Tên người dùng" +smtpPass: "Mật khẩu" +emptyToDisableSmtpAuth: "Để trống tên người dùng và mật khẩu để tắt xác thực SMTP" +smtpSecure: "Dùng SSL/TLS ngầm định cho các kết nối SMTP" +smtpSecureInfo: "Tắt cái này nếu dùng STARTTLS" +testEmail: "Kiểm tra vận chuyển email" +wordMute: "Ẩn chữ" +regexpError: "Lỗi biểu thức" +regexpErrorDescription: "Xảy ra lỗi biểu thức ở dòng {line} của {tab} chữ ẩn:" +instanceMute: "Những máy chủ ẩn" +userSaysSomething: "{name} nói gì đó" +makeActive: "Kích hoạt" +display: "Hiển thị" +copy: "Sao chép" +metrics: "Số liệu" +overview: "Tổng quan" +logs: "Nhật ký" +delayed: "Độ trễ" +database: "Cơ sở dữ liệu" +channel: "Kênh" +create: "Tạo" +notificationSetting: "Cài đặt thông báo" +notificationSettingDesc: "Chọn loại thông báo bạn muốn hiển thị." +useGlobalSetting: "Dùng thiết lập chung" +useGlobalSettingDesc: "Nếu được bật, cài đặt thông báo của bạn sẽ được áp dụng. Nếu bị tắt, có thể thực hiện các thiết lập riêng lẻ." +other: "Khác" +regenerateLoginToken: "Tạo lại mã đăng nhập" +regenerateLoginTokenDescription: "Tạo lại mã nội bộ có thể dùng để đăng nhập. Thông thường hành động này là không cần thiết. Nếu được tạo lại, tất cả các thiết bị sẽ bị đăng xuất." +setMultipleBySeparatingWithSpace: "Tách nhiều mục nhập bằng dấu cách." +fileIdOrUrl: "ID tập tin hoặc URL" +behavior: "Thao tác" +sample: "Ví dụ" +abuseReports: "Lượt báo cáo" +reportAbuse: "Báo cáo" +reportAbuseOf: "Báo cáo {name}" +fillAbuseReportDescription: "Vui lòng điền thông tin chi tiết về báo cáo này. Nếu đó là về một tút cụ thể, hãy kèm theo URL của tút." +abuseReported: "Báo cáo đã được gửi. Cảm ơn bạn nhiều." +reporter: "Người báo cáo" +reporteeOrigin: "Bị báo cáo" +reporterOrigin: "Máy chủ người báo cáo" +forwardReport: "Chuyển tiếp báo cáo cho máy chủ từ xa" +forwardReportIsAnonymous: "Thay vì tài khoản của bạn, một tài khoản hệ thống ẩn danh sẽ được hiển thị dưới dạng người báo cáo ở máy chủ từ xa." +send: "Gửi" +abuseMarkAsResolved: "Đánh dấu đã xử lý" +openInNewTab: "Mở trong tab mới" +openInSideView: "Mở trong thanh bên" +defaultNavigationBehaviour: "Thao tác điều hướng mặc định" +editTheseSettingsMayBreakAccount: "Việc chỉnh sửa các cài đặt này có thể làm hỏng tài khoản của bạn." +instanceTicker: "Thông tin máy chủ của tút" +waitingFor: "Đang đợi {x}" +random: "Ngẫu nhiên" +system: "Hệ thống" +switchUi: "Chuyển đổi giao diện người dùng" +desktop: "Desktop" +clip: "Ghim" +createNew: "Tạo mới" +optional: "Không bắt buộc" +createNewClip: "Tạo một ghim mới" +unclip: "Bỏ ghim" +confirmToUnclipAlreadyClippedNote: "Bài đăng này là một phần của \"{name}\" ghim. Bạn có muốn bỏ khỏi ghim?" +public: "Công khai" +i18nInfo: "Calckey đang được các tình nguyện viên dịch sang nhiều thứ tiếng khác nhau. Bạn có thể hỗ trợ tại {link}." +manageAccessTokens: "Tạo mã truy cập" +accountInfo: "Thông tin tài khoản" +notesCount: "Số lượng tút" +repliesCount: "Số lượt trả lời đã gửi" +renotesCount: "Số lượt đăng lại đã gửi" +repliedCount: "Số lượt trả lời đã nhận" +renotedCount: "Lượt chia sẻ" +followingCount: "Số lượng người tôi theo dõi" +followersCount: "Số lượng người theo dõi tôi" +sentReactionsCount: "Số lượng biểu cảm đã gửi" +receivedReactionsCount: "Số lượng biểu cảm đã nhận" +pollVotesCount: "Số lượng bình chọn đã gửi" +pollVotedCount: "Số lượng bình chọn đã nhận" +yes: "Đồng ý" +no: "Từ chối" +driveFilesCount: "Số tập tin trong Ổ đĩa" +driveUsage: "Dung lượng ổ đĩa" +noCrawle: "Từ chối lập chỉ mục" +noCrawleDescription: "Không cho công cụ tìm kiếm lập chỉ mục trang hồ sơ, tút, Trang, etc." +lockedAccountInfo: "Ghi chú của bạn sẽ hiển thị với bất kỳ ai, trừ khi bạn đặt chế độ hiển thị tút của mình thành \"Chỉ người theo dõi\"." +alwaysMarkSensitive: "Luôn đánh dấu NSFW" +loadRawImages: "Tải ảnh gốc thay vì ảnh thu nhỏ" +disableShowingAnimatedImages: "Không phát ảnh động" +verificationEmailSent: "Một email xác minh đã được gửi. Vui lòng nhấn vào liên kết đính kèm để hoàn tất xác minh." +notSet: "Chưa đặt" +emailVerified: "Email đã được xác minh" +noteFavoritesCount: "Số lượng tút yêu thích" +pageLikesCount: "Số lượng trang đã thích" +pageLikedCount: "Số lượng thích trang đã nhận" +contact: "Liên hệ" +useSystemFont: "Dùng phông chữ mặc định của hệ thống" +clips: "Ghim" +experimentalFeatures: "Tính năng thử nghiệm" +developer: "Nhà phát triển" +makeExplorable: "Không hiện tôi trong \"Khám phá\"" +makeExplorableDescription: "Nếu bạn tắt, tài khoản của bạn sẽ không hiện trong mục \"Khám phá\"." +showGapBetweenNotesInTimeline: "Hiện dải phân cách giữa các tút trên bảng tin" +duplicate: "Tạo bản sao" +left: "Bên trái" +center: "Giữa" +wide: "Rộng" +narrow: "Thu hẹp" +reloadToApplySetting: "Cài đặt này sẽ chỉ áp dụng sau khi tải lại trang. Tải lại ngay bây giờ?" +needReloadToApply: "Cần tải lại để điều này được áp dụng." +showTitlebar: "Hiện thanh tựa đề" +clearCache: "Xóa bộ nhớ đệm" +onlineUsersCount: "{n} người đang online" +nUsers: "{n} Người" +nNotes: "{n} Tút" +sendErrorReports: "Báo lỗi" +sendErrorReportsDescription: "Khi được bật, thông tin chi tiết về lỗi sẽ được chia sẻ với Calckey khi xảy ra sự cố, giúp nâng cao chất lượng của Calckey.\nBao gồm thông tin như phiên bản hệ điều hành của bạn, trình duyệt bạn đang sử dụng, hoạt động của bạn trong Calckey, v.v." +myTheme: "Theme của tôi" +backgroundColor: "Màu nền" +accentColor: "Màu phụ" +textColor: "Màu chữ" +saveAs: "Lưu thành" +advanced: "Nâng cao" +value: "Giá trị" +createdAt: "Ngày tạo" +updatedAt: "Cập nhật lúc" +saveConfirm: "Lưu thay đổi?" +deleteConfirm: "Bạn có muốn xóa không?" +invalidValue: "Giá trị không hợp lệ." +registry: "Registry" +closeAccount: "Đóng tài khoản" +currentVersion: "Phiên bản hiện tại" +latestVersion: "Phiên bản mới nhất" +youAreRunningUpToDateClient: "Bạn đang sử dụng phiên bản mới nhất." +newVersionOfClientAvailable: "Có phiên bản mới cho bạn cập nhật." +usageAmount: "Sử dụng" +capacity: "Sức chứa" +inUse: "Đã dùng" +editCode: "Chỉnh sửa mã" +apply: "Áp dụng" +receiveAnnouncementFromInstance: "Nhận thông báo từ máy chủ này" +emailNotification: "Thông báo email" +publish: "Đăng" +inChannelSearch: "Tìm trong kênh" +useReactionPickerForContextMenu: "Nhấn chuột phải để mở bộ chọn biểu cảm" +typingUsers: "{users} đang nhập" +jumpToSpecifiedDate: "Đến một ngày cụ thể" +showingPastTimeline: "Hiện đang hiển thị dòng thời gian cũ" +clear: "Hoàn lại" +markAllAsRead: "Đánh dấu tất cả đã đọc" +goBack: "Quay lại" +unlikeConfirm: "Bạn có chắc muốn bỏ thích ?" +fullView: "Kích thước đầy đủ" +quitFullView: "Thoát toàn màn hình" +addDescription: "Thêm mô tả" +userPagePinTip: "Bạn có thể hiển thị các tút ở đây bằng cách chọn \"Ghim vào hồ sơ\" từ menu của mỗi tút." +notSpecifiedMentionWarning: "Tút này có đề cập đến những người không mong muốn" +info: "Giới thiệu" +userInfo: "Thông tin người dùng" +unknown: "Chưa biết" +onlineStatus: "Trạng thái" +hideOnlineStatus: "Ẩn trạng thái online" +hideOnlineStatusDescription: "Ẩn trạng thái online của bạn làm giảm sự tiện lợi của một số tính năng như tìm kiếm." +online: "Online" +active: "Hoạt động" +offline: "Offline" +notRecommended: "Không đề xuất" +botProtection: "Bảo vệ Bot" +instanceBlocking: "Máy chủ đã chặn" +selectAccount: "Chọn một tài khoản" +switchAccount: "Chuyển tài khoản" +enabled: "Đã bật" +disabled: "Đã tắt" +quickAction: "Thao tác nhanh" +user: "Người dùng" +administration: "Quản lý" +accounts: "Tài khoản của bạn" +switch: "Chuyển đổi" +noMaintainerInformationWarning: "Chưa thiết lập thông tin vận hành." +noBotProtectionWarning: "Bảo vệ Bot chưa thiết lập." +configure: "Thiết lập" +postToGallery: "Tạo tút có ảnh" +gallery: "Thư viện ảnh" +recentPosts: "Tút gần đây" +popularPosts: "Tút được xem nhiều nhất" +shareWithNote: "Chia sẻ kèm với tút" +ads: "Quảng cáo" +expiration: "Thời hạn" +memo: "Lưu ý" +priority: "Ưu tiên" +high: "Cao" +middle: "Vừa" +low: "Thấp" +emailNotConfiguredWarning: "Chưa đặt địa chỉ email." +ratio: "Tỷ lệ" +previewNoteText: "Hiện xem trước" +customCss: "Tùy chỉnh CSS" +customCssWarn: "Chỉ sử dụng những cài đặt này nếu bạn biết rõ về nó. Việc nhập các giá trị không đúng có thể khiến máy chủ hoạt động không bình thường." +global: "Toàn cầu" +squareAvatars: "Ảnh đại diện vuông" +sent: "Gửi" +received: "Đã nhận" +searchResult: "Kết quả tìm kiếm" +hashtags: "Hashtag" +troubleshooting: "Khắc phục sự cố" +useBlurEffect: "Dùng hiệu ứng làm mờ trong giao diện" +learnMore: "Tìm hiểu thêm" +misskeyUpdated: "Calckey vừa được cập nhật!" +whatIsNew: "Hiện những thay đổi" +translate: "Dịch" +translatedFrom: "Dịch từ {x}" +accountDeletionInProgress: "Đang xử lý việc xóa tài khoản" +usernameInfo: "Bạn có thể sử dụng chữ cái (a ~ z, A ~ Z), chữ số (0 ~ 9) hoặc dấu gạch dưới (_). Tên người dùng không thể thay đổi sau này." +aiChanMode: "Chế độ Ai" +keepCw: "Giữ cảnh báo nội dung" +pubSub: "Tài khoản Chính/Phụ" +lastCommunication: "Lần giao tiếp cuối" +resolved: "Đã xử lý" +unresolved: "Chờ xử lý" +breakFollow: "Xóa người theo dõi" +itsOn: "Đã bật" +itsOff: "Đã tắt" +emailRequiredForSignup: "Yêu cầu địa chỉ email khi đăng ký" +unread: "Chưa đọc" +filter: "Bộ lọc" +controlPanel: "Bảng điều khiển" +manageAccounts: "Quản lý tài khoản" +makeReactionsPublic: "Đặt lịch sử biểu cảm công khai" +makeReactionsPublicDescription: "Điều này sẽ hiển thị công khai danh sách tất cả các biểu cảm trước đây của bạn." +classic: "Cổ điển" +muteThread: "Không quan tâm nữa" +unmuteThread: "Quan tâm tút này" +ffVisibility: "Hiển thị Theo dõi/Người theo dõi" +ffVisibilityDescription: "Quyết định ai có thể xem những người bạn theo dõi và những người theo dõi bạn." +continueThread: "Tiếp tục xem chuỗi tút" +deleteAccountConfirm: "Điều này sẽ khiến tài khoản bị xóa vĩnh viễn. Vẫn tiếp tục?" +incorrectPassword: "Sai mật khẩu." +voteConfirm: "Xác nhận bình chọn \"{choice}\"?" +hide: "Ẩn" +leaveGroup: "Rời khỏi nhóm" +leaveGroupConfirm: "Bạn có chắc muốn rời khỏi nhóm \"{name}\"?" +useDrawerReactionPickerForMobile: "Hiện bộ chọn biểu cảm dạng xổ ra trên điện thoại" +welcomeBackWithName: "Chào mừng trở lại, {name}" +clickToFinishEmailVerification: "Vui lòng nhấn [{ok}] để hoàn tất việc đăng ký." +overridedDeviceKind: "Loại thiết bị" +smartphone: "Điện thoại" +tablet: "Máy tính bảng" +auto: "Tự động" +themeColor: "Màu theme" +size: "Kích thước" +numberOfColumn: "Số lượng cột" +searchByGoogle: "Google" +instanceDefaultLightTheme: "Theme máy chủ Sáng-Rộng" +instanceDefaultDarkTheme: "Theme máy chủ Tối-Rộng" +instanceDefaultThemeDescription: "Nhập mã theme trong định dạng đối tượng." +mutePeriod: "Thời hạn ẩn" +indefinitely: "Vĩnh viễn" +tenMinutes: "10 phút" +oneHour: "1 giờ" +oneDay: "1 ngày" +oneWeek: "1 tuần" +reflectMayTakeTime: "Có thể mất một thời gian để điều này được áp dụng." +failedToFetchAccountInformation: "Không thể lấy thông tin tài khoản" +rateLimitExceeded: "Giới hạn quá mức" +cropImage: "Cắt hình ảnh" +cropImageAsk: "Bạn có muốn cắt ảnh này?" +file: "Tập tin" +recentNHours: "{n}h trước" +recentNDays: "{n} ngày trước" +noEmailServerWarning: "Chưa đặt máy chủ email." +thereIsUnresolvedAbuseReportWarning: "Có báo cáo chưa xử lí." +recommended: "Được đề xuất" +check: "Kiểm tra" +driveCapOverrideLabel: "Thay đổi dung lượng drive cho người này" +driveCapOverrideCaption: "Đặt dung lượng drive về mặc định bằng cách nhập 0 hoặc số âm." +requireAdminForView: "Bạn phải đăng nhập như là quản trị viên mới xem được." +isSystemAccount: "Đã tạo một tài khoản và tự động vận hành bởi hệ thống." +typeToConfirm: "Nhấn {x} để xác nhận" +deleteAccount: "Xóa tài khoản" +document: "Tài liệu" +numberOfPageCache: "Số lượng trang bộ nhớ đệm" +numberOfPageCacheDescription: "Việc tăng con số này sẽ cải thiện sự thuận tiện cho người dùng nhưng gây ra nhiều áp lực hơn cho máy chủ cũng như sử dụng nhiều bộ nhớ hơn." +logoutConfirm: "Bạn có chắc muốn đăng xuất?" +lastActiveDate: "Lần cuối vào" +statusbar: "Thanh trạng thái" +pleaseSelect: "Chọn một lựa chọn" +reverse: "Lật" +colored: "Với màu" +refreshInterval: "Cập nhật nội bộ" +label: "Nhãn" +type: "Loại" +speed: "Tốc độ" +slow: "Chậm" +fast: "Nhanh" +sensitiveMediaDetection: "Tự động phát hiện NSFW" +localOnly: "Chỉ trên máy chủ" +remoteOnly: "Chỉ máy chủ từ xa" +failedToUpload: "Tải lên thất bại" +cannotUploadBecauseInappropriate: "Không thể tải lên tập tin này vì các phần của tập tin đã được phát hiện có khả năng là NSFW." +cannotUploadBecauseNoFreeSpace: "Tải lên không thành công do thiếu dung lượng Drive." +beta: "Beta" +enableAutoSensitive: "Tự động đánh dấu NSFW" +enableAutoSensitiveDescription: "Cho phép tự động phát hiện và đánh dấu media NSFW thông qua học máy, nếu có thể. Ngay cả khi tùy chọn này bị tắt, nó vẫn có thể được bật trên toàn máy chủ." +activeEmailValidationDescription: "Cho phép xác minh địa chỉ email chặt chẽ hơn, bao gồm việc kiểm tra các địa chỉ dùng một lần và xem nó có thực sự được giao tiếp hay không. Khi bỏ chọn, chỉ định dạng của email được xác minh." +navbar: "Thanh điều hướng" +shuffle: "Xáo trộn" +account: "Tài khoản của bạn" +move: "Di chuyển" +_sensitiveMediaDetection: + description: "Giảm nỗ lực kiểm duyệt máy chủ thông qua việc tự động nhận dạng media NSFW thông qua học máy. Điều này sẽ làm tăng một chút áp lực trên máy chủ." + sensitivity: "Phát hiện nhạy cảm" + sensitivityDescription: "Giảm độ nhạy sẽ dẫn đến ít phát hiện sai hơn (dương tính giả), tăng nó sẽ dẫn đến ít phát hiện sai hơn (âm tính giả)." + setSensitiveFlagAutomatically: "Đánh dấu là NSFW" + setSensitiveFlagAutomaticallyDescription: "Kết quả của phát hiện nội bộ sẽ được giữ lại ngay cả khi tùy chọn này bị tắt." + analyzeVideos: "Bật chuẩn đoán video" + analyzeVideosDescription: "Phân tích video bên cạnh hình ảnh. Điều này sẽ làm tăng một chút áp lực trên máy chủ." +_emailUnavailable: + used: "Địa chỉ email đã được sử dụng" + format: "Địa chỉ email không hợp lệ" + disposable: "Cấm sử dụng địa chỉ email dùng một lần" + mx: "Máy chủ email không hợp lệ" + smtp: "Máy chủ email không phản hồi" +_ffVisibility: + public: "Đăng" + followers: "Chỉ người theo dõi mới xem được" + private: "Riêng tư" +_signup: + almostThere: "Gần xong rồi" + emailAddressInfo: "Hãy điền địa chỉ email của bạn. Nó sẽ không được công khai." + emailSent: "Một email xác minh đã được gửi đến địa chỉ email ({email}) của bạn. Vui lòng nhấn vào liên kết trong đó để hoàn tất việc tạo tài khoản." +_accountDelete: + accountDelete: "Xóa tài khoản" + mayTakeTime: "Vì xóa tài khoản là một quá trình tốn nhiều tài nguyên nên có thể mất một khoảng thời gian để hoàn thành, tùy thuộc vào lượng nội dung bạn đã tạo và số lượng tập tin bạn đã tải lên." + sendEmail: "Sau khi hoàn tất việc xóa tài khoản, một email sẽ được gửi đến địa chỉ email đã đăng ký tài khoản này." + requestAccountDelete: "Yêu cầu xóa tài khoản" + started: "Đang bắt đầu xóa tài khoản." + inProgress: "Đang xóa dần tài khoản." +_ad: + back: "Quay lại" + reduceFrequencyOfThisAd: "Hiện ít lại" +_forgotPassword: + enterEmail: "Nhập địa chỉ email bạn đã sử dụng để đăng ký. Một liên kết mà bạn có thể đặt lại mật khẩu của mình sau đó sẽ được gửi đến nó." + ifNoEmail: "Nếu bạn không sử dụng email lúc đăng ký, vui lòng liên hệ với quản trị viên." + contactAdmin: "Máy chủ này không hỗ trợ sử dụng địa chỉ email, vui lòng liên hệ với quản trị viên để đặt lại mật khẩu của bạn." +_gallery: + my: "Kho Ảnh" + liked: "Tút Đã Thích" + like: "Thích" + unlike: "Bỏ thích" +_email: + _follow: + title: "đã theo dõi bạn" + _receiveFollowRequest: + title: "Chấp nhận yêu cầu theo dõi" +_plugin: + install: "Cài đặt tiện ích" + installWarn: "Vui lòng không cài đặt những tiện ích đáng ngờ." + manage: "Quản lý plugin" +_preferencesBackups: + list: "Tạo sao lưu" + saveNew: "Lưu bản sao lưu" + loadFile: "Nhập tập tin" + apply: "Áp dụng lên thiết bị này" + save: "Lưu thay đổi" + inputName: "Nhập tên bản sao lưu" + cannotSave: "Không thể lưu" + nameAlreadyExists: "Bản sao lưu \"{name}\" đã tồn tại. Xin nhập tên khác." + applyConfirm: "Bạn có chắc muốn áp dụng bản sao lưu \"{name}\" cho thiết bị này? Thiết lập hiện tại sẽ bị ghi đè." + saveConfirm: "Lưu bản sao lưu {name}?" + deleteConfirm: "Xóa bản sao lưu {name}?" + renameConfirm: "Đổi tên bản sao lưu \"{old}\" thành \"{new}\"?" + noBackups: "Chưa có bản sao lưu. Bạn có thể sao lưu thiết lập trên máy chủ này bằng cách sử dụng \"Tạo sao lưu\"." + createdAt: "Tạo vào: {time} {date}" + updatedAt: "Cập nhật: {time} {date}" + cannotLoad: "Tải thất bại" + invalidFile: "Sai định dạng tập tin" +_registry: + scope: "Phạm vi" + key: "Mã" + keys: "Các mã" + domain: "Tên miền" + createKey: "Tạo mã" +_aboutMisskey: + about: "Misskey là phần mềm mã nguồn mở được phát triển bởi syuilo từ năm 2014." + contributors: "Những người đóng góp nổi bật" + allContributors: "Toàn bộ người đóng góp" + source: "Mã nguồn" + translation: "Dịch Calckey" + donate: "Ủng hộ Calckey" + morePatrons: "Chúng tôi cũng trân trọng sự hỗ trợ của nhiều người đóng góp khác không được liệt kê ở đây. Cảm ơn! 🥰" + patrons: "Người ủng hộ" +_nsfw: + respect: "Ẩn nội dung NSFW" + ignore: "Hiện nội dung NSFW" + force: "Ẩn mọi media" +_mfm: + cheatSheet: "MFM Cheatsheet" + intro: "MFM là ngôn ngữ phát triển độc quyền của Calckey có thể được sử dụng ở nhiều nơi. Tại đây bạn có thể xem danh sách tất cả các cú pháp MFM có sẵn." + dummy: "Calckey mở rộng thế giới Fediverse" + mention: "Nhắc đến" + mentionDescription: "Bạn có thể nhắc đến ai đó bằng cách sử dụng @tên người dùng." + hashtag: "Hashtag" + hashtagDescription: "Bạn có thể tạo một hashtag bằng #chữ hoặc #số." + url: "URL" + urlDescription: "Những URL có thể hiển thị." + link: "Đường dẫn" + linkDescription: "Các phần cụ thể của văn bản có thể được hiển thị dưới dạng URL." + bold: "In đậm" + boldDescription: "Nổi bật các chữ cái bằng cách làm chúng dày hơn." + small: "Nhỏ" + smallDescription: "Hiển thị nội dung nhỏ và mỏng." + center: "Giữa" + centerDescription: "Hiển thị nội dung căn giữa." + inlineCode: "Mã (Trong dòng)" + inlineCodeDescription: "Hiển thị tô sáng cú pháp trong dòng cho mã (chương trình)." + blockCode: "Mã (Khối)" + blockCodeDescription: "Hiển thị tô sáng cú pháp cho mã nhiều dòng (chương trình) trong một khối." + inlineMath: "Toán học (Trong dòng)" + inlineMathDescription: "Hiển thị công thức toán (KaTeX) trong dòng" + blockMath: "Toán học (Khối)" + blockMathDescription: "Hiển thị công thức toán học nhiều dòng (KaTeX) trong một khối" + quote: "Trích dẫn" + quoteDescription: "Hiển thị nội dung dạng lời trích dạng." + emoji: "Tùy chỉnh emoji" + emojiDescription: "Hiển thị emoji với cú pháp :tên emoji:" + search: "Tìm kiếm" + searchDescription: "Hiển thị hộp tìm kiếm với văn bản được nhập trước." + flip: "Lật" + flipDescription: "Lật nội dung theo chiều ngang hoặc chiều dọc." + jelly: "Chuyển động (Thạch rau câu)" + jellyDescription: "Cho phép nội dung chuyển động giống như thạch rau câu." + tada: "Chuyển động (Tada)" + tadaDescription: "Cho phép nội dung chuyển động kiểu \"Tada!\"." + jump: "Chuyển động (Nhảy múa)" + jumpDescription: "Cho phép nội dung chuyển động nhảy nhót." + bounce: "Chuyển động (Cà tưng)" + bounceDescription: "Cho phép nội dung chuyển động cà tưng." + shake: "Chuyển động (Rung)" + shakeDescription: "Cho phép nội dung chuyển động rung lắc." + twitch: "Chuyển động (Co rút)" + twitchDescription: "Cho phép nội dung chuyển động co rút." + spin: "Chuyển động (Xoay tít)" + spinDescription: "Cho phép nội dung chuyển động xoay tít." + x2: "Lớn" + x2Description: "Hiển thị nội dung cỡ lớn hơn." + x3: "Rất lớn" + x3Description: "Hiển thị nội dung cỡ lớn hơn nữa." + x4: "Khổng lồ" + x4Description: "Hiển thị nội dung cỡ khổng lồ." + blur: "Làm mờ" + blurDescription: "Làm mờ nội dung. Nó sẽ được hiển thị rõ ràng khi di chuột qua." + font: "Phông chữ" + fontDescription: "Chọn phông chữ để hiển thị nội dung." + rainbow: "Cầu vồng" + rainbowDescription: "Làm cho nội dung hiển thị với màu sắc cầu vồng." + sparkle: "Lấp lánh" + sparkleDescription: "Làm cho nội dung hiệu ứng hạt lấp lánh." + rotate: "Xoay" + rotateDescription: "Xoay nội dung theo một góc cụ thể." + plain: "Đơn giản" + plainDescription: "Vô hiệu hóa mọi hiệu ứng MFM chứa trong hiệu ứng MFM này." +_instanceTicker: + none: "Không hiển thị" + remote: "Hiện cho người dùng từ máy chủ khác" + always: "Luôn hiện" +_serverDisconnectedBehavior: + reload: "Tự động tải lại" + dialog: "Hiện hộp thoại cảnh báo" + quiet: "Hiển thị cảnh báo không phô trương" +_channel: + create: "Tạo kênh" + edit: "Chỉnh sửa kênh" + setBanner: "Đặt ảnh bìa" + removeBanner: "Xóa ảnh bìa" + featured: "Xu hướng" + owned: "Do tôi quản lý" + following: "Đang theo dõi" + usersCount: "{n} Thành viên" + notesCount: "{n} Tút" +_menuDisplay: + sideFull: "Thanh bên" + sideIcon: "Thanh bên (Biểu tượng)" + top: "Trên cùng" + hide: "Ẩn" +_wordMute: + muteWords: "Ẩn từ ngữ" + muteWordsDescription: "Separate with spaces for an AND condition or with line breaks for an OR condition." + muteWordsDescription2: "Bao quanh các từ khóa bằng dấu gạch chéo để sử dụng cụm từ thông dụng." + softDescription: "Ẩn các tút phù hợp điều kiện đã đặt khỏi bảng tin." + hardDescription: "Ngăn các tút đáp ứng các điều kiện đã đặt xuất hiện trên bảng tin. Lưu ý, những tút này sẽ không được thêm vào bảng tin ngay cả khi các điều kiện được thay đổi." + soft: "Yếu" + hard: "Mạnh" + mutedNotes: "Những tút đã ẩn" +_instanceMute: + instanceMuteDescription: "Thao tác này sẽ ẩn mọi tút/lượt đăng lại từ các máy chủ được liệt kê, bao gồm cả những tút dạng trả lời từ máy chủ bị ẩn." + instanceMuteDescription2: "Tách bằng cách xuống dòng" + title: "Ẩn tút từ những máy chủ đã liệt kê." + heading: "Danh sách những máy chủ bị ẩn" +_theme: + explore: "Khám phá theme" + install: "Cài đặt theme" + manage: "Quản lý theme" + code: "Mã theme" + description: "Mô tả" + installed: "{name} đã được cài đặt" + installedThemes: "Theme đã cài đặt" + builtinThemes: "Theme tích hợp sẵn" + alreadyInstalled: "Theme này đã được cài đặt" + invalid: "Định dạng của theme này không hợp lệ" + make: "Tạo theme" + base: "Dựa trên có sẵn" + addConstant: "Thêm hằng số" + constant: "Hằng số" + defaultValue: "Giá trị mặc định" + color: "Màu sắc" + refProp: "Tham chiếu một thuộc tính" + refConst: "Tham chiếu một hằng số" + key: "Khóa" + func: "Hàm" + funcKind: "Loại hàm" + argument: "Tham số" + basedProp: "Thuộc tính tham chiếu" + alpha: "Độ trong suốt" + darken: "Độ tối" + lighten: "Độ sáng" + inputConstantName: "Nhập tên cho hằng số này" + importInfo: "Nếu bạn nhập mã theme ở đây, bạn có thể nhập mã đó vào trình chỉnh sửa theme" + deleteConstantConfirm: "Bạn có chắc muốn xóa hằng số {const} không?" + keys: + accent: "Màu phụ" + bg: "Màu nền" + fg: "Màu chữ" + focus: "Trọng tâm" + indicator: "Chỉ báo" + panel: "Thanh bên" + shadow: "Bóng mờ" + header: "Ảnh bìa" + navBg: "Nền thanh bên" + navFg: "Chữ thanh bên" + navHoverFg: "Chữ thanh bên (Khi chạm)" + navActive: "Chữ thanh bên (Khi chọn)" + navIndicator: "Chỉ báo thanh bên" + link: "Đường dẫn" + hashtag: "Hashtag" + mention: "Nhắc đến" + mentionMe: "Lượt nhắc (Tôi)" + renote: "Đăng lại" + modalBg: "Nền phương thức" + divider: "Phân chia" + scrollbarHandle: "Thanh cuộn khi giữ" + scrollbarHandleHover: "Thanh cuộn khi chạm" + dateLabelFg: "Màu ngày tháng năm" + infoBg: "Nền thông tin" + infoFg: "Chữ thông tin" + infoWarnBg: "Nền cảnh báo" + infoWarnFg: "Chữ cảnh báo" + cwBg: "Nền nút nội dung ẩn" + cwFg: "Chữ nút nội dung ẩn" + cwHoverBg: "Nền nút nội dung ẩn (Chạm)" + toastBg: "Nền thông báo" + toastFg: "Chữ thông báo" + buttonBg: "Nền nút" + buttonHoverBg: "Nền nút (Chạm)" + inputBorder: "Đường viền khung soạn thảo" + listItemHoverBg: "Nền mục liệt kê (Chạm)" + driveFolderBg: "Nền thư mục Ổ đĩa" + wallpaperOverlay: "Lớp phủ hình nền" + badge: "Huy hiệu" + messageBg: "Nền chat" + accentDarken: "Màu phụ (Tối)" + accentLighten: "Màu phụ (Sáng)" + fgHighlighted: "Chữ nổi bật" +_sfx: + note: "Tút" + noteMy: "Tút của tôi" + notification: "Thông báo" + chat: "Trò chuyện" + chatBg: "Chat (Nền)" + antenna: "Trạm phát sóng" + channel: "Kênh" +_ago: + future: "Tương lai" + justNow: "Vừa xong" + secondsAgo: "{n}s trước" + minutesAgo: "{n} phút trước" + hoursAgo: "{n} giờ trước" + daysAgo: "{n} ngày trước" + weeksAgo: "{n} tuần trước" + monthsAgo: "{n} tháng trước" + yearsAgo: "{n} năm trước" +_time: + second: "s" + minute: "phút" + hour: "giờ" + day: "ngày" +_tutorial: + title: "How to use Calckey" + step1_1: "Welcome!" + step1_2: "Let's get you set up. You'll be up and running in no time!" + step2_1: "First, please fill out your profile." + step2_2: "Providing some information about who you are will make it easier for others to tell if they want to see your notes or follow you." + step3_1: "Now time to follow some people!" + step3_2: "Your home and social timelines are based off of who you follow, so try following a couple accounts to get started.\nClick the plus circle on the top right of a profile to follow them." + step4_1: "Let's get you out there." + step4_2: "For your first post, some people like to made a {introduction} post or a simple \"Hello world!\"" + step5_1: "Timelines, timelines everywhere!" + step5_2: "Your instance has {timelines} different timelines enabled." + step5_3: "The Home {icon} timeline is where you can see posts from your followers." + step5_4: "The Local {icon} timeline is where you can see posts from everyone else on this instance." + step5_5: "The Recommended {icon} timeline is where you can see posts from instances the admins recommend." + step5_6: "The Social {icon} timeline is where you can see posts from friends of your followers." + step5_7: "The Global {icon} timeline is where you can see posts from every other connected instance." + step6_1: "So, what is this place?" + step6_2: "Well, you didn't just join Calckey. You joined a portal to the Fediverse, an interconnected network of thousands of servers, called \"instances\"." + step6_3: "Each server works in different ways, and not all servers run Calckey. This one does though! It's a bit complicated, but you'll get the hang of it in no time." + step6_4: "Now go, explore, and have fun!" +_2fa: + alreadyRegistered: "Bạn đã đăng ký thiết bị xác minh 2 bước." + registerTOTP: "Đăng ký một thiết bị" + registerSecurityKey: "Đăng ký một mã bảo vệ" + step1: "Trước tiên, hãy cài đặt một ứng dụng xác minh (chẳng hạn như {a} hoặc {b}) trên thiết bị của bạn." + step2: "Sau đó, quét mã QR hiển thị trên màn hình này." + step2Url: "Bạn cũng có thể nhập URL này nếu sử dụng một chương trình máy tính:" + step3: "Nhập mã token do ứng dụng của bạn cung cấp để hoàn tất thiết lập." + step4: "Kể từ bây giờ, những lần đăng nhập trong tương lai sẽ yêu cầu mã token đăng nhập đó." + securityKeyInfo: "Bên cạnh xác minh bằng vân tay hoặc mã PIN, bạn cũng có thể thiết lập xác minh thông qua khóa bảo mật phần cứng hỗ trợ FIDO2 để bảo mật hơn nữa cho tài khoản của mình." +_permissions: + "read:account": "Xem thông tin tài khoản của bạn" + "write:account": "Sửa thông tin tài khoản của bạn" + "read:blocks": "Xem danh sách người bạn chặn" + "write:blocks": "Sửa danh sách người bạn chặn" + "read:drive": "Truy cập tập tin, thư mục trong Ổ đĩa" + "write:drive": "Sửa và xóa tập tin, thư mục trong Ổ đĩa" + "read:favorites": "Xem lượt thích của tôi" + "write:favorites": "Sửa lượt thích của tôi" + "read:following": "Xem những người bạn theo dõi" + "write:following": "Theo dõi hoặc ngưng theo dõi ai đó" + "read:messaging": "Xem lịch sử chat" + "write:messaging": "Soạn hoặc xóa tin nhắn" + "read:mutes": "Xem những người bạn ẩn" + "write:mutes": "Sửa những người bạn ẩn" + "write:notes": "Soạn hoặc xóa tút" + "read:notifications": "Xem thông báo của tôi" + "write:notifications": "Quản lý thông báo của tôi" + "read:reactions": "Xem lượt biểu cảm của tôi" + "write:reactions": "Sửa lượt biểu cảm của tôi" + "write:votes": "Bình chọn" + "read:pages": "Xem trang của tôi" + "write:pages": "Sửa hoặc xóa trang của tôi" + "read:page-likes": "Xem lượt thích trên trang của tôi" + "write:page-likes": "Sửa lượt thích của tôi trên trang" + "read:user-groups": "Xem nhóm của tôi" + "write:user-groups": "Sửa hoặc xóa nhóm của tôi" + "read:channels": "Xem kênh của tôi" + "write:channels": "Sửa kênh của tôi" + "read:gallery": "Xem kho ảnh của tôi" + "write:gallery": "Sửa kho ảnh của tôi" + "read:gallery-likes": "Xem danh sách các tút đã thích trong thư viện của tôi" + "write:gallery-likes": "Sửa danh sách các tút đã thích trong thư viện của tôi" +_auth: + shareAccess: "Bạn có muốn cho phép \"{name}\" truy cập vào tài khoản này không?" + shareAccessAsk: "Bạn có chắc muốn cho phép ứng dụng này truy cập vào tài khoản của mình không?" + permissionAsk: "Ứng dụng này yêu cầu các quyền sau" + pleaseGoBack: "Vui lòng quay lại ứng dụng" + callback: "Quay lại ứng dụng" + denied: "Truy cập bị từ chối" +_antennaSources: + all: "Toàn bộ tút" + homeTimeline: "Tút từ những người đã theo dõi" + users: "Tút từ những người cụ thể" + userList: "Tút từ danh sách người dùng cụ thể" + userGroup: "Tút từ người dùng trong một nhóm cụ thể" +_weekday: + sunday: "Chủ Nhật" + monday: "Thứ Hai" + tuesday: "Thứ Ba" + wednesday: "Thứ Tư" + thursday: "Thứ Năm" + friday: "Thứ Sáu" + saturday: "Thứ Bảy" +_widgets: + memo: "Tút đã ghim" + notifications: "Thông báo" + timeline: "Bảng tin" + calendar: "Lịch" + trends: "Xu hướng" + clock: "Đồng hồ" + rss: "Trình đọc RSS" + rssTicker: "RSS-Ticker" + activity: "Hoạt động" + photos: "Kho ảnh" + digitalClock: "Đồng hồ số" + unixClock: "Đồng hồ UNIX" + federation: "Liên hợp" + instanceCloud: "Instance cloud" + postForm: "Mẫu đăng" + slideshow: "Trình chiếu" + button: "Nút" + onlineUsers: "Ai đang online" + jobQueue: "Công việc chờ xử lý" + serverMetric: "Thống kê máy chủ" + aiscript: "AiScript console" + aichan: "Ai" +_cw: + hide: "Ẩn" + show: "Tải thêm" + chars: "{count} ký tự" + files: "{count} tập tin" +_poll: + noOnlyOneChoice: "Cần ít nhất hai lựa chọn." + choiceN: "Lựa chọn {n}" + noMore: "Bạn không thể thêm lựa chọn" + canMultipleVote: "Cho phép chọn nhiều lựa chọn" + expiration: "Thời hạn" + infinite: "Vĩnh viễn" + at: "Kết thúc vào..." + after: "Kết thúc sau..." + deadlineDate: "Ngày kết thúc" + deadlineTime: "giờ" + duration: "Thời hạn" + votesCount: "{n} bình chọn" + totalVotes: "{n} tổng bình chọn" + vote: "Bình chọn" + showResult: "Xem kết quả" + voted: "Đã bình chọn" + closed: "Đã kết thúc" + remainingDays: "{d} ngày {h} giờ còn lại" + remainingHours: "{h} giờ {m} phút còn lại" + remainingMinutes: "{m} phút {s}s còn lại" + remainingSeconds: "{s}s còn lại" +_visibility: + public: "Công khai" + publicDescription: "Mọi người đều có thể đọc tút của bạn" + home: "Trang chính" + homeDescription: "Chỉ đăng lên bảng tin nhà" + followers: "Người theo dõi" + followersDescription: "Dành riêng cho người theo dõi" + specified: "Nhắn riêng" + specifiedDescription: "Chỉ người được nhắc đến mới thấy" + localOnly: "Chỉ trên máy chủ" + localOnlyDescription: "Không hiển thị với người ở máy chủ khác" +_postForm: + replyPlaceholder: "Trả lời tút này" + quotePlaceholder: "Trích dẫn tút này" + channelPlaceholder: "Đăng lên một kênh" + _placeholders: + a: "Bạn đang định làm gì?" + b: "Hôm nay bạn có gì vui?" + c: "Bạn đang nghĩ gì?" + d: "Bạn muốn nói gì?" + e: "Bắt đầu viết..." + f: "Đang chờ bạn viết..." +_profile: + name: "Tên" + username: "Tên người dùng" + description: "Tiểu sử" + youCanIncludeHashtags: "Bạn có thể dùng hashtag trong tiểu sử." + metadata: "Thông tin bổ sung" + metadataEdit: "Sửa thông tin bổ sung" + metadataDescription: "Sử dụng phần này, bạn có thể hiển thị các mục thông tin bổ sung trong hồ sơ của mình." + metadataLabel: "Nhãn" + metadataContent: "Nội dung" + changeAvatar: "Đổi ảnh đại diện" + changeBanner: "Đổi ảnh bìa" +_exportOrImport: + allNotes: "Toàn bộ tút" + followingList: "Đang theo dõi" + muteList: "Ẩn" + blockingList: "Chặn" + userLists: "Danh sách" + excludeMutingUsers: "Loại trừ những người dùng bị ẩn" + excludeInactiveUsers: "Loại trừ những người dùng không hoạt động" +_charts: + federation: "Liên hợp" + apRequest: "Yêu cầu" + usersIncDec: "Sự khác biệt về số lượng người dùng" + usersTotal: "Tổng số người dùng" + activeUsers: "Số người đang hoạt động" + notesIncDec: "Sự khác biệt về số lượng tút" + localNotesIncDec: "Sự khác biệt về số lượng tút máy chủ này" + remoteNotesIncDec: "Sự khác biệt về số lượng tút từ máy chủ khác" + notesTotal: "Tổng số sút" + filesIncDec: "Sự khác biệt về số lượng tập tin" + filesTotal: "Tổng số tập tin" + storageUsageIncDec: "Sự khác biệt về dung lượng lưu trữ" + storageUsageTotal: "Tổng dung lượng lưu trữ" +_instanceCharts: + requests: "Lượt yêu cầu" + users: "Sự khác biệt về số lượng người dùng" + usersTotal: "Số lượng người dùng tích lũy" + notes: "Sự khác biệt về số lượng tút" + notesTotal: "Số lượng tút tích lũy" + ff: "Sự khác biệt về số lượng người dùng được theo dõi/người theo dõi" + ffTotal: "Số lượng người dùng được theo dõi/người theo dõi tích lũy" + cacheSize: "Sự khác biệt về dung lượng bộ nhớ đệm" + cacheSizeTotal: "Dung lượng bộ nhớ đệm tích lũy" + files: "Sự khác biệt về số lượng tập tin" + filesTotal: "Số lượng tập tin tích lũy" +_timelines: + home: "Trang chính" + local: "Máy chủ này" + social: "Xã hội" + global: "Liên hợp" +_pages: + newPage: "Tạo Trang mới" + editPage: "Sửa Trang này" + readPage: "Xem mã nguồn Trang này" + created: "Trang đã được tạo thành công" + updated: "Trang đã được cập nhật thành công" + deleted: "Trang đã được xóa thành công" + pageSetting: "Cài đặt trang" + nameAlreadyExists: "URL Trang đã tồn tại" + invalidNameTitle: "URL Trang không hợp lệ" + invalidNameText: "Không được để trống tựa đề Trang" + editThisPage: "Sửa Trang này" + viewSource: "Xem mã nguồn" + viewPage: "Xem trang của tôi" + like: "Thích" + unlike: "Bỏ thích" + my: "Trang của tôi" + liked: "Trang đã thích" + featured: "Nổi tiếng" + inspector: "Thanh tra" + contents: "Nội dung" + content: "Chặn Trang" + variables: "Biến thể" + title: "Tựa đề" + url: "URL Trang" + summary: "Mô tả Trang" + alignCenter: "Căn giữa" + hideTitleWhenPinned: "Ẩn tựa đề Trang khi ghim lên hồ sơ" + font: "Phông chữ" + fontSerif: "Serif" + fontSansSerif: "Sans Serif" + eyeCatchingImageSet: "Đặt ảnh thu nhỏ" + eyeCatchingImageRemove: "Xóa ảnh thu nhỏ" + chooseBlock: "Thêm khối" + selectType: "Chọn kiểu" + enterVariableName: "Nhập tên một biến thể" + variableNameIsAlreadyUsed: "Tên biến thể này đã được sử dụng" + contentBlocks: "Nội dung" + inputBlocks: "Nhập" + specialBlocks: "Đặc biệt" + blocks: + text: "Văn bản" + textarea: "Khu vực văn bản" + section: "Mục " + image: "Hình ảnh" + button: "Nút" + if: "Nếu" + _if: + variable: "Biến thể" + post: "Mẫu đăng" + _post: + text: "Nội dung" + attachCanvasImage: "Đính kèm hình canva" + canvasId: "ID Canva" + textInput: "Văn bản đầu vào" + _textInput: + name: "Tên biến thể" + text: "Tựa đề" + default: "Giá trị mặc định" + textareaInput: "Văn bản nhiều dòng đầu vào" + _textareaInput: + name: "Tên biến thể" + text: "Tựa đề" + default: "Giá trị mặc định" + numberInput: "Đầu vào số" + _numberInput: + name: "Tên biến thể" + text: "Tựa đề" + default: "Giá trị mặc định" + canvas: "Canva" + _canvas: + id: "ID Canva" + width: "Chiều rộng" + height: "Chiều cao" + note: "Tút đã nhúng" + _note: + id: "ID tút" + idDescription: "Ngoài ra, bạn có thể dán URL tút vào đây." + detailed: "Xem chi tiết" + switch: "Chuyển đổi" + _switch: + name: "Tên biến thể" + text: "Tựa đề" + default: "Giá trị mặc định" + counter: "Bộ đếm" + _counter: + name: "Tên biến thể" + text: "Tựa đề" + inc: "Bước" + _button: + text: "Tựa đề" + colored: "Với màu" + action: "Thao tác khi nhấn nút" + _action: + dialog: "Hiện hộp thoại" + _dialog: + content: "Nội dung" + resetRandom: "Đặt lại seed ngẫu nhiên" + pushEvent: "Gửi một sự kiện" + _pushEvent: + event: "Tên sự kiện" + message: "Tin nhắn hiển thị khi kích hoạt" + variable: "Biển thể để gửi" + no-variable: "Không" + callAiScript: "Gọi AiScript" + _callAiScript: + functionName: "Tên tính năng" + radioButton: "Lựa chọn" + _radioButton: + name: "Tên biến thể" + title: "Tựa đề" + values: "Phân tách các mục bằng cách xuống dòng" + default: "Giá trị mặc định" + script: + categories: + flow: "Điều khiển" + logical: "Hoạt động logic" + operation: "Tính toán" + comparison: "So sánh" + random: "Ngẫu nhiên" + value: "Giá trị" + fn: "Tính năng" + text: "Tác vụ văn bản" + convert: "Chuyển đổi" + list: "Danh sách" + blocks: + text: "Văn bản" + multiLineText: "Văn bản (nhiều dòng)" + textList: "Văn bản liệt kê" + _textList: + info: "Phân tách mục bằng cách xuống dòng" + strLen: "Độ dài văn bản" + _strLen: + arg1: "Văn bản" + strPick: "Trích xuất chuỗi" + _strPick: + arg1: "Văn bản" + arg2: "Vị trí chuỗi" + strReplace: "Thay thế chuỗi" + _strReplace: + arg1: "Nội dung" + arg2: "Văn bản thay thế" + arg3: "Thay thế bằng" + strReverse: "Lật văn bản" + _strReverse: + arg1: "Văn bản" + join: "Nối văn bản" + _join: + arg1: "Danh sách" + arg2: "Phân cách" + add: "Cộng" + _add: + arg1: "A" + arg2: "B" + subtract: "Trừ" + _subtract: + arg1: "A" + arg2: "B" + multiply: "Nhân" + _multiply: + arg1: "A" + arg2: "B" + divide: "Chia" + _divide: + arg1: "A" + arg2: "B" + mod: "Phần còn lại" + _mod: + arg1: "A" + arg2: "B" + round: "Làm tròn thập phân" + _round: + arg1: "Số" + eq: "A và B bằng nhau" + _eq: + arg1: "A" + arg2: "B" + notEq: "A và B khác nhau" + _notEq: + arg1: "A" + arg2: "B" + and: "A VÀ B" + _and: + arg1: "A" + arg2: "B" + or: "A HOẶC B" + _or: + arg1: "A" + arg2: "B" + lt: "< A nhỏ hơn B" + _lt: + arg1: "A" + arg2: "B" + gt: "> A lớn hơn B" + _gt: + arg1: "A" + arg2: "B" + ltEq: "<= A nhỏ hơn hoặc bằng B" + _ltEq: + arg1: "A" + arg2: "B" + gtEq: ">= A lớn hơn hoặc bằng B" + _gtEq: + arg1: "A" + arg2: "B" + if: "Nhánh" + _if: + arg1: "Nếu" + arg2: "Sau đó" + arg3: "Khác" + not: "KHÔNG" + _not: + arg1: "KHÔNG" + random: "Ngẫu nhiên" + _random: + arg1: "Xác suất" + rannum: "Số ngẫu nhiên" + _rannum: + arg1: "Giá trị tối thiểu" + arg2: "Giá trị tối đa" + randomPick: "Chọn ngẫu nhiên từ danh sách" + _randomPick: + arg1: "Danh sách" + dailyRandom: "Ngẫu nhiên (Đổi mỗi người một lần mỗi ngày)" + _dailyRandom: + arg1: "Xác suất" + dailyRannum: "Số ngẫu nhiên (Đổi mỗi người một lần mỗi ngày)" + _dailyRannum: + arg1: "Giá trị tối thiểu" + arg2: "Giá trị tối đa" + dailyRandomPick: "Chọn ngẫu nhiên từ một danh sách (Đổi mỗi người một lần mỗi ngày)" + _dailyRandomPick: + arg1: "Danh sách" + seedRandom: "Ngẫu nhiên (với seed)" + _seedRandom: + arg1: "Seed" + arg2: "Xác suất" + seedRannum: "Số ngẫu nhiên (với seed)" + _seedRannum: + arg1: "Seed" + arg2: "Giá trị tối thiểu" + arg3: "Giá trị tối đa" + seedRandomPick: "Chọn ngẫu nhiên từ danh sách (với seed)" + _seedRandomPick: + arg1: "Seed" + arg2: "Danh sách" + DRPWPM: "Chọn ngẫu nhiên từ danh sách nặng (Đổi mỗi người một lần mỗi ngày)" + _DRPWPM: + arg1: "Văn bản liệt kê" + pick: "Chọn từ danh sách" + _pick: + arg1: "Danh sách" + arg2: "Vị trí" + listLen: "Lấy độ dài danh sách" + _listLen: + arg1: "Danh sách" + number: "Số" + stringToNumber: "Chữ thành số" + _stringToNumber: + arg1: "Văn bản" + numberToString: "Số thành chữ" + _numberToString: + arg1: "Số" + splitStrByLine: "Phân cách văn bản bằng cách xuống dòng" + _splitStrByLine: + arg1: "Văn bản" + ref: "Biến thể" + aiScriptVar: "Biển thể AiScript" + fn: "Tính năng" + _fn: + slots: "Chỗ" + slots-info: "Phân cách chỗ bằng cách xuống dòng" + arg1: "Đầu ra" + for: "để-Lặp lại" + _for: + arg1: "Số lần lặp lại" + arg2: "Hành động" + typeError: "Chỗ {slot} chấp nhận các giá trị thuộc loại \"{expect}\", nhưng giá trị được cung cấp thuộc loại \"{actual}\"!" + thereIsEmptySlot: "Chỗ {slot} đang trống!" + types: + string: "Văn bản" + number: "Số" + boolean: "Cờ" + array: "Danh sách" + stringArray: "Văn bản liệt kê" + emptySlot: "Chỗ trống" + enviromentVariables: "Biến môi trường" + pageVariables: "Biến trang" + argVariables: "Đầu vào chỗ" +_relayStatus: + requesting: "Đang chờ" + accepted: "Đã duyệt" + rejected: "Đã từ chối" +_notification: + fileUploaded: "Đã tải lên tập tin" + youGotMention: "{name} nhắc đến bạn" + youGotReply: "{name} trả lời bạn" + youGotQuote: "{name} trích dẫn tút của bạn" + youRenoted: "{name} đăng lại tút của bạn" + youGotPoll: "{name} bình chọn tút của bạn" + youGotMessagingMessageFromUser: "{name} nhắn tin cho bạn" + youGotMessagingMessageFromGroup: "Một tin nhắn trong nhóm {name}" + youWereFollowed: "đã theo dõi bạn" + youReceivedFollowRequest: "Bạn vừa có một yêu cầu theo dõi" + yourFollowRequestAccepted: "Yêu cầu theo dõi của bạn đã được chấp nhận" + youWereInvitedToGroup: "Bạn đã được mời tham gia nhóm" + pollEnded: "Cuộc bình chọn đã kết thúc" + emptyPushNotificationMessage: "Đã cập nhật thông báo đẩy" + _types: + all: "Toàn bộ" + follow: "Đang theo dõi" + mention: "Nhắc đến" + reply: "Lượt trả lời" + renote: "Đăng lại" + quote: "Trích dẫn" + reaction: "Biểu cảm" + pollVote: "Lượt bình chọn" + pollEnded: "Bình chọn kết thúc" + receiveFollowRequest: "Yêu cầu theo dõi" + followRequestAccepted: "Yêu cầu theo dõi được chấp nhận" + groupInvited: "Mời vào nhóm" + app: "Từ app liên kết" + _actions: + followBack: "đã theo dõi lại bạn" + reply: "Trả lời" + renote: "Đăng lại" +_deck: + alwaysShowMainColumn: "Luôn hiện cột chính" + columnAlign: "Căn cột" + addColumn: "Thêm cột" + configureColumn: "Cài đặt cột" + swapLeft: "Hoán đổi với cột bên trái" + swapRight: "Hoán đổi với cột bên phải" + swapUp: "Hoán đổi với cột trên" + swapDown: "Hoán đổi với cột dưới" + stackLeft: "Xếp chồng với cột bên trái" + popRight: "Xếp chồng với cột bên trái" + profile: "Hồ sơ" + newProfile: "Hồ sơ mới" + deleteProfile: "Xóa hồ sơ" + introduction: "Kết hợp các cột để tạo giao diện của riêng bạn!" + introduction2: "Bạn có thể thêm cột bất kỳ lúc nào bằng cách nhấn + ở bên phải màn hình." + widgetsIntroduction: "Chọn \"Sửa widget\" trong menu cột và thêm một widget." + _columns: + main: "Chính" + widgets: "Tiện ích" + notifications: "Thông báo" + tl: "Bảng tin" + antenna: "Trạm phát sóng" + list: "Danh sách" + mentions: "Lượt nhắc" + direct: "Nhắn riêng" diff --git a/fe_calckey/frontend/locales/zh-CN.yml b/fe_calckey/frontend/locales/zh-CN.yml new file mode 100644 index 0000000..a6c9ec5 --- /dev/null +++ b/fe_calckey/frontend/locales/zh-CN.yml @@ -0,0 +1,1751 @@ +--- +_lang_: "简体中文" +headlineMisskey: "通过帖子连接在一起的网络" +introMisskey: "欢迎!Misskey是一个开源的、去中心化的“微博客”服务。\n通过编写「帖文」来和大家分享你的以及你周围的事情吧!📡\n通过「回应」功能,可以让你快速地对大家的帖文表达反馈👍\n来探索新的世界吧!🚀" +monthAndDay: "{month}月 {day}日" +search: "搜索" +notifications: "通知" +username: "用户名" +password: "密码" +forgotPassword: "忘记密码" +fetchingAsApObject: "正在联邦宇宙查询中" +ok: "OK" +gotIt: "我明白了" +cancel: "取消" +enterUsername: "输入用户名" +renotedBy: "由 {user} 转贴" +noNotes: "没有帖文" +noNotifications: "无通知" +instance: "实例" +settings: "设置" +basicSettings: "基本设置" +otherSettings: "其他设置" +openInWindow: "在新窗口中打开" +profile: "个人资料" +timeline: "时间线" +noAccountDescription: "这个人很懒,没有写自我介绍" +login: "登录" +loggingIn: "正在登录..." +logout: "登出" +signup: "新用户注册" +uploading: "正在上传" +save: "保存" +users: "用户" +addUser: "添加用户" +favorite: "收藏" +favorites: "收藏" +unfavorite: "取消收藏" +favorited: "已加入收藏夹。" +alreadyFavorited: "收藏夹中已存在。" +cantFavorite: "无法添加到收藏夹。" +pin: "置顶" +unpin: "取消置顶" +copyContent: "复制内容" +copyLink: "复制链接" +delete: "删除" +deleteAndEdit: "删除并编辑" +deleteAndEditConfirm: "要删除此帖并再次编辑吗?对此帖的所有回应、转发和回复也将被删除。" +addToList: "添加至列表" +sendMessage: "发送" +copyUsername: "复制用户名" +searchUser: "搜索用户" +reply: "回复" +loadMore: "查看更多" +showMore: "查看更多" +showLess: "关闭" +youGotNewFollower: "你有新的关注者" +receiveFollowRequest: "您收到了关注请求" +followRequestAccepted: "您的关注请求被通过了" +mention: "提及" +mentions: "提及" +directNotes: "私信" +importAndExport: "导入和导出" +import: "导入" +export: "导出" +files: "文件" +download: "下载" +driveFileDeleteConfirm: "要删除「{name}」文件吗?附加此文件的帖子也会被删除。" +unfollowConfirm: "要取消对{name}的关注吗?" +exportRequested: "导出请求已提交,这可能需要花一些时间,导出的文件将保存到网盘中。" +importRequested: "导入请求已提交,这可能需要花一点时间。" +lists: "列表" +noLists: "列表为空" +note: "帖子" +notes: "帖子" +following: "关注中" +followers: "关注者" +followsYou: "正在关注你" +createList: "创建列表" +manageLists: "管理列表" +error: "错误" +somethingHappened: "出现了一些问题!" +retry: "重试" +pageLoadError: "页面加载失败。" +pageLoadErrorDescription: "这通常是由于网络或浏览器缓存的原因。请清除缓存或等待片刻后重试。" +serverIsDead: "服务器没有响应。 请稍等片刻,然后重试。" +youShouldUpgradeClient: "请重新加载并使用新版本的客户端查看此页面。" +enterListName: "输入列表名称" +privacy: "隐私" +makeFollowManuallyApprove: "关注请求需要批准" +defaultNoteVisibility: "默认可见性" +follow: "关注" +followRequest: "关注申请" +followRequests: "关注申请" +unfollow: "取消关注" +followRequestPending: "发送关注请求" +enterEmoji: "输入表情符号" +renote: "转发" +unrenote: "取消转发" +renoted: "已转发。" +cantRenote: "该帖无法转发。" +cantReRenote: "转发无法被再次转发。" +quote: "引用" +pinnedNote: "已置顶的帖子" +pinned: "置顶" +you: "您" +clickToShow: "点击以显示" +sensitive: "敏感内容" +add: "添加" +reaction: "回应" +enableEmojiReaction: "启用表情符号回应" +showEmojisInReactionNotifications: "在回应通知中显示表情符号" +reactionSetting: "在选择器中显示的回应" +reactionSettingDescription2: "拖动重新排序,单击删除,点击 + 添加。" +rememberNoteVisibility: "保存上次设置的可见性" +attachCancel: "删除附件" +markAsSensitive: "标记为敏感内容" +unmarkAsSensitive: "取消标记为敏感内容" +enterFileName: "请输入文件名" +mute: "屏蔽" +unmute: "解除屏蔽" +renoteMute: "屏蔽转帖" +renoteUnmute: "解除屏蔽转帖" +block: "拉黑" +unblock: "取消拉黑" +suspend: "冻结" +unsuspend: "解除冻结" +blockConfirm: "确定要拉黑吗?" +unblockConfirm: "确定要解除拉黑吗?" +suspendConfirm: "要冻结吗?" +unsuspendConfirm: "要解除冻结吗?" +selectList: "选择列表" +selectAntenna: "选择天线" +selectWidget: "选择小工具" +editWidgets: "编辑部件" +editWidgetsExit: "完成编辑" +customEmojis: "自定义表情符号" +emoji: "表情符号" +emojis: "表情符号" +emojiName: "表情符号名称" +emojiUrl: "表情符号地址" +addEmoji: "添加表情符号" +settingGuide: "推荐配置" +cacheRemoteFiles: "远程文件缓存" +cacheRemoteFilesDescription: "当禁用此设定时远程文件将直接从远程实例载入。禁用后会减小储存空间需求,但是会增加流量,因为缩略图不会被生成。" +flagAsBot: "这是一个机器人账号" +flagAsBotDescription: "如果此帐户由程序控制,请启用此项。启用后,此标志可以帮助其他开发人员防止机器人之间产生无限互动的行为,并让Misskey的内部系统将此帐户识别为机器人。" +flagAsCat: "将这个账户设定为一只猫" +flagAsCatDescription: "如果您想表明此帐户是一只猫,请打开此标志。\n开启后,会在您的头像上出现猫耳朵,并将你的帖子中的「na」替换为「nya」,日文同理。" +flagShowTimelineReplies: "在时间线上显示帖子的回复" +flagShowTimelineRepliesDescription: "启用时,时间线除了显示用户的帖子外,还会显示其他用户对帖子的回复。" +autoAcceptFollowed: "自动允许关注者的关注" +addAccount: "添加账户" +loginFailed: "登录失败" +showOnRemote: "转到所在实例显示" +general: "常规设置" +wallpaper: "壁纸" +setWallpaper: "设置壁纸" +removeWallpaper: "移除壁纸" +searchWith: "搜索:{q}" +youHaveNoLists: "列表为空" +followConfirm: "你确定要关注{name}吗?" +proxyAccount: "代理账户" +proxyAccountDescription: "代理账户是在某些情况下充当用户的远程关注者的账户。 例如,当一个用户列出一个远程用户时,如果没有人跟随该列出的用户,则该活动将不会传递到该实例,因此将代之以代理账户。" +host: "主机名" +selectUser: "选择用户" +recipient: "收件人" +annotation: "注解" +federation: "联合" +instances: "实例" +registeredAt: "初次观测" +latestRequestSentAt: "上次发送的请求" +latestRequestReceivedAt: "上次收到的请求" +latestStatus: "最后状态" +storageUsage: "已用存储" +charts: "图表" +perHour: "每小时" +perDay: "每天" +stopActivityDelivery: "停止发送活动" +blockThisInstance: "阻止此实例向本实例推流" +operations: "操作" +software: "软件" +version: "版本" +metadata: "元数据" +monitor: "服务器状态" +jobQueue: "作业队列" +cpuAndMemory: "CPU和内存" +network: "网络" +disk: "存储" +instanceInfo: "实例信息" +statistics: "统计" +clearQueue: "清除队列" +clearQueueConfirmTitle: "确定清除队列?" +clearQueueConfirmText: "未送达的帖子将不会送达。 通常,您不需要这样做。" +clearCachedFiles: "清除缓存" +clearCachedFilesConfirm: "确定要清除缓存文件?" +blockedInstances: "被阻拦的实例" +blockedInstancesDescription: "设定要阻拦的实例,以换行来进行分割。被阻拦的实例将无法与本实例进行交换通讯。" +muteAndBlock: "屏蔽/拉黑" +mutedUsers: "已屏蔽用户" +blockedUsers: "被拉黑的用户" +noUsers: "无用户" +editProfile: "编辑资料" +noteDeleteConfirm: "要删除该帖子吗?" +pinLimitExceeded: "无法置顶更多了" +intro: "Misskey的部署结束啦!填写管理员账号吧!" +done: "完成" +processing: "正在处理" +preview: "预览" +default: "默认" +defaultValueIs: "默认值: {value}" +noCustomEmojis: "没有自定义表情符号" +noJobs: "没有任务" +federating: "联合中" +blocked: "已拉黑" +suspended: "停止推流" +all: "全部" +subscribing: "已订阅" +publishing: "直播中" +notResponding: "没有响应" +instanceFollowing: "关注实例" +instanceFollowers: "关注实例" +instanceUsers: "实例用户" +changePassword: "修改密码" +security: "安全" +retypedNotMatch: "两次输入不一致!" +currentPassword: "现在的密码" +newPassword: "新密码" +newPasswordRetype: "重新输入密码:" +attachFile: "插入附件" +more: "更多!" +featured: "热门" +usernameOrUserId: "用户名或用户ID" +noSuchUser: "用户不存在" +lookup: "查询" +announcements: "公告" +imageUrl: "图片URL" +remove: "删除" +removed: "已删除" +removeAreYouSure: "要删掉「{x}」吗?" +deleteAreYouSure: "要删掉「{x}」吗?" +resetAreYouSure: "恢复默认设置?" +saved: "已保存" +messaging: "聊天" +upload: "本地上传" +keepOriginalUploading: "保留原图" +keepOriginalUploadingDescription: "上传图片时保留原始图片。关闭时,浏览器会在上传时生成一张用于web发布的图片。" +fromDrive: "从网盘中" +fromUrl: "从 URL" +uploadFromUrl: "从网址上传" +uploadFromUrlDescription: "输入文件的URL" +uploadFromUrlRequested: "请求上传" +uploadFromUrlMayTakeTime: "上传可能需要一些时间完成。" +explore: "发现" +messageRead: "已读" +noMoreHistory: "没有更多的历史记录" +startMessaging: "添加聊天" +nUsersRead: "{n}人已读" +agreeTo: "勾选则表示已阅读并同意{0}" +tos: "服务条款" +start: "开始" +home: "首页" +remoteUserCaution: "由于此用户来自其它实例,显示的信息可能不完整。" +activity: "活动" +images: "图片" +birthday: "生日" +yearsOld: "{age}岁" +registeredDate: "注册于" +location: "位置" +theme: "主题" +themeForLightMode: "在浅色模式下使用的主题" +themeForDarkMode: "在深色模式下使用的主题" +light: "浅色" +dark: "深色" +lightThemes: "浅色主题" +darkThemes: "深色主题" +syncDeviceDarkMode: "将深色模式与设备设置同步" +drive: "网盘" +fileName: "文件名称" +selectFile: "选择文件" +selectFiles: "选择文件" +selectFolder: "选择文件夹" +selectFolders: "选择多个文件夹" +renameFile: "重命名文件" +folderName: "文件夹名称" +createFolder: "创建文件夹" +renameFolder: "重命名文件夹" +deleteFolder: "删除文件夹" +addFile: "添加文件" +emptyDrive: "网盘中无文件" +emptyFolder: "此文件夹中无文件" +unableToDelete: "无法删除" +inputNewFileName: "请输入新文件名" +inputNewDescription: "请输入新标题" +inputNewFolderName: "请输入新文件夹名" +circularReferenceFolder: "目标文件夹是您要移动的文件夹的子文件夹。" +hasChildFilesOrFolders: "此文件夹中有文件,无法删除。" +copyUrl: "复制链接" +rename: "重命名" +avatar: "头像" +banner: "横幅" +nsfw: "敏感内容" +whenServerDisconnected: "与服务器连接中断时" +disconnectedFromServer: "已和服务器断开连接" +reload: "重新加载" +doNothing: "关闭弹窗" +reloadConfirm: "确定要重新加载吗?" +watch: "关注" +unwatch: "取消关注" +accept: "允许" +reject: "拒绝" +normal: "正常" +instanceName: "实例名称" +instanceDescription: "实例介绍" +maintainerName: "管理员名称" +maintainerEmail: "管理员电子邮箱" +tosUrl: "服务条款URL" +thisYear: "今年" +thisMonth: "本月" +today: "今天" +dayX: "{day}日" +monthX: "{month}月" +yearX: "{year}年" +pages: "页面" +integration: "关联" +connectService: "连接" +disconnectService: "断开连接" +enableLocalTimeline: "启用本地时间线功能" +enableGlobalTimeline: "启用全局时间线" +disablingTimelinesInfo: "即使时间线功能被禁用,出于方便,管理员和数据图表也可以继续使用。" +registration: "注册" +enableRegistration: "允许新用户注册" +invite: "邀请" +driveCapacityPerLocalAccount: "每个用户的网盘空间" +driveCapacityPerRemoteAccount: "每个远程用户的网盘容量" +inMb: "以兆字节(MegaByte)为单位" +iconUrl: "图标URL" +bannerUrl: "横幅URL" +backgroundImageUrl: "背景图URL" +basicInfo: "基本信息" +pinnedUsers: "置顶用户" +pinnedUsersDescription: "在「发现」页面中使用换行标记想要置顶的用户。" +pinnedPages: "固定页面" +pinnedPagesDescription: "输入您要固定到实例首页的页面路径,以换行符分隔。" +pinnedClipId: "置顶的便签ID" +pinnedNotes: "已置顶的帖子" +hcaptcha: "hCaptcha" +enableHcaptcha: "启用 hCaptcha" +hcaptchaSiteKey: "网站密钥" +hcaptchaSecretKey: "密钥" +recaptcha: "reCAPTCHA" +enableRecaptcha: "启用 reCAPTCHA\n(请注意, 此功能在中国大陆不可用. 如果启用, 可能导致无法正常使用登录或注册等功能)" +recaptchaSiteKey: "网站密钥" +recaptchaSecretKey: "reCAPTCHA 密钥" +avoidMultiCaptchaConfirm: "使用多种验证方式可能会造成干扰,您要禁用其他验证方式吗?您可以按“取消”按钮,仍然保持启用多种验证方式。" +antennas: "天线" +manageAntennas: "天线管理" +name: "名称" +antennaSource: "接收来源" +antennaKeywords: "包含关键字" +antennaExcludeKeywords: "排除关键字" +antennaKeywordsDescription: "使用空格分隔会产生AND规范,并且使用换行符分隔会产生OR规范" +notifyAntenna: "开启通知" +withFileAntenna: "仅带有附件的帖子" +enableServiceworker: "启用ServiceWorker" +antennaUsersDescription: "指定用户名,用换行符分隔" +caseSensitive: "区分大小写" +withReplies: "包括回复" +connectedTo: "您的账号已连到接以下第三方账号" +notesAndReplies: "帖子与回复" +withFiles: "附件" +silence: "禁言" +silenceConfirm: "确认要禁言吗?" +unsilence: "解除禁言" +unsilenceConfirm: "要解除禁言吗?" +popularUsers: "热门用户" +recentlyUpdatedUsers: "最近投稿的用户" +recentlyRegisteredUsers: "最近登录的用户" +recentlyDiscoveredUsers: "最近发现的用户" +exploreUsersCount: "有{count}个用户" +exploreFediverse: "探索联邦宇宙" +popularTags: "热门标签" +userList: "列表" +about: "关于" +aboutMisskey: "关于 Misskey" +administrator: "管理员" +token: "Token (令牌)" +twoStepAuthentication: "两步验证" +moderator: "监察员" +moderation: "管理" +nUsersMentioned: "{n} 被提到" +securityKey: "安全密钥" +securityKeyName: "密钥名称" +registerSecurityKey: "注册硬件安全密钥" +lastUsed: "最后使用:" +unregister: "删除账户" +passwordLessLogin: "无密码登录" +resetPassword: "重置密码" +newPasswordIs: "新的密码是「{password}」" +reduceUiAnimation: "减少UI动画" +share: "分享" +notFound: "未找到" +notFoundDescription: "没有与指定URL对应的页面。" +uploadFolder: "默认上传文件夹" +cacheClear: "清空缓存" +markAsReadAllNotifications: "将所有通知标为已读" +markAsReadAllUnreadNotes: "将所有帖子标记为已读" +markAsReadAllTalkMessages: "将所有聊天标记为已读" +help: "帮助" +inputMessageHere: "在此键入信息" +close: "关闭" +group: "群组" +groups: "群组" +createGroup: "创建群组" +ownedGroups: "拥有的群组" +joinedGroups: "已加入的群组" +invites: "邀请" +groupName: "群组名" +members: "成员" +transfer: "转让" +messagingWithUser: "与用户聊天" +messagingWithGroup: "与群组聊天" +title: "标题" +text: "文本" +enable: "启用" +next: "下一个" +retype: "重新输入" +noteOf: "{user}的帖子" +inviteToGroup: "群组邀请" +quoteAttached: "已引用" +quoteQuestion: "是否引用此链接内容?" +noMessagesYet: "现在没有新的聊天" +newMessageExists: "新信息" +onlyOneFileCanBeAttached: "只能添加一个附件" +signinRequired: "请先登录" +invitations: "邀请" +invitationCode: "邀请码" +checking: "正在确认" +available: "可用" +unavailable: "不可用" +usernameInvalidFormat: "可使用大小写英文字母、数字和下划线。" +tooShort: "过短" +tooLong: "过长" +weakPassword: "密码强度:弱" +normalPassword: "密码强度:中等" +strongPassword: "密码强度:强" +passwordMatched: "密码一致" +passwordNotMatched: "密码不一致" +signinWith: "以{x}登录" +signinFailed: "无法登录,请检查您的用户名和密码是否正确。" +tapSecurityKey: "轻触硬件安全密钥" +or: "或者" +language: "语言" +uiLanguage: "显示语言" +groupInvited: "您有新的群组邀请" +aboutX: "关于 {x}" +useOsNativeEmojis: "使用系统的原生表情符号" +disableDrawer: "不显示抽屉菜单" +youHaveNoGroups: "没有群组" +joinOrCreateGroup: "请加入一个现有的群组,或者创建新群组。" +noHistory: "没有历史记录" +signinHistory: "登录历史" +disableAnimatedMfm: "禁用MFM动画" +doing: "正在进行" +category: "类别" +tags: "标签" +docSource: "文件来源" +createAccount: "注册账户" +existingAccount: "现有的账户" +regenerate: "重新生成" +fontSize: "字体大小" +noFollowRequests: "没有关注申请" +openImageInNewTab: "在新标签页中打开图片" +dashboard: "管理面板" +local: "本地" +remote: "远程" +total: "总计" +weekOverWeekChanges: "与前一周相比" +dayOverDayChanges: "与前一日相比" +appearance: "外观" +clientSettings: "客户端设置" +accountSettings: "账户设置" +promotion: "推广" +promote: "推广" +numberOfDays: "天数" +hideThisNote: "隐藏这条帖子" +showFeaturedNotesInTimeline: "在时间线上显示热门推荐" +objectStorage: "对象存储" +useObjectStorage: "使用对象存储" +objectStorageBaseUrl: "Base URL" +objectStorageBaseUrlDesc: "用于引用的URL。如果您正在使用CDN或反向代理,请指定其URL,例如S3:“https://.s3.amazonaws.com”,GCS:“https://storage.googleapis.com/”" +objectStorageBucket: "存储桶" +objectStorageBucketDesc: "请指定使用的对象存储服务的存储桶名称。" +objectStoragePrefix: "前缀" +objectStoragePrefixDesc: "文件将存储在此前缀的目录下。" +objectStorageEndpoint: "端点" +objectStorageEndpointDesc: "如果你使用AWS S3请留空。否则请根据你使用的服务商的说明来进行设置,指定端点形式为“”或“:”。" +objectStorageRegion: "可用区" +objectStorageRegionDesc: "指定一个可用区,例如“xx-east-1”。 如果您的对象存储服务没有可用区概念,请将其留空或填写“us-east-1”。" +objectStorageUseSSL: "使用SSL" +objectStorageUseSSLDesc: "如果不使用https进行API连接,请关闭。" +objectStorageUseProxy: "使用代理" +objectStorageUseProxyDesc: "如果您不使用代理进行API连接,请将其关闭。" +objectStorageSetPublicRead: "上传时设置为public-read" +serverLogs: "服务器日志" +deleteAll: "全部删除" +showFixedPostForm: "在时间线顶部显示发帖框" +newNoteRecived: "有新的帖子" +sounds: "提示音" +listen: "试听" +none: "无" +showInPage: "在页面中显示" +popout: "弹窗" +volume: "音量" +masterVolume: "主音量" +details: "详情" +chooseEmoji: "选择表情符号" +unableToProcess: "操作无法完成" +recentUsed: "最近使用" +install: "安装" +uninstall: "卸载" +installedApps: "已授权的应用" +nothing: "没有" +installedDate: "授权日期" +lastUsedDate: "最近使用" +state: "状态" +sort: "排序" +ascendingOrder: "升序" +descendingOrder: "降序" +scratchpad: "AiScript控制台" +scratchpadDescription: "AiScript控制台为AiScript提供了实验环境。您可以编写代码以与Misskey交互,运行它并查看结果。" +output: "输出" +script: "脚本" +disablePagesScript: "禁用页面脚本" +updateRemoteUser: "更新远程用户信息" +deleteAllFiles: "删除所有文件" +deleteAllFilesConfirm: "要删除所有文件吗?" +removeAllFollowing: "取消所有关注" +removeAllFollowingDescription: "取消{host}的所有关注者。当实例不存在时执行。" +userSuspended: "该用户已被冻结。" +userSilenced: "该用户已被禁言。" +yourAccountSuspendedTitle: "账户已被冻结" +yourAccountSuspendedDescription: "由于违反了服务器的服务条款或其他原因,该账户已被冻结。 您可以与管理员联系以了解更多信息。 请不要创建一个新的账户。" +menu: "菜单" +divider: "分割线" +addItem: "添加项目" +relays: "中继" +addRelay: "添加中继" +inboxUrl: "Inbox URL" +addedRelays: "已添加的中继" +serviceworkerInfo: "您需要启用推送通知" +deletedNote: "已删除的帖子" +invisibleNote: "隐藏的帖子" +enableInfiniteScroll: "启用自动滚动页面模式" +visibility: "可见性" +poll: "调查问卷" +useCw: "隐藏内容" +enablePlayer: "打开播放器" +disablePlayer: "关闭播放器" +expandTweet: "展开帖子" +themeEditor: "主题编辑器" +description: "描述" +describeFile: "添加标题" +enterFileDescription: "输入标题" +author: "作者" +leaveConfirm: "存在未保存的更改。要放弃更改吗?" +manage: "管理" +plugins: "插件" +preferencesBackups: "备份设置" +deck: "Deck" +undeck: "取消Deck" +useBlurEffectForModal: "对话框使用模糊效果" +useFullReactionPicker: "使用全功能的回应工具栏" +width: "宽度" +height: "高度" +large: "大" +medium: "中" +small: "小" +generateAccessToken: "生成访问令牌" +permission: "权限" +enableAll: "启用全部" +disableAll: "禁用全部" +tokenRequested: "允许访问账户" +pluginTokenRequestedDescription: "此插件将能够拥有此处设置的权限" +notificationType: "通知类型" +edit: "编辑" +emailServer: "邮件服务器" +enableEmail: "启用发送邮件功能" +emailConfigInfo: "用于确认电子邮件和密码重置" +email: "邮箱" +emailAddress: "电子邮件地址" +smtpConfig: "SMTP服务器设置" +smtpHost: "主机名" +smtpPort: "端口" +smtpUser: "用户名" +smtpPass: "密码" +emptyToDisableSmtpAuth: "用户名和密码留空可以禁用SMTP验证" +smtpSecure: "在 SMTP 连接中使用隐式 SSL / TLS" +smtpSecureInfo: "使用STARTTLS时关闭。" +testEmail: "邮件发送测试" +wordMute: "文字屏蔽" +regexpError: "正则表达式错误" +regexpErrorDescription: "{tab} 屏蔽文字的第 {line} 行的正则表达式有错误:" +instanceMute: "实例的屏蔽" +userSaysSomething: "{name}说了什么" +makeActive: "启用" +display: "显示" +copy: "复制" +metrics: "服务器监控" +overview: "服务器概况" +logs: "日志" +delayed: "滞后" +database: "数据库" +channel: "频道" +create: "创建" +notificationSetting: "通知设置" +notificationSettingDesc: "选择要显示的通知类型。" +useGlobalSetting: "使用全局设置" +useGlobalSettingDesc: "启用时,将使用账户通知设置。关闭时,则可以单独设置。" +other: "其他" +regenerateLoginToken: "重新生成登录令牌" +regenerateLoginTokenDescription: "重新生成用于登录的内部令牌。通常您不需要这样做。重新生成后,您将在所有设备上登出。" +setMultipleBySeparatingWithSpace: "您可以使用空格分隔多个项目。" +fileIdOrUrl: "文件ID或者URL" +behavior: "行为" +sample: "示例" +abuseReports: "举报" +reportAbuse: "举报" +reportAbuseOf: "举报{name}" +fillAbuseReportDescription: "请填写举报的详细原因。如果有对方发的帖子,请同时填写URL地址。" +abuseReported: "内容已发送。感谢您提交信息。" +reporter: "举报者" +reporteeOrigin: "举报来源" +reporterOrigin: "举报者来源" +forwardReport: "将该举报信息转发给远程实例" +forwardReportIsAnonymous: "勾选则在远程实例上显示的举报者是匿名的系统账号,而不是您的账号。" +send: "发送" +abuseMarkAsResolved: "处理完毕" +openInNewTab: "在新标签页中打开" +openInSideView: "在侧边栏中打开" +defaultNavigationBehaviour: "默认导航" +editTheseSettingsMayBreakAccount: "编辑这些设置可以会损坏您的账号" +instanceTicker: "帖子的实例信息" +waitingFor: "等待{x}" +random: "随机" +system: "系统" +switchUi: "切换界面" +desktop: "桌面" +clip: "便签" +createNew: "新建" +optional: "可选" +createNewClip: "新建便签" +unclip: "移除便签" +confirmToUnclipAlreadyClippedNote: "本帖已包含在便签\"{name}\"里。您想要将本帖从该便签中移除吗?" +public: "公开" +i18nInfo: "Calckey已经被志愿者们翻译成了各种语言。如果你也有兴趣,可以通过{link}帮助翻译。" +manageAccessTokens: "管理 Access Tokens" +accountInfo: "账户信息" +notesCount: "帖子数量" +repliesCount: "回复数量" +renotesCount: "转帖数量" +repliedCount: "回复数" +renotedCount: "转发数" +followingCount: "正在关注数量" +followersCount: "关注者数量" +sentReactionsCount: "发送回应数" +receivedReactionsCount: "收到回应数" +pollVotesCount: "问卷调查的投票数" +pollVotedCount: "问卷调查的被投票数" +yes: "是" +no: "否" +driveFilesCount: "网盘的文件数" +driveUsage: "网盘的空间用量" +noCrawle: "要求搜索引擎不索引该用户" +noCrawleDescription: "要求搜索引擎不要收录(索引)您的用户页面,帖子,页面等。" +lockedAccountInfo: "即使通过了关注请求,只要您不将帖子可见范围设置成“关注者”,任何人都可以看到您的帖子。" +alwaysMarkSensitive: "默认将媒体文件标记为敏感内容" +loadRawImages: "添加附件图像的缩略图时使用原始图像质量" +disableShowingAnimatedImages: "不播放动画" +verificationEmailSent: "已发送确认电子邮件。请访问电子邮件中的链接以完成设置。" +notSet: "未设置" +emailVerified: "电子邮件地址已验证" +noteFavoritesCount: "收藏的帖子数" +pageLikesCount: "页面点赞次数" +pageLikedCount: "页面被点赞次数" +contact: "联系人" +useSystemFont: "使用系统默认字体" +clips: "便签" +experimentalFeatures: "实验性功能" +developer: "开发者" +makeExplorable: "使账号可见。" +makeExplorableDescription: "关闭时,账号不会显示在\"发现\"中。" +showGapBetweenNotesInTimeline: "时间线上的帖子分开显示。" +duplicate: "复制" +left: "左" +center: "中央" +wide: "宽" +narrow: "窄" +reloadToApplySetting: "页面刷新后设置才会生效。是否现在刷新页面?" +needReloadToApply: "重启后应用才会生效。" +showTitlebar: "显示标题栏" +clearCache: "清除缓存" +onlineUsersCount: "{n}人在线" +nUsers: "{n}用户" +nNotes: "{n}帖子" +sendErrorReports: "发送错误报告" +sendErrorReportsDescription: "启用后,如果出现问题,可以与Misskey共享详细的错误信息,从而帮助提高软件的质量。" +myTheme: "我的主题" +backgroundColor: "背景" +accentColor: "强调色" +textColor: "文本" +saveAs: "另存为" +advanced: "高级" +value: "值" +createdAt: "创建日期" +updatedAt: "更新时间" +saveConfirm: "确定保存?" +deleteConfirm: "确定删除?" +invalidValue: "无效值。" +registry: "注册表" +closeAccount: "永久注销账户" +currentVersion: "当前版本" +latestVersion: "最新版本" +youAreRunningUpToDateClient: "您所使用的客户端已经是最新的。" +newVersionOfClientAvailable: "新版本的客户端可用。" +usageAmount: "使用量" +capacity: "容量" +inUse: "已使用" +editCode: "编辑代码" +apply: "应用" +receiveAnnouncementFromInstance: "从实例接收通知" +emailNotification: "邮件通知" +publish: "发布" +inChannelSearch: "频道内搜索" +useReactionPickerForContextMenu: "单击右键打开回应工具栏" +typingUsers: "{users}正在输入" +jumpToSpecifiedDate: "跳转到特定日期" +showingPastTimeline: "显示过去的时间线" +clear: "清除" +markAllAsRead: "全部标记为已读" +goBack: "返回" +unlikeConfirm: "取消赞?" +fullView: "全屏" +quitFullView: "退出全屏" +addDescription: "添加描述" +userPagePinTip: "在帖子的菜单中选择“置顶”,即可显示该条帖子。" +notSpecifiedMentionWarning: "有未指定的提及" +info: "关于" +userInfo: "用户信息" +unknown: "未知" +onlineStatus: "在线状态" +hideOnlineStatus: "隐藏在线状态" +hideOnlineStatusDescription: "隐藏在线状态后,可能会降低搜索等功能的便利性。" +online: "在线" +active: "活动" +offline: "离线" +notRecommended: "不推荐" +botProtection: "Bot防御" +instanceBlocking: "被阻拦的实例" +selectAccount: "选择账户" +switchAccount: "切换账户" +enabled: "已启用" +disabled: "已禁用 " +quickAction: "快捷操作" +user: "用户" +administration: "管理" +accounts: "账户" +switch: "切换" +noMaintainerInformationWarning: "管理人员信息未设置。" +noBotProtectionWarning: "Bot保护未设置。" +configure: "设置" +postToGallery: "发送到图库" +gallery: "图库" +recentPosts: "最新发布" +popularPosts: "热门投稿" +shareWithNote: "在帖子中分享" +ads: "广告" +expiration: "截止时间" +memo: "便笺" +priority: "优先级" +high: "高" +middle: "中" +low: "低" +emailNotConfiguredWarning: "电子邮件地址未设置。" +ratio: "比率" +previewNoteText: "预览文本" +customCss: "自定义 CSS" +customCssWarn: "这些设置必须有相关的基础知识,不当的配置可能导致客户端无法正常使用!" +global: "全局" +squareAvatars: "显示方形头像图标" +sent: "发送" +received: "收取" +searchResult: "搜索结果" +hashtags: "话题标签" +troubleshooting: "故障排除" +useBlurEffect: "在UI上使用模糊效果" +learnMore: "更多信息" +misskeyUpdated: "Misskey更新完成!" +whatIsNew: "显示更新信息" +translate: "翻译" +translatedFrom: "从 {x} 翻译" +accountDeletionInProgress: "正在删除账户" +usernameInfo: "在服务器上唯一标识您的帐户的名称。您可以使用字母 (a ~ z, A ~ Z)、数字 (0 ~ 9) 和下划线 (_)。用户名以后不能更改。" +aiChanMode: "小蓝模式" +keepCw: "保留CW" +pubSub: "Pub/Sub账户" +lastCommunication: "最近通信" +resolved: "已解决" +unresolved: "未解决" +breakFollow: "移除关注者" +itsOn: "已开启" +itsOff: "已关闭" +emailRequiredForSignup: "注册账户需要电子邮件地址" +unread: "未读" +filter: "筛选" +controlPanel: "控制面板" +manageAccounts: "管理账户" +makeReactionsPublic: "将回应设置为公开" +makeReactionsPublicDescription: "将您发表过的回应设置成公开可见。" +classic: "经典" +muteThread: "屏蔽帖子列表" +unmuteThread: "取消屏蔽帖子列表" +ffVisibility: "连接的可见范围" +ffVisibilityDescription: "您可以设置您的关注/关注者信息的公开范围" +continueThread: "查看更多帖子" +deleteAccountConfirm: "将要删除账户。是否确认?" +incorrectPassword: "密码错误" +voteConfirm: "确定投给“{choice}” ?" +hide: "隐藏" +leaveGroup: "离开群组" +leaveGroupConfirm: "确定离开「{name}」?" +useDrawerReactionPickerForMobile: "在移动设备上使用抽屉显示" +welcomeBackWithName: "欢迎回来,{name}" +clickToFinishEmailVerification: "点击 [{ok}] 完成电子邮件地址认证。" +overridedDeviceKind: "设备类型" +smartphone: "智能手机" +tablet: "平板" +auto: "自动" +themeColor: "主题颜色" +size: "大小" +numberOfColumn: "列数" +searchByGoogle: "Google" +instanceDefaultLightTheme: "实例默认浅色主题" +instanceDefaultDarkTheme: "实例默认深色主题" +instanceDefaultThemeDescription: "以对象格式键入主题代码" +mutePeriod: "屏蔽期限" +indefinitely: "永久" +tenMinutes: "10分钟" +oneHour: "1小时" +oneDay: "1天" +oneWeek: "1周" +reflectMayTakeTime: "可能需要一些时间才能体现出效果。" +failedToFetchAccountInformation: "获取账户信息失败" +rateLimitExceeded: "已超過速率限制" +cropImage: "剪裁图像" +cropImageAsk: "是否要裁剪图像?" +file: "文件" +recentNHours: "最近{n}小时" +recentNDays: "最近{n}天" +noEmailServerWarning: "电子邮件服务器未设置。" +thereIsUnresolvedAbuseReportWarning: "有未解决的报告" +recommended: "推荐" +check: "检查" +driveCapOverrideLabel: "變更此用戶的雲端硬碟容量上限" +driveCapOverrideCaption: "设定为 0 以下则会解除此限制。" +requireAdminForView: "需要使用管理员账户登录才能查看。" +isSystemAccount: "该账号由系统自动创建和管理。" +typeToConfirm: "输入 {x} 以确认操作。" +deleteAccount: "删除账户" +document: "文档" +numberOfPageCache: "缓存页数" +numberOfPageCacheDescription: "设置较高的值会更方便用户,但设备的负载和内存使用量会增加。" +logoutConfirm: "是否确认登出?" +lastActiveDate: "最后活跃时间" +statusbar: "状态栏" +pleaseSelect: "请选择" +reverse: "翻转" +colored: "彩色" +refreshInterval: "刷新间隔" +label: "标签" +type: "类型" +speed: "速度" +slow: "慢" +fast: "快" +sensitiveMediaDetection: "检测到敏感媒体" +localOnly: "仅限本地" +remoteOnly: "仅远程" +failedToUpload: "上传失败" +cannotUploadBecauseInappropriate: "因为可能含有不适宜的内容,无法上传。" +cannotUploadBecauseNoFreeSpace: "因为已无可用空间,无法上传。" +beta: "测试" +enableAutoSensitive: "自动 NSFW 识别" +enableAutoSensitiveDescription: "如果可用,请使用机器学习在媒体上自动设置 NSFW 标志。即使关闭此功能,也可能会根据实例自动设置。" +activeEmailValidationDescription: "积极地验证用户的电子邮件地址,判断它是一次性的电子邮件地址,还是可以实际通信的地址。关闭时,则只检查字符串是否正确。" +navbar: "导航栏" +shuffle: "随机" +account: "账户" +move: "移动" +customKaTeXMacro: "自定义 KaTeX 宏" +customKaTeXMacroDescription: "使用宏来轻松的输入数学表达式吧!宏的用法与 LaTeX 中的命令定义相同。你可以使用 \\newcommand{\\name}{content} 或 \\newcommand{\\name}[number of arguments]{content} 来输入数学表达式。举个例子,\\newcommand{\\add}[2]{#1 + #2} 会将 \\add{3}{foo} 展开为 3 + foo。此外,宏名称外的花括号 {} 可以被替换为圆括号 () 和方括号 [],这会影响用于参数的括号。每行只能够定义一个宏,无法在中间换行,且无效的行将被忽略。只支持简单字符串替换功能,不支持高级语法,如条件分支等。" +enableCustomKaTeXMacro: "启用自定义 KaTeX 宏" +_sensitiveMediaDetection: + description: "可以使用机器学习技术自动检测敏感媒体,以便进行审核。服务器负载将略微增加。" + sensitivity: "检测敏感度" + sensitivityDescription: "敏感度较低,则误检(假阳性)会减少;敏感度较高,则漏检(假阴性)会减少。" + setSensitiveFlagAutomatically: "自动设置 NSFW 标签" + setSensitiveFlagAutomaticallyDescription: "即使关闭此配置,识别结果也会在内部保存。" + analyzeVideos: "启用对视频的检测" + analyzeVideosDescription: "除了静止图像之外,还对视频进行分析。服务器负载会略微增加。" +_emailUnavailable: + used: "已经被使用过" + format: "无效的格式" + disposable: "不是永久可用的地址" + mx: "邮件服务器不正确" + smtp: "邮件服务器没有响应" +_ffVisibility: + public: "发布" + followers: "只有关注你的用户能看到" + private: "私密" +_signup: + almostThere: "即将完成" + emailAddressInfo: "请输入您所使用的电子邮件地址" + emailSent: "已将确认邮件发送至您输入的电子邮件地址 ({email})。请访问电子邮件中的链接以完成帐户创建。" +_accountDelete: + accountDelete: "删除帐户" + mayTakeTime: "删除账号是一个性能损耗较大的处理,如果账号持有的内容数量和上传的文件数量较多的话,完成需要花费一段时间。" + sendEmail: "账户删除完成后,将向注册的电子邮件地址发送通知。" + requestAccountDelete: "请求删除账户" + started: "账户删除过程已开始。" + inProgress: "正在删除" +_ad: + back: "返回" + reduceFrequencyOfThisAd: "减少此广告的频率" +_forgotPassword: + enterEmail: "请输入您验证账号时用的电子邮箱地址,密码重置链接将发送至该邮箱上。" + ifNoEmail: "如果您没有使用电子邮件地址进行验证,请联系管理员。" + contactAdmin: "该实例不支持发送电子邮件。如果您想重设密码,请联系管理员。" +_gallery: + my: "我的图库" + liked: "喜欢的图片" + like: "喜欢" + unlike: "取消喜欢" +_email: + _follow: + title: "你有新的关注者" + _receiveFollowRequest: + title: "收到了关注请求" +_plugin: + install: "安装插件" + installWarn: "请不要安装不可信的插件。" + manage: "管理插件..." +_preferencesBackups: + list: "已创建的备份" + saveNew: "另存为" + loadFile: "导入文件" + apply: "应用于本设备" + save: "覆盖存档" + inputName: "请输入备份的名称" + cannotSave: "无法保存" + nameAlreadyExists: "备份名称\"{name}\"已经存在,请指定其他名称。" + applyConfirm: "您是否要将备份\"{name}\"应用到当前设备上?当前设备现有配置将被丢弃。" + saveConfirm: "您确定要覆盖保存 {name} 吗?" + deleteConfirm: "您确定要删除 {name} 吗?" + renameConfirm: "您确定要把“{old}”改为“{new}”吗?" + noBackups: "当前没有备份,“另存为”允许您在服务器上保存当前客户端的配置。" + createdAt: "创建日期:{date} {time}" + updatedAt: "更新日期:{date} {time}" + cannotLoad: "无法加载" + invalidFile: "无效的的文件格式。" +_registry: + scope: "范围" + key: "主要" + keys: "主要" + domain: "域" + createKey: "创建键" +_aboutMisskey: + about: "Misskey是由syuilo于2014年开发的开源软件。" + contributors: "主要贡献者" + allContributors: "全体贡献者" + source: "源代码" + translation: "翻译Misskey" + donate: "赞助Misskey" + morePatrons: "还有很多其他的人也在支持我们,非常感谢🥰" + patrons: "支持者" +_nsfw: + respect: "隐藏敏感内容" + ignore: "不隐藏敏感内容" + force: "总是隐藏内容" +_mfm: + cheatSheet: "MFM代码速查表" + intro: "MFM是一种在Misskey中的各个位置使用的专用标记语言。在这里您可以看到MFM中可用的语法列表。" + dummy: "通过Misskey扩展联邦宇宙的世界" + mention: "提及" + mentionDescription: "可以使用 @+用户名 来指示特定用户" + hashtag: "话题标签" + hashtagDescription: "可以使用井号+文字来表示话题标签。" + url: "URL" + urlDescription: "可以表示URL地址。" + link: "链接" + linkDescription: "可以将部分文字和URL关联起来。" + bold: "粗体" + boldDescription: "可以将文字显示为粗体来表示强调。" + small: "缩小" + smallDescription: "可以使内容文字变小、变淡。" + center: "居中" + centerDescription: "可以将内容居中显示。" + inlineCode: "代码(内嵌)" + inlineCodeDescription: "将文字中的程序代码语法高亮显示。" + blockCode: "代码(块)" + blockCodeDescription: "语法高亮显示整块程序代码。" + inlineMath: "数学公式(内嵌)" + inlineMathDescription: "显示内嵌的KaTeX公式。" + blockMath: "数学公式(块)" + blockMathDescription: "显示整块的KaTeX数学公式。" + quote: "引用" + quoteDescription: "可以用来表示引用的内容。" + emoji: "自定义表情符号" + emojiDescription: "可以将自定义表情符号使用冒号括起来,就可以显示自定义表情符号了。" + search: "搜索" + searchDescription: "显示含有搜索内容示例的搜索框。" + flip: "翻转" + flipDescription: "将内容上下或左右翻转。" + jelly: "动画(果冻)" + jellyDescription: "显示果冻一样的动画效果。" + tada: "动画(锵锵)" + tadaDescription: "显示\"锵锵!\"的动画效果。" + jump: "动画(跳动)" + jumpDescription: "显示跳动的动画效果。" + bounce: "动画(弹性)" + bounceDescription: "显示弹性一样的动画效果。" + shake: "动画(摇晃)" + shakeDescription: "显示摇晃的动画效果。" + twitch: "动画(颤抖)" + twitchDescription: "显示强烈颤抖的动画效果。" + spin: "动画(回转)" + spinDescription: "显示回转的动画效果。" + x2: "大" + x2Description: "以大尺寸显示内容。" + x3: "非常大" + x3Description: "以更大尺寸显示内容。" + x4: "最大" + x4Description: "以最大尺寸显示内容。" + blur: "模糊" + blurDescription: "产生模糊效果。将鼠标指针放在上面即可将内容显示出来。" + font: "字体" + fontDescription: "可以设置内容所使用的字体。" + rainbow: "彩虹" + rainbowDescription: "用彩虹色来显示内容。" + sparkle: "闪光" + sparkleDescription: "添加发光粒子效果。" + rotate: "旋转" + rotateDescription: "旋转指定的角度。" + plain: "简洁" + plainDescription: "禁用所有内部语法。" +_instanceTicker: + none: "不显示" + remote: "仅远程用户" + always: "始终显示" +_serverDisconnectedBehavior: + reload: "自动重载" + dialog: "对话框警告" + quiet: "安静警告" +_channel: + create: "创建频道" + edit: "编辑频道" + setBanner: "设置横幅" + removeBanner: "删除横幅" + featured: "热点" + owned: "管理中" + following: "正在关注" + usersCount: "有{n}人参与" + notesCount: "有{n}个帖子" + nameAndDescription: "名称与描述" + nameOnly: "仅名称" +_menuDisplay: + sideFull: "横向" + sideIcon: "横向(图标)" + top: "顶部" + hide: "隐藏" +_wordMute: + muteWords: "禁用词" + muteWordsDescription: "使用空格分隔表示AND逻辑,使用换行符分隔表示OR逻辑。" + muteWordsDescription2: "将关键字用斜线括起来表示正则表达式。" + softDescription: "隐藏时间线中指定条件的帖子。" + hardDescription: "防止将具有指定条件的帖子添加到时间线。 即使您更改条件,未添加的帖文也会被排除在外。" + soft: "软屏蔽" + hard: "硬屏蔽" + mutedNotes: "被屏蔽的帖子" +_instanceMute: + instanceMuteDescription: "屏蔽配置实例中的所有帖子和转帖,包括实例的用户回复。" + instanceMuteDescription2: "设置时用换行符来分隔" + title: "隐藏实例已设置的帖子。" + heading: "屏蔽实例" +_theme: + explore: "寻找主题" + install: "安装主题" + manage: "主题管理" + code: "主题代码" + description: "描述" + installed: "{name} 已安装" + installedThemes: "已安装的主题" + builtinThemes: "标准主题" + alreadyInstalled: "此主题已经安装" + invalid: "主题格式错误" + make: "制作主题" + base: "基于" + addConstant: "添加常量" + constant: "常量" + defaultValue: "默认值" + color: "颜色" + refProp: "查看属性" + refConst: "查看常量" + key: "主要" + func: "函数" + funcKind: "功能类型" + argument: "参数" + basedProp: "基于的属性名称" + alpha: "不透明度" + darken: "深色" + lighten: "浅色" + inputConstantName: "请输入常量名称" + importInfo: "您可以在此处粘贴主题代码,将其导入到编辑器中" + deleteConstantConfirm: "确定要删除常量{const}吗?" + keys: + accent: "强调色" + bg: "背景" + fg: "文本" + focus: "聚焦" + indicator: "标记" + panel: "面板" + shadow: "阴影" + header: "顶栏" + navBg: "侧边栏背景" + navFg: "侧栏文本" + navHoverFg: "侧栏文本(悬停)" + navActive: "侧栏文本(活动)" + navIndicator: "侧栏标记" + link: "链接" + hashtag: "话题标签" + mention: "提及" + mentionMe: "提及" + renote: "转发" + modalBg: "对话框背景" + divider: "分割线" + scrollbarHandle: "滚动条" + scrollbarHandleHover: "滚动条(悬停)" + dateLabelFg: "日期标签文字" + infoBg: "信息背景" + infoFg: "信息文本" + infoWarnBg: "警告背景" + infoWarnFg: "警告文本" + cwBg: "CW 按钮背景" + cwFg: "CW 按钮文本" + cwHoverBg: "CW 按钮背景(悬停)" + toastBg: "Toast通知背景" + toastFg: "Toast通知文本" + buttonBg: "按钮背景" + buttonHoverBg: "按钮背景(悬停)" + inputBorder: "输入框边框" + listItemHoverBg: "下拉列表项目背景(悬停)" + driveFolderBg: "网盘的文件夹背景" + wallpaperOverlay: "壁纸叠加层" + badge: "徽章" + messageBg: "聊天背景" + accentDarken: "强调色(深)" + accentLighten: "强调色(浅)" + fgHighlighted: "高亮显示文本" +_sfx: + note: "帖子" + noteMy: "我的帖子" + notification: "通知" + chat: "聊天" + chatBg: "聊天背景" + antenna: "天线接收" + channel: "频道通知" +_ago: + future: "未来" + justNow: "最近" + secondsAgo: "{n}秒前" + minutesAgo: "{n}分前" + hoursAgo: "{n}小时前" + daysAgo: "{n}日前" + weeksAgo: "{n}周前" + monthsAgo: "{n}月前" + yearsAgo: "{n}年前" +_time: + second: "秒" + minute: "分" + hour: "小时" + day: "日" +_tutorial: + title: "如何使用Calckey" + step1_1: "欢迎!" + step1_2: "让我们把你安排好。你很快就会启动并运行!" + step2_1: "首先,请完成您的个人资料。" + step2_2: "通过提供一些关于你自己的信息,其他人会更容易了解他们是否想看到你的帖子或关注你。" + step3_1: "现在是时候跟随一些人了!" + step3_2: "你的主页和社交馈送是基于你所关注的人,所以试着先关注几个账户。{n点击个人资料右上角的加号圈就可以关注它。" + step4_1: "让我们出去找你。" + step4_2: "对于他们的第一条信息,有些人喜欢做{introduction}或一个简单的 \"hello world!\"" + step5_1: "时间限制,到处是时间限制!" + step5_2: "您的实例已启用各种时间线的{timelines}。" + step5_3: "主{icon}时间线是你可以看到你的订阅者的帖子的时间线。" + step5_4: "本地{icon}时间线是你可以看到实例中所有其他用户的信息的时间线。" + step5_5: "推荐的{icon}时间线 - 是时间轴,你可以看到管理员推荐的实例的信息" + step5_6: "社交{icon}时间线显示来自你的订阅者朋友的信息。" + step5_7: "全球{icon}时间线是你可以看到来自所有其他连接的实例的消息。" + step6_1: "那么,这里是什么地方?" + step6_2: "好吧,你不只是加入卡尔基。你已经加入了Fediverse的一个门户,这是一个由成千上万台服务器组成的互联网络,被称为 \"实例\"" + step6_3: "每个服务器的工作方式不同,并不是所有的服务器都运行Calckey。但这个人确实如此! 这有点复杂,但你很快就会明白的。" + step6_4: "现在去学习并享受乐趣!" +_2fa: + alreadyRegistered: "此设备已被注册" + registerTOTP: "注册设备" + registerSecurityKey: "注册密钥" + step1: "首先,在您的设备上安装验证应用,例如{a}或{b}。" + step2: "然后,扫描屏幕上显示的二维码。" + step2Url: "在桌面应用程序中输入以下URL:" + step3: "输入您的应用提供的动态口令以完成设置。" + step4: "从现在开始,任何登录操作都将要求您提供动态口令。" + securityKeyInfo: "您可以设置使用支持FIDO2的硬件安全密钥、设备上的指纹或PIN来保护您的登录过程。" +_permissions: + "read:account": "查看账户信息" + "write:account": "更改帐户信息" + "read:blocks": "查看黑名单" + "write:blocks": "编辑黑名单" + "read:drive": "查看网盘" + "write:drive": "管理网盘文件" + "read:favorites": "查看收藏夹" + "write:favorites": "编辑收藏夹" + "read:following": "查看关注信息" + "write:following": "关注/取消关注" + "read:messaging": "查看消息" + "write:messaging": "撰写或删除消息" + "read:mutes": "查看屏蔽列表" + "write:mutes": "编辑屏蔽列表" + "write:notes": "撰写或删除帖子" + "read:notifications": "查看通知" + "write:notifications": "管理通知" + "read:reactions": "查看回应" + "write:reactions": "回应操作" + "write:votes": "投票" + "read:pages": "查看页面" + "write:pages": "操作页面" + "read:page-likes": "查看喜欢的页面" + "write:page-likes": "操作喜欢的页面" + "read:user-groups": "查看用户组" + "write:user-groups": "操作用户组" + "read:channels": "查看频道" + "write:channels": "管理频道" + "read:gallery": "浏览图库" + "write:gallery": "操作图库" + "read:gallery-likes": "读取喜欢的图片" + "write:gallery-likes": "操作喜欢的图片" +_auth: + shareAccess: "您要授权允许“{name}”访问您的帐户吗?" + shareAccessAsk: "您确定要授权此应用程序访问您的帐户吗?" + permissionAsk: "这个应用程序需要以下权限" + pleaseGoBack: "请返回到应用程序" + callback: "回到应用程序" + denied: "拒绝访问" +_antennaSources: + all: "所有帖子" + homeTimeline: "已关注用户的帖子" + users: "来自指定用户的帖子" + userList: "来自指定列表中的帖子" + userGroup: "来自指定群组中用户的帖子" +_weekday: + sunday: "星期日" + monday: "星期一" + tuesday: "星期二" + wednesday: "星期三" + thursday: "星期四" + friday: "星期五" + saturday: "星期六" +_widgets: + memo: "便签" + notifications: "通知" + timeline: "时间线" + calendar: "日历" + trends: "趋势" + clock: "时钟" + rss: "RSS阅读器" + rssTicker: "RSS Ticker" + activity: "活动" + photos: "照片" + digitalClock: "数字时钟" + unixClock: "UNIX时钟" + federation: "联邦宇宙" + instanceCloud: "实例云" + postForm: "投稿窗口" + slideshow: "幻灯片展示" + button: "按钮" + onlineUsers: "在线用户" + jobQueue: "作业队列" + serverMetric: "服务器监控" + aiscript: "AiScript控制台" + aichan: "小蓝" +_cw: + hide: "隐藏" + show: "查看更多" + chars: "{count}个字符" + files: "{count} 个文件" +_poll: + noOnlyOneChoice: "需要至少两个选项" + choiceN: "选择{n}" + noMore: "无法再添加更多了" + canMultipleVote: "允许多个投票" + expiration: "截止时间" + infinite: "永久" + at: "指定日期" + after: "指定时间" + deadlineDate: "截止日期" + deadlineTime: "小时" + duration: "时长" + votesCount: "{n}票" + totalVotes: "总票数{n}" + vote: "投票" + showResult: "显示结果" + voted: "已投票" + closed: "已截止" + remainingDays: "{d}天{h}小时后截止" + remainingHours: "{h}小时{m}分后截止" + remainingMinutes: "{m}分{s}秒后截止" + remainingSeconds: "{s}秒后截止" +_visibility: + public: "公开" + publicDescription: "您的帖子将出现在全局时间线上" + home: "首页" + homeDescription: "仅发送至首页的时间线" + followers: "仅关注者" + followersDescription: "仅发送至关注者" + specified: "指定用户" + specifiedDescription: "仅发送至指定用户" + localOnly: "仅限本地" + localOnlyDescription: "对远程用户不可见" +_postForm: + replyPlaceholder: "回复这个帖子..." + quotePlaceholder: "引用这个帖子..." + channelPlaceholder: "发布到频道…" + _placeholders: + a: "现在如何?" + b: "发生了什么?" + c: "你有什么想法?" + d: "你想要发布些什么吗?" + e: "请写下来吧" + f: "等待您的发布..." +_profile: + name: "昵称" + username: "用户名" + description: "个人简介" + youCanIncludeHashtags: "您可以包含一个哈希标签。" + metadata: "附加信息" + metadataEdit: "附加信息编辑" + metadataDescription: "最多可以在个人资料中以表格形式显示四条其他信息。" + metadataLabel: "标签" + metadataContent: "内容" + changeAvatar: "修改头像" + changeBanner: "修改横幅" +_exportOrImport: + allNotes: "所有帖子" + followingList: "关注中" + muteList: "屏蔽" + blockingList: "拉黑" + userLists: "列表" + excludeMutingUsers: "排除屏蔽用户" + excludeInactiveUsers: "排除不活跃用户" +_charts: + federation: "联合" + apRequest: "请求" + usersIncDec: "用户数量:增加/减少" + usersTotal: "用户总数" + activeUsers: "活跃用户数" + notesIncDec: "帖子:增加/减少" + localNotesIncDec: "本地帖子量增减" + remoteNotesIncDec: "远程帖子量增减" + notesTotal: "帖子总数" + filesIncDec: "文件总数增减" + filesTotal: "合计文件总数" + storageUsageIncDec: "存储空间用量增减" + storageUsageTotal: "合计存储空间用量" +_instanceCharts: + requests: "请求" + users: "用户数量:增加/减少" + usersTotal: "用户总计" + notes: "帖子:增加/减少" + notesTotal: "帖子总计" + ff: "关注/被关注:数量变化" + ffTotal: "关注/被关注者总计" + cacheSize: "缓存大小:增加/减少" + cacheSizeTotal: "缓存大小总计" + files: "文件总数增减" + filesTotal: "文件数总计" +_timelines: + home: "首页" + local: "本地" + social: "社交" + global: "全局" +_pages: + newPage: "创建页面" + editPage: "编辑页面" + readPage: "查看页面" + created: "页面已创建" + updated: "页面已更新" + deleted: "该页面已被删除" + pageSetting: "页面设置" + nameAlreadyExists: "该页面URL已存在" + invalidNameTitle: "无效的页面URL" + invalidNameText: "请确认该项不为空" + editThisPage: "编辑此页面" + viewSource: "查看源代码" + viewPage: "查看页面" + like: "赞" + unlike: "取消喜欢" + my: "我的页面" + liked: "喜欢的页面" + featured: "热门" + inspector: "检查器" + contents: "内容" + content: "页面内容" + variables: "变量" + title: "标题" + url: "页面URL" + summary: "页面摘要" + alignCenter: "居中" + hideTitleWhenPinned: "置顶时隐藏标题" + font: "字体" + fontSerif: "衬线字体" + fontSansSerif: "无衬线字体" + eyeCatchingImageSet: "设置封面图片" + eyeCatchingImageRemove: "删除封面图片" + chooseBlock: "添加块" + selectType: "选择类型" + enterVariableName: "请输入变量名" + variableNameIsAlreadyUsed: "变量名已使用" + contentBlocks: "内容" + inputBlocks: "输入" + specialBlocks: "特殊" + blocks: + text: "文本" + textarea: "文本区域" + section: "章节" + image: "图片" + button: "按钮" + if: "如果" + _if: + variable: "变量" + post: "投稿窗口" + _post: + text: "内容" + attachCanvasImage: "附加画布图像" + canvasId: "画布ID" + textInput: "文本输入" + _textInput: + name: "变量名" + text: "标题" + default: "默认值" + textareaInput: "多行文本输入" + _textareaInput: + name: "变量名" + text: "标题" + default: "默认值" + numberInput: "输入数值" + _numberInput: + name: "变量名" + text: "标题" + default: "默认值" + canvas: "画布" + _canvas: + id: "画布ID" + width: "宽度" + height: "高度" + note: "嵌入的帖子" + _note: + id: "帖子ID" + idDescription: "您也可以通过粘贴帖子的URL来进行设置。" + detailed: "显示详细信息" + switch: "开关" + _switch: + name: "变量名" + text: "标题" + default: "默认值" + counter: "计数器" + _counter: + name: "变量名" + text: "标题" + inc: "增加值" + _button: + text: "标题" + colored: "彩色" + action: "按下按钮时的行为" + _action: + dialog: "显示对话框" + _dialog: + content: "内容" + resetRandom: "重置随机值" + pushEvent: "发送事件" + _pushEvent: + event: "事件名称" + message: "按下时显示的消息" + variable: "发送的变量" + no-variable: "空" + callAiScript: "调用AiScript" + _callAiScript: + functionName: "函数名" + radioButton: "选择项" + _radioButton: + name: "变量名" + title: "标题" + values: "使用换行区分的选择项" + default: "默认值" + script: + categories: + flow: "控制" + logical: "逻辑运算" + operation: "计算" + comparison: "比较" + random: "随机" + value: "值" + fn: "函数" + text: "文本操作" + convert: "转换" + list: "列表" + blocks: + text: "文本" + multiLineText: "文本 (多行)" + textList: "文本列表" + _textList: + info: "请使用换行符分隔每行" + strLen: "文本长度" + _strLen: + arg1: "文本" + strPick: "提取字符" + _strPick: + arg1: "文本" + arg2: "字符位置" + strReplace: "替换文本" + _strReplace: + arg1: "文本" + arg2: "替换之前" + arg3: "替换之后" + strReverse: "文本反向" + _strReverse: + arg1: "文本" + join: "合并文本" + _join: + arg1: "列表" + arg2: "分隔符" + add: "加" + _add: + arg1: "A" + arg2: "B" + subtract: "减" + _subtract: + arg1: "A" + arg2: "B" + multiply: "乘" + _multiply: + arg1: "A" + arg2: "B" + divide: "除" + _divide: + arg1: "A" + arg2: "B" + mod: "取模(MOD)" + _mod: + arg1: "A" + arg2: "B" + round: "四舍五入" + _round: + arg1: "数值" + eq: "A和B相等" + _eq: + arg1: "A" + arg2: "B" + notEq: "A和B不等" + _notEq: + arg1: "A" + arg2: "B" + and: "A和B" + _and: + arg1: "A" + arg2: "B" + or: "A或B" + _or: + arg1: "A" + arg2: "B" + lt: "< A小于B" + _lt: + arg1: "A" + arg2: "B" + gt: "> A大于B" + _gt: + arg1: "A" + arg2: "B" + ltEq: "<= A小于等于B" + _ltEq: + arg1: "A" + arg2: "B" + gtEq: ">= A大于等于B" + _gtEq: + arg1: "A" + arg2: "B" + if: "分支" + _if: + arg1: "如果" + arg2: "如果" + arg3: "否则" + not: "否" + _not: + arg1: "否" + random: "随机" + _random: + arg1: "概率" + rannum: "随机数" + _rannum: + arg1: "最小值" + arg2: "最大值" + randomPick: "从列表中随机选择" + _randomPick: + arg1: "列表" + dailyRandom: "随机(每个用户每日)" + _dailyRandom: + arg1: "概率" + dailyRannum: "随机数(每个用户每日)" + _dailyRannum: + arg1: "最小值" + arg2: "最大值" + dailyRandomPick: "从列表中随机选择(每个用户每日)" + _dailyRandomPick: + arg1: "列表" + seedRandom: "随机 (种子)" + _seedRandom: + arg1: "种子" + arg2: "概率" + seedRannum: "随机数(种子)" + _seedRannum: + arg1: "种子" + arg2: "最小值" + arg3: "最大值" + seedRandomPick: "从列表中随机选择 (种子)" + _seedRandomPick: + arg1: "种子" + arg2: "列表" + DRPWPM: "从概率列表中随机选择(每用户每天)" + _DRPWPM: + arg1: "文本列表" + pick: "从列表中选择" + _pick: + arg1: "列表" + arg2: "位置" + listLen: "获取列表长度" + _listLen: + arg1: "列表" + number: "数值" + stringToNumber: "文本到数字" + _stringToNumber: + arg1: "文本" + numberToString: "数字到文本" + _numberToString: + arg1: "数值" + splitStrByLine: "将文本按行拆分" + _splitStrByLine: + arg1: "文本" + ref: "变量" + aiScriptVar: "AiScript变量" + fn: "函数" + _fn: + slots: "槽函数" + slots-info: "请使用换行符分隔每个槽函数" + arg1: "输出" + for: "重复" + _for: + arg1: "次数" + arg2: "处理" + typeError: "槽函数{slot}需要传入“{expect}”,但是实际传入为“{actual}”!" + thereIsEmptySlot: "槽函数{slot}为空!" + types: + string: "文字" + number: "数值" + boolean: "Flag" + array: "列表" + stringArray: "文本列表" + emptySlot: "空白槽函数" + enviromentVariables: "环境变量" + pageVariables: "页面元素" + argVariables: "输入变量" +_relayStatus: + requesting: "待批准" + accepted: "已批准" + rejected: "已拒绝" +_notification: + fileUploaded: "文件已上传" + youGotMention: "来自{name}的提及" + youGotReply: "来自{name}的回复" + youGotQuote: "来自{name}的引用" + youRenoted: "来自{name}的转发" + youGotPoll: "来自{name}的投票" + youGotMessagingMessageFromUser: "来自{name}的聊天" + youGotMessagingMessageFromGroup: "来自{name}的群聊" + youWereFollowed: "关注了你。" + youReceivedFollowRequest: "您有新的关注请求" + yourFollowRequestAccepted: "您的关注请求已通过" + youWereInvitedToGroup: "您有新的群组邀请" + pollEnded: "问卷调查结果已生成。" + emptyPushNotificationMessage: "推送通知已更新" + _types: + all: "全部" + follow: "关注中" + mention: "提及" + reply: "回复" + renote: "转发" + quote: "引用" + reaction: "回应" + pollVote: "问卷调查被投票" + pollEnded: "问卷调查结束" + receiveFollowRequest: "收到关注请求" + followRequestAccepted: "关注请求已通过" + groupInvited: "加入群组邀请" + app: "关联应用的通知" + _actions: + followBack: "回关" + reply: "回复" + renote: "转发" +_deck: + alwaysShowMainColumn: "总是显示主列" + columnAlign: "列对齐" + addColumn: "添加列" + configureColumn: "列设置" + swapLeft: "向左移动" + swapRight: "向右移动" + swapUp: "向上移动" + swapDown: "向下移动" + stackLeft: "向左折叠" + popRight: "向右弹出" + profile: "配置文件" + newProfile: "新建配置文件" + renameProfile: "重命名配置文件" + deleteProfile: "删除配置文件" + nameAlreadyExists: "该配置文件名已存在。" + introduction: "将各列进行组合以创建您自己的界面!" + introduction2: "您可以随时通过屏幕右侧的 + 来添加列" + widgetsIntroduction: "从列菜单中,选择“小工具编辑”来添加小工具" + _columns: + main: "主列" + widgets: "小工具" + notifications: "通知" + tl: "时间线" + antenna: "天线" + list: "列表" + mentions: "提及" + direct: "指定用户" diff --git a/fe_calckey/frontend/locales/zh-TW.yml b/fe_calckey/frontend/locales/zh-TW.yml new file mode 100644 index 0000000..d373daf --- /dev/null +++ b/fe_calckey/frontend/locales/zh-TW.yml @@ -0,0 +1,1848 @@ +_lang_: "繁體中文" +headlineMisskey: "貼文連繫網路" +introMisskey: "歡迎! Calckey是一個免費,開放原碼,去中心化的社群網路🚀" +monthAndDay: "{month}月 {day}日" +search: "搜尋" +notifications: "通知" +username: "使用者名稱" +password: "密碼" +forgotPassword: "忘記密碼" +fetchingAsApObject: "從聯邦宇宙取得中" +ok: "OK" +gotIt: "知道了!" +cancel: "取消" +enterUsername: "輸入使用者名稱" +renotedBy: "{user} 轉傳了" +noNotes: "無貼文" +noNotifications: "沒有通知" +instance: "伺服器" +settings: "設定" +basicSettings: "基本設定" +otherSettings: "其他設定" +openInWindow: "在新視窗開啟" +profile: "個人檔案" +timeline: "時間軸" +noAccountDescription: "此用戶還沒有自我介紹。" +login: "登入" +loggingIn: "登入中" +logout: "登出" +signup: "註冊" +uploading: "上傳中..." +save: "儲存" +users: "使用者" +addUser: "新增使用者" +favorite: "我的最愛" +favorites: "我的最愛" +unfavorite: "從我的最愛中移除" +favorited: "已添加至我的最愛。" +alreadyFavorited: "我的最愛中已存在。" +cantFavorite: "無法加入至我的最愛。" +pin: "置頂" +unpin: "取消置頂" +copyContent: "複製內容" +copyLink: "複製連結" +delete: "刪除" +deleteAndEdit: "刪除並編輯" +deleteAndEditConfirm: "要刪除並再次編輯嗎?此貼文的所有情感、轉發和回覆也將會消失。" +addToList: "加入至清單" +sendMessage: "發送訊息" +copyUsername: "複製使用者名稱" +searchUser: "搜尋使用者" +reply: "回覆" +loadMore: "載入更多" +showMore: "載入更多" +showLess: "關閉" +youGotNewFollower: "您有新的追隨者" +receiveFollowRequest: "您有新的追隨請求" +followRequestAccepted: "追隨請求已接受" +mention: "提及" +mentions: "提及" +directNotes: "私訊" +importAndExport: "匯入與匯出" +import: "匯入" +export: "匯出" +files: "檔案" +download: "下載" +driveFileDeleteConfirm: "確定要刪除檔案「{name}」嗎?使用此附件的貼文也會跟著消失。" +unfollowConfirm: "確定要取消追隨{name}嗎?" +exportRequested: "已請求匯出。這可能會花一點時間。結束後檔案將會被放到雲端裡。" +importRequested: "已請求匯入。這可能會花一點時間。" +lists: "清單" +noLists: "你沒有任何清單" +note: "貼文" +notes: "貼文" +following: "追隨中" +followers: "追隨者" +followsYou: "追隨你的人" +createList: "建立清單" +manageLists: "管理清單" +error: "錯誤" +somethingHappened: "發生錯誤" +retry: "重試" +pageLoadError: "載入頁面失敗。" +pageLoadErrorDescription: "這通常是因為網路錯誤或是瀏覽器快取殘留的原因。請先清除瀏覽器快取,稍後再重試。" +serverIsDead: "伺服器沒有回應。請稍等片刻,然後重試。" +youShouldUpgradeClient: "請重新載入以使用新版本的客戶端顯示此頁面。" +enterListName: "輸入清單名稱" +privacy: "隱私" +makeFollowManuallyApprove: "手動審核追隨請求" +defaultNoteVisibility: "預設可見性" +follow: "追隨" +followRequest: "追隨請求" +followRequests: "追隨請求" +unfollow: "取消追隨" +followRequestPending: "追隨許可批准中" +enterEmoji: "輸入表情符號" +renote: "轉發" +unrenote: "取消轉發" +renoted: "已轉傳。" +cantRenote: "無法轉發此貼文。" +cantReRenote: "無法轉傳之前已經轉傳過的內容。" +quote: "引用" +pinnedNote: "已置頂的貼文" +pinned: "置頂" +you: "您" +clickToShow: "按一下以顯示" +sensitive: "敏感內容" +add: "新增" +reaction: "情感" +enableEmojiReaction: "啟用表情符號反應" +showEmojisInReactionNotifications: "在反應通知中顯示表情符號" +reactionSetting: "在選擇器中顯示反應" +reactionSettingDescription2: "拖動以重新列序,點擊以刪除,按下 + 添加。" +rememberNoteVisibility: "記住貼文可見性" +attachCancel: "移除附件" +markAsSensitive: "標記為敏感內容" +unmarkAsSensitive: "取消標記為敏感內容" +enterFileName: "請輸入檔案名稱" +mute: "靜音" +unmute: "解除靜音" +renoteMute: "靜音轉發貼文" +renoteUnmute: "解除靜音轉發貼文" +block: "封鎖" +unblock: "解除封鎖" +suspend: "凍結" +unsuspend: "解除凍結" +blockConfirm: "確定要封鎖此用戶?" +unblockConfirm: "確定解除封鎖此用戶?" +suspendConfirm: "確定凍結此帳號?" +unsuspendConfirm: "確定解凍此帳號?" +selectList: "選擇清單" +selectAntenna: "選擇天線" +selectWidget: "選擇小工具" +editWidgets: "編輯小工具" +editWidgetsExit: "完成" +customEmojis: "自訂表情符號" +emoji: "表情符號" +emojis: "表情符號" +emojiName: "表情符號名稱" +emojiUrl: "表情符號URL" +addEmoji: "加入表情符號" +settingGuide: "推薦設定" +cacheRemoteFiles: "快取遠端檔案" +cacheRemoteFilesDescription: "禁用此設定會停止遠端檔案的緩存,從而節省儲存空間,但資料會因直接連線從而產生額外連接數據。" +flagAsBot: "此使用者是機器人" +flagAsBotDescription: "如果本帳戶是由程式控制,請啟用此選項。啟用後,會作為標示幫助其他開發者防止機器人之間產生無限互動的行為,並會調整Calckey內部系統將本帳戶識別為機器人。" +flagAsCat: "此使用者是貓" +flagAsCatDescription: "如果想將本帳戶標示為一隻貓,請開啟此標示!" +flagShowTimelineReplies: "在時間軸上顯示貼文的回覆" +flagShowTimelineRepliesDescription: "啟用時,時間線除了顯示用戶的貼文以外,還會顯示用戶對其他貼文的回覆。" +autoAcceptFollowed: "自動追隨中使用者的追隨請求" +addAccount: "添加帳戶" +loginFailed: "登入失敗" +showOnRemote: "轉到所在伺服器顯示" +general: "一般" +wallpaper: "桌布" +setWallpaper: "設定桌布" +removeWallpaper: "移除桌布" +searchWith: "搜尋: {q}" +youHaveNoLists: "你沒有任何清單" +followConfirm: "你真的要追隨{name}嗎?" +proxyAccount: "代理帳戶" +proxyAccountDescription: "代理帳戶是在某些情況下充當其他伺服器用戶的帳戶。例如,當使用者將一個來自其他伺服器的帳戶放在列表中時,由於沒有其他使用者追蹤該帳戶,該指令不會傳送到該伺服器上,因此會由代理帳戶追蹤。" +host: "主機" +selectUser: "選取使用者" +recipient: "收件人" +annotation: "註解" +federation: "站台聯邦" +instances: "伺服器" +registeredAt: "初次觀測" +latestRequestSentAt: "上次發送的請求" +latestRequestReceivedAt: "上次收到的請求" +latestStatus: "最後狀態" +storageUsage: "已使用容量" +charts: "圖表" +perHour: "每小時" +perDay: "每日" +stopActivityDelivery: "停止發送活動" +blockThisInstance: "封鎖此伺服器" +operations: "操作" +software: "軟體" +version: "版本" +metadata: "元資料" +monitor: "監視器" +jobQueue: "佇列" +cpuAndMemory: "CPU及記憶體用量" +network: "網路" +disk: "硬碟" +instanceInfo: "伺服器資訊" +statistics: "統計" +clearQueue: "清除佇列" +clearQueueConfirmTitle: "確定要清除佇列嗎?" +clearQueueConfirmText: "未發佈的貼文將不會發佈。您通常不需要確認。" +clearCachedFiles: "清除快取資料" +clearCachedFilesConfirm: "確定要清除所有遠端暫存資料嗎?" +blockedInstances: "已封鎖的伺服器" +blockedInstancesDescription: "請逐行輸入需要封鎖的伺服器。已封鎖的伺服器將無法與本伺服器進行通訊。" +muteAndBlock: "靜音和封鎖" +mutedUsers: "已靜音用戶" +blockedUsers: "已封鎖用戶" +noUsers: "沒有任何使用者" +editProfile: "編輯個人檔案" +noteDeleteConfirm: "確定刪除此貼文嗎?" +pinLimitExceeded: "不能置頂更多貼文了" +intro: "Calckey 部署完成!請建立管理員帳戶。" +done: "完成" +processing: "處理中" +preview: "預覽" +default: "預設" +defaultValueIs: "預設值:{value}" +noCustomEmojis: "沒有自訂的表情符號" +noJobs: "沒有任務" +federating: "整合搜索中" +blocked: "已封鎖" +suspended: "已凍結" +all: "全部" +subscribing: "訂閱中" +publishing: "直播中" +notResponding: "沒有回應" +instanceFollowing: "追蹤伺服器" +instanceFollowers: "伺服器的追蹤者" +instanceUsers: "此伺服器的用戶" +changePassword: "修改密碼" +security: "安全性" +retypedNotMatch: "兩次輸入不一致。" +currentPassword: "目前密碼" +newPassword: "新密碼" +newPasswordRetype: "確認密碼" +attachFile: "上傳附件" +more: "更多!" +featured: "精選" +usernameOrUserId: "使用者名稱或使用者ID" +noSuchUser: "使用者不存在" +lookup: "查詢" +announcements: "公告" +imageUrl: "圖片URL" +remove: "刪除" +removed: "已刪除" +removeAreYouSure: "確定要刪掉「{x}」嗎?" +deleteAreYouSure: "確定要刪掉「{x}」嗎?" +resetAreYouSure: "確定要重設嗎?" +saved: "已儲存" +messaging: "傳送訊息" +upload: "上傳" +keepOriginalUploading: "保留原圖" +keepOriginalUploadingDescription: "上傳圖片時保留原始圖片。關閉時,瀏覽器會在上傳時生成一張用於web發布的圖片。" +fromDrive: "從雲端空間" +fromUrl: "從URL" +uploadFromUrl: "從網址上傳" +uploadFromUrlDescription: "您要上傳的文件的URL" +uploadFromUrlRequested: "已請求上傳" +uploadFromUrlMayTakeTime: "還需要一些時間才能完成上傳。" +explore: "探索" +messageRead: "已讀" +noMoreHistory: "沒有更多歷史紀錄" +startMessaging: "開始傳送訊息" +nUsersRead: "{n}人已讀" +agreeTo: "我同意{0}" +tos: "使用條款" +start: "開始" +home: "首頁" +remoteUserCaution: "由於該使用者來自遠端實例,因此資訊可能非即時的。" +activity: "動態" +images: "圖片" +birthday: "生日" +yearsOld: "{age}歲" +registeredDate: "註冊日期" +location: "位置" +theme: "外觀主題" +themeForLightMode: "在淺色模式下使用的主題" +themeForDarkMode: "在黑暗模式下使用的主題" +light: "淺色" +dark: "黑暗" +lightThemes: "明亮主題" +darkThemes: "黑暗主題" +syncDeviceDarkMode: "將黑暗模式與設備設置同步" +drive: "雲端硬碟" +fileName: "檔案名稱" +selectFile: "選擇檔案" +selectFiles: "選擇檔案" +selectFolder: "選擇資料夾" +selectFolders: "選擇資料夾" +renameFile: "重新命名檔案" +folderName: "資料夾名稱" +createFolder: "新增資料夾" +renameFolder: "重新命名資料夾" +deleteFolder: "刪除資料夾" +addFile: "加入附件" +emptyDrive: "雲端硬碟為空" +emptyFolder: "資料夾為空" +unableToDelete: "無法刪除" +inputNewFileName: "輸入檔案名稱" +inputNewDescription: "請輸入新標題" +inputNewFolderName: "輸入新資料夾的名稱" +circularReferenceFolder: "目標文件夾是您要移動的文件夾的子文件夾。" +hasChildFilesOrFolders: "此文件夾不是空的,無法刪除。" +copyUrl: "複製URL" +rename: "重新命名" +avatar: "大頭貼" +banner: "橫幅" +nsfw: "敏感內容" +whenServerDisconnected: "與伺服器的連接中斷時" +disconnectedFromServer: "與伺服器中斷連線" +reload: "重新整理" +doNothing: "無視" +reloadConfirm: "確定要重新整理嗎?" +watch: "關注" +unwatch: "取消追隨" +accept: "接受" +reject: "拒絕" +normal: "正常" +instanceName: "伺服器名稱" +instanceDescription: "伺服器說明" +maintainerName: "管理員名稱" +maintainerEmail: "管理員郵箱" +tosUrl: "服務條款URL" +thisYear: "本年" +thisMonth: "本月" +today: "本日" +dayX: "{day}日" +monthX: "{month}月" +yearX: "{year}年" +pages: "頁面" +integration: "整合" +connectService: "己連結" +disconnectService: "己斷開" +enableLocalTimeline: "開啟本地時間軸" +enableGlobalTimeline: "啟用公開時間軸" +disablingTimelinesInfo: "即使您關閉了時間線功能,管理員和協調人仍可以繼續使用,以方便您。" +registration: "註冊" +enableRegistration: "開啟新使用者註冊" +invite: "邀請" +driveCapacityPerLocalAccount: "每個本地用戶的雲端空間大小" +driveCapacityPerRemoteAccount: "每個非本地用戶的雲端容量" +inMb: "以Mbps為單位" +iconUrl: "圖像URL" +bannerUrl: "橫幅圖像URL" +backgroundImageUrl: "背景圖片的來源網址" +basicInfo: "基本資訊" +pinnedUsers: "置頂用戶" +pinnedUsersDescription: "在「發現」頁面中使用換行標記想要置頂的使用者。" +pinnedPages: "釘選頁面" +pinnedPagesDescription: "輸入要固定至伺服器首頁的頁面路徑,以換行符分隔。" +pinnedClipId: "置頂的摘錄ID" +pinnedNotes: "已置頂的貼文" +hcaptcha: "hCaptcha" +enableHcaptcha: "啟用 hCaptcha" +hcaptchaSiteKey: "網站金鑰" +hcaptchaSecretKey: "金鑰" +recaptcha: "reCAPTCHA" +enableRecaptcha: "啟用 reCAPTCHA" +recaptchaSiteKey: "網站金鑰" +recaptchaSecretKey: "金鑰" +avoidMultiCaptchaConfirm: "使用多種驗證方式可能會造成干擾,您要關閉其他驗證方式嗎?您可以按“取消”保留多種驗證方式。" +antennas: "天線" +manageAntennas: "管理天線" +name: "名稱" +antennaSource: "接收來源" +antennaKeywords: "包含關鍵字" +antennaExcludeKeywords: "排除關鍵字" +antennaKeywordsDescription: "用空格分隔指定AND、用換行符分隔指定OR。" +notifyAntenna: "通知有新貼文" +withFileAntenna: "僅帶有附件的貼文" +enableServiceworker: "開啟 ServiceWorker" +antennaUsersDescription: "指定用換行符分隔的用戶名" +caseSensitive: "區分大小寫" +withReplies: "包含回覆" +connectedTo: "您的帳戶已連接到以下社交帳戶" +notesAndReplies: "貼文與回覆" +withFiles: "附件" +silence: "禁言" +silenceConfirm: "確定要禁言此用戶嗎?" +unsilence: "解除禁言" +unsilenceConfirm: "確定要解除禁言嗎?" +popularUsers: "熱門使用者" +recentlyUpdatedUsers: "最近發文的使用者" +recentlyRegisteredUsers: "新加入使用者" +recentlyDiscoveredUsers: "最近發現的使用者" +exploreUsersCount: "有{count}個使用者" +exploreFediverse: "探索聯邦世界" +popularTags: "熱門標籤" +userList: "清單" +about: "資訊" +aboutMisskey: "關於 Calckey" +administrator: "管理員" +token: "權杖" +twoStepAuthentication: "兩階段驗證" +moderator: "板主" +moderation: "言論調節" +nUsersMentioned: "提到了{n}" +securityKey: "安全金鑰" +securityKeyName: "金鑰名稱" +registerSecurityKey: "註冊安全金鑰" +lastUsed: "上次使用" +unregister: "註銷帳號" +passwordLessLogin: "設置無密碼登入" +resetPassword: "重置密碼" +newPasswordIs: "新密碼為「{password}」" +reduceUiAnimation: "減少介面的動態視覺" +share: "分享" +notFound: "找不到" +notFoundDescription: "找不到與指定URL回應的頁面。" +uploadFolder: "預設上傳資料夾" +cacheClear: "清除快取" +markAsReadAllNotifications: "標記所有通知為已讀" +markAsReadAllUnreadNotes: "標記所有貼文為已讀" +markAsReadAllTalkMessages: "標記所有訊息為已讀" +help: "幫助" +inputMessageHere: "在此輸入訊息" +close: "關閉" +group: "群組" +groups: "群組" +createGroup: "創建群組" +ownedGroups: "擁有的群組" +joinedGroups: "群組成員" +invites: "邀請" +groupName: "群組名稱" +members: "成員" +transfer: "轉讓" +messagingWithUser: "傳送訊息給其他使用者" +messagingWithGroup: "發送訊息至群組" +title: "標題" +text: "文字" +enable: "啟用" +next: "下一步" +retype: "重新輸入" +noteOf: "{user}的貼文" +inviteToGroup: "邀請至群組" +quoteAttached: "引用" +quoteQuestion: "是否要引用?" +noMessagesYet: "沒有訊息" +newMessageExists: "有新的訊息" +onlyOneFileCanBeAttached: "只能加入一個附件" +signinRequired: "請先登入" +invitations: "邀請" +invitationCode: "邀請碼" +checking: "確認中..." +available: "可用的" +unavailable: "不可用的" +usernameInvalidFormat: "可使用大小寫英文字母、數字和底線。" +tooShort: "過短" +tooLong: "過長" +weakPassword: "密碼強度過弱" +normalPassword: "密碼強度普通" +strongPassword: "密碼強度高" +passwordMatched: "密碼一致" +passwordNotMatched: "密碼不一致" +signinWith: "以{x}登錄" +signinFailed: "登入失敗。 請檢查使用者名稱和密碼。" +tapSecurityKey: "點擊安全密鑰" +or: "或者" +language: "語言" +uiLanguage: "介面語言" +groupInvited: "您有新的群組邀請" +aboutX: "關於{x}" +useOsNativeEmojis: "使用OS原生表情符號" +disableDrawer: "不顯示下拉式選單" +youHaveNoGroups: "找不到群組" +joinOrCreateGroup: "請加入現有群組,或創建新群組。" +noHistory: "沒有歷史紀錄" +signinHistory: "登入歷史" +disableAnimatedMfm: "禁用MFM動畫" +doing: "正在處理..." +category: "類別" +tags: "標籤" +docSource: "文件來源" +createAccount: "建立帳戶" +existingAccount: "現有帳戶" +regenerate: "再生" +fontSize: "字體大小" +noFollowRequests: "沒有要求跟隨您的申請" +openImageInNewTab: "於新分頁中開啟圖片" +dashboard: "儀表板" +local: "本地" +remote: "遠端" +total: "合計" +weekOverWeekChanges: "與上週相比" +dayOverDayChanges: "與前一日相比" +appearance: "外觀" +clientSettings: "用戶端設定" +accountSettings: "帳戶設定" +promotion: "推廣" +promote: "推廣" +numberOfDays: "有效天數" +hideThisNote: "隱藏此貼文" +showFeaturedNotesInTimeline: "在時間軸上顯示熱門推薦" +objectStorage: "Object Storage (物件儲存)" +useObjectStorage: "使用Object Storage" +objectStorageBaseUrl: "根URL" +objectStorageBaseUrlDesc: "引用時的URL。如果你使用的是CDN或反向代理,請指定其網址URL。\n例如S3:“https://.s3.amazonaws.com”,GCS:“https://storage.googleapis.com/”。" +objectStorageBucket: "儲存空間(Bucket)" +objectStorageBucketDesc: "請指定您正在使用的服務的存儲桶名稱。" +objectStoragePrefix: "前綴" +objectStoragePrefixDesc: "它存儲在此前綴目錄下。" +objectStorageEndpoint: "端點(Endpoint)" +objectStorageEndpointDesc: "如要使用AWS S3,請留空。否則請依照你使用的服務商的說明書進行設定,以''或 ':'的形式設定端點(Endpoint)。" +objectStorageRegion: "地域(Region)" +objectStorageRegionDesc: "指定一個分區,例如“xx-east-1”。 如果您使用的服務沒有分區的概念,請留空或填寫“us-east-1”。" +objectStorageUseSSL: "使用SSL" +objectStorageUseSSLDesc: "如果不使用https進行API連接,請關閉" +objectStorageUseProxy: "使用網路代理" +objectStorageUseProxyDesc: "如果不使用代理進行API連接,請關閉" +objectStorageSetPublicRead: "上傳時設定為\"public-read\"" +serverLogs: "伺服器日誌" +deleteAll: "刪除所有記錄" +showFixedPostForm: "於時間軸頁頂顯示「發送貼文」方框" +newNoteRecived: "發現新的貼文" +sounds: "音效" +listen: "聆聽" +none: "無" +showInPage: "在頁面中顯示" +popout: "彈出型窗口" +volume: "音量" +masterVolume: "主音量" +details: "詳細資訊" +chooseEmoji: "選擇您的表情符號" +unableToProcess: "操作無法完成" +recentUsed: "最近使用" +install: "安裝" +uninstall: "解除安裝" +installedApps: "已授權的應用程式" +nothing: "未發現" +installedDate: "安裝時間" +lastUsedDate: "最後上線日期" +state: "狀態" +sort: "排序" +ascendingOrder: "昇冪" +descendingOrder: "降冪" +scratchpad: "暫存記憶體" +scratchpadDescription: "AiScript控制台為AiScript提供了實驗環境。您可以在此編寫、執行和確認代碼與Calckey互動的结果。" +output: "輸出" +script: "腳本" +disablePagesScript: "停用頁面的AiScript腳本" +updateRemoteUser: "更新遠端使用者資訊" +deleteAllFiles: "刪除所有檔案" +deleteAllFilesConfirm: "要删除所有檔案嗎?" +removeAllFollowing: "解除所有追蹤" +removeAllFollowingDescription: "解除{host}所有的追蹤。在伺服器不再存在時執行。" +userSuspended: "此使用者已被停用。" +userSilenced: "該用戶已被禁言。" +yourAccountSuspendedTitle: "帳戶已被凍結" +yourAccountSuspendedDescription: "由於違反了伺服器的服務條款或其他原因,該帳戶已被凍結。 您可以與管理員連繫以了解更多訊息。 請不要創建一個新的帳戶。" +menu: "選單" +divider: "分割線" +addItem: "新增項目" +relays: "中繼" +addRelay: "新增中繼" +inboxUrl: "收件夾URL" +addedRelays: "已加入的中繼" +serviceworkerInfo: "您需要啟用推送通知。" +deletedNote: "已删除的貼文" +invisibleNote: "隱藏的貼文" +enableInfiniteScroll: "啟用自動滾動頁面模式" +visibility: "可見性" +poll: "投票" +useCw: "隱藏內容" +enablePlayer: "打開播放器" +disablePlayer: "關閉播放器" +expandTweet: "展開推文" +themeEditor: "主題編輯器" +description: "描述" +describeFile: "添加標題" +enterFileDescription: "輸入標題" +author: "作者" +leaveConfirm: "有未保存的更改。要放棄嗎?" +manage: "管理" +plugins: "外掛" +preferencesBackups: "備份設定檔" +deck: "多欄模式" +undeck: "取消多欄模式" +useBlurEffectForModal: "在模態框使用模糊效果" +useFullReactionPicker: "使用全尺寸的反應選擇器" +width: "寬度" +height: "高度" +large: "大" +medium: "中" +small: "小" +generateAccessToken: "發行存取權杖" +permission: "權限" +enableAll: "啟用全部" +disableAll: "停用全部" +tokenRequested: "允許存取帳戶" +pluginTokenRequestedDescription: "此外掛將擁有在此設定的權限。" +notificationType: "通知形式" +edit: "編輯" +emailServer: "電郵伺服器" +enableEmail: "啟用發送電郵功能" +emailConfigInfo: "用於確認電郵地址及密碼重置" +email: "電子郵件" +emailAddress: "電郵地址" +smtpConfig: "SMTP伺服器設定" +smtpHost: "主機" +smtpPort: "埠" +smtpUser: "使用者名稱" +smtpPass: "密碼" +emptyToDisableSmtpAuth: "留空使用者名稱及密碼以關閉SMTP驗證" +smtpSecure: "在 SMTP 連接中使用隱式 SSL/TLS" +smtpSecureInfo: "如使用STARTTLS,請關閉" +testEmail: "測試郵件發送" +wordMute: "被靜音的文字" +regexpError: "正規表達式錯誤" +regexpErrorDescription: "{tab} 靜音文字的第 {line} 行的正規表達式有錯誤:" +instanceMute: "伺服器的靜音" +userSaysSomething: "{name}說了什麼" +makeActive: "啟用" +display: "檢視" +copy: "複製" +metrics: "指標" +overview: "概覽" +logs: "日誌" +delayed: "延遲" +database: "資料庫" +channel: "頻道" +create: "新增" +notificationSetting: "通知設定" +notificationSettingDesc: "選擇顯示通知的類型。" +useGlobalSetting: "使用全域設定" +useGlobalSettingDesc: "啟用時,將使用帳戶通知設定。停用時,則可以單獨設定。" +other: "其他" +regenerateLoginToken: "重新產生登入權杖" +regenerateLoginTokenDescription: "重新產生用於登入的內部權杖。一般情況下是不需要這樣做的。一旦重產,所有裝置將會被登出。" +setMultipleBySeparatingWithSpace: "您可以使用空格分隔多個項目。" +fileIdOrUrl: "檔案ID或URL" +behavior: "行為" +sample: "範例" +abuseReports: "檢舉" +reportAbuse: "檢舉" +reportAbuseOf: "檢舉{name}" +fillAbuseReportDescription: "請填寫檢舉的詳細理由。可以的話,請附上針對的URL網址。" +abuseReported: "回報已送出。感謝您的報告。" +reporter: "檢舉者" +reporteeOrigin: "檢舉來源" +reporterOrigin: "檢舉者來源" +forwardReport: "將報告轉送給遠端伺服器" +forwardReportIsAnonymous: "在遠端伺服器上看不到您的資訊,顯示的報告者是匿名的系統帳戶。" +send: "發送" +abuseMarkAsResolved: "處理完畢" +openInNewTab: "在新分頁中開啟" +openInSideView: "在側欄中開啟" +defaultNavigationBehaviour: "默認導航" +editTheseSettingsMayBreakAccount: "修改這些設定可能會毀損你的帳戶。" +instanceTicker: "貼文的伺服器資訊" +waitingFor: "等待{x}" +random: "隨機" +system: "系統" +switchUi: "界面" +desktop: "桌面" +clip: "摘錄" +createNew: "新建" +optional: "可選" +createNewClip: "建立新摘錄" +unclip: "解除摘錄" +confirmToUnclipAlreadyClippedNote: "此貼文已包含在摘錄「{name}」中。 你想將貼文從這個摘錄中排除嗎?" +public: "公開" +i18nInfo: "Calckey已經被志願者們翻譯成各種語言版本,如果想要幫忙的話,可以進入{link}幫助翻譯。" +manageAccessTokens: "管理存取權杖" +accountInfo: "帳戶資訊" +notesCount: "貼文數量" +repliesCount: "回覆數量" +renotesCount: "轉發數量" +repliedCount: "回覆數量" +renotedCount: "轉發次數" +followingCount: "正在跟隨的用戶數量" +followersCount: "跟隨者數量" +sentReactionsCount: "情感發送次數" +receivedReactionsCount: "情感收到次數" +pollVotesCount: "已統計的投票數" +pollVotedCount: "已投票數" +yes: "確定" +no: "取消" +driveFilesCount: "雲端硬碟檔案數量" +driveUsage: "雲端硬碟使用量" +noCrawle: "拒絕搜尋引擎索引" +noCrawleDescription: "要求網路搜尋引擎不要索引你的個人資料頁、貼文及頁面等。" +lockedAccountInfo: "即使你通過了追隨者請求,除非你將貼文的可見性設定為 「追隨者」,否則任何人都能看見你的貼文。" +alwaysMarkSensitive: "默認將圖像/影像標記為敏感內容" +loadRawImages: "以原始圖檔顯示附件圖檔的縮圖" +disableShowingAnimatedImages: "不播放動態圖檔" +verificationEmailSent: "已發送驗證電子郵件。請點擊進入電子郵件中的鏈接完成驗證。" +notSet: "未設定" +emailVerified: "已成功驗證您的電郵" +noteFavoritesCount: "我的最愛貼文的數目" +pageLikesCount: "頁面被按讚次數" +pageLikedCount: "頁面被按讚次數" +contact: "聯絡人" +useSystemFont: "使用系統預設的字型" +clips: "摘錄" +experimentalFeatures: "實驗中的功能" +developer: "開發者" +makeExplorable: "使自己的帳戶能夠在“探索”頁面中顯示" +makeExplorableDescription: "如果關閉,帳戶將不會被顯示在\"探索\"頁面中。" +showGapBetweenNotesInTimeline: "分開顯示時間軸上的貼文" +duplicate: "複製" +left: "左" +center: "置中" +wide: "寬" +narrow: "窄" +reloadToApplySetting: "設定將會在頁面重新載入之後生效。要現在就重載頁面嗎?" +needReloadToApply: "必須重新載入才會生效。" +showTitlebar: "顯示標題列" +clearCache: "清除快取資料" +onlineUsersCount: "{n}人正在線上" +nUsers: "{n}用戶" +nNotes: "{n}貼文" +sendErrorReports: "傳送錯誤報告" +sendErrorReportsDescription: "啟用後,問題報告將傳送至Calckey開發者以提升軟體品質。\n問題報告可能包括OS版本,瀏覽器類型,行為歷史記錄等。" +myTheme: "我的佈景主題" +backgroundColor: "背景" +accentColor: "重點色彩" +textColor: "文字" +saveAs: "另存為..." +advanced: "進階" +value: "數值" +createdAt: "建立於" +updatedAt: "最後更新" +saveConfirm: "您要儲存變更嗎?" +deleteConfirm: "你確定要刪除嗎?" +invalidValue: "輸入值無效。" +registry: "登錄表" +closeAccount: "停用帳戶" +currentVersion: "目前版本" +latestVersion: "最新版本" +youAreRunningUpToDateClient: "您所使用的用戶端已經是最新的。" +newVersionOfClientAvailable: "新版本的用戶端可用。" +usageAmount: "使用量" +capacity: "容量" +inUse: "已使用" +editCode: "編輯代碼" +apply: "套用" +receiveAnnouncementFromInstance: "接收由本伺服器發出的電郵通知" +emailNotification: "郵件通知" +publish: "發佈" +inChannelSearch: "頻道内搜尋" +useReactionPickerForContextMenu: "點擊右鍵開啟反應工具欄" +typingUsers: "{users}輸入中" +jumpToSpecifiedDate: "跳轉到特定日期" +showingPastTimeline: "顯示過往的時間線" +clear: "清除" +markAllAsRead: "全部標示為已讀" +goBack: "返回" +unlikeConfirm: "要取消按讚嗎?" +fullView: "全熒幕顯示" +quitFullView: "退出全熒幕顯示" +addDescription: "添加描述" +userPagePinTip: "在貼文的選單中選擇\"置頂\",即可置頂該貼文至您的個人檔案頁面。" +notSpecifiedMentionWarning: "此貼文有未指定的提及" +info: "資訊" +userInfo: "用戶資料" +unknown: "未知" +onlineStatus: "在線狀態" +hideOnlineStatus: "隱藏在線狀態" +hideOnlineStatusDescription: "隱藏在線狀態後,可能會降低檢索等功能的便利性。" +online: "線上" +active: "最近活躍" +offline: "離線" +notRecommended: "不推薦" +botProtection: "Bot防護" +instanceBlocking: "聯邦管理" +selectAccount: "選擇帳戶" +switchAccount: "切換帳戶" +enabled: "已啟用" +disabled: "已停用" +quickAction: "快捷操作" +user: "使用者" +administration: "管理" +accounts: "帳戶" +switch: "切換" +noMaintainerInformationWarning: "尚未設定管理員信息。" +noBotProtectionWarning: "尚未設定Bot防護。" +configure: "設定" +postToGallery: "發佈到相簿" +gallery: "相簿" +recentPosts: "最新貼文" +popularPosts: "熱門的貼文" +shareWithNote: "在貼文中分享" +ads: "廣告" +expiration: "期限" +memo: "備忘錄" +priority: "優先級" +high: "高" +middle: "中" +low: "低" +emailNotConfiguredWarning: "沒有設定電郵地址。" +ratio: "%" +previewNoteText: "預覽文本" +customCss: "自定義 CSS" +customCssWarn: "這個設定必須由具備相關知識的人員操作,不當的設定可能导致客戶端無法正常使用。" +global: "公開" +squareAvatars: "頭像以方形顯示" +sent: "發送" +received: "收取" +searchResult: "搜尋結果" +hashtags: "#tag" +troubleshooting: "故障排除" +useBlurEffect: "在 UI 上使用模糊效果" +learnMore: "更多資訊" +misskeyUpdated: "Calckey 更新完成!" +whatIsNew: "顯示更新資訊" +translate: "翻譯" +translatedFrom: "從 {x} 翻譯" +accountDeletionInProgress: "正在刪除帳戶" +usernameInfo: "在伺服器上您的帳戶是唯一的識別名稱。您可以使用字母 (a ~ z, A ~ Z)、數字 (0 ~ 9) 和下底線 (_)。之後帳戶名是不能更改的。" +aiChanMode: "小藍模式" +keepCw: "保持CW" +pubSub: "Pub/Sub 帳戶" +lastCommunication: "最近的通信" +resolved: "已解決" +unresolved: "未解決" +breakFollow: "移除追蹤者" +itsOn: "已開啟" +itsOff: "已關閉" +emailRequiredForSignup: "註冊帳戶需要電子郵件地址" +unread: "未讀" +filter: "篩選" +controlPanel: "控制台" +manageAccounts: "管理帳戶" +makeReactionsPublic: "將反應設為公開" +makeReactionsPublicDescription: "將您做過的反應設為公開可見。" +classic: "置中" +muteThread: "將貼文串設為靜音" +unmuteThread: "將貼文串的靜音解除" +ffVisibility: "連接的公開範圍" +ffVisibilityDescription: "您可以設定您的關注/關注者資訊的公開範圍。" +continueThread: "查看更多貼文" +deleteAccountConfirm: "將要刪除帳戶。是否確定?" +incorrectPassword: "密碼錯誤。" +voteConfirm: "確定投給「{choice}」?" +hide: "隱藏" +leaveGroup: "離開群組" +leaveGroupConfirm: "確定離開「{name}」?" +useDrawerReactionPickerForMobile: "在移動設備上使用抽屜顯示" +welcomeBackWithName: "歡迎回來,{name}" +clickToFinishEmailVerification: "點擊 [{ok}] 完成電子郵件地址認證。" +overridedDeviceKind: "裝置類型" +smartphone: "智慧型手機" +tablet: "平板" +auto: "自動" +themeColor: "主題顏色" +size: "大小" +numberOfColumn: "列數" +searchByGoogle: "搜尋" +instanceDefaultLightTheme: "伺服器預設的淺色主題" +instanceDefaultDarkTheme: "伺服器預設的深色主題" +instanceDefaultThemeDescription: "輸入物件形式的主題代碼。" +mutePeriod: "靜音的期限" +indefinitely: "無期限" +tenMinutes: "10分鐘" +oneHour: "1小時" +oneDay: "1天" +oneWeek: "1週" +reflectMayTakeTime: "可能需要一些時間才會出現效果。" +failedToFetchAccountInformation: "取得帳戶資訊失敗" +rateLimitExceeded: "已超過速率限制" +cropImage: "圖片裁剪" +cropImageAsk: "要剪裁圖片嗎?" +file: "檔案" +recentNHours: "過去{n}小時" +recentNDays: "過去{n}天" +noEmailServerWarning: "尚未設定電子郵件伺服器。" +thereIsUnresolvedAbuseReportWarning: "有尚未處理的檢舉。" +recommended: "推薦" +check: "檢查" +driveCapOverrideLabel: "更改這個使用者的雲端硬碟容量上限" +driveCapOverrideCaption: "如果指定0以下的值,就會被取消。" +requireAdminForView: "必須以管理者帳號登入才可以檢視。" +isSystemAccount: "由系統自動建立與管理的帳號。" +typeToConfirm: "要執行這項操作,請輸入 {x}" +deleteAccount: "刪除帳號" +document: "文件" +numberOfPageCache: "快取頁面數" +numberOfPageCacheDescription: "增加數量會提高便利性,但也會增加負荷與記憶體使用量。" +logoutConfirm: "確定要登出嗎?" +lastActiveDate: "上次使用日期及時間" +statusbar: "狀態列" +pleaseSelect: "請選擇" +reverse: "翻轉" +colored: "彩色" +refreshInterval: "更新間隔 " +label: "標籤" +type: "類型" +speed: "速度" +slow: "慢" +fast: "快" +sensitiveMediaDetection: "敏感性媒體的檢測" +localOnly: "僅限本地" +remoteOnly: "僅限遠端" +failedToUpload: "上傳失敗" +cannotUploadBecauseInappropriate: "由於判定可能包含不適當的內容,因此無法上傳。" +cannotUploadBecauseNoFreeSpace: "由於雲端硬碟沒有可用空間,因此無法上傳。" +beta: "Beta" +enableAutoSensitive: "自動NSFW判定" +enableAutoSensitiveDescription: "如可用,請利用機器學習在媒體上自動設置 NSFW 旗標。 即使關閉此功能,依伺服器而定也可能會自動設置。" +activeEmailValidationDescription: "積極地驗證用戶的電子郵件地址,判斷它是否為免洗地址,或者它是否可以通信。 若關閉,則只會檢查字元是否正確。" +navbar: "導覽列" +shuffle: "隨機" +account: "帳戶" +move: "移動" +customKaTeXMacro: "自定義 KaTeX 宏" +customKaTeXMacroDescription: "使用宏來輕鬆的輸入數學表達式吧!宏的用法與 LaTeX 中的命令定義相同。你可以使用 \\newcommand{\\ + name}{content} 或 \\newcommand{\\name}[number of arguments]{content} 來輸入數學表達式。舉個例子,\\ + newcommand{\\add}[2]{#1 + #2} 會將 \\add{3}{foo} 展開為 3 + foo。此外,宏名稱外的花括號 {} 可以被替換為圓括號 + () 和方括號 [],這會影響用於參數的括號。每行只能夠定義一個宏,無法在中間換行,且無效的行將被忽略。只支持簡單字符串替換功能,不支持高級語法,如條件分支等。" +enableCustomKaTeXMacro: "啟用自定義 KaTeX 宏" +_sensitiveMediaDetection: + description: "您可以使用機器學習自動檢測敏感媒體並將其用於審核。 伺服器的負荷會稍微增加。" + sensitivity: "檢測敏感度" + sensitivityDescription: "敏感度低時,誤檢測(偽陽性)會減少。敏感度高時,漏檢(偽陰性)會減少。" + setSensitiveFlagAutomatically: "設定 NSFW 旗標" + setSensitiveFlagAutomaticallyDescription: "即使將此設定關閉,判定結果也會保留在內部。" + analyzeVideos: "啟用影片分析" + analyzeVideosDescription: "除了靜止影像以外,也分析影片。伺服器的負荷會稍微增加。" +_emailUnavailable: + used: "已經在使用中" + format: "格式無效" + disposable: "不是永久可用的地址" + mx: "郵件伺服器不正確" + smtp: "郵件伺服器沒有應答" +_ffVisibility: + public: "發佈" + followers: "只有關注你的用戶能看到" + private: "私密" +_signup: + almostThere: "即將完成" + emailAddressInfo: "請輸入您所使用的電子郵件地址。電子郵件地址不會被公開。" + emailSent: "已將確認郵件發送至您輸入的電子郵件地址 ({email})。請開啟電子郵件中的連結以完成帳戶創建。" +_accountDelete: + accountDelete: "刪除帳戶" + mayTakeTime: "刪除帳戶的處理負荷較大,如果帳戶產生的內容數量上傳的檔案數量較多的話,就需要花费一段時間才能完成。" + sendEmail: "帳戶删除完成後,將向註冊地電子郵件地址發送通知。" + requestAccountDelete: "刪除帳戶請求" + started: "已開始刪除作業。" + inProgress: "正在刪除" +_ad: + back: "返回" + reduceFrequencyOfThisAd: "降低此廣告的頻率" +_forgotPassword: + enterEmail: "請輸入您的帳戶註冊的電子郵件地址。 密碼重置連結將被發送到該電子郵件地址。" + ifNoEmail: "如果您還沒有註冊您的電子郵件地址,請聯繫管理員。" + contactAdmin: "此伺服器不支援使用電郵,請聯繫您的管理員重置你的密碼。" +_gallery: + my: "我的貼文" + liked: "喜歡的貼文" + like: "讚" + unlike: "收回喜歡" +_email: + _follow: + title: "您有新的追隨者" + _receiveFollowRequest: + title: "收到追隨請求" +_plugin: + install: "安裝外掛組件" + installWarn: "請不要安裝來源不明的外掛組件。" + manage: "管理外掛" +_preferencesBackups: + list: "已備份的設定檔" + saveNew: "另存新檔" + loadFile: "讀取檔案" + apply: "套用在此裝置" + save: "覆蓋存檔" + inputName: "輸入備份檔名稱" + cannotSave: "無法儲存" + nameAlreadyExists: "備份檔名稱「{name}」已經存在。請指定不同的名稱。" + applyConfirm: "將備份檔「{name}」套用在現在的裝置嗎?現在的裝置設定將會消失。" + saveConfirm: "要覆蓋存檔{name}嗎?" + deleteConfirm: "要刪除{name}嗎?" + renameConfirm: "要將「{old}」變更為「{new}」嗎?" + noBackups: "沒有備份檔。您可以用「另存新檔」將現在的客戶端設定儲存在伺服器上。" + createdAt: "建立日期:{date} {time}" + updatedAt: "更新日期:{date} {time}" + cannotLoad: "無法讀取" + invalidFile: "無效的檔案格式" +_registry: + scope: "範圍" + key: "機碼" + keys: "機碼" + domain: "域" + createKey: "新增機碼" +_aboutMisskey: + about: "Calckey是由ThatOneCalculator自2022年起開發的Misskey分支。" + contributors: "主要貢獻者" + allContributors: "全體貢獻人員" + source: "原始碼" + translation: "翻譯Calckey" + donate: "贊助Calckey" + morePatrons: "還有許許多多幫助我們的其他人,非常感謝你們。 🥰" + patrons: "贊助者" +_nsfw: + respect: "隱藏敏感內容" + ignore: "不隱藏敏感內容" + force: "隱藏所有內容" +_mfm: + cheatSheet: "MFM代碼小抄" + intro: "MFM是Misskey專用的標記語言,可以在Misskey中的各個位置使用。 您可以這裏看到MFM可用語法列表。" + dummy: "Calckey拓展了Fediverse的世界" + mention: "提及" + mentionDescription: "透過 @+用戶名 來標示特定使用者。" + hashtag: "#tag" + hashtagDescription: "可以使用\"#\"符號後加文字表示話題標籤。" + url: "URL" + urlDescription: "可以展示URL位址。" + link: "鏈接" + linkDescription: "您可以將特定範圍的文章與 URL 相關聯。" + bold: "粗體" + boldDescription: "可以將文字顯示为粗體来強調。" + small: "縮小" + smallDescription: "可以使內容文字變小、變淡。" + center: "置中" + centerDescription: "可以將內容置中顯示。" + inlineCode: "程式碼(内嵌)" + inlineCodeDescription: "在行內用高亮度顯示,例如程式碼語法。" + blockCode: "程式碼(區塊)" + blockCodeDescription: "在區塊中用高亮度顯示,例如複數行的程式碼語法。" + inlineMath: "數學公式(內嵌)" + inlineMathDescription: "顯示內嵌的KaTeX數學公式" + blockMath: "數學公式(方塊)" + blockMathDescription: "以區塊顯示KaTeX數學式" + quote: "引用" + quoteDescription: "可以用來表示引用的内容。" + emoji: "自訂表情符號" + emojiDescription: "您可以通過將自定義表情符號名稱括在冒號中來顯示自定義表情符號。" + search: "搜尋" + searchDescription: "您可以顯示所輸入的搜索框。" + flip: "翻轉" + flipDescription: "將內容上下或左右翻轉。" + jelly: "動畫(果凍)" + jellyDescription: "顯示果凍一樣的動畫效果。" + tada: "動畫(鏘~)" + tadaDescription: "顯示「鏘~!」這種感覺的動畫效果。" + jump: "動畫(跳動)" + jumpDescription: "顯示跳動的動畫效果。" + bounce: "動畫(反彈)" + bounceDescription: "顯示有彈性的動畫效果。" + shake: "動畫(搖晃)" + shakeDescription: "顯示顫抖的動畫效果。" + twitch: "動畫(顫抖)" + twitchDescription: "顯示強烈顫抖的動畫效果。" + spin: "動畫(旋轉)" + spinDescription: "顯示旋轉的動畫效果。" + x2: "大" + x2Description: "放大顯示內容。" + x3: "較大" + x3Description: "放大顯示內容。" + x4: "最大" + x4Description: "將顯示內容放至最大。" + blur: "模糊" + blurDescription: "產生模糊效果。将游標放在上面即可將内容顯示出來。" + font: "字型" + fontDescription: "您可以設定顯示內容的字型。" + rainbow: "彩虹" + rainbowDescription: "用彩虹色來顯示內容。" + sparkle: "閃閃發光" + sparkleDescription: "添加閃閃發光的粒子效果。" + rotate: "旋轉" + rotateDescription: "以指定的角度旋轉。" + plain: "簡潔" + plainDescription: "停用全部的內部語法。" + play: 播放 MFM + stop: 暫停MFM + warn: MFM 可能包含快速移動或顯眼的動畫 + position: 位置 + alwaysPlay: 自動播放所有MFM動畫 + positionDescription: 按指定數量移動內容。 +_instanceTicker: + none: "隱藏" + remote: "向遠端使用者顯示" + always: "總是顯示" +_serverDisconnectedBehavior: + reload: "自動重載" + dialog: "彈出式警告" + quiet: "非侵入式警告" + nothing: 無 +_channel: + create: "建立頻道" + edit: "編輯頻道" + setBanner: "設定橫幅圖像" + removeBanner: "移除橫幅圖像" + featured: "熱門貼文" + owned: "管理中" + following: "關注中" + usersCount: "有{n}人參與" + notesCount: "有{n}個貼文" + nameAndDescription: "名稱與說明" + nameOnly: "僅名稱" +_menuDisplay: + sideFull: "側向" + sideIcon: "側向(圖示)" + top: "頂部" + hide: "隱藏" +_wordMute: + muteWords: "加入靜音文字" + muteWordsDescription: "用空格分隔指定AND,用換行分隔指定OR。" + muteWordsDescription2: "將關鍵字用斜線括起來表示正規表達式。" + softDescription: "隱藏時間軸中指定條件的貼文。" + hardDescription: "具有指定條件的貼文將不添加到時間軸。 即使您更改條件,未被添加的貼文也會被排除在外。" + soft: "軟性靜音" + hard: "硬性靜音" + mutedNotes: "已靜音的貼文" +_instanceMute: + instanceMuteDescription: "包括對被靜音伺服器上的用戶的回覆,被設定的伺服器上所有貼文及轉發都會被靜音。" + instanceMuteDescription2: "設定時以換行進行分隔" + title: "被設定的伺服器,貼文將被隱藏。" + heading: "將會被靜音的伺服器" +_theme: + explore: "取得佈景主題" + install: "安裝佈景主題" + manage: "佈景主題管理員" + code: "主題代碼" + description: "描述" + installed: "{name}已安裝" + installedThemes: "已經安裝的主題" + builtinThemes: "標準主題" + alreadyInstalled: "此主題已經安裝" + invalid: "主題格式錯誤" + make: "製作主題" + base: "基於" + addConstant: "添加常數" + constant: "常數" + defaultValue: "預設值" + color: "顏色" + refProp: "查看屬性" + refConst: "查看常數" + key: "按鍵" + func: "函数" + funcKind: "功能類型" + argument: "參數" + basedProp: "要基於的屬性的名稱" + alpha: "透明度" + darken: "暗度" + lighten: "亮度" + inputConstantName: "請輸入常數的名稱" + importInfo: "您可以在此貼上主題代碼,將其匯入編輯器中" + deleteConstantConfirm: "確定要删除常數{const}嗎?" + keys: + accent: "重點色彩" + bg: "背景" + fg: "文本" + focus: "聚焦" + indicator: "指標" + panel: "面板" + shadow: "陰影" + header: "標題" + navBg: "側邊欄的背景" + navFg: "側邊欄的文字" + navHoverFg: "側邊欄文字(懸停)" + navActive: "側邊欄文本 (活動)" + navIndicator: "側邊欄指示符" + link: "鏈接" + hashtag: "#tag" + mention: "提到" + mentionMe: "提到了我" + renote: "轉發貼文" + modalBg: "對話框背景" + divider: "分割線" + scrollbarHandle: "捲動條" + scrollbarHandleHover: "捲動條 (漂浮)" + dateLabelFg: "日期標籤文字" + infoBg: "資訊背景" + infoFg: "資訊內容" + infoWarnBg: "警告背景" + infoWarnFg: "警告字元" + cwBg: "CW 按鈕背景" + cwFg: "CW 按鈕文本" + cwHoverBg: "CW 按鈕背景 (漂浮)" + toastBg: "通知背景" + toastFg: "通知文本" + buttonBg: "按鈕背景" + buttonHoverBg: "按鈕背景 (漂浮)" + inputBorder: "輸入框邊框" + listItemHoverBg: "列表物品背景 (漂浮)" + driveFolderBg: "雲端硬碟文件夾背景" + wallpaperOverlay: "壁紙覆蓋層" + badge: "獎章" + messageBg: "私訊背景" + accentDarken: "強調色(偏暗)" + accentLighten: "強調色(明亮)" + fgHighlighted: "高亮顯示文本" +_sfx: + note: "貼文" + noteMy: "我的貼文" + notification: "通知" + chat: "傳送訊息" + chatBg: "聊天背景" + antenna: "天線接收" + channel: "頻道通知" +_ago: + future: "未來" + justNow: "剛剛" + secondsAgo: "{n}秒前" + minutesAgo: "{n}分鐘前" + hoursAgo: "{n}小時前" + daysAgo: "{n}天前" + weeksAgo: "{n}周前" + monthsAgo: "{n}個月前" + yearsAgo: "{n}年前" +_time: + second: "秒" + minute: "分鐘" + hour: "小時" + day: "日" +_tutorial: + title: "如何使用Calckey" + step1_1: "歡迎!" + step1_2: "讓我們把你安排好。你很快就會啟動並運行!" + step2_1: "首先,請完成你的個人資料。" + step2_2: "通過提供一些關於你自己的資料,其他人會更容易了解他們是否想看到你的帖子或關注你。" + step3_1: "現在是時候追隨一些人了!" + step3_2: "你的主頁和社交時間軸是基於你所追蹤的人,所以試著先追蹤幾個賬戶。\n點擊個人資料右上角的加號圈就可以關注它。" + step4_1: "讓我們出去找你。" + step4_2: "對於他們的第一條信息,有些人喜歡做 {introduction} 或一個簡單的 \"hello world!\"" + step5_1: "時間軸,到處都是時間軸!" + step5_2: "您的伺服器已啟用了{timelines}個時間軸。" + step5_3: "主 {icon} 時間軸是顯示你追蹤的帳號的帖子。" + step5_4: "本地 {icon} 時間軸是你可以看到伺服器中所有其他用戶的信息的時間軸。" + step5_5: "社交 {icon} 時間軸是顯示你的主時間軸 + 本地時間軸。" + step5_6: "推薦 {icon} 時間軸是顯示你的伺服器管理員推薦的帖文。" + step5_7: "全球 {icon} 時間軸是顯示來自所有其他連接的伺服器的帖文。" + step6_1: "那麼,這裡是什麼地方?" + step6_2: "你不只是加入Calckey。你已經加入了Fediverse的一個門戶,這是一個由成千上萬台服務器組成的互聯網絡。" + step6_3: "每個服務器也有不同,而並不是所有的服務器都運行Calckey。但這個服務器確實是運行Calckey的! 你可能會覺得有點複雜,但你很快就會明白的。" + step6_4: "現在開始探索吧!" +_2fa: + alreadyRegistered: "你已註冊過一個雙重認證的裝置。" + registerTOTP: "註冊裝置" + registerSecurityKey: "註冊鍵" + step1: "首先,在您的設備上安裝二步驗證程式,例如{a}或{b}。" + step2: "然後,掃描螢幕上的QR code。" + step2Url: "在桌面版應用中,請輸入以下的URL:" + step3: "輸入您的App提供的權杖以完成設定。" + step4: "從現在開始,任何登入操作都將要求您提供權杖。" + securityKeyInfo: "您可以設定使用支援FIDO2的硬體安全鎖、終端設備的指纹認證或者PIN碼來登入。" +_permissions: + "read:account": "查看我的帳戶資訊" + "write:account": "更改我的帳戶資訊" + "read:blocks": "已封鎖用戶名單" + "write:blocks": "編輯已封鎖用戶名單" + "read:drive": "存取雲端硬碟" + "write:drive": "編輯雲端硬碟的檔案" + "read:favorites": "瀏覽我的最愛" + "write:favorites": "編輯我的最愛列表" + "read:following": "查看追隨中的用戶資訊" + "write:following": "追隨/解除追隨" + "read:messaging": "顯示訊息" + "write:messaging": "撰寫或刪除私人訊息" + "read:mutes": "顯示已靜音列表" + "write:mutes": "編輯已靜音列表" + "write:notes": "撰寫或刪除貼文" + "read:notifications": "查看通知" + "write:notifications": "編輯通知" + "read:reactions": "查看情感" + "write:reactions": "編輯情感" + "write:votes": "投票" + "read:pages": "顯示頁面" + "write:pages": "編輯頁面" + "read:page-likes": "顯示已按讚的頁面" + "write:page-likes": "編輯頁面上喜歡" + "read:user-groups": "顯示使用者群組" + "write:user-groups": "編輯使用者群組" + "read:channels": "已查看的頻道" + "write:channels": "編輯頻道" + "read:gallery": "瀏覽圖庫" + "write:gallery": "操作圖庫" + "read:gallery-likes": "讀取喜歡的圖片" + "write:gallery-likes": "操作喜歡的圖片" +_auth: + shareAccess: "要授權「“{name}”」存取您的帳戶嗎?" + shareAccessAsk: "您確定要授權這個應用程式使用您的帳戶嗎?" + permissionAsk: "此應用程式需要以下權限" + pleaseGoBack: "請返回至應用程式" + callback: "回到應用程式" + denied: "拒絕訪問" +_antennaSources: + all: "全部貼文" + homeTimeline: "來自已追隨使用者的貼文" + users: "來自特定使用者的貼文" + userList: "來自特定清單中的貼文" + userGroup: "來自特定群組的貼文" +_weekday: + sunday: "週日" + monday: "週一" + tuesday: "週二" + wednesday: "週三" + thursday: "週四" + friday: "週五" + saturday: "週六" +_widgets: + memo: "備忘錄" + notifications: "通知" + timeline: "時間軸" + calendar: "行事曆" + trends: "發燒貼文" + clock: "時鐘" + rss: "RSS閱讀器" + rssTicker: "RSS跑馬燈" + activity: "動態" + photos: "照片" + digitalClock: "電子時鐘" + unixClock: "UNIX時間" + federation: "聯邦宇宙" + instanceCloud: "伺服器雲端" + postForm: "發佈窗口" + slideshow: "幻燈片" + button: "按鈕" + onlineUsers: "線上的用戶" + jobQueue: "佇列" + serverMetric: "伺服器指標" + aiscript: "AiScript控制台" + aichan: "小藍" +_cw: + hide: "隱藏" + show: "瀏覽更多" + chars: "{count}字元" + files: "{count} 個檔案" +_poll: + noOnlyOneChoice: "至少需要兩個選項" + choiceN: "選擇{n}" + noMore: "沒辦法再添加選項了" + canMultipleVote: "可以多次投票" + expiration: "期限" + infinite: "無期限" + at: "結束時間" + after: "在指定時間後結束..." + deadlineDate: "截止日期" + deadlineTime: "小時" + duration: "時長" + votesCount: "{n}票" + totalVotes: "一共{n}票" + vote: "投票" + showResult: "顯示結果" + voted: "已投票" + closed: "已結束" + remainingDays: "{d}天{h}小時後結束" + remainingHours: "{h}小時{m}分後結束" + remainingMinutes: "{m}分{s}秒後結束" + remainingSeconds: "{s}秒後截止" +_visibility: + public: "公開" + publicDescription: "發布給所有用戶" + home: "不在主頁顯示" + homeDescription: "僅發送至首頁的時間軸" + followers: "追隨者" + followersDescription: "僅發送至關注者" + specified: "指定使用者" + specifiedDescription: "僅發送至指定使用者" + localOnly: "僅限本地" + localOnlyDescription: "對遠端使用者隱藏" +_postForm: + replyPlaceholder: "回覆此貼文..." + quotePlaceholder: "引用此貼文..." + channelPlaceholder: "發佈到頻道..." + _placeholders: + a: "今天過得如何?" + b: "有什麼新鮮事嗎?" + c: "有什麼新鮮想法嗎?" + d: "想要發布些什麼嗎?" + e: "寫些什麼吧..." + f: "期待你發佈的內容..." +_profile: + name: "名稱" + username: "使用者名稱" + description: "關於我" + youCanIncludeHashtags: "你也可以在「關於我」中加上 #tag。" + metadata: "進階資訊" + metadataEdit: "編輯進階資訊" + metadataDescription: "可以在個人資料中以表格形式顯示其他資訊。" + metadataLabel: "標籤" + metadataContent: "内容" + changeAvatar: "更換大頭貼" + changeBanner: "變更橫幅圖像" + locationDescription: 如果你先輸入你所在的城市,則會向其他用戶顯示你的當地時間。 +_exportOrImport: + allNotes: "所有貼文" + followingList: "追隨中" + muteList: "靜音" + blockingList: "封鎖" + userLists: "清單" + excludeMutingUsers: "排除被靜音的用戶" + excludeInactiveUsers: "排除不活躍帳戶" +_charts: + federation: "站台聯邦" + apRequest: "請求" + usersIncDec: "使用者増減" + usersTotal: "使用者合共" + activeUsers: "活躍使用者" + notesIncDec: "貼文増減" + localNotesIncDec: "本地貼文増減" + remoteNotesIncDec: "遠端貼文數目增减" + notesTotal: "貼文合共" + filesIncDec: "檔案増減" + filesTotal: "累計檔案" + storageUsageIncDec: "儲存空間的増減" + storageUsageTotal: "已使用的儲存空間合共" +_instanceCharts: + requests: "請求" + users: "使用者増減" + usersTotal: "總計使用者" + notes: "貼文増減" + notesTotal: "累計貼文" + ff: "追隨/追隨者的増減 " + ffTotal: "追隨/追隨者累計" + cacheSize: "增加或減少快取用量" + cacheSizeTotal: "快取大小總計" + files: "檔案數量的増減" + filesTotal: "檔案數量總計" +_timelines: + home: "首頁" + local: "本地" + social: "社群" + global: "公開" + recommended: 推薦 +_pages: + newPage: "建立頁面" + editPage: "編輯頁面" + readPage: "正檢視原始碼" + created: "頁面已建立" + updated: "頁面已更新" + deleted: "頁面已被刪除" + pageSetting: "頁面設定" + nameAlreadyExists: "指定的頁面URL已經存在" + invalidNameTitle: "指定的頁面URL無效" + invalidNameText: "請確定是否為非空白" + editThisPage: "編輯此頁面" + viewSource: "檢視原始碼" + viewPage: "顯示頁面" + like: "喜歡" + unlike: "收回喜歡" + my: "我的頁面" + liked: "已喜歡的頁面" + featured: "人氣" + inspector: "面板檢查" + contents: "內容" + content: "頁面方塊" + variables: "變數" + title: "標題" + url: "頁面網址" + summary: "頁面摘要" + alignCenter: "置中" + hideTitleWhenPinned: "被置頂於個人資料時隱藏頁面標題" + font: "字型" + fontSerif: "襯線體" + fontSansSerif: "無襯線體" + eyeCatchingImageSet: "設定封面影像" + eyeCatchingImageRemove: "刪除封面影像" + chooseBlock: "新增方塊" + selectType: "選擇類型" + enterVariableName: "請輸入變數名稱" + variableNameIsAlreadyUsed: "變數名稱已被佔用" + contentBlocks: "內容" + inputBlocks: "輸入" + specialBlocks: "特殊" + blocks: + text: "字串" + textarea: "字串區域" + section: "區段" + image: "圖片" + button: "按鈕" + if: "如果" + _if: + variable: "變數" + post: "發佈窗口" + _post: + text: "内容" + attachCanvasImage: "附加相簿圖像" + canvasId: "畫布ID" + textInput: "插入字串" + _textInput: + name: "變數名稱" + text: "標題" + default: "預設值" + textareaInput: "多行文字输入" + _textareaInput: + name: "變數名稱" + text: "標題" + default: "預設值" + numberInput: "輸入數值" + _numberInput: + name: "變數名稱" + text: "標題" + default: "預設值" + canvas: "畫布" + _canvas: + id: "畫布ID" + width: "寬度" + height: "高度" + note: "嵌式貼文" + _note: + id: "貼文ID" + idDescription: "您也可以粘貼筆記 URL 並進行設置。" + detailed: "顯示詳細內容" + switch: "開關" + _switch: + name: "變數名稱" + text: "標題" + default: "預設值" + counter: "計數器" + _counter: + name: "變數名稱" + text: "標題" + inc: "増加値" + _button: + text: "標題" + colored: "彩色" + action: "按下按鈕後發生的行為" + _action: + dialog: "顯示對話框" + _dialog: + content: "内容" + resetRandom: "重設亂數" + pushEvent: "發送事件" + _pushEvent: + event: "事件名稱" + message: "按下時顯示的消息" + variable: "要發送的變數" + no-variable: "沒有" + callAiScript: "調用AiScript" + _callAiScript: + functionName: "函數名稱" + radioButton: "選項" + _radioButton: + name: "變數名稱" + title: "標題" + values: "由換行符分隔的選項" + default: "預設值" + script: + categories: + flow: "控制" + logical: "邏輯運算" + operation: "計算" + comparison: "對比" + random: "隨機" + value: "數值" + fn: "函数" + text: "文本操作" + convert: "轉換" + list: "清單" + blocks: + text: "字串" + multiLineText: "字串(多行)" + textList: "字串串列" + _textList: + info: "請分開每個換行符" + strLen: "字串長度" + _strLen: + arg1: "字串" + strPick: "提取字元" + _strPick: + arg1: "字串" + arg2: "字元位置" + strReplace: "替換字串" + _strReplace: + arg1: "字串" + arg2: "替換前" + arg3: "替換後" + strReverse: "倒轉字串" + _strReverse: + arg1: "字串" + join: "合併字串" + _join: + arg1: "清單" + arg2: "分隔字元" + add: "加" + _add: + arg1: "A" + arg2: "B" + subtract: "减去" + _subtract: + arg1: "A" + arg2: "B" + multiply: "乘" + _multiply: + arg1: "A" + arg2: "B" + divide: "除" + _divide: + arg1: "A" + arg2: "B" + mod: "餘數" + _mod: + arg1: "A" + arg2: "B" + round: "四舍五入" + _round: + arg1: "數值" + eq: "A和B相等" + _eq: + arg1: "A" + arg2: "B" + notEq: "A和B不等" + _notEq: + arg1: "A" + arg2: "B" + and: "A和B" + _and: + arg1: "A" + arg2: "B" + or: "A或B" + _or: + arg1: "A" + arg2: "B" + lt: "< A小於B" + _lt: + arg1: "A" + arg2: "B" + gt: "> A大於B" + _gt: + arg1: "A" + arg2: "B" + ltEq: "<= A小於或等於B" + _ltEq: + arg1: "A" + arg2: "B" + gtEq: ">= A大於或等於B" + _gtEq: + arg1: "A" + arg2: "B" + if: "分支" + _if: + arg1: "如果" + arg2: "如果" + arg3: "除此以外" + not: "否" + _not: + arg1: "否" + random: "隨機" + _random: + arg1: "機率" + rannum: "亂數" + _rannum: + arg1: "下限" + arg2: "上限" + randomPick: "從列表中隨機選擇" + _randomPick: + arg1: "清單" + dailyRandom: "隨機(使用者每日變化 )" + _dailyRandom: + arg1: "機率" + dailyRannum: "亂數(使用者每日變化)" + _dailyRannum: + arg1: "下限" + arg2: "上限" + dailyRandomPick: "從列表中隨機選擇(使用者每日變化 )" + _dailyRandomPick: + arg1: "清單" + seedRandom: "隨機抽選種子碼" + _seedRandom: + arg1: "種子" + arg2: "機率" + seedRannum: "亂數 (種子)" + _seedRannum: + arg1: "種子" + arg2: "最小值" + arg3: "最大值" + seedRandomPick: "從列表中隨機選擇 (種子)" + _seedRandomPick: + arg1: "種子" + arg2: "清單" + DRPWPM: "从機率列表中隨機選擇(每個用户每天)" + _DRPWPM: + arg1: "字串串列" + pick: "從清單中選取" + _pick: + arg1: "清單" + arg2: "位置" + listLen: "取得清單長度" + _listLen: + arg1: "清單" + number: "數值" + stringToNumber: "將字串轉換至數値" + _stringToNumber: + arg1: "字串" + numberToString: "將數値轉換至字串" + _numberToString: + arg1: "數值" + splitStrByLine: "於換行時分割字串" + _splitStrByLine: + arg1: "字串" + ref: "變數" + aiScriptVar: "AiScript的變數" + fn: "函数" + _fn: + slots: "欄位" + slots-info: "用換行符分隔每個欄位" + arg1: "輸出" + for: "重複" + _for: + arg1: "重複次數" + arg2: "處理" + typeError: "槽參數{slot}需要傳入“{expect}”,但是實際傳入為“{actual}”!" + thereIsEmptySlot: "參數{slot}是空的!" + types: + string: "字串" + number: "数值" + boolean: "標記" + array: "清單" + stringArray: "字串列表" + emptySlot: "空欄位" + enviromentVariables: "環境變數" + pageVariables: "頁面元素" + argVariables: "輸入欄位" +_relayStatus: + requesting: "等待核准" + accepted: "已通過核准" + rejected: "已拒絕" +_notification: + fileUploaded: "上傳檔案成功" + youGotMention: "{name}提及到您" + youGotReply: "{name}回覆了您" + youGotQuote: "{name}引用了您" + youRenoted: "{name} 轉發了你的貼文" + youGotPoll: "{name}已投票" + youGotMessagingMessageFromUser: "{name}發送給您的訊息" + youGotMessagingMessageFromGroup: "{name}發送給您的訊息" + youWereFollowed: "您有新的追隨者" + youReceivedFollowRequest: "您有新的追隨請求" + yourFollowRequestAccepted: "您的追隨請求已通過" + youWereInvitedToGroup: "您有新的群組邀請" + pollEnded: "問卷調查已產生結果" + emptyPushNotificationMessage: "推送通知已更新" + _types: + all: "全部" + follow: "追隨中" + mention: "提及" + reply: "回覆" + renote: "轉發貼文" + quote: "引用" + reaction: "反應" + pollVote: "統計已投票數" + pollEnded: "問卷調查結束" + receiveFollowRequest: "已收到追隨請求" + followRequestAccepted: "追隨請求已接受" + groupInvited: "加入社群邀請" + app: "應用程式通知" + _actions: + followBack: "回關" + reply: "回覆" + renote: "轉發" +_deck: + alwaysShowMainColumn: "總是顯示主欄" + columnAlign: "對齊欄位" + addColumn: "新增欄位" + configureColumn: "欄位的設定" + swapLeft: "向左移動" + swapRight: "向右移動" + swapUp: "往上移動" + swapDown: "往下移動" + stackLeft: "向左折疊" + popRight: "向右彈出" + profile: "工作區" + newProfile: "新增工作區" + renameProfile: "重新命名工作區" + deleteProfile: "刪除工作區" + nameAlreadyExists: "該工作區名稱已經存在。" + introduction: "組合欄位來製作屬於自己的介面吧!" + introduction2: "您可以隨時透過按畫面右方的 + 來添加欄位。" + widgetsIntroduction: "請從欄位的選單中,選擇「編輯小工具」來添加小工具。" + _columns: + main: "主列" + widgets: "小工具" + notifications: "通知" + tl: "時間軸" + antenna: "天線" + list: "清單" + mentions: "提及" + direct: "指定使用者" +secureMode: 安全模式(授權獲取) +instanceSecurity: 伺服器安全性 +privateMode: 私人模式 +allowedInstances: 列入白名單的伺服器 +secureModeInfo: 當從其他伺服器請求時,不要在沒有證據的情況下發回。 +_messaging: + dms: 私訊 + groups: 群組 +manageGroups: 管理群組 +replayTutorial: 重新播放教程 +moveFromLabel: '您想遷移的舊帳戶:' +customMOTDDescription: 每次用戶加載/重新加載頁面時,由換行符號分隔的 MOTD(啟動畫面)的自定信息將隨機顯示。 +privateModeInfo: 啟用後,只有列入白名單的伺服器才能與你的伺服器聯合。所有貼文都將對公眾隱藏。 +adminCustomCssWarn: 除非你知道它的作用,否則請不要使用此設定。 輸入不正確的值可能會導致每個人的客戶端無法正常運行。你可在你的的用戶設定中測試,確保你的 + CSS 正常工作。 +showUpdates: Calckey 更新時顯示彈出視窗 +recommendedInstances: 建議的伺服器 +caption: 自動字幕 +enterSendsMessage: 在 Messaging 中按 Return 發送消息 (如關閉則是 Ctrl + Return) +migrationConfirm: "您確定要將你的帳戶遷移到 {account} 嗎? 一旦這樣做,你將無法復原,而你將無法再次正常使用您的帳戶。\n另外,請確保你已將此當前帳戶設置為您要遷移的帳戶。" +customSplashIconsDescription: 每次用戶加載/重新加載頁面時,以換行符號分隔的自定啟動畫面圖標的網址將隨機顯示。請確保圖片位於靜態網址上,最好所有圖片解析度調整為 + 192x192。 +accountMoved: '該使用者已移至新帳戶:' +showAds: 顯示廣告 +noThankYou: 不用了,謝謝 +selectInstance: 選擇伺服器 +enableRecommendedTimeline: 啟用推薦時間軸 +antennaInstancesDescription: 分行列出一個伺服器 +moveTo: 遷移此帳戶到新帳戶 +moveToLabel: '請輸入你將會遷移到的帳戶:' +moveAccount: 遷移帳戶! +moveAccountDescription: '這個過程是不可逆的。 在遷移前,請確保您已在新帳戶上為此帳戶設置了別名(Alias)。 請輸入帳戶標籤 (格式: + @person@server.com)' +moveFrom: 由舊帳戶移至此帳戶 +moveFromDescription: '這將為你的舊帳戶設置一個別名(Alias),以便你可以從該帳戶轉移到當前帳戶。 在你的舊帳戶移動之前請執行此操作。 請輸入帳戶標籤 + (格式: @person@server.com)' +enableEmojiReactions: 啟用表情符號反應 +breakFollowConfirm: 您確定要移除該關注者嗎? +socialTimeline: 社交時間軸 +cannotUploadBecauseExceedsFileSizeLimit: 因檔案太大而無法上傳。 +customMOTD: 自定義MOTD (網頁載入時顯示的信息) +customSplashIcons: 啟動畫面圖標 (網址) +splash: 啟動畫面 +updateAvailable: 可能有可用的更新! +showAdminUpdates: 表明新的 Calckey 版本可用(只限管理員) +migration: 遷移 +homeTimeline: 主頁時間軸 +swipeOnDesktop: 允許在桌面上進行手機式滑動 +logoImageUrl: 圖標網址 +addInstance: 增加一個伺服器 +noInstances: 沒有伺服器 +flagSpeakAsCat: 像貓一樣地說話 +silenceThisInstance: 靜音此伺服器 +silencedInstances: 已靜音的伺服器 +silenced: 已靜音 +_experiments: + enablePostEditing: 啟用帖子編輯 + title: 試驗功能 +findOtherInstance: 找找另一個伺服器 +noGraze: 瀏覽器擴展 "Graze for Mastodon" 會與Calckey發生衝突,請停用該擴展。 +userSaysSomethingReasonRenote: '{name} 轉傳了包含 {reason} 的帖子' +pushNotificationNotSupported: 你的瀏覽器或伺服器不支援推送通知 +accessibility: 輔助功能 +userSaysSomethingReasonReply: '{name} 回復了包含 {reason} 的帖子' +hiddenTags: 隱藏主題標籤 +indexPosts: 索引帖子 +indexNotice: 現在開始索引。 這可能需要一段時間,請不要在一個小時內重啟你的伺服器。 +deleted: 已刪除 +editNote: 編輯筆記 +edited: '於 {date} {time} 編輯' +userSaysSomethingReason: '{name} 說了 {reason}' +allowedInstancesDescription: 要加入聯邦白名單的服務器,每台伺服器用新行分隔(僅適用於私有模式)。 +defaultReaction: 默認的表情符號反應 +license: 授權 +apps: 應用 +pushNotification: 推送通知 +subscribePushNotification: 啟用推送通知 +unsubscribePushNotification: 禁用推送通知 +pushNotificationAlreadySubscribed: 推送通知已經啟用 +recommendedInstancesDescription: 以每行分隔的推薦服務器出現在推薦的時間軸中。 不要添加 `https://`,只添加域名。 +searchPlaceholder: 搜尋 Calckey +cw: 內容警告 +selectChannel: 選擇一個頻道 +newer: 較新 +older: 較舊 +jumpToPrevious: 跳到上一個 diff --git a/fe_calckey/frontend/package.json b/fe_calckey/frontend/package.json new file mode 100644 index 0000000..986672f --- /dev/null +++ b/fe_calckey/frontend/package.json @@ -0,0 +1,50 @@ +{ + "name": "calckey", + "version": "14.0.0-alpha+magnetar-0.2.0", + "codename": "aqua", + "repository": { + "type": "git", + "url": "https://codeberg.org/calckey/calckey.git" + }, + "packageManager": "pnpm@8.6.3", + "private": true, + "scripts": { + "rebuild": "pnpm run clean && pnpm -r run build && pnpm run gulp", + "build": "pnpm -r run build && pnpm run gulp", + "gulp": "gulp build", + "dev:staging": "NODE_OPTIONS=--max_old_space_size=3072 NODE_ENV=development pnpm run build && pnpm run start", + "lint": "pnpm -r run lint", + "format": "pnpm -r run format", + "clean": "pnpm node ./scripts/clean.js", + "clean-all": "pnpm node ./scripts/clean-all.js", + "cleanall": "pnpm run clean-all" + }, + "resolutions": { + "chokidar": "^3.3.1" + }, + "dependencies": { + "@bull-board/api": "5.2.0", + "@bull-board/ui": "5.2.0", + "@napi-rs/cli": "^2.16.1", + "js-yaml": "4.1.0", + "seedrandom": "^3.0.5" + }, + "devDependencies": { + "@discordapp/twemoji": "14.1.2", + "@types/gulp": "4.0.10", + "@types/gulp-rename": "2.0.1", + "chalk": "4.1.2", + "cross-env": "7.0.3", + "cypress": "10.11.0", + "execa": "5.1.1", + "gulp": "4.0.2", + "gulp-cssnano": "2.1.3", + "gulp-rename": "2.0.0", + "gulp-replace": "1.1.4", + "gulp-terser": "2.1.0", + "install-peers": "^1.0.4", + "rome": "^12.1.3", + "start-server-and-test": "1.15.2", + "typescript": "4.9.4" + } +} diff --git a/fe_calckey/frontend/pnpm-lock.yaml b/fe_calckey/frontend/pnpm-lock.yaml new file mode 100644 index 0000000..abafe43 --- /dev/null +++ b/fe_calckey/frontend/pnpm-lock.yaml @@ -0,0 +1,9691 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +overrides: + chokidar: ^3.3.1 + +importers: + + .: + dependencies: + '@bull-board/api': + specifier: 5.2.0 + version: 5.2.0(@bull-board/ui@5.2.0) + '@bull-board/ui': + specifier: 5.2.0 + version: 5.2.0 + '@napi-rs/cli': + specifier: ^2.16.1 + version: 2.16.1 + js-yaml: + specifier: 4.1.0 + version: 4.1.0 + seedrandom: + specifier: ^3.0.5 + version: 3.0.5 + devDependencies: + '@discordapp/twemoji': + specifier: 14.1.2 + version: 14.1.2 + '@types/gulp': + specifier: 4.0.10 + version: 4.0.10 + '@types/gulp-rename': + specifier: 2.0.1 + version: 2.0.1 + chalk: + specifier: 4.1.2 + version: 4.1.2 + cross-env: + specifier: 7.0.3 + version: 7.0.3 + cypress: + specifier: 10.11.0 + version: 10.11.0 + execa: + specifier: 5.1.1 + version: 5.1.1 + gulp: + specifier: 4.0.2 + version: 4.0.2 + gulp-cssnano: + specifier: 2.1.3 + version: 2.1.3 + gulp-rename: + specifier: 2.0.0 + version: 2.0.0 + gulp-replace: + specifier: 1.1.4 + version: 1.1.4 + gulp-terser: + specifier: 2.1.0 + version: 2.1.0 + install-peers: + specifier: ^1.0.4 + version: 1.0.4 + rome: + specifier: ^12.1.3 + version: 12.1.3 + start-server-and-test: + specifier: 1.15.2 + version: 1.15.2 + typescript: + specifier: 4.9.4 + version: 4.9.4 + + calckey-js: + dependencies: + eventemitter3: + specifier: ^4.0.7 + version: 4.0.7 + reconnecting-websocket: + specifier: ^4.4.0 + version: 4.4.0 + semver: + specifier: ^7.3.8 + version: 7.3.8 + optionalDependencies: + '@swc/core-android-arm64': + specifier: 1.3.11 + version: 1.3.11 + devDependencies: + '@microsoft/api-documenter': + specifier: ^7.22.21 + version: 7.22.21(@types/node@20.3.1) + '@microsoft/api-extractor': + specifier: ^7.36.0 + version: 7.36.0(@types/node@20.3.1) + '@swc/cli': + specifier: ^0.1.62 + version: 0.1.62(@swc/core@1.3.62) + '@swc/core': + specifier: ^1.3.62 + version: 1.3.62 + '@types/jest': + specifier: ^27.4.0 + version: 27.4.0 + '@types/node': + specifier: 20.3.1 + version: 20.3.1 + jest: + specifier: ^27.4.5 + version: 27.4.5(ts-node@10.4.0) + jest-fetch-mock: + specifier: ^3.0.3 + version: 3.0.3 + jest-websocket-mock: + specifier: ^2.2.1 + version: 2.2.1(mock-socket@9.0.8) + mock-socket: + specifier: ^9.0.8 + version: 9.0.8 + ts-jest: + specifier: ^27.1.2 + version: 27.1.2(@babel/core@7.22.8)(@types/jest@27.4.0)(jest@27.4.5)(typescript@5.1.3) + ts-node: + specifier: 10.4.0 + version: 10.4.0(@swc/core@1.3.62)(@types/node@20.3.1)(typescript@5.1.3) + tsd: + specifier: ^0.28.1 + version: 0.28.1 + typescript: + specifier: 5.1.3 + version: 5.1.3 + + client: + devDependencies: + '@discordapp/twemoji': + specifier: 14.1.2 + version: 14.1.2 + '@phosphor-icons/web': + specifier: ^2.0.3 + version: 2.0.3 + '@rollup/plugin-alias': + specifier: 3.1.9 + version: 3.1.9(rollup@3.23.1) + '@rollup/plugin-json': + specifier: 4.1.0 + version: 4.1.0(rollup@3.23.1) + '@rollup/pluginutils': + specifier: ^4.2.1 + version: 4.2.1 + '@syuilo/aiscript': + specifier: 0.11.1 + version: 0.11.1 + '@types/escape-regexp': + specifier: 0.0.1 + version: 0.0.1 + '@types/glob': + specifier: 8.1.0 + version: 8.1.0 + '@types/gulp': + specifier: 4.0.11 + version: 4.0.11 + '@types/gulp-rename': + specifier: 2.0.2 + version: 2.0.2 + '@types/katex': + specifier: 0.16.0 + version: 0.16.0 + '@types/matter-js': + specifier: 0.18.2 + version: 0.18.2 + '@types/punycode': + specifier: 2.1.0 + version: 2.1.0 + '@types/seedrandom': + specifier: 3.0.5 + version: 3.0.5 + '@types/throttle-debounce': + specifier: 5.0.0 + version: 5.0.0 + '@types/tinycolor2': + specifier: 1.4.3 + version: 1.4.3 + '@types/uuid': + specifier: 8.3.4 + version: 8.3.4 + '@vitejs/plugin-vue': + specifier: 4.2.3 + version: 4.2.3(vite@4.3.9)(vue@3.3.4) + '@vue/compiler-sfc': + specifier: 3.3.4 + version: 3.3.4 + autobind-decorator: + specifier: 2.4.0 + version: 2.4.0 + autosize: + specifier: 5.0.2 + version: 5.0.2 + blurhash: + specifier: 1.1.5 + version: 1.1.5 + broadcast-channel: + specifier: 4.19.1 + version: 4.19.1 + browser-image-resizer: + specifier: github:misskey-dev/browser-image-resizer + version: github.com/misskey-dev/browser-image-resizer/56f504427ad7f6500e141a6d9f3aee42023d7f3e + calckey-js: + specifier: workspace:* + version: link:../calckey-js + chart.js: + specifier: 4.3.0 + version: 4.3.0 + chartjs-adapter-date-fns: + specifier: 3.0.0 + version: 3.0.0(chart.js@4.3.0)(date-fns@2.30.0) + chartjs-chart-matrix: + specifier: ^2.0.1 + version: 2.0.1(chart.js@4.3.0) + chartjs-plugin-gradient: + specifier: 0.6.1 + version: 0.6.1(chart.js@4.3.0) + chartjs-plugin-zoom: + specifier: 2.0.1 + version: 2.0.1(chart.js@4.3.0) + city-timezones: + specifier: ^1.2.1 + version: 1.2.1 + compare-versions: + specifier: 5.0.3 + version: 5.0.3 + cropperjs: + specifier: 2.0.0-beta.2 + version: 2.0.0-beta.2 + cross-env: + specifier: 7.0.3 + version: 7.0.3 + cypress: + specifier: 10.11.0 + version: 10.11.0 + date-fns: + specifier: 2.30.0 + version: 2.30.0 + emojilib: + specifier: github:thatonecalculator/emojilib + version: github.com/thatonecalculator/emojilib/15fd9504f943763a057ff803ee2009ec0524c96b + escape-regexp: + specifier: 0.0.1 + version: 0.0.1 + eventemitter3: + specifier: 4.0.7 + version: 4.0.7 + focus-trap: + specifier: ^7.4.3 + version: 7.4.3 + focus-trap-vue: + specifier: ^4.0.2 + version: 4.0.2(focus-trap@7.4.3)(vue@3.3.4) + gsap: + specifier: ^3.11.5 + version: 3.11.5 + idb-keyval: + specifier: 6.2.1 + version: 6.2.1 + insert-text-at-cursor: + specifier: 0.3.0 + version: 0.3.0 + json5: + specifier: 2.2.3 + version: 2.2.3 + katex: + specifier: 0.16.7 + version: 0.16.7 + matter-js: + specifier: 0.18.0 + version: 0.18.0 + mfm-js: + specifier: 0.23.3 + version: 0.23.3 + photoswipe: + specifier: 5.3.7 + version: 5.3.7 + prettier: + specifier: 2.8.8 + version: 2.8.8 + prettier-plugin-vue: + specifier: 1.1.6 + version: 1.1.6 + prismjs: + specifier: 1.29.0 + version: 1.29.0 + punycode: + specifier: 2.1.1 + version: 2.1.1 + querystring: + specifier: 0.2.1 + version: 0.2.1 + rndstr: + specifier: 1.0.0 + version: 1.0.0 + rollup: + specifier: 3.23.1 + version: 3.23.1 + s-age: + specifier: 1.1.2 + version: 1.1.2 + sass: + specifier: 1.62.1 + version: 1.62.1 + seedrandom: + specifier: 3.0.5 + version: 3.0.5 + start-server-and-test: + specifier: 1.15.2 + version: 1.15.2 + strict-event-emitter-types: + specifier: 2.0.0 + version: 2.0.0 + stringz: + specifier: 2.1.0 + version: 2.1.0 + swiper: + specifier: 9.3.2 + version: 9.3.2 + syuilo-password-strength: + specifier: 0.0.1 + version: 0.0.1 + textarea-caret: + specifier: 3.1.0 + version: 3.1.0 + three: + specifier: 0.146.0 + version: 0.146.0 + throttle-debounce: + specifier: 5.0.0 + version: 5.0.0 + tinycolor2: + specifier: 1.5.2 + version: 1.5.2 + tsc-alias: + specifier: 1.8.6 + version: 1.8.6 + tsconfig-paths: + specifier: 4.2.0 + version: 4.2.0 + twemoji-parser: + specifier: 14.0.0 + version: 14.0.0 + typescript: + specifier: 5.1.3 + version: 5.1.3 + unicode-emoji-json: + specifier: ^0.4.0 + version: 0.4.0 + uuid: + specifier: 9.0.0 + version: 9.0.0 + vanilla-tilt: + specifier: 1.8.0 + version: 1.8.0 + vite: + specifier: 4.3.9 + version: 4.3.9(sass@1.62.1) + vite-plugin-compression: + specifier: ^0.5.1 + version: 0.5.1(vite@4.3.9) + vue: + specifier: 3.3.4 + version: 3.3.4 + vue-isyourpasswordsafe: + specifier: ^2.0.0 + version: 2.0.0 + vue-plyr: + specifier: ^7.0.0 + version: 7.0.0 + vue-prism-editor: + specifier: 2.0.0-alpha.2 + version: 2.0.0-alpha.2(vue@3.3.4) + vue3-otp-input: + specifier: ^0.4.1 + version: 0.4.1(vue@3.3.4) + vuedraggable: + specifier: 4.1.0 + version: 4.1.0(vue@3.3.4) + + sw: + devDependencies: + '@swc/cli': + specifier: ^0.1.62 + version: 0.1.62(@swc/core@1.3.62) + '@swc/core': + specifier: ^1.3.62 + version: 1.3.62 + '@swc/core-android-arm64': + specifier: 1.3.11 + version: 1.3.11 + calckey-js: + specifier: workspace:* + version: link:../calckey-js + idb-keyval: + specifier: ^6.2.1 + version: 6.2.1 + swc-loader: + specifier: ^0.2.3 + version: 0.2.3(@swc/core@1.3.62)(webpack@5.85.1) + webpack: + specifier: ^5.85.1 + version: 5.85.1(@swc/core@1.3.62)(webpack-cli@5.1.3) + webpack-cli: + specifier: ^5.1.3 + version: 5.1.3(webpack@5.85.1) + +packages: + + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + dev: true + + /@babel/code-frame@7.22.5: + resolution: {integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.22.5 + dev: true + + /@babel/compat-data@7.22.6: + resolution: {integrity: sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core@7.22.8: + resolution: {integrity: sha512-75+KxFB4CZqYRXjx4NlR4J7yGvKumBuZTmV4NV6v09dVXXkuYVYLT68N6HCzLvfJ+fWCxQsntNzKwwIXL4bHnw==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.22.5 + '@babel/generator': 7.22.7 + '@babel/helper-compilation-targets': 7.22.6(@babel/core@7.22.8) + '@babel/helper-module-transforms': 7.22.5 + '@babel/helpers': 7.22.6 + '@babel/parser': 7.22.7 + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.8 + '@babel/types': 7.22.5 + '@nicolo-ribaudo/semver-v6': 6.3.3 + convert-source-map: 1.9.0 + debug: 4.3.4(supports-color@8.1.1) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator@7.22.7: + resolution: {integrity: sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.5 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + jsesc: 2.5.2 + dev: true + + /@babel/helper-compilation-targets@7.22.6(@babel/core@7.22.8): + resolution: {integrity: sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.22.6 + '@babel/core': 7.22.8 + '@babel/helper-validator-option': 7.22.5 + '@nicolo-ribaudo/semver-v6': 6.3.3 + browserslist: 4.21.9 + lru-cache: 5.1.1 + dev: true + + /@babel/helper-environment-visitor@7.22.5: + resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-function-name@7.22.5: + resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.5 + '@babel/types': 7.22.5 + dev: true + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.5 + dev: true + + /@babel/helper-module-imports@7.22.5: + resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.5 + dev: true + + /@babel/helper-module-transforms@7.22.5: + resolution: {integrity: sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-module-imports': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.5 + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.8 + '@babel/types': 7.22.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.5 + dev: true + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.5 + dev: true + + /@babel/helper-string-parser@7.22.5: + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier@7.22.5: + resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-option@7.22.5: + resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helpers@7.22.6: + resolution: {integrity: sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.5 + '@babel/traverse': 7.22.8 + '@babel/types': 7.22.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/highlight@7.22.5: + resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + + /@babel/parser@7.22.7: + resolution: {integrity: sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.22.5 + dev: true + + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.8): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.22.8): + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.8): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.8): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.8): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.8): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.8): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.8): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.8): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.8): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.8): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.8): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.22.8): + resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.8 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/runtime@7.20.7: + resolution: {integrity: sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.13.11 + dev: true + + /@babel/runtime@7.22.6: + resolution: {integrity: sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.13.11 + dev: true + + /@babel/template@7.22.5: + resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.5 + '@babel/parser': 7.22.7 + '@babel/types': 7.22.5 + dev: true + + /@babel/traverse@7.22.8: + resolution: {integrity: sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.5 + '@babel/generator': 7.22.7 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.22.7 + '@babel/types': 7.22.5 + debug: 4.3.4(supports-color@8.1.1) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types@7.22.5: + resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.5 + to-fast-properties: 2.0.0 + dev: true + + /@bcoe/v8-coverage@0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + dev: true + + /@bull-board/api@5.2.0(@bull-board/ui@5.2.0): + resolution: {integrity: sha512-1HGF2EF/4zI3+Cj414nQzwFprLXOJTlVdqXUf5UEBS4HtYafWv93mGIwkrD8S4Bpz4VSvM87adF6tQPJ7Ewt+w==} + peerDependencies: + '@bull-board/ui': 5.2.0 + dependencies: + '@bull-board/ui': 5.2.0 + redis-info: 3.1.0 + dev: false + + /@bull-board/ui@5.2.0: + resolution: {integrity: sha512-f2sgs7AjOVch7tFhbmlVCkhZjJWboxwNxWEfAsIUd1WidUC+Ef5J02tpQvu7apzRtu5zcn8IiJtI5HFO6oKaCA==} + dependencies: + '@bull-board/api': 5.2.0(@bull-board/ui@5.2.0) + dev: false + + /@colors/colors@1.5.0: + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + requiresBuild: true + dev: true + optional: true + + /@cropper/element-canvas@2.0.0-beta.3: + resolution: {integrity: sha512-G4KqpZHAqb2PNY63lt7MxSIXQhYrQUWImDmsQYrXSTVYC5yrMLlk5bT9oEaSTjQZnV4x5EaujFM+gx6lWh/5sg==} + dependencies: + '@cropper/element': 2.0.0-beta.3 + '@cropper/utils': 2.0.0-beta.3 + dev: true + + /@cropper/element-crosshair@2.0.0-beta.3: + resolution: {integrity: sha512-SfrzZjO+x7ND/CgAclfwDQ9T/nTlZTKsLtM+dDXfjJQjuqreMaWaLD23isB1kh8H7iqjz1g+VE2ZsdiLB932ww==} + dependencies: + '@cropper/element': 2.0.0-beta.3 + '@cropper/utils': 2.0.0-beta.3 + dev: true + + /@cropper/element-grid@2.0.0-beta.3: + resolution: {integrity: sha512-/U1/sNcJ9TKcUD7N+yHJqxRfZcW15XHz63LYMLaWQ7Cnnq2uYopopJUqtTiAdIoCh6mwoIWdYvLZ1Vhr6XKJBg==} + dependencies: + '@cropper/element': 2.0.0-beta.3 + '@cropper/utils': 2.0.0-beta.3 + dev: true + + /@cropper/element-handle@2.0.0-beta.3: + resolution: {integrity: sha512-bjxZfX0rqj4RsTBGxJ1WcxDya1/25dKe9j4+YRZFyASQUOPuUrqVOpWKQcGaQ0PeN+wfwLo3422vjaGSXNA+Pg==} + dependencies: + '@cropper/element': 2.0.0-beta.3 + '@cropper/utils': 2.0.0-beta.3 + dev: true + + /@cropper/element-image@2.0.0-beta.3: + resolution: {integrity: sha512-1VjqaJG+IxPDkvEUvnKAfR12zK8fx+C6+ZsC5T4986KLtpltmqccaYiupgGXX8CVHrVyaW5ncBvOXSTGowiC7Q==} + dependencies: + '@cropper/element': 2.0.0-beta.3 + '@cropper/element-canvas': 2.0.0-beta.3 + '@cropper/utils': 2.0.0-beta.3 + dev: true + + /@cropper/element-selection@2.0.0-beta.3: + resolution: {integrity: sha512-FjcNwUaV5/KzQROoaoNZzOpeRe92PCd8PPTgfl4/b2rGgpYvGcjwpjei5HRsF+uaDJwR2f1MOK8L+3ZkAUw18Q==} + dependencies: + '@cropper/element': 2.0.0-beta.3 + '@cropper/element-canvas': 2.0.0-beta.3 + '@cropper/element-image': 2.0.0-beta.3 + '@cropper/utils': 2.0.0-beta.3 + dev: true + + /@cropper/element-shade@2.0.0-beta.3: + resolution: {integrity: sha512-WCmGYbmewIF49GUeJyXCXZUBwmLsu7B+G22o5FObhtxoY8pF7mp1SclIZdJU5KfvGFFOzXKHJg4yx1wO9IAfvQ==} + dependencies: + '@cropper/element': 2.0.0-beta.3 + '@cropper/element-canvas': 2.0.0-beta.3 + '@cropper/element-selection': 2.0.0-beta.3 + '@cropper/utils': 2.0.0-beta.3 + dev: true + + /@cropper/element-viewer@2.0.0-beta.3: + resolution: {integrity: sha512-A2yh8ULbxuykJHVvcG3eI81VX2ug/IklDuOAzCP4yRMGSvGb9eK0BQDkOButoViwM2FtleCf2blXPuXjzD1OMA==} + dependencies: + '@cropper/element': 2.0.0-beta.3 + '@cropper/element-canvas': 2.0.0-beta.3 + '@cropper/element-image': 2.0.0-beta.3 + '@cropper/element-selection': 2.0.0-beta.3 + '@cropper/utils': 2.0.0-beta.3 + dev: true + + /@cropper/element@2.0.0-beta.3: + resolution: {integrity: sha512-Ta1QPx6uqO4WtlvWbQanKSdTi0NptfnSk4h93TSk/GTKYTUI6Qa1g5C+2ibdsomcD/bVTTY6cbuGMFfM8E8zQQ==} + dependencies: + '@cropper/utils': 2.0.0-beta.3 + dev: true + + /@cropper/elements@2.0.0-beta.3: + resolution: {integrity: sha512-oHRnhrFN/S2vadX1/ogaoZQuPUwUxYRoZ+BZjPUxr0kdX4SwumU0pMD2hxVMbveTl0zxFc0S3HdqXx8kcHGPtg==} + dependencies: + '@cropper/element': 2.0.0-beta.3 + '@cropper/element-canvas': 2.0.0-beta.3 + '@cropper/element-crosshair': 2.0.0-beta.3 + '@cropper/element-grid': 2.0.0-beta.3 + '@cropper/element-handle': 2.0.0-beta.3 + '@cropper/element-image': 2.0.0-beta.3 + '@cropper/element-selection': 2.0.0-beta.3 + '@cropper/element-shade': 2.0.0-beta.3 + '@cropper/element-viewer': 2.0.0-beta.3 + dev: true + + /@cropper/utils@2.0.0-beta.3: + resolution: {integrity: sha512-3oBwFN2DZiqfKzkB+fpAa+LV2izRUpbH0MS427p8rgMb7EEOP/UFaKeq/P/Ovs3dhLbiA48aLiV6GmX9piEmlw==} + dev: true + + /@cspotcode/source-map-consumer@0.8.0: + resolution: {integrity: sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==} + engines: {node: '>= 12'} + dev: true + + /@cspotcode/source-map-support@0.7.0: + resolution: {integrity: sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==} + engines: {node: '>=12'} + dependencies: + '@cspotcode/source-map-consumer': 0.8.0 + dev: true + + /@cypress/request@2.88.11: + resolution: {integrity: sha512-M83/wfQ1EkspjkE2lNWNV5ui2Cv7UCv1swW1DqljahbzLVWltcsexQh8jYtuS/vzFXP+HySntGM83ZXA9fn17w==} + engines: {node: '>= 6'} + dependencies: + aws-sign2: 0.7.0 + aws4: 1.12.0 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + http-signature: 1.3.6 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.35 + performance-now: 2.1.0 + qs: 6.10.4 + safe-buffer: 5.2.1 + tough-cookie: 2.5.0 + tunnel-agent: 0.6.0 + uuid: 8.3.2 + dev: true + + /@cypress/xvfb@1.2.4(supports-color@8.1.1): + resolution: {integrity: sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==} + dependencies: + debug: 3.2.7(supports-color@8.1.1) + lodash.once: 4.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@discordapp/twemoji@14.1.2: + resolution: {integrity: sha512-Rkuu30/biwy8Zss0r5qfFvQzoQGPTHXzA7Y/MPMkCQqFd0WskoYvjfJRTz0iuZwUpMfrgbM8eakSsptCxmOqog==} + dependencies: + fs-extra: 8.1.0 + jsonfile: 5.0.0 + twemoji-parser: 14.0.0 + universalify: 0.1.2 + dev: true + + /@discoveryjs/json-ext@0.5.7: + resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} + engines: {node: '>=10.0.0'} + dev: true + + /@esbuild/android-arm64@0.17.19: + resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.17.19: + resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.17.19: + resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.17.19: + resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.17.19: + resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.17.19: + resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.17.19: + resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.17.19: + resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.17.19: + resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.17.19: + resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.17.19: + resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.17.19: + resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.17.19: + resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.17.19: + resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.17.19: + resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.17.19: + resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.17.19: + resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.17.19: + resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.17.19: + resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.17.19: + resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.17.19: + resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.17.19: + resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@hapi/hoek@9.3.0: + resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} + dev: true + + /@hapi/topo@5.1.0: + resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + dependencies: + '@hapi/hoek': 9.3.0 + dev: true + + /@istanbuljs/load-nyc-config@1.1.0: + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.13.1 + resolve-from: 5.0.0 + dev: true + + /@istanbuljs/schema@0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + dev: true + + /@jest/console@27.5.1: + resolution: {integrity: sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/node': 20.3.1 + chalk: 4.1.2 + jest-message-util: 27.5.1 + jest-util: 27.5.1 + slash: 3.0.0 + dev: true + + /@jest/core@27.5.1(ts-node@10.4.0): + resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 27.5.1 + '@jest/reporters': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 20.3.1 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.8.1 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 27.5.1 + jest-config: 27.5.1(ts-node@10.4.0) + jest-haste-map: 27.5.1 + jest-message-util: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-resolve-dependencies: 27.5.1 + jest-runner: 27.5.1 + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + jest-watcher: 27.5.1 + micromatch: 4.0.5 + rimraf: 3.0.2 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + + /@jest/environment@27.5.1: + resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/fake-timers': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 20.3.1 + jest-mock: 27.5.1 + dev: true + + /@jest/fake-timers@27.5.1: + resolution: {integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@sinonjs/fake-timers': 8.1.0 + '@types/node': 20.3.1 + jest-message-util: 27.5.1 + jest-mock: 27.5.1 + jest-util: 27.5.1 + dev: true + + /@jest/globals@27.5.1: + resolution: {integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/types': 27.5.1 + expect: 27.5.1 + dev: true + + /@jest/reporters@27.5.1: + resolution: {integrity: sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 20.3.1 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-instrument: 5.2.1 + istanbul-lib-report: 3.0.0 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.5 + jest-haste-map: 27.5.1 + jest-resolve: 27.5.1 + jest-util: 27.5.1 + jest-worker: 27.5.1 + slash: 3.0.0 + source-map: 0.6.1 + string-length: 4.0.2 + terminal-link: 2.1.1 + v8-to-istanbul: 8.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/schemas@29.6.0: + resolution: {integrity: sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.27.8 + dev: true + + /@jest/source-map@27.5.1: + resolution: {integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + callsites: 3.1.0 + graceful-fs: 4.2.11 + source-map: 0.6.1 + dev: true + + /@jest/test-result@27.5.1: + resolution: {integrity: sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/console': 27.5.1 + '@jest/types': 27.5.1 + '@types/istanbul-lib-coverage': 2.0.4 + collect-v8-coverage: 1.0.2 + dev: true + + /@jest/test-sequencer@27.5.1: + resolution: {integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/test-result': 27.5.1 + graceful-fs: 4.2.11 + jest-haste-map: 27.5.1 + jest-runtime: 27.5.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/transform@27.5.1: + resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/core': 7.22.8 + '@jest/types': 27.5.1 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 1.9.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 27.5.1 + jest-regex-util: 27.5.1 + jest-util: 27.5.1 + micromatch: 4.0.5 + pirates: 4.0.6 + slash: 3.0.0 + source-map: 0.6.1 + write-file-atomic: 3.0.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/types@27.5.1: + resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 20.3.1 + '@types/yargs': 16.0.5 + chalk: 4.1.2 + dev: true + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.18 + dev: true + + /@jridgewell/resolve-uri@3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/source-map@0.3.3: + resolution: {integrity: sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.18 + dev: true + + /@jridgewell/sourcemap-codec@1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true + + /@jridgewell/trace-mapping@0.3.18: + resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@kurkle/color@0.3.2: + resolution: {integrity: sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==} + dev: true + + /@microsoft/api-documenter@7.22.21(@types/node@20.3.1): + resolution: {integrity: sha512-o8VXpB83P87cLIYfkQS7ibShoYorTZ7Xs+gMwftT75pFaYWwhBuI8M0MPgzTGIAxzi338XfUjhctlVCjRn+Sqg==} + hasBin: true + dependencies: + '@microsoft/api-extractor-model': 7.27.3(@types/node@20.3.1) + '@microsoft/tsdoc': 0.14.2 + '@rushstack/node-core-library': 3.59.4(@types/node@20.3.1) + '@rushstack/ts-command-line': 4.15.1 + colors: 1.2.5 + js-yaml: 3.13.1 + resolve: 1.22.2 + transitivePeerDependencies: + - '@types/node' + dev: true + + /@microsoft/api-extractor-model@7.27.3(@types/node@20.3.1): + resolution: {integrity: sha512-fSFvw7otYHduOkyshjTbapKKgwF8bgquVHvgF8VgeKtMYvqXkoaj7W6VcM7PNY7E2bbblhUgC4XNdqZLD4SJGw==} + dependencies: + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 3.59.4(@types/node@20.3.1) + transitivePeerDependencies: + - '@types/node' + dev: true + + /@microsoft/api-extractor@7.36.0(@types/node@20.3.1): + resolution: {integrity: sha512-P+kYgJFDXIr+UNzhRMhlpM/dderi6ab4lxn35vdhfAIMPtGCSXIJxrrtpTOQmQW8CZtmoZX06LYoUsKCc1zjow==} + hasBin: true + dependencies: + '@microsoft/api-extractor-model': 7.27.3(@types/node@20.3.1) + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 3.59.4(@types/node@20.3.1) + '@rushstack/rig-package': 0.4.0 + '@rushstack/ts-command-line': 4.15.1 + colors: 1.2.5 + lodash: 4.17.21 + resolve: 1.22.2 + semver: 7.3.8 + source-map: 0.6.1 + typescript: 5.0.4 + transitivePeerDependencies: + - '@types/node' + dev: true + + /@microsoft/tsdoc-config@0.16.2: + resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} + dependencies: + '@microsoft/tsdoc': 0.14.2 + ajv: 6.12.6 + jju: 1.4.0 + resolve: 1.19.0 + dev: true + + /@microsoft/tsdoc@0.14.2: + resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} + dev: true + + /@mole-inc/bin-wrapper@8.0.1: + resolution: {integrity: sha512-sTGoeZnjI8N4KS+sW2AN95gDBErhAguvkw/tWdCjeM8bvxpz5lqrnd0vOJABA1A+Ic3zED7PYoLP/RANLgVotA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + bin-check: 4.1.0 + bin-version-check: 5.1.0 + content-disposition: 0.5.4 + ext-name: 5.0.0 + file-type: 17.1.6 + filenamify: 5.1.1 + got: 11.8.6 + os-filter-obj: 2.0.0 + dev: true + + /@napi-rs/cli@2.16.1: + resolution: {integrity: sha512-L0Gr5iEQIDEbvWdDr1HUaBOxBSHL1VZhWSk1oryawoT8qJIY+KGfLFelU+Qma64ivCPbxYpkfPoKYVG3rcoGIA==} + engines: {node: '>= 10'} + hasBin: true + dev: false + + /@nicolo-ribaudo/semver-v6@6.3.3: + resolution: {integrity: sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==} + hasBin: true + dev: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: true + + /@phosphor-icons/web@2.0.3: + resolution: {integrity: sha512-9oYmohi2fo87w3DbtfjBoJxrklVojgXq2wuGcqxKccj2TxMq7UIusKDrGUZYOQHM9pUKkh+kvfmutETMGDR6gg==} + dev: true + + /@rollup/plugin-alias@3.1.9(rollup@3.23.1): + resolution: {integrity: sha512-QI5fsEvm9bDzt32k39wpOwZhVzRcL5ydcffUHMyLVaVaLeC70I8TJZ17F1z1eMoLu4E/UOcH9BWVkKpIKdrfiw==} + engines: {node: '>=8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + rollup: 3.23.1 + slash: 3.0.0 + dev: true + + /@rollup/plugin-json@4.1.0(rollup@3.23.1): + resolution: {integrity: sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==} + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 + dependencies: + '@rollup/pluginutils': 3.1.0(rollup@3.23.1) + rollup: 3.23.1 + dev: true + + /@rollup/pluginutils@3.1.0(rollup@3.23.1): + resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + '@types/estree': 0.0.39 + estree-walker: 1.0.1 + picomatch: 2.3.1 + rollup: 3.23.1 + dev: true + + /@rollup/pluginutils@4.2.1: + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} + engines: {node: '>= 8.0.0'} + dependencies: + estree-walker: 2.0.2 + picomatch: 2.3.1 + dev: true + + /@rometools/cli-darwin-arm64@12.1.3: + resolution: {integrity: sha512-AmFTUDYjBuEGQp/Wwps+2cqUr+qhR7gyXAUnkL5psCuNCz3807TrUq/ecOoct5MIavGJTH6R4aaSL6+f+VlBEg==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rometools/cli-darwin-x64@12.1.3: + resolution: {integrity: sha512-k8MbWna8q4LRlb005N2X+JS1UQ+s3ZLBBvwk4fP8TBxlAJXUz17jLLu/Fi+7DTTEmMhM84TWj4FDKW+rNar28g==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rometools/cli-linux-arm64@12.1.3: + resolution: {integrity: sha512-X/uLhJ2/FNA3nu5TiyeNPqiD3OZoFfNfRvw6a3ut0jEREPvEn72NI7WPijH/gxSz55znfQ7UQ6iM4DZumUknJg==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rometools/cli-linux-x64@12.1.3: + resolution: {integrity: sha512-csP17q1eWiUXx9z6Jr/JJPibkplyKIwiWPYNzvPCGE8pHlKhwZj3YHRuu7Dm/4EOqx0XFIuqqWZUYm9bkIC8xg==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rometools/cli-win32-arm64@12.1.3: + resolution: {integrity: sha512-RymHWeod57EBOJY4P636CgUwYA6BQdkQjh56XKk4pLEHO6X1bFyMet2XL7KlHw5qOTalzuzf5jJqUs+vf3jdXQ==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rometools/cli-win32-x64@12.1.3: + resolution: {integrity: sha512-yHSKYidqJMV9nADqg78GYA+cZ0hS1twANAjiFibQdXj9aGzD+s/IzIFEIi/U/OBLvWYg/SCw0QVozi2vTlKFDQ==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rushstack/node-core-library@3.59.4(@types/node@20.3.1): + resolution: {integrity: sha512-YAKJDC6Mz/KA1D7bvB88WaRX3knt/ZuLzkRu5G9QADGSjLtvTWzCNCytRF2PCSaaHOZaZsWul4F1KQdgFgUDqA==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + dependencies: + '@types/node': 20.3.1 + colors: 1.2.5 + fs-extra: 7.0.1 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.2 + semver: 7.3.8 + z-schema: 5.0.5 + dev: true + + /@rushstack/rig-package@0.4.0: + resolution: {integrity: sha512-FnM1TQLJYwSiurP6aYSnansprK5l8WUK8VG38CmAaZs29ZeL1msjK0AP1VS4ejD33G0kE/2cpsPsS9jDenBMxw==} + dependencies: + resolve: 1.22.2 + strip-json-comments: 3.1.1 + dev: true + + /@rushstack/ts-command-line@4.15.1: + resolution: {integrity: sha512-EL4jxZe5fhb1uVL/P/wQO+Z8Rc8FMiWJ1G7VgnPDvdIt5GVjRfK7vwzder1CZQiX3x0PY6uxENYLNGTFd1InRQ==} + dependencies: + '@types/argparse': 1.0.38 + argparse: 1.0.10 + colors: 1.2.5 + string-argv: 0.3.2 + dev: true + + /@sideway/address@4.1.4: + resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==} + dependencies: + '@hapi/hoek': 9.3.0 + dev: true + + /@sideway/formula@3.0.1: + resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} + dev: true + + /@sideway/pinpoint@2.0.0: + resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + dev: true + + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + dev: true + + /@sindresorhus/is@4.6.0: + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + dev: true + + /@sinonjs/commons@1.8.6: + resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} + dependencies: + type-detect: 4.0.8 + dev: true + + /@sinonjs/fake-timers@8.1.0: + resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} + dependencies: + '@sinonjs/commons': 1.8.6 + dev: true + + /@swc/cli@0.1.62(@swc/core@1.3.62): + resolution: {integrity: sha512-kOFLjKY3XH1DWLfXL1/B5MizeNorHR8wHKEi92S/Zi9Md/AK17KSqR8MgyRJ6C1fhKHvbBCl8wboyKAFXStkYw==} + engines: {node: '>= 12.13'} + hasBin: true + peerDependencies: + '@swc/core': ^1.2.66 + chokidar: ^3.5.1 + peerDependenciesMeta: + chokidar: + optional: true + dependencies: + '@mole-inc/bin-wrapper': 8.0.1 + '@swc/core': 1.3.62 + commander: 7.2.0 + fast-glob: 3.3.0 + semver: 7.3.8 + slash: 3.0.0 + source-map: 0.7.4 + dev: true + + /@swc/core-android-arm64@1.3.11: + resolution: {integrity: sha512-M7FamR3kFpVTyTw73FzKcOZmS7/TWHX75eqtwBTaU9fW4shf0KTLr/h9DnMxNKAnwUMeub/lqlINUe5EKFIKwQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [android] + dependencies: + '@swc/wasm': 1.2.130 + + /@swc/core-darwin-arm64@1.3.62: + resolution: {integrity: sha512-MmGilibITz68LEje6vJlKzc2gUUSgzvB3wGLSjEORikTNeM7P8jXVxE4A8fgZqDeudJUm9HVWrxCV+pHDSwXhA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@swc/core-darwin-x64@1.3.62: + resolution: {integrity: sha512-Xl93MMB3sCWVlYWuQIB+v6EQgzoiuQYK5tNt9lsHoIEVu2zLdkQjae+5FUHZb1VYqCXIiWcULFfVz0R4Sjb7JQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm-gnueabihf@1.3.62: + resolution: {integrity: sha512-nJsp6O7kCtAjTTMcIjVB0g5y1JNiYAa5q630eiwrnaHUusEFoANDdORI3Z9vXeikMkng+6yIv9/V8Rb093xLjQ==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm64-gnu@1.3.62: + resolution: {integrity: sha512-XGsV93vpUAopDt5y6vPwbK1Nc/MlL55L77bAZUPIiosWD1cWWPHNtNSpriE6+I+JiMHe0pqtfS/SSTk6ZkFQVw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-arm64-musl@1.3.62: + resolution: {integrity: sha512-ESUmJjSlTTkoBy9dMG49opcNn8BmviqStMhwyeD1G8XRnmRVCZZgoBOKdvCXmJhw8bQXDhZumeaTUB+OFUKVXg==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-x64-gnu@1.3.62: + resolution: {integrity: sha512-wnHJkt3ZBrax3SFnUHDcncG6mrSg9ZZjMhQV9Mc3JL1x1s1Gy9rGZCoBNnV/BUZWTemxIBcQbANRSDut/WO+9A==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-linux-x64-musl@1.3.62: + resolution: {integrity: sha512-9oRbuTC/VshB66Rgwi3pTq3sPxSTIb8k9L1vJjES+dDMKa29DAjPtWCXG/pyZ00ufpFZgkGEuAHH5uqUcr1JQg==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-arm64-msvc@1.3.62: + resolution: {integrity: sha512-zv14vlF2VRrxS061XkfzGjCYnOrEo5glKJjLK5PwUKysIoVrx/L8nAbFxjkX5cObdlyoqo+ekelyBPAO+4bS0w==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-ia32-msvc@1.3.62: + resolution: {integrity: sha512-8MC/PZQSsOP2iA/81tAfNRqMWyEqTS/8zKUI67vPuLvpx6NAjRn3E9qBv7iFqH79iqZNzqSMo3awnLrKZyFbcw==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core-win32-x64-msvc@1.3.62: + resolution: {integrity: sha512-GJSmUJ95HKHZXAxiuPUmrcm/S3ivQvEzXhOZaIqYBIwUsm02vFZkClsV7eIKzWjso1t0+I/8MjrnUNaSWqh1rQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@swc/core@1.3.62: + resolution: {integrity: sha512-J58hWY+/G8vOr4J6ZH9hLg0lMSijZtqIIf4HofZezGog/pVX6sJyBJ40dZ1ploFkDIlWTWvJyqtpesBKS73gkQ==} + engines: {node: '>=10'} + requiresBuild: true + peerDependencies: + '@swc/helpers': ^0.5.0 + peerDependenciesMeta: + '@swc/helpers': + optional: true + optionalDependencies: + '@swc/core-darwin-arm64': 1.3.62 + '@swc/core-darwin-x64': 1.3.62 + '@swc/core-linux-arm-gnueabihf': 1.3.62 + '@swc/core-linux-arm64-gnu': 1.3.62 + '@swc/core-linux-arm64-musl': 1.3.62 + '@swc/core-linux-x64-gnu': 1.3.62 + '@swc/core-linux-x64-musl': 1.3.62 + '@swc/core-win32-arm64-msvc': 1.3.62 + '@swc/core-win32-ia32-msvc': 1.3.62 + '@swc/core-win32-x64-msvc': 1.3.62 + dev: true + + /@swc/wasm@1.2.130: + resolution: {integrity: sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q==} + + /@syuilo/aiscript@0.11.1: + resolution: {integrity: sha512-chwOIA3yLUKvOB0G611hjLArKTeOWNmTm3lHERSaDW1d+dS6do56naX6Lkwy2UpnwWC0qzeNSgg35elk6t2gZg==} + dependencies: + autobind-decorator: 2.4.0 + chalk: 4.0.0 + seedrandom: 3.0.5 + stringz: 2.1.0 + uuid: 7.0.3 + dev: true + + /@szmarczak/http-timer@4.0.6: + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + dependencies: + defer-to-connect: 2.0.1 + dev: true + + /@tokenizer/token@0.3.0: + resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} + dev: true + + /@tootallnate/once@1.1.2: + resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} + engines: {node: '>= 6'} + dev: true + + /@tsconfig/node10@1.0.9: + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + dev: true + + /@tsconfig/node12@1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + dev: true + + /@tsconfig/node14@1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + dev: true + + /@tsconfig/node16@1.0.4: + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + dev: true + + /@tsd/typescript@5.0.4: + resolution: {integrity: sha512-YQi2lvZSI+xidKeUjlbv6b6Zw7qB3aXHw5oGJLs5OOGAEqKIOvz5UIAkWyg0bJbkSUWPBEtaOHpVxU4EYBO1Jg==} + dev: true + + /@types/argparse@1.0.38: + resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} + dev: true + + /@types/babel__core@7.20.1: + resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==} + dependencies: + '@babel/parser': 7.22.7 + '@babel/types': 7.22.5 + '@types/babel__generator': 7.6.4 + '@types/babel__template': 7.4.1 + '@types/babel__traverse': 7.20.1 + dev: true + + /@types/babel__generator@7.6.4: + resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} + dependencies: + '@babel/types': 7.22.5 + dev: true + + /@types/babel__template@7.4.1: + resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} + dependencies: + '@babel/parser': 7.22.7 + '@babel/types': 7.22.5 + dev: true + + /@types/babel__traverse@7.20.1: + resolution: {integrity: sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==} + dependencies: + '@babel/types': 7.22.5 + dev: true + + /@types/cacheable-request@6.0.3: + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + dependencies: + '@types/http-cache-semantics': 4.0.1 + '@types/keyv': 3.1.4 + '@types/node': 20.3.1 + '@types/responselike': 1.0.0 + dev: true + + /@types/escape-regexp@0.0.1: + resolution: {integrity: sha512-ogj/ZTIdeFkiuxDwawYuZSIgC6suFGgBeZPr6Xs5lHEcvIXTjXGtH+/n8f1XhZhespaUwJ5LIGRICPji972FLw==} + dev: true + + /@types/eslint-scope@3.7.4: + resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==} + dependencies: + '@types/eslint': 8.44.0 + '@types/estree': 1.0.1 + dev: true + + /@types/eslint@7.29.0: + resolution: {integrity: sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==} + dependencies: + '@types/estree': 1.0.1 + '@types/json-schema': 7.0.12 + dev: true + + /@types/eslint@8.44.0: + resolution: {integrity: sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw==} + dependencies: + '@types/estree': 1.0.1 + '@types/json-schema': 7.0.12 + dev: true + + /@types/estree@0.0.39: + resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} + dev: true + + /@types/estree@1.0.1: + resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} + dev: true + + /@types/expect@1.20.4: + resolution: {integrity: sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==} + dev: true + + /@types/glob-stream@8.0.0: + resolution: {integrity: sha512-fxTWwdQmX9LWSHD7ZLlv3BHR992mKcVcDnT/2v+l/QZZo7TfDdyasqlSYVzOnMGWhRbrWeWkbj/mgezFjKynhw==} + dependencies: + '@types/node': 20.3.1 + '@types/picomatch': 2.3.0 + '@types/streamx': 2.9.1 + dev: true + + /@types/glob@8.1.0: + resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 20.3.1 + dev: true + + /@types/graceful-fs@4.1.6: + resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} + dependencies: + '@types/node': 20.3.1 + dev: true + + /@types/gulp-rename@2.0.1: + resolution: {integrity: sha512-9ZjeS2RHEnmBmTcyi2+oeye3BgCsWhvi4uv3qCnAg8i6plOuRdaeNxjOves0ELysEXYLBl7bCl5fbVs7AZtgTA==} + dependencies: + '@types/node': 20.3.1 + '@types/vinyl': 2.0.7 + dev: true + + /@types/gulp-rename@2.0.2: + resolution: {integrity: sha512-CQsXqTVtAXqrPd4IbrrlJEEzRkUR3RXsyZbrVoOVqjlchDDmnyRDatAUisjpQjjCg/wjJrSiNg8T1uAbJ/7Qqg==} + dependencies: + '@types/node': 20.3.1 + '@types/vinyl': 2.0.7 + dev: true + + /@types/gulp@4.0.10: + resolution: {integrity: sha512-spgZHJFqiEJGwqGlf7T/k4nkBpBcLgP7T0EfN6G2vvnhUfvd4uO1h8RwpXOE8x/54DVYUs1XCAtBHkX/R3axAQ==} + dependencies: + '@types/undertaker': 1.2.8 + '@types/vinyl-fs': 3.0.2 + chokidar: 3.3.1 + dev: true + + /@types/gulp@4.0.11: + resolution: {integrity: sha512-jy0nfcsjiGqO1prNsYMK/bHkTblIBgG04sL2nxPpnP9MyNicHp1SUblomjOla6JoW1qkR67HjFHqIibpPoShNQ==} + dependencies: + '@types/undertaker': 1.2.8 + '@types/vinyl-fs': 3.0.2 + chokidar: 3.3.1 + dev: true + + /@types/http-cache-semantics@4.0.1: + resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==} + dev: true + + /@types/istanbul-lib-coverage@2.0.4: + resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + dev: true + + /@types/istanbul-lib-report@3.0.0: + resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + dev: true + + /@types/istanbul-reports@3.0.1: + resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} + dependencies: + '@types/istanbul-lib-report': 3.0.0 + dev: true + + /@types/jest@27.4.0: + resolution: {integrity: sha512-gHl8XuC1RZ8H2j5sHv/JqsaxXkDDM9iDOgu0Wp8sjs4u/snb2PVehyWXJPr+ORA0RPpgw231mnutWI1+0hgjIQ==} + dependencies: + jest-diff: 27.5.1 + pretty-format: 27.5.1 + dev: true + + /@types/json-schema@7.0.12: + resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==} + dev: true + + /@types/katex@0.16.0: + resolution: {integrity: sha512-hz+S3nV6Mym5xPbT9fnO8dDhBFQguMYpY0Ipxv06JMi1ORgnEM4M1ymWDUhUNer3ElLmT583opRo4RzxKmh9jw==} + dev: true + + /@types/keyv@3.1.4: + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + dependencies: + '@types/node': 20.3.1 + dev: true + + /@types/matter-js@0.18.2: + resolution: {integrity: sha512-W9UC9DOPNBRTUocqqPZmzX3cbHmlZBI9jLn6SuxZz0n5QrPk382Ig3hbBWHqYU8TRUmTCJJhuanXeyMTavF7Mg==} + dev: true + + /@types/minimatch@5.1.2: + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + dev: true + + /@types/minimist@1.2.2: + resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} + dev: true + + /@types/node@14.18.51: + resolution: {integrity: sha512-P9bsdGFPpVtofEKlhWMVS2qqx1A/rt9QBfihWlklfHHpUpjtYse5AzFz6j4DWrARLYh6gRnw9+5+DJcrq3KvBA==} + dev: true + + /@types/node@20.3.1: + resolution: {integrity: sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==} + dev: true + + /@types/normalize-package-data@2.4.1: + resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + dev: true + + /@types/picomatch@2.3.0: + resolution: {integrity: sha512-O397rnSS9iQI4OirieAtsDqvCj4+3eY1J+EPdNTKuHuRWIfUoGyzX294o8C4KJYaLqgSrd2o60c5EqCU8Zv02g==} + dev: true + + /@types/prettier@2.7.3: + resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} + dev: true + + /@types/punycode@2.1.0: + resolution: {integrity: sha512-PG5aLpW6PJOeV2fHRslP4IOMWn+G+Uq8CfnyJ+PDS8ndCbU+soO+fB3NKCKo0p/Jh2Y4aPaiQZsrOXFdzpcA6g==} + dev: true + + /@types/responselike@1.0.0: + resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} + dependencies: + '@types/node': 20.3.1 + dev: true + + /@types/seedrandom@3.0.5: + resolution: {integrity: sha512-kopEpYpFQvQdYsZkZVwht/0THHmTFFYXDaqV/lM45eweJ8kcGVDgZHs0RVTolSq55UPZNmjhKc9r7UvLu/mQQg==} + dev: true + + /@types/sinonjs__fake-timers@8.1.1: + resolution: {integrity: sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==} + dev: true + + /@types/sizzle@2.3.3: + resolution: {integrity: sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==} + dev: true + + /@types/stack-utils@2.0.1: + resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} + dev: true + + /@types/streamx@2.9.1: + resolution: {integrity: sha512-9bywzhouyedmci7WCIPFwJ8zASDnxt2gaVUy52X0p0Tt085IJSAEP0L6j4SSNeDMSLzpYu6cPz0GrJZ7kPJ6Bg==} + dependencies: + '@types/node': 20.3.1 + dev: true + + /@types/throttle-debounce@5.0.0: + resolution: {integrity: sha512-Pb7k35iCGFcGPECoNE4DYp3Oyf2xcTd3FbFQxXUI9hEYKUl6YX+KLf7HrBmgVcD05nl50LIH6i+80js4iYmWbw==} + dev: true + + /@types/tinycolor2@1.4.3: + resolution: {integrity: sha512-Kf1w9NE5HEgGxCRyIcRXR/ZYtDv0V8FVPtYHwLxl0O+maGX0erE77pQlD0gpP+/KByMZ87mOA79SjifhSB3PjQ==} + dev: true + + /@types/undertaker-registry@1.0.1: + resolution: {integrity: sha512-Z4TYuEKn9+RbNVk1Ll2SS4x1JeLHecolIbM/a8gveaHsW0Hr+RQMraZACwTO2VD7JvepgA6UO1A1VrbktQrIbQ==} + dev: true + + /@types/undertaker@1.2.8: + resolution: {integrity: sha512-gW3PRqCHYpo45XFQHJBhch7L6hytPsIe0QeLujlnFsjHPnXLhJcPdN6a9368d7aIQgH2I/dUTPFBlGeSNA3qOg==} + dependencies: + '@types/node': 20.3.1 + '@types/undertaker-registry': 1.0.1 + async-done: 1.3.2 + dev: true + + /@types/uuid@8.3.4: + resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} + dev: true + + /@types/vinyl-fs@3.0.2: + resolution: {integrity: sha512-ctNcmmzbMIKooXjRkyyUCOu2Z4AyqibL+RhXoF3pb7K7j+ezItnakmpm31LymkYHSIM5ey0tjIFzTvFOTSBCGw==} + dependencies: + '@types/glob-stream': 8.0.0 + '@types/node': 20.3.1 + '@types/vinyl': 2.0.7 + dev: true + + /@types/vinyl@2.0.7: + resolution: {integrity: sha512-4UqPv+2567NhMQuMLdKAyK4yzrfCqwaTt6bLhHEs8PFcxbHILsrxaY63n4wgE/BRLDWDQeI+WcTmkXKExh9hQg==} + dependencies: + '@types/expect': 1.20.4 + '@types/node': 20.3.1 + dev: true + + /@types/yargs-parser@21.0.0: + resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} + dev: true + + /@types/yargs@16.0.5: + resolution: {integrity: sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==} + dependencies: + '@types/yargs-parser': 21.0.0 + dev: true + + /@types/yauzl@2.10.0: + resolution: {integrity: sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==} + requiresBuild: true + dependencies: + '@types/node': 20.3.1 + dev: true + optional: true + + /@vitejs/plugin-vue@4.2.3(vite@4.3.9)(vue@3.3.4): + resolution: {integrity: sha512-R6JDUfiZbJA9cMiguQ7jxALsgiprjBeHL5ikpXfJCH62pPHtI+JdJ5xWj6Ev73yXSlYl86+blXn1kZHQ7uElxw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.0.0 + vue: ^3.2.25 + dependencies: + vite: 4.3.9(sass@1.62.1) + vue: 3.3.4 + dev: true + + /@vue/compiler-core@3.3.4: + resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==} + dependencies: + '@babel/parser': 7.22.7 + '@vue/shared': 3.3.4 + estree-walker: 2.0.2 + source-map-js: 1.0.2 + dev: true + + /@vue/compiler-dom@3.3.4: + resolution: {integrity: sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==} + dependencies: + '@vue/compiler-core': 3.3.4 + '@vue/shared': 3.3.4 + dev: true + + /@vue/compiler-sfc@2.7.14: + resolution: {integrity: sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==} + dependencies: + '@babel/parser': 7.22.7 + postcss: 8.4.25 + source-map: 0.6.1 + dev: true + + /@vue/compiler-sfc@3.3.4: + resolution: {integrity: sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==} + dependencies: + '@babel/parser': 7.22.7 + '@vue/compiler-core': 3.3.4 + '@vue/compiler-dom': 3.3.4 + '@vue/compiler-ssr': 3.3.4 + '@vue/reactivity-transform': 3.3.4 + '@vue/shared': 3.3.4 + estree-walker: 2.0.2 + magic-string: 0.30.1 + postcss: 8.4.25 + source-map-js: 1.0.2 + dev: true + + /@vue/compiler-ssr@3.3.4: + resolution: {integrity: sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==} + dependencies: + '@vue/compiler-dom': 3.3.4 + '@vue/shared': 3.3.4 + dev: true + + /@vue/reactivity-transform@3.3.4: + resolution: {integrity: sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==} + dependencies: + '@babel/parser': 7.22.7 + '@vue/compiler-core': 3.3.4 + '@vue/shared': 3.3.4 + estree-walker: 2.0.2 + magic-string: 0.30.1 + dev: true + + /@vue/reactivity@3.3.4: + resolution: {integrity: sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==} + dependencies: + '@vue/shared': 3.3.4 + dev: true + + /@vue/runtime-core@3.3.4: + resolution: {integrity: sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==} + dependencies: + '@vue/reactivity': 3.3.4 + '@vue/shared': 3.3.4 + dev: true + + /@vue/runtime-dom@3.3.4: + resolution: {integrity: sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==} + dependencies: + '@vue/runtime-core': 3.3.4 + '@vue/shared': 3.3.4 + csstype: 3.1.2 + dev: true + + /@vue/server-renderer@3.3.4(vue@3.3.4): + resolution: {integrity: sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==} + peerDependencies: + vue: 3.3.4 + dependencies: + '@vue/compiler-ssr': 3.3.4 + '@vue/shared': 3.3.4 + vue: 3.3.4 + dev: true + + /@vue/shared@3.3.4: + resolution: {integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==} + dev: true + + /@webassemblyjs/ast@1.11.6: + resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} + dependencies: + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + dev: true + + /@webassemblyjs/floating-point-hex-parser@1.11.6: + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + dev: true + + /@webassemblyjs/helper-api-error@1.11.6: + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + dev: true + + /@webassemblyjs/helper-buffer@1.11.6: + resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} + dev: true + + /@webassemblyjs/helper-numbers@1.11.6: + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@xtuc/long': 4.2.2 + dev: true + + /@webassemblyjs/helper-wasm-bytecode@1.11.6: + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + dev: true + + /@webassemblyjs/helper-wasm-section@1.11.6: + resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + dev: true + + /@webassemblyjs/ieee754@1.11.6: + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + dependencies: + '@xtuc/ieee754': 1.2.0 + dev: true + + /@webassemblyjs/leb128@1.11.6: + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + dependencies: + '@xtuc/long': 4.2.2 + dev: true + + /@webassemblyjs/utf8@1.11.6: + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + dev: true + + /@webassemblyjs/wasm-edit@1.11.6: + resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-opt': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + '@webassemblyjs/wast-printer': 1.11.6 + dev: true + + /@webassemblyjs/wasm-gen@1.11.6: + resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + dev: true + + /@webassemblyjs/wasm-opt@1.11.6: + resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + dev: true + + /@webassemblyjs/wasm-parser@1.11.6: + resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + dev: true + + /@webassemblyjs/wast-printer@1.11.6: + resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@xtuc/long': 4.2.2 + dev: true + + /@webpack-cli/configtest@2.1.1(webpack-cli@5.1.3)(webpack@5.85.1): + resolution: {integrity: sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + dependencies: + webpack: 5.85.1(@swc/core@1.3.62)(webpack-cli@5.1.3) + webpack-cli: 5.1.3(webpack@5.85.1) + dev: true + + /@webpack-cli/info@2.0.2(webpack-cli@5.1.3)(webpack@5.85.1): + resolution: {integrity: sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + dependencies: + webpack: 5.85.1(@swc/core@1.3.62)(webpack-cli@5.1.3) + webpack-cli: 5.1.3(webpack@5.85.1) + dev: true + + /@webpack-cli/serve@2.0.5(webpack-cli@5.1.3)(webpack@5.85.1): + resolution: {integrity: sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + webpack-dev-server: '*' + peerDependenciesMeta: + webpack-dev-server: + optional: true + dependencies: + webpack: 5.85.1(@swc/core@1.3.62)(webpack-cli@5.1.3) + webpack-cli: 5.1.3(webpack@5.85.1) + dev: true + + /@xtuc/ieee754@1.2.0: + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + dev: true + + /@xtuc/long@4.2.2: + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + dev: true + + /abab@2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + dev: true + + /acorn-globals@6.0.0: + resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} + dependencies: + acorn: 7.4.1 + acorn-walk: 7.2.0 + dev: true + + /acorn-import-assertions@1.9.0(acorn@8.8.2): + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.8.2 + dev: true + + /acorn-walk@7.2.0: + resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /acorn@8.8.2: + resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + + /aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + dev: true + + /ajv-keywords@3.5.2(ajv@6.12.6): + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + dependencies: + ajv: 6.12.6 + dev: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /alphanum-sort@1.0.2: + resolution: {integrity: sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ==} + dev: true + + /ansi-colors@1.1.0: + resolution: {integrity: sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-wrap: 0.1.0 + dev: true + + /ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + dev: true + + /ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + dev: true + + /ansi-gray@0.1.1: + resolution: {integrity: sha512-HrgGIZUl8h2EHuZaU9hTR/cU5nhKxpVE1V6kdGsQ8e4zirElJ5fvtfc8N7Q1oq1aatO275i8pUFUCpNWCAnVWw==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-wrap: 0.1.0 + dev: true + + /ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-styles@2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} + dev: true + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /ansi-wrap@0.1.0: + resolution: {integrity: sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==} + engines: {node: '>=0.10.0'} + dev: true + + /anymatch@2.0.0: + resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==} + dependencies: + micromatch: 3.1.10 + normalize-path: 2.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /append-buffer@1.0.2: + resolution: {integrity: sha512-WLbYiXzD3y/ATLZFufV/rZvWdZOs+Z/+5v1rBZ463Jn398pa6kcde27cvozYnBoxXblGZTFfoPpsaEw0orU5BA==} + engines: {node: '>=0.10.0'} + dependencies: + buffer-equal: 1.0.1 + dev: true + + /arch@2.2.0: + resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} + dev: true + + /archy@1.0.0: + resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} + dev: true + + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + + /arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + dev: true + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: false + + /arr-diff@4.0.0: + resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} + engines: {node: '>=0.10.0'} + dev: true + + /arr-filter@1.1.2: + resolution: {integrity: sha512-A2BETWCqhsecSvCkWAeVBFLH6sXEUGASuzkpjL3GR1SlL/PWL6M3J8EAAld2Uubmh39tvkJTqC9LeLHCUKmFXA==} + engines: {node: '>=0.10.0'} + dependencies: + make-iterator: 1.0.1 + dev: true + + /arr-flatten@1.1.0: + resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} + engines: {node: '>=0.10.0'} + dev: true + + /arr-map@2.0.2: + resolution: {integrity: sha512-tVqVTHt+Q5Xb09qRkbu+DidW1yYzz5izWS2Xm2yFm7qJnmUfz4HPzNxbHkdRJbz2lrqI7S+z17xNYdFcBBO8Hw==} + engines: {node: '>=0.10.0'} + dependencies: + make-iterator: 1.0.1 + dev: true + + /arr-union@3.1.0: + resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} + engines: {node: '>=0.10.0'} + dev: true + + /array-each@1.0.1: + resolution: {integrity: sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==} + engines: {node: '>=0.10.0'} + dev: true + + /array-initial@1.1.0: + resolution: {integrity: sha512-BC4Yl89vneCYfpLrs5JU2aAu9/a+xWbeKhvISg9PT7eWFB9UlRvI+rKEtk6mgxWr3dSkk9gQ8hCrdqt06NXPdw==} + engines: {node: '>=0.10.0'} + dependencies: + array-slice: 1.1.0 + is-number: 4.0.0 + dev: true + + /array-last@1.3.0: + resolution: {integrity: sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 4.0.0 + dev: true + + /array-slice@1.1.0: + resolution: {integrity: sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==} + engines: {node: '>=0.10.0'} + dev: true + + /array-sort@1.0.0: + resolution: {integrity: sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==} + engines: {node: '>=0.10.0'} + dependencies: + default-compare: 1.0.0 + get-value: 2.0.6 + kind-of: 5.1.0 + dev: true + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /array-unique@0.3.2: + resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==} + engines: {node: '>=0.10.0'} + dev: true + + /arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + dev: true + + /asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + dev: true + + /assign-symbols@1.0.0: + resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==} + engines: {node: '>=0.10.0'} + dev: true + + /astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + dev: true + + /async-done@1.3.2: + resolution: {integrity: sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==} + engines: {node: '>= 0.10'} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + process-nextick-args: 2.0.1 + stream-exhaust: 1.0.2 + dev: true + + /async-settle@1.0.0: + resolution: {integrity: sha512-VPXfB4Vk49z1LHHodrEQ6Xf7W4gg1w0dAPROHngx7qgDjqmIQ+fXmwgGXTW/ITLai0YLSvWepJOP9EVpMnEAcw==} + engines: {node: '>= 0.10'} + dependencies: + async-done: 1.3.2 + dev: true + + /async@3.2.4: + resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} + dev: true + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: true + + /at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: true + + /atob@2.1.2: + resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} + engines: {node: '>= 4.5.0'} + hasBin: true + dev: true + + /autobind-decorator@2.4.0: + resolution: {integrity: sha512-OGYhWUO72V6DafbF8PM8rm3EPbfuyMZcJhtm5/n26IDwO18pohE4eNazLoCGhPiXOCD0gEGmrbU3849QvM8bbw==} + engines: {node: '>=8.10', npm: '>=6.4.1'} + dev: true + + /autoprefixer@6.7.7: + resolution: {integrity: sha512-WKExI/eSGgGAkWAO+wMVdFObZV7hQen54UpD1kCCTN3tvlL3W1jL4+lPP/M7MwoP7Q4RHzKtO3JQ4HxYEcd+xQ==} + dependencies: + browserslist: 1.7.7 + caniuse-db: 1.0.30001502 + normalize-range: 0.1.2 + num2fraction: 1.2.2 + postcss: 5.2.18 + postcss-value-parser: 3.3.1 + dev: true + + /autosize@5.0.2: + resolution: {integrity: sha512-FPVt5ynkqUAA9gcMZnJHka1XfQgr1WNd/yRfIjmj5WGmjua+u5Hl9hn8M2nU5CNy2bEIcj1ZUwXq7IOHsfZG9w==} + dev: true + + /aws-sign2@0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + dev: true + + /aws4@1.12.0: + resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==} + dev: true + + /axios@0.25.0(debug@4.3.4): + resolution: {integrity: sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==} + dependencies: + follow-redirects: 1.15.2(debug@4.3.4) + transitivePeerDependencies: + - debug + dev: true + + /babel-jest@27.5.1(@babel/core@7.22.8): + resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': 7.22.8 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/babel__core': 7.20.1 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 27.5.1(@babel/core@7.22.8) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + dependencies: + '@babel/helper-plugin-utils': 7.22.5 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-jest-hoist@27.5.1: + resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/template': 7.22.5 + '@babel/types': 7.22.5 + '@types/babel__core': 7.20.1 + '@types/babel__traverse': 7.20.1 + dev: true + + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.22.8): + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.8 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.8) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.22.8) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.8) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.22.8) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.8) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.8) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.8) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.8) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.8) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.8) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.8) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.8) + dev: true + + /babel-preset-jest@27.5.1(@babel/core@7.22.8): + resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.8 + babel-plugin-jest-hoist: 27.5.1 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.8) + dev: true + + /bach@1.2.0: + resolution: {integrity: sha512-bZOOfCb3gXBXbTFXq3OZtGR88LwGeJvzu6szttaIzymOTS4ZttBNOWSv7aLZja2EMycKtRYV0Oa8SNKH/zkxvg==} + engines: {node: '>= 0.10'} + dependencies: + arr-filter: 1.1.2 + arr-flatten: 1.1.0 + arr-map: 2.0.2 + array-each: 1.0.1 + array-initial: 1.1.0 + array-last: 1.3.0 + async-done: 1.3.2 + async-settle: 1.0.0 + now-and-later: 2.0.1 + dev: true + + /balanced-match@0.4.2: + resolution: {integrity: sha512-STw03mQKnGUYtoNjmowo4F2cRmIIxYEGiMsjjwla/u5P1lxadj/05WkNaFjNiKTgJkj8KiXbgAiRTmcQRwQNtg==} + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: true + + /base@0.11.2: + resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==} + engines: {node: '>=0.10.0'} + dependencies: + cache-base: 1.0.1 + class-utils: 0.3.6 + component-emitter: 1.3.0 + define-property: 1.0.0 + isobject: 3.0.1 + mixin-deep: 1.3.2 + pascalcase: 0.1.1 + dev: true + + /bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + dependencies: + tweetnacl: 0.14.5 + dev: true + + /bin-check@4.1.0: + resolution: {integrity: sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==} + engines: {node: '>=4'} + dependencies: + execa: 0.7.0 + executable: 4.1.1 + dev: true + + /bin-version-check@5.1.0: + resolution: {integrity: sha512-bYsvMqJ8yNGILLz1KP9zKLzQ6YpljV3ln1gqhuLkUtyfGi3qXKGuK2p+U4NAvjVFzDFiBBtOpCOSFNuYYEGZ5g==} + engines: {node: '>=12'} + dependencies: + bin-version: 6.0.0 + semver: 7.5.3 + semver-truncate: 3.0.0 + dev: true + + /bin-version@6.0.0: + resolution: {integrity: sha512-nk5wEsP4RiKjG+vF+uG8lFsEn4d7Y6FVDamzzftSunXOoOcOOkzcWdKVlGgFFwlUQCj63SgnUkLLGF8v7lufhw==} + engines: {node: '>=12'} + dependencies: + execa: 5.1.1 + find-versions: 5.1.0 + dev: true + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /binaryextensions@2.3.0: + resolution: {integrity: sha512-nAihlQsYGyc5Bwq6+EsubvANYGExeJKHDO3RjnvwU042fawQTQfM3Kxn7IHUXQOz4bzfwsGYYHGSvXyW4zOGLg==} + engines: {node: '>=0.8'} + dev: true + + /blob-util@2.0.2: + resolution: {integrity: sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==} + dev: true + + /bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + dev: true + + /blurhash@1.1.5: + resolution: {integrity: sha512-a+LO3A2DfxTaTztsmkbLYmUzUeApi0LZuKalwbNmqAHR6HhJGMt1qSV/R3wc+w4DL28holjqO3Bg74aUGavGjg==} + dev: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces@2.3.2: + resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==} + engines: {node: '>=0.10.0'} + dependencies: + arr-flatten: 1.1.0 + array-unique: 0.3.2 + extend-shallow: 2.0.1 + fill-range: 4.0.0 + isobject: 3.0.1 + repeat-element: 1.1.4 + snapdragon: 0.8.2 + snapdragon-node: 2.1.1 + split-string: 3.1.0 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /broadcast-channel@4.19.1: + resolution: {integrity: sha512-CroDV8L4QdMuCHtjs0AATaN2w1rA5e6ca9a3yZATmAs3lbFu3q3QkITkuMS4sQ/NjtZwkVANXLlhgyQfiukBuw==} + dependencies: + '@babel/runtime': 7.20.7 + oblivious-set: 1.1.1 + p-queue: 6.6.2 + rimraf: 3.0.2 + unload: 2.4.1 + dev: true + + /browser-process-hrtime@1.0.0: + resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + dev: true + + /browserslist@1.7.7: + resolution: {integrity: sha512-qHJblDE2bXVRYzuDetv/wAeHOJyO97+9wxC1cdCtyzgNuSozOyRCiiLaCR1f71AN66lQdVVBipWm63V+a7bPOw==} + deprecated: Browserslist 2 could fail on reading Browserslist >3.0 config used in other tools. + hasBin: true + dependencies: + caniuse-db: 1.0.30001502 + electron-to-chromium: 1.4.430 + dev: true + + /browserslist@4.21.9: + resolution: {integrity: sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001513 + electron-to-chromium: 1.4.453 + node-releases: 2.0.13 + update-browserslist-db: 1.0.11(browserslist@4.21.9) + dev: true + + /bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + dependencies: + fast-json-stable-stringify: 2.1.0 + dev: true + + /bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + dependencies: + node-int64: 0.4.0 + dev: true + + /buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + dev: true + + /buffer-equal@1.0.1: + resolution: {integrity: sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==} + engines: {node: '>=0.4'} + dev: true + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + + /cache-base@1.0.1: + resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} + engines: {node: '>=0.10.0'} + dependencies: + collection-visit: 1.0.0 + component-emitter: 1.3.0 + get-value: 2.0.6 + has-value: 1.0.0 + isobject: 3.0.1 + set-value: 2.0.1 + to-object-path: 0.3.0 + union-value: 1.0.1 + unset-value: 1.0.0 + dev: true + + /cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + dev: true + + /cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.1.1 + keyv: 4.5.2 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + dev: true + + /cachedir@2.3.0: + resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==} + engines: {node: '>=6'} + dev: true + + /call-bind@1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.2.1 + dev: true + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + dev: true + + /camelcase@3.0.0: + resolution: {integrity: sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==} + engines: {node: '>=0.10.0'} + dev: true + + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: true + + /camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + dev: true + + /caniuse-api@1.6.1: + resolution: {integrity: sha512-SBTl70K0PkDUIebbkXrxWqZlHNs0wRgRD6QZ8guctShjbh63gEPfF+Wj0Yw+75f5Y8tSzqAI/NcisYv/cCah2Q==} + dependencies: + browserslist: 1.7.7 + caniuse-db: 1.0.30001502 + lodash.memoize: 4.1.2 + lodash.uniq: 4.5.0 + dev: true + + /caniuse-db@1.0.30001502: + resolution: {integrity: sha512-nNj61ClInBeMsDqHo20wgMJ40Jhyg9l6W0Z9tipmsc99g43TGvlJky4LP3TlrXbLrVCzRWVS4Gox606M6Hw9Ow==} + dev: true + + /caniuse-lite@1.0.30001513: + resolution: {integrity: sha512-pnjGJo7SOOjAGytZZ203Em95MRM8Cr6jhCXNF/FAXTpCTRTECnqQWLpiTRqrFtdYcth8hf4WECUpkezuYsMVww==} + dev: true + + /caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + dev: true + + /chalk@1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 + dev: true + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + + /chalk@4.0.0: + resolution: {integrity: sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + dev: true + + /charenc@0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + dev: true + + /chart.js@4.3.0: + resolution: {integrity: sha512-ynG0E79xGfMaV2xAHdbhwiPLczxnNNnasrmPEXriXsPJGjmhOBYzFVEsB65w2qMDz+CaBJJuJD0inE/ab/h36g==} + engines: {pnpm: '>=7'} + dependencies: + '@kurkle/color': 0.3.2 + dev: true + + /chartjs-adapter-date-fns@3.0.0(chart.js@4.3.0)(date-fns@2.30.0): + resolution: {integrity: sha512-Rs3iEB3Q5pJ973J93OBTpnP7qoGwvq3nUnoMdtxO+9aoJof7UFcRbWcIDteXuYd1fgAvct/32T9qaLyLuZVwCg==} + peerDependencies: + chart.js: '>=2.8.0' + date-fns: '>=2.0.0' + dependencies: + chart.js: 4.3.0 + date-fns: 2.30.0 + dev: true + + /chartjs-chart-matrix@2.0.1(chart.js@4.3.0): + resolution: {integrity: sha512-BGfeY+/PHnITyDlc7WfnKJ1RyOfgOzIqWp/gxzzl7pUjyoGzHDcw51qd2xJF9gdT9Def7ZwOnOMm8GJUXDxI0w==} + peerDependencies: + chart.js: '>=3.0.0' + dependencies: + chart.js: 4.3.0 + dev: true + + /chartjs-plugin-gradient@0.6.1(chart.js@4.3.0): + resolution: {integrity: sha512-TGHNIh8KqQMLdb+UfY80cBHYRyOC47eeokmgkeajRdKGbFt462lJiyiq4ZJ25fiM7BGsmzoBLhmVyEw4B3gQxw==} + peerDependencies: + chart.js: '>=2.6.0' + dependencies: + chart.js: 4.3.0 + dev: true + + /chartjs-plugin-zoom@2.0.1(chart.js@4.3.0): + resolution: {integrity: sha512-ogOmLu6e+Q7E1XWOCOz9YwybMslz9qNfGV2a+qjfmqJYpsw5ZMoRHZBUyW+NGhkpQ5PwwPA/+rikHpBZb7PZuA==} + peerDependencies: + chart.js: '>=3.2.0' + dependencies: + chart.js: 4.3.0 + hammerjs: 2.0.8 + dev: true + + /check-more-types@2.24.0: + resolution: {integrity: sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==} + engines: {node: '>= 0.8.0'} + dev: true + + /chokidar@3.3.1: + resolution: {integrity: sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.3.0 + optionalDependencies: + fsevents: 2.1.3 + dev: true + + /chrome-trace-event@1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + engines: {node: '>=6.0'} + dev: true + + /ci-info@3.8.0: + resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} + engines: {node: '>=8'} + dev: true + + /city-timezones@1.2.1: + resolution: {integrity: sha512-hruuB611QFoUFMsan7xd9B2VPMrA8XC716O/999WW34kmaJUT1hxKF2W8TSXAWkhSqgvbu70DjcDv7/wpM6vow==} + dependencies: + lodash: 4.17.21 + dev: true + + /cjs-module-lexer@1.2.3: + resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + dev: true + + /clap@1.2.3: + resolution: {integrity: sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==} + engines: {node: '>=0.10.0'} + dependencies: + chalk: 1.1.3 + dev: true + + /class-utils@0.3.6: + resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-union: 3.1.0 + define-property: 0.2.5 + isobject: 3.0.1 + static-extend: 0.1.2 + dev: true + + /clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + dev: true + + /cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + dependencies: + restore-cursor: 3.1.0 + dev: true + + /cli-table3@0.6.3: + resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==} + engines: {node: 10.* || >= 12.*} + dependencies: + string-width: 4.2.3 + optionalDependencies: + '@colors/colors': 1.5.0 + dev: true + + /cli-truncate@2.1.0: + resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} + engines: {node: '>=8'} + dependencies: + slice-ansi: 3.0.0 + string-width: 4.2.3 + dev: true + + /cliui@3.2.0: + resolution: {integrity: sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==} + dependencies: + string-width: 1.0.2 + strip-ansi: 3.0.1 + wrap-ansi: 2.1.0 + dev: true + + /cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /clone-buffer@1.0.0: + resolution: {integrity: sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==} + engines: {node: '>= 0.10'} + dev: true + + /clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + dev: true + + /clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + dependencies: + mimic-response: 1.0.1 + dev: true + + /clone-stats@1.0.0: + resolution: {integrity: sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==} + dev: true + + /clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + dev: true + + /clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + dev: true + + /cloneable-readable@1.1.3: + resolution: {integrity: sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==} + dependencies: + inherits: 2.0.4 + process-nextick-args: 2.0.1 + readable-stream: 2.3.8 + dev: true + + /co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: true + + /coa@1.0.4: + resolution: {integrity: sha512-KAGck/eNAmCL0dcT3BiuYwLbExK6lduR8DxM3C1TyDzaXhZHyZ8ooX5I5+na2e3dPFuibfxrGdorr0/Lr7RYCQ==} + engines: {node: '>= 0.8.0'} + dependencies: + q: 1.5.1 + dev: true + + /code-point-at@1.1.0: + resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} + engines: {node: '>=0.10.0'} + dev: true + + /collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + dev: true + + /collection-map@1.0.0: + resolution: {integrity: sha512-5D2XXSpkOnleOI21TG7p3T0bGAsZ/XknZpKBmGYyluO8pw4zA3K8ZlrBIbC4FXg3m6z/RNFiUFfT2sQK01+UHA==} + engines: {node: '>=0.10.0'} + dependencies: + arr-map: 2.0.2 + for-own: 1.0.0 + make-iterator: 1.0.1 + dev: true + + /collection-visit@1.0.0: + resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==} + engines: {node: '>=0.10.0'} + dependencies: + map-visit: 1.0.0 + object-visit: 1.0.1 + dev: true + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: true + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /color-string@0.3.0: + resolution: {integrity: sha512-sz29j1bmSDfoAxKIEU6zwoIZXN6BrFbAMIhfYCNyiZXBDuU/aiHlN84lp/xDzL2ubyFhLDobHIlU1X70XRrMDA==} + dependencies: + color-name: 1.1.4 + dev: true + + /color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + dev: true + + /color@0.11.4: + resolution: {integrity: sha512-Ajpjd8asqZ6EdxQeqGzU5WBhhTfJ/0cA4Wlbre7e5vXfmDSmda7Ov6jeKoru+b0vHcb1CqvuroTHp5zIWzhVMA==} + dependencies: + clone: 1.0.4 + color-convert: 1.9.3 + color-string: 0.3.0 + dev: true + + /colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + dev: true + + /colormin@1.1.2: + resolution: {integrity: sha512-XSEQUUQUR/lXqGyddiNH3XYFUPYlYr1vXy9rTFMsSOw+J7Q6EQkdlQIrTlYn4TccpsOaUE1PYQNjBn20gwCdgQ==} + dependencies: + color: 0.11.4 + css-color-names: 0.0.4 + has: 1.0.3 + dev: true + + /colors@1.1.2: + resolution: {integrity: sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w==} + engines: {node: '>=0.1.90'} + dev: true + + /colors@1.2.5: + resolution: {integrity: sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==} + engines: {node: '>=0.1.90'} + dev: true + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: true + + /commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + dev: true + + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + dev: true + + /commander@5.1.0: + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + engines: {node: '>= 6'} + dev: true + + /commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + dev: true + + /commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + dev: true + + /commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + dev: true + + /common-tags@1.8.2: + resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} + engines: {node: '>=4.0.0'} + dev: true + + /compare-versions@5.0.3: + resolution: {integrity: sha512-4UZlZP8Z99MGEY+Ovg/uJxJuvoXuN4M6B3hKaiackiHrgzQFEe3diJi1mf1PNHbFujM7FvLrK2bpgIaImbtZ1A==} + dev: true + + /component-emitter@1.3.0: + resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /concat-stream@1.6.2: + resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} + engines: {'0': node >= 0.8} + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 2.3.8 + typedarray: 0.0.6 + dev: true + + /content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: true + + /copy-descriptor@0.1.1: + resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==} + engines: {node: '>=0.10.0'} + dev: true + + /copy-props@2.0.5: + resolution: {integrity: sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==} + dependencies: + each-props: 1.3.2 + is-plain-object: 5.0.0 + dev: true + + /core-js@3.31.1: + resolution: {integrity: sha512-2sKLtfq1eFST7l7v62zaqXacPc7uG8ZAya8ogijLhTtaKNcpzpB4TMoTw2Si+8GYKRwFPMMtUT0263QFWFfqyQ==} + requiresBuild: true + dev: true + + /core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + dev: true + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true + + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + + /cropperjs@2.0.0-beta.2: + resolution: {integrity: sha512-jDRSODDGKmi9vp3p/+WXkxMqV/AE+GpSld1U3cHZDRdLy9UykRzurSe8k1dR0TExn45ygCMrv31qkg+K3EeXXw==} + dependencies: + '@cropper/elements': 2.0.0-beta.3 + '@cropper/utils': 2.0.0-beta.3 + dev: true + + /cross-env@7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + dependencies: + cross-spawn: 7.0.3 + dev: true + + /cross-fetch@3.1.8: + resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} + dependencies: + node-fetch: 2.6.12 + transitivePeerDependencies: + - encoding + dev: true + + /cross-spawn@5.1.0: + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + dependencies: + lru-cache: 4.1.5 + shebang-command: 1.2.0 + which: 1.3.1 + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /crypt@0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + dev: true + + /css-color-names@0.0.4: + resolution: {integrity: sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q==} + dev: true + + /cssnano@3.10.0: + resolution: {integrity: sha512-0o0IMQE0Ezo4b41Yrm8U6Rp9/Ag81vNXY1gZMnT1XhO4DpjEf2utKERqWJbOoz3g1Wdc1d3QSta/cIuJ1wSTEg==} + dependencies: + autoprefixer: 6.7.7 + decamelize: 1.2.0 + defined: 1.0.1 + has: 1.0.3 + object-assign: 4.1.1 + postcss: 5.2.18 + postcss-calc: 5.3.1 + postcss-colormin: 2.2.2 + postcss-convert-values: 2.6.1 + postcss-discard-comments: 2.0.4 + postcss-discard-duplicates: 2.1.0 + postcss-discard-empty: 2.1.0 + postcss-discard-overridden: 0.1.1 + postcss-discard-unused: 2.2.3 + postcss-filter-plugins: 2.0.3 + postcss-merge-idents: 2.1.7 + postcss-merge-longhand: 2.0.2 + postcss-merge-rules: 2.1.2 + postcss-minify-font-values: 1.0.5 + postcss-minify-gradients: 1.0.5 + postcss-minify-params: 1.2.2 + postcss-minify-selectors: 2.1.1 + postcss-normalize-charset: 1.1.1 + postcss-normalize-url: 3.0.8 + postcss-ordered-values: 2.2.3 + postcss-reduce-idents: 2.4.0 + postcss-reduce-initial: 1.0.1 + postcss-reduce-transforms: 1.0.4 + postcss-svgo: 2.1.6 + postcss-unique-selectors: 2.0.2 + postcss-value-parser: 3.3.1 + postcss-zindex: 2.2.0 + dev: true + + /csso@2.3.2: + resolution: {integrity: sha512-FmCI/hmqDeHHLaIQckMhMZneS84yzUZdrWDAvJVVxOwcKE1P1LF9FGmzr1ktIQSxOw6fl3PaQsmfg+GN+VvR3w==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + clap: 1.2.3 + source-map: 0.5.7 + dev: true + + /cssom@0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + dev: true + + /cssom@0.4.4: + resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} + dev: true + + /cssstyle@2.3.0: + resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} + engines: {node: '>=8'} + dependencies: + cssom: 0.3.8 + dev: true + + /csstype@3.1.2: + resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + dev: true + + /custom-event-polyfill@1.0.7: + resolution: {integrity: sha512-TDDkd5DkaZxZFM8p+1I3yAlvM3rSr1wbrOliG4yJiwinMZN8z/iGL7BTlDkrJcYTmgUSb4ywVCc3ZaUtOtC76w==} + dev: true + + /cypress@10.11.0: + resolution: {integrity: sha512-lsaE7dprw5DoXM00skni6W5ElVVLGAdRUUdZjX2dYsGjbY/QnpzWZ95Zom1mkGg0hAaO/QVTZoFVS7Jgr/GUPA==} + engines: {node: '>=12.0.0'} + hasBin: true + requiresBuild: true + dependencies: + '@cypress/request': 2.88.11 + '@cypress/xvfb': 1.2.4(supports-color@8.1.1) + '@types/node': 14.18.51 + '@types/sinonjs__fake-timers': 8.1.1 + '@types/sizzle': 2.3.3 + arch: 2.2.0 + blob-util: 2.0.2 + bluebird: 3.7.2 + buffer: 5.7.1 + cachedir: 2.3.0 + chalk: 4.1.2 + check-more-types: 2.24.0 + cli-cursor: 3.1.0 + cli-table3: 0.6.3 + commander: 5.1.0 + common-tags: 1.8.2 + dayjs: 1.11.8 + debug: 4.3.4(supports-color@8.1.1) + enquirer: 2.3.6 + eventemitter2: 6.4.7 + execa: 4.1.0 + executable: 4.1.1 + extract-zip: 2.0.1(supports-color@8.1.1) + figures: 3.2.0 + fs-extra: 9.1.0 + getos: 3.2.1 + is-ci: 3.0.1 + is-installed-globally: 0.4.0 + lazy-ass: 1.6.0 + listr2: 3.14.0(enquirer@2.3.6) + lodash: 4.17.21 + log-symbols: 4.1.0 + minimist: 1.2.8 + ospath: 1.2.2 + pretty-bytes: 5.6.0 + proxy-from-env: 1.0.0 + request-progress: 3.0.0 + semver: 7.3.8 + supports-color: 8.1.1 + tmp: 0.2.1 + untildify: 4.0.0 + yauzl: 2.10.0 + dev: true + + /d@1.0.1: + resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} + dependencies: + es5-ext: 0.10.62 + type: 1.2.0 + dev: true + + /dashdash@1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} + dependencies: + assert-plus: 1.0.0 + dev: true + + /data-urls@2.0.0: + resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} + engines: {node: '>=10'} + dependencies: + abab: 2.0.6 + whatwg-mimetype: 2.3.0 + whatwg-url: 8.7.0 + dev: true + + /date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + dependencies: + '@babel/runtime': 7.22.6 + dev: true + + /dayjs@1.11.8: + resolution: {integrity: sha512-LcgxzFoWMEPO7ggRv1Y2N31hUf2R0Vj7fuy/m+Bg1K8rr+KAs1AEy4y9jd5DXe8pbHgX+srkHNS7TH6Q6ZhYeQ==} + dev: true + + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: true + + /debug@3.2.7(supports-color@8.1.1): + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + supports-color: 8.1.1 + dev: true + + /debug@4.3.4(supports-color@8.1.1): + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + supports-color: 8.1.1 + dev: true + + /decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + dev: true + + /decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + dev: true + + /decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + dev: true + + /decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + dev: true + + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + dev: true + + /dedent@0.7.0: + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + dev: true + + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + dev: true + + /default-compare@1.0.0: + resolution: {integrity: sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 5.1.0 + dev: true + + /default-resolution@2.0.0: + resolution: {integrity: sha512-2xaP6GiwVwOEbXCGoJ4ufgC76m8cj805jrghScewJC2ZDsb9U0b4BIrba+xt/Uytyd0HvQ6+WymSRTfnYj59GQ==} + engines: {node: '>= 0.10'} + dev: true + + /defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + dev: true + + /define-properties@1.2.0: + resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} + engines: {node: '>= 0.4'} + dependencies: + has-property-descriptors: 1.0.0 + object-keys: 1.1.1 + dev: true + + /define-property@0.2.5: + resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 0.1.6 + dev: true + + /define-property@1.0.0: + resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 1.0.2 + dev: true + + /define-property@2.0.2: + resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-descriptor: 1.0.2 + isobject: 3.0.1 + dev: true + + /defined@1.0.1: + resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==} + dev: true + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: true + + /detect-file@1.0.0: + resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} + engines: {node: '>=0.10.0'} + dev: true + + /detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + dev: true + + /diff-sequences@27.5.1: + resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: true + + /diff-sequences@29.4.3: + resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /domexception@2.0.1: + resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} + engines: {node: '>=8'} + dependencies: + webidl-conversions: 5.0.0 + dev: true + + /duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + dev: true + + /duplexify@3.7.1: + resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 2.3.8 + stream-shift: 1.0.1 + dev: true + + /each-props@1.3.2: + resolution: {integrity: sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==} + dependencies: + is-plain-object: 2.0.4 + object.defaults: 1.1.0 + dev: true + + /ecc-jsbn@0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + dev: true + + /electron-to-chromium@1.4.430: + resolution: {integrity: sha512-FytjTbGwz///F+ToZ5XSeXbbSaXalsVRXsz2mHityI5gfxft7ieW3HqFLkU5V1aIrY42aflICqbmFoDxW10etg==} + dev: true + + /electron-to-chromium@1.4.453: + resolution: {integrity: sha512-BU8UtQz6CB3T7RIGhId4BjmjJVXQDujb0+amGL8jpcluFJr6lwspBOvkUbnttfpZCm4zFMHmjrX1QrdPWBBMjQ==} + dev: true + + /emittery@0.8.1: + resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==} + engines: {node: '>=10'} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: true + + /enhanced-resolve@5.15.0: + resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + dev: true + + /enquirer@2.3.6: + resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} + engines: {node: '>=8.6'} + dependencies: + ansi-colors: 4.1.3 + dev: true + + /envinfo@7.10.0: + resolution: {integrity: sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: true + + /es-module-lexer@1.3.0: + resolution: {integrity: sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==} + dev: true + + /es5-ext@0.10.62: + resolution: {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==} + engines: {node: '>=0.10'} + requiresBuild: true + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.3 + next-tick: 1.1.0 + dev: true + + /es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-symbol: 3.1.3 + dev: true + + /es6-symbol@3.1.3: + resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} + dependencies: + d: 1.0.1 + ext: 1.7.0 + dev: true + + /es6-weak-map@2.0.3: + resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-iterator: 2.0.3 + es6-symbol: 3.1.3 + dev: true + + /esbuild@0.17.19: + resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.17.19 + '@esbuild/android-arm64': 0.17.19 + '@esbuild/android-x64': 0.17.19 + '@esbuild/darwin-arm64': 0.17.19 + '@esbuild/darwin-x64': 0.17.19 + '@esbuild/freebsd-arm64': 0.17.19 + '@esbuild/freebsd-x64': 0.17.19 + '@esbuild/linux-arm': 0.17.19 + '@esbuild/linux-arm64': 0.17.19 + '@esbuild/linux-ia32': 0.17.19 + '@esbuild/linux-loong64': 0.17.19 + '@esbuild/linux-mips64el': 0.17.19 + '@esbuild/linux-ppc64': 0.17.19 + '@esbuild/linux-riscv64': 0.17.19 + '@esbuild/linux-s390x': 0.17.19 + '@esbuild/linux-x64': 0.17.19 + '@esbuild/netbsd-x64': 0.17.19 + '@esbuild/openbsd-x64': 0.17.19 + '@esbuild/sunos-x64': 0.17.19 + '@esbuild/win32-arm64': 0.17.19 + '@esbuild/win32-ia32': 0.17.19 + '@esbuild/win32-x64': 0.17.19 + dev: true + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /escape-regexp@0.0.1: + resolution: {integrity: sha512-jVgdsYRa7RKxTT6MKNC3gdT+BF0Gfhpel19+HMRZJC2L0PufB0XOBuXBoXj29NKHwuktnAXd1Z1lyiH/8vOTpw==} + dev: true + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: true + + /escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + dev: true + + /escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + dev: true + + /escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + dev: true + + /eslint-formatter-pretty@4.1.0: + resolution: {integrity: sha512-IsUTtGxF1hrH6lMWiSl1WbGaiP01eT6kzywdY1U+zLc0MP+nwEnUiS9UI8IaOTUhTeQJLlCEWIbXINBH4YJbBQ==} + engines: {node: '>=10'} + dependencies: + '@types/eslint': 7.29.0 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + eslint-rule-docs: 1.1.235 + log-symbols: 4.1.0 + plur: 4.0.0 + string-width: 4.2.3 + supports-hyperlinks: 2.3.0 + dev: true + + /eslint-rule-docs@1.1.235: + resolution: {integrity: sha512-+TQ+x4JdTnDoFEXXb3fDvfGOwnyNV7duH8fXWTPD1ieaBmB8omj7Gw/pMBBu4uI2uJCCU8APDaQJzWuXnTsH4A==} + dev: true + + /eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true + + /esprima@2.7.3: + resolution: {integrity: sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==} + engines: {node: '>=0.10.0'} + hasBin: true + dev: true + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + dev: true + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /estree-walker@1.0.1: + resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} + dev: true + + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: true + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /event-stream@3.3.4: + resolution: {integrity: sha512-QHpkERcGsR0T7Qm3HNJSyXKEEj8AHNxkY3PK8TS2KJvQ7NiSHe3DDpwVKKtoYprL/AreyzFBeIkBIWChAqn60g==} + dependencies: + duplexer: 0.1.2 + from: 0.1.7 + map-stream: 0.1.0 + pause-stream: 0.0.11 + split: 0.3.3 + stream-combiner: 0.0.4 + through: 2.3.8 + dev: true + + /eventemitter2@6.4.7: + resolution: {integrity: sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==} + dev: true + + /eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + dev: true + + /execa@0.7.0: + resolution: {integrity: sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==} + engines: {node: '>=4'} + dependencies: + cross-spawn: 5.1.0 + get-stream: 3.0.0 + is-stream: 1.1.0 + npm-run-path: 2.0.2 + p-finally: 1.0.0 + signal-exit: 3.0.7 + strip-eof: 1.0.0 + dev: true + + /execa@4.1.0: + resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 5.2.0 + human-signals: 1.1.1 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /executable@4.1.1: + resolution: {integrity: sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==} + engines: {node: '>=4'} + dependencies: + pify: 2.3.0 + dev: true + + /executioner@2.0.1: + resolution: {integrity: sha512-idZAlKsxEZASjaIqP4PQ1txyS1bOcDwWCHy/8p5oMmLGV0XNCQPD6WWAOwJCUVsWItWzAN2BEash5N78PliaIw==} + dependencies: + mixly: 1.0.0 + dev: true + + /exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + dev: true + + /expand-brackets@2.1.4: + resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==} + engines: {node: '>=0.10.0'} + dependencies: + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + posix-character-classes: 0.1.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /expand-tilde@2.0.2: + resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} + engines: {node: '>=0.10.0'} + dependencies: + homedir-polyfill: 1.0.3 + dev: true + + /expect@27.5.1: + resolution: {integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + jest-get-type: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + dev: true + + /ext-list@2.2.2: + resolution: {integrity: sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==} + engines: {node: '>=0.10.0'} + dependencies: + mime-db: 1.52.0 + dev: true + + /ext-name@5.0.0: + resolution: {integrity: sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==} + engines: {node: '>=4'} + dependencies: + ext-list: 2.2.2 + sort-keys-length: 1.0.1 + dev: true + + /ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + dependencies: + type: 2.7.2 + dev: true + + /extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: 0.1.1 + dev: true + + /extend-shallow@3.0.2: + resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} + engines: {node: '>=0.10.0'} + dependencies: + assign-symbols: 1.0.0 + is-extendable: 1.0.1 + dev: true + + /extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + dev: true + + /extglob@2.0.4: + resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==} + engines: {node: '>=0.10.0'} + dependencies: + array-unique: 0.3.2 + define-property: 1.0.0 + expand-brackets: 2.1.4 + extend-shallow: 2.0.1 + fragment-cache: 0.2.1 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /extract-zip@2.0.1(supports-color@8.1.1): + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + dependencies: + debug: 4.3.4(supports-color@8.1.1) + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.0 + transitivePeerDependencies: + - supports-color + dev: true + + /extsprintf@1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} + dev: true + + /fancy-log@1.3.3: + resolution: {integrity: sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==} + engines: {node: '>= 0.10'} + dependencies: + ansi-gray: 0.1.1 + color-support: 1.1.3 + parse-node-version: 1.0.1 + time-stamp: 1.1.0 + dev: true + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fast-glob@3.3.0: + resolution: {integrity: sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein@1.1.4: + resolution: {integrity: sha512-Ia0sQNrMPXXkqVFt6w6M1n1oKo3NfKs+mvaV811Jwir7vAk9a6PVV9VPYf6X3BU97QiLEmuW3uXH9u87zDFfdw==} + dev: true + + /fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + dev: true + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + dependencies: + bser: 2.1.1 + dev: true + + /fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + dependencies: + pend: 1.2.0 + dev: true + + /figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + dependencies: + escape-string-regexp: 1.0.5 + dev: true + + /file-type@17.1.6: + resolution: {integrity: sha512-hlDw5Ev+9e883s0pwUsuuYNu4tD7GgpUnOvykjv1Gya0ZIjuKumthDRua90VUn6/nlRKAjcxLUnHNTIUWwWIiw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + readable-web-to-node-stream: 3.0.2 + strtok3: 7.0.0 + token-types: 5.0.1 + dev: true + + /filename-reserved-regex@3.0.0: + resolution: {integrity: sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /filenamify@5.1.1: + resolution: {integrity: sha512-M45CbrJLGACfrPOkrTp3j2EcO9OBkKUYME0eiqOCa7i2poaklU0jhlIaMlr8ijLorT0uLAzrn3qXOp5684CkfA==} + engines: {node: '>=12.20'} + dependencies: + filename-reserved-regex: 3.0.0 + strip-outer: 2.0.0 + trim-repeated: 2.0.0 + dev: true + + /fill-range@4.0.0: + resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 2.0.1 + is-number: 3.0.0 + repeat-string: 1.6.1 + to-regex-range: 2.1.1 + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /find-up@1.1.2: + resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} + engines: {node: '>=0.10.0'} + dependencies: + path-exists: 2.1.0 + pinkie-promise: 2.0.1 + dev: true + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + + /find-versions@5.1.0: + resolution: {integrity: sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg==} + engines: {node: '>=12'} + dependencies: + semver-regex: 4.0.5 + dev: true + + /findup-sync@2.0.0: + resolution: {integrity: sha512-vs+3unmJT45eczmcAZ6zMJtxN3l/QXeccaXQx5cu/MeJMhewVfoWZqibRkOxPnmoR59+Zy5hjabfQc6JLSah4g==} + engines: {node: '>= 0.10'} + dependencies: + detect-file: 1.0.0 + is-glob: 3.1.0 + micromatch: 3.1.10 + resolve-dir: 1.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /findup-sync@3.0.0: + resolution: {integrity: sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==} + engines: {node: '>= 0.10'} + dependencies: + detect-file: 1.0.0 + is-glob: 4.0.3 + micromatch: 3.1.10 + resolve-dir: 1.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /fined@1.2.0: + resolution: {integrity: sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==} + engines: {node: '>= 0.10'} + dependencies: + expand-tilde: 2.0.2 + is-plain-object: 2.0.4 + object.defaults: 1.1.0 + object.pick: 1.3.0 + parse-filepath: 1.0.2 + dev: true + + /flagged-respawn@1.0.1: + resolution: {integrity: sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==} + engines: {node: '>= 0.10'} + dev: true + + /flatten@1.0.3: + resolution: {integrity: sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==} + deprecated: flatten is deprecated in favor of utility frameworks such as lodash. + dev: true + + /flush-write-stream@1.1.1: + resolution: {integrity: sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==} + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + dev: true + + /focus-trap-vue@4.0.2(focus-trap@7.4.3)(vue@3.3.4): + resolution: {integrity: sha512-2iQN2xKCSCzyhcD90VpueQcTIAhaCRxxo67fkz7RSqLmEd16QKjfGslCr3KxvBx0LfpVN9j0IAyKKuJKw3Intg==} + peerDependencies: + focus-trap: ^7.0.0 + vue: ^3.0.0 + dependencies: + focus-trap: 7.4.3 + vue: 3.3.4 + dev: true + + /focus-trap@7.4.3: + resolution: {integrity: sha512-BgSSbK4GPnS2VbtZ50VtOv1Sti6DIkj3+LkVjiWMNjLeAp1SH1UlLx3ULu/DCu4vq5R4/uvTm+zrvsMsuYmGLg==} + dependencies: + tabbable: 6.2.0 + dev: true + + /follow-redirects@1.15.2(debug@4.3.4): + resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dependencies: + debug: 4.3.4(supports-color@8.1.1) + dev: true + + /for-in@1.0.2: + resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} + engines: {node: '>=0.10.0'} + dev: true + + /for-own@1.0.0: + resolution: {integrity: sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==} + engines: {node: '>=0.10.0'} + dependencies: + for-in: 1.0.2 + dev: true + + /forever-agent@0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + dev: true + + /form-data@2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + + /form-data@3.0.1: + resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + + /fragment-cache@0.2.1: + resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==} + engines: {node: '>=0.10.0'} + dependencies: + map-cache: 0.2.2 + dev: true + + /from@0.1.7: + resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==} + dev: true + + /fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + + /fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: true + + /fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: true + + /fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + dev: true + + /fs-mkdirp-stream@1.0.0: + resolution: {integrity: sha512-+vSd9frUnapVC2RZYfL3FCB2p3g4TBhaUmrsWlSudsGdnxIuUvBB2QM1VZeBtc49QFwrp+wQLrDs3+xxDgI5gQ==} + engines: {node: '>= 0.10'} + dependencies: + graceful-fs: 4.2.11 + through2: 2.0.5 + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.1.3: + resolution: {integrity: sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + deprecated: '"Please update to latest v2.3 or v2.2"' + requiresBuild: true + dev: true + optional: true + + /fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /fulcon@1.0.2: + resolution: {integrity: sha512-vYwUBqbdo9XK0NmN7cFmURmy2T1YHpEsTCbxGO3aErxx6a0Z/HkWXcqcPkk7yOuJ74mSAHGWGBSBBd6v3GKebA==} + engines: {node: '>= 0.10'} + dev: true + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + + /get-caller-file@1.0.3: + resolution: {integrity: sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==} + dev: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /get-intrinsic@1.2.1: + resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-proto: 1.0.1 + has-symbols: 1.0.3 + dev: true + + /get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + dev: true + + /get-stream@3.0.0: + resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} + engines: {node: '>=4'} + dev: true + + /get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + dependencies: + pump: 3.0.0 + dev: true + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /get-value@2.0.6: + resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} + engines: {node: '>=0.10.0'} + dev: true + + /getos@3.2.1: + resolution: {integrity: sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==} + dependencies: + async: 3.2.4 + dev: true + + /getpass@0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + dependencies: + assert-plus: 1.0.0 + dev: true + + /glob-parent@3.1.0: + resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==} + dependencies: + is-glob: 3.1.0 + path-dirname: 1.0.2 + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-stream@6.1.0: + resolution: {integrity: sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw==} + engines: {node: '>= 0.10'} + dependencies: + extend: 3.0.2 + glob: 7.2.3 + glob-parent: 3.1.0 + is-negated-glob: 1.0.0 + ordered-read-streams: 1.0.1 + pumpify: 1.5.1 + readable-stream: 2.3.8 + remove-trailing-separator: 1.1.0 + to-absolute-glob: 2.0.2 + unique-stream: 2.3.1 + dev: true + + /glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + dev: true + + /glob-watcher@5.0.5: + resolution: {integrity: sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==} + engines: {node: '>= 0.10'} + dependencies: + anymatch: 2.0.0 + async-done: 1.3.2 + chokidar: 3.3.1 + is-negated-glob: 1.0.0 + just-debounce: 1.1.0 + normalize-path: 3.0.0 + object.defaults: 1.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /global-dirs@3.0.1: + resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} + engines: {node: '>=10'} + dependencies: + ini: 2.0.0 + dev: true + + /global-modules@1.0.0: + resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} + engines: {node: '>=0.10.0'} + dependencies: + global-prefix: 1.0.2 + is-windows: 1.0.2 + resolve-dir: 1.0.1 + dev: true + + /global-prefix@1.0.2: + resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} + engines: {node: '>=0.10.0'} + dependencies: + expand-tilde: 2.0.2 + homedir-polyfill: 1.0.3 + ini: 1.3.8 + is-windows: 1.0.2 + which: 1.3.1 + dev: true + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.0 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /glogg@1.0.2: + resolution: {integrity: sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==} + engines: {node: '>= 0.10'} + dependencies: + sparkles: 1.0.1 + dev: true + + /got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.0 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + dev: true + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: true + + /gsap@3.11.5: + resolution: {integrity: sha512-Q89nKCLgoX5xUjznh9LcaIUkz54k1voNucT1Rpf9SJNFIQznBwFqt5qUUQbeVInFyN/n18OUJkpeI6CNEDt74w==} + dev: true + + /gulp-cli@2.3.0: + resolution: {integrity: sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==} + engines: {node: '>= 0.10'} + hasBin: true + dependencies: + ansi-colors: 1.1.0 + archy: 1.0.0 + array-sort: 1.0.0 + color-support: 1.1.3 + concat-stream: 1.6.2 + copy-props: 2.0.5 + fancy-log: 1.3.3 + gulplog: 1.0.0 + interpret: 1.4.0 + isobject: 3.0.1 + liftoff: 3.1.0 + matchdep: 2.0.0 + mute-stdout: 1.0.1 + pretty-hrtime: 1.0.3 + replace-homedir: 1.0.0 + semver-greatest-satisfied-range: 1.1.0 + v8flags: 3.2.0 + yargs: 7.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /gulp-cssnano@2.1.3: + resolution: {integrity: sha512-r8qdX5pTXsBb/IRm9loE8Ijz8UiPW/URMC/bKJe4FPNHRaz4aEx8Bev03L0FYHd/7BSGu/ebmfumAkpGuTdenA==} + dependencies: + buffer-from: 1.1.2 + cssnano: 3.10.0 + object-assign: 4.1.1 + plugin-error: 1.0.1 + vinyl-sourcemaps-apply: 0.2.1 + dev: true + + /gulp-rename@2.0.0: + resolution: {integrity: sha512-97Vba4KBzbYmR5VBs9mWmK+HwIf5mj+/zioxfZhOKeXtx5ZjBk57KFlePf5nxq9QsTtFl0ejnHE3zTC9MHXqyQ==} + engines: {node: '>=4'} + dev: true + + /gulp-replace@1.1.4: + resolution: {integrity: sha512-SVSF7ikuWKhpAW4l4wapAqPPSToJoiNKsbDoUnRrSgwZHH7lH8pbPeQj1aOVYQrbZKhfSVBxVW+Py7vtulRktw==} + engines: {node: '>=10'} + dependencies: + '@types/node': 20.3.1 + '@types/vinyl': 2.0.7 + istextorbinary: 3.3.0 + replacestream: 4.0.3 + yargs-parser: 21.1.1 + dev: true + + /gulp-terser@2.1.0: + resolution: {integrity: sha512-lQ3+JUdHDVISAlUIUSZ/G9Dz/rBQHxOiYDQ70IVWFQeh4b33TC1MCIU+K18w07PS3rq/CVc34aQO4SUbdaNMPQ==} + engines: {node: '>=10'} + dependencies: + plugin-error: 1.0.1 + terser: 5.18.0 + through2: 4.0.2 + vinyl-sourcemaps-apply: 0.2.1 + dev: true + + /gulp@4.0.2: + resolution: {integrity: sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==} + engines: {node: '>= 0.10'} + hasBin: true + dependencies: + glob-watcher: 5.0.5 + gulp-cli: 2.3.0 + undertaker: 1.3.0 + vinyl-fs: 3.0.3 + transitivePeerDependencies: + - supports-color + dev: true + + /gulplog@1.0.0: + resolution: {integrity: sha512-hm6N8nrm3Y08jXie48jsC55eCZz9mnb4OirAStEk2deqeyhXU3C1otDVh+ccttMuc1sBi6RX6ZJ720hs9RCvgw==} + engines: {node: '>= 0.10'} + dependencies: + glogg: 1.0.2 + dev: true + + /hammerjs@2.0.8: + resolution: {integrity: sha512-tSQXBXS/MWQOn/RKckawJ61vvsDpCom87JgxiYdGwHdOa0ht0vzUWDlfioofFCRU0L+6NGDt6XzbgoJvZkMeRQ==} + engines: {node: '>=0.8.0'} + dev: true + + /hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + dev: true + + /has-ansi@2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + dev: true + + /has-flag@1.0.0: + resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} + engines: {node: '>=0.10.0'} + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-property-descriptors@1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + dependencies: + get-intrinsic: 1.2.1 + dev: true + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + dev: true + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: true + + /has-value@0.3.1: + resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==} + engines: {node: '>=0.10.0'} + dependencies: + get-value: 2.0.6 + has-values: 0.1.4 + isobject: 2.1.0 + dev: true + + /has-value@1.0.0: + resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==} + engines: {node: '>=0.10.0'} + dependencies: + get-value: 2.0.6 + has-values: 1.0.0 + isobject: 3.0.1 + dev: true + + /has-values@0.1.4: + resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==} + engines: {node: '>=0.10.0'} + dev: true + + /has-values@1.0.0: + resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 3.0.0 + kind-of: 4.0.0 + dev: true + + /has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /homedir-polyfill@1.0.3: + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} + engines: {node: '>=0.10.0'} + dependencies: + parse-passwd: 1.0.0 + dev: true + + /hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true + + /hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + dependencies: + lru-cache: 6.0.0 + dev: true + + /html-comment-regex@1.1.2: + resolution: {integrity: sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==} + dev: true + + /html-encoding-sniffer@2.0.1: + resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} + engines: {node: '>=10'} + dependencies: + whatwg-encoding: 1.0.5 + dev: true + + /html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: true + + /http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + dev: true + + /http-proxy-agent@4.0.1: + resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': 1.1.2 + agent-base: 6.0.2 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + + /http-signature@1.3.6: + resolution: {integrity: sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==} + engines: {node: '>=0.10'} + dependencies: + assert-plus: 1.0.0 + jsprim: 2.0.2 + sshpk: 1.17.0 + dev: true + + /http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + dev: true + + /https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4(supports-color@8.1.1) + transitivePeerDependencies: + - supports-color + dev: true + + /human-signals@1.1.1: + resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} + engines: {node: '>=8.12.0'} + dev: true + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /idb-keyval@6.2.1: + resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==} + dev: true + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true + + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + dev: true + + /immutable@4.3.0: + resolution: {integrity: sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==} + dev: true + + /import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + dev: true + + /import-local@3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + hasBin: true + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: true + + /indexes-of@1.0.1: + resolution: {integrity: sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + + /ini@2.0.0: + resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} + engines: {node: '>=10'} + dev: true + + /insert-text-at-cursor@0.3.0: + resolution: {integrity: sha512-/nPtyeX9xPUvxZf+r0518B7uqNKlP+LqNJqSiXFEaa2T71rWIwTVXGH7hB9xO/EVdwa5/pWlFCPwShOW81XIxQ==} + dev: true + + /install-peers@1.0.4: + resolution: {integrity: sha512-0POFG2zRn/rt0uO1tUekCDhq6t6l3HDjxR42+Hcbjmj75Gv4yuqEfMe63HC76piO1lsctAp/cQW+Ny+i/SxTlg==} + requiresBuild: true + dependencies: + executioner: 2.0.1 + dev: true + + /interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + dev: true + + /interpret@3.1.1: + resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} + engines: {node: '>=10.13.0'} + dev: true + + /invert-kv@1.0.0: + resolution: {integrity: sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==} + engines: {node: '>=0.10.0'} + dev: true + + /irregular-plurals@3.5.0: + resolution: {integrity: sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==} + engines: {node: '>=8'} + dev: true + + /is-absolute-url@2.1.0: + resolution: {integrity: sha512-vOx7VprsKyllwjSkLV79NIhpyLfr3jAp7VaTCMXOJHu4m0Ew1CZ2fcjASwmV1jI3BWuWHB013M48eyeldk9gYg==} + engines: {node: '>=0.10.0'} + dev: true + + /is-absolute@1.0.0: + resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} + engines: {node: '>=0.10.0'} + dependencies: + is-relative: 1.0.0 + is-windows: 1.0.2 + dev: true + + /is-accessor-descriptor@0.1.6: + resolution: {integrity: sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /is-accessor-descriptor@1.0.0: + resolution: {integrity: sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 6.0.3 + dev: true + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + dev: true + + /is-ci@3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + hasBin: true + dependencies: + ci-info: 3.8.0 + dev: true + + /is-core-module@2.12.1: + resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==} + dependencies: + has: 1.0.3 + dev: true + + /is-data-descriptor@0.1.4: + resolution: {integrity: sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /is-data-descriptor@1.0.0: + resolution: {integrity: sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 6.0.3 + dev: true + + /is-descriptor@0.1.6: + resolution: {integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==} + engines: {node: '>=0.10.0'} + dependencies: + is-accessor-descriptor: 0.1.6 + is-data-descriptor: 0.1.4 + kind-of: 5.1.0 + dev: true + + /is-descriptor@1.0.2: + resolution: {integrity: sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==} + engines: {node: '>=0.10.0'} + dependencies: + is-accessor-descriptor: 1.0.0 + is-data-descriptor: 1.0.0 + kind-of: 6.0.3 + dev: true + + /is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + dev: true + + /is-extendable@1.0.1: + resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==} + engines: {node: '>=0.10.0'} + dependencies: + is-plain-object: 2.0.4 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point@1.0.0: + resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} + engines: {node: '>=0.10.0'} + dependencies: + number-is-nan: 1.0.1 + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + + /is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + dev: true + + /is-glob@3.1.0: + resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-installed-globally@0.4.0: + resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} + engines: {node: '>=10'} + dependencies: + global-dirs: 3.0.1 + is-path-inside: 3.0.3 + dev: true + + /is-negated-glob@1.0.0: + resolution: {integrity: sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==} + engines: {node: '>=0.10.0'} + dev: true + + /is-number@3.0.0: + resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /is-number@4.0.0: + resolution: {integrity: sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + dev: true + + /is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + dev: true + + /is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + dev: true + + /is-relative@1.0.0: + resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==} + engines: {node: '>=0.10.0'} + dependencies: + is-unc-path: 1.0.0 + dev: true + + /is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /is-svg@2.1.0: + resolution: {integrity: sha512-Ya1giYJUkcL/94quj0+XGcmts6cETPBW1MiFz1ReJrnDJ680F52qpAEGAEGU0nq96FRGIGPx6Yo1CyPXcOoyGw==} + engines: {node: '>=0.10.0'} + dependencies: + html-comment-regex: 1.1.2 + dev: true + + /is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + dev: true + + /is-unc-path@1.0.0: + resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} + engines: {node: '>=0.10.0'} + dependencies: + unc-path-regex: 0.1.2 + dev: true + + /is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + dev: true + + /is-utf8@0.2.1: + resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + dev: true + + /is-valid-glob@1.0.0: + resolution: {integrity: sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA==} + engines: {node: '>=0.10.0'} + dev: true + + /is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + dev: true + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /isobject@2.1.0: + resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} + engines: {node: '>=0.10.0'} + dependencies: + isarray: 1.0.0 + dev: true + + /isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + dev: true + + /isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + dev: true + + /istanbul-lib-coverage@3.2.0: + resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + engines: {node: '>=8'} + dev: true + + /istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + dependencies: + '@babel/core': 7.22.8 + '@babel/parser': 7.22.7 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.0 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-report@3.0.0: + resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} + engines: {node: '>=8'} + dependencies: + istanbul-lib-coverage: 3.2.0 + make-dir: 3.1.0 + supports-color: 7.2.0 + dev: true + + /istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + dependencies: + debug: 4.3.4(supports-color@8.1.1) + istanbul-lib-coverage: 3.2.0 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-reports@3.1.5: + resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.0 + dev: true + + /istextorbinary@3.3.0: + resolution: {integrity: sha512-Tvq1W6NAcZeJ8op+Hq7tdZ434rqnMx4CCZ7H0ff83uEloDvVbqAwaMTZcafKGJT0VHkYzuXUiCY4hlXQg6WfoQ==} + engines: {node: '>=8'} + dependencies: + binaryextensions: 2.3.0 + textextensions: 3.3.0 + dev: true + + /jest-changed-files@27.5.1: + resolution: {integrity: sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + execa: 5.1.1 + throat: 6.0.2 + dev: true + + /jest-circus@27.5.1: + resolution: {integrity: sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 20.3.1 + chalk: 4.1.2 + co: 4.6.0 + dedent: 0.7.0 + expect: 27.5.1 + is-generator-fn: 2.1.0 + jest-each: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + pretty-format: 27.5.1 + slash: 3.0.0 + stack-utils: 2.0.6 + throat: 6.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-cli@27.5.1(ts-node@10.4.0): + resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 27.5.1(ts-node@10.4.0) + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + import-local: 3.1.0 + jest-config: 27.5.1(ts-node@10.4.0) + jest-util: 27.5.1 + jest-validate: 27.5.1 + prompts: 2.4.2 + yargs: 16.2.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + + /jest-config@27.5.1(ts-node@10.4.0): + resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + ts-node: '>=9.0.0' + peerDependenciesMeta: + ts-node: + optional: true + dependencies: + '@babel/core': 7.22.8 + '@jest/test-sequencer': 27.5.1 + '@jest/types': 27.5.1 + babel-jest: 27.5.1(@babel/core@7.22.8) + chalk: 4.1.2 + ci-info: 3.8.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 27.5.1 + jest-environment-jsdom: 27.5.1 + jest-environment-node: 27.5.1 + jest-get-type: 27.5.1 + jest-jasmine2: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-runner: 27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 27.5.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.4.0(@swc/core@1.3.62)(@types/node@20.3.1)(typescript@5.1.3) + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /jest-diff@27.5.1: + resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 27.5.1 + jest-get-type: 27.5.1 + pretty-format: 27.5.1 + dev: true + + /jest-diff@29.6.1: + resolution: {integrity: sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 29.4.3 + jest-get-type: 29.4.3 + pretty-format: 29.6.1 + dev: true + + /jest-docblock@27.5.1: + resolution: {integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + detect-newline: 3.1.0 + dev: true + + /jest-each@27.5.1: + resolution: {integrity: sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + chalk: 4.1.2 + jest-get-type: 27.5.1 + jest-util: 27.5.1 + pretty-format: 27.5.1 + dev: true + + /jest-environment-jsdom@27.5.1: + resolution: {integrity: sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/fake-timers': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 20.3.1 + jest-mock: 27.5.1 + jest-util: 27.5.1 + jsdom: 16.7.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /jest-environment-node@27.5.1: + resolution: {integrity: sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/fake-timers': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 20.3.1 + jest-mock: 27.5.1 + jest-util: 27.5.1 + dev: true + + /jest-fetch-mock@3.0.3: + resolution: {integrity: sha512-Ux1nWprtLrdrH4XwE7O7InRY6psIi3GOsqNESJgMJ+M5cv4A8Lh7SN9d2V2kKRZ8ebAfcd1LNyZguAOb6JiDqw==} + dependencies: + cross-fetch: 3.1.8 + promise-polyfill: 8.3.0 + transitivePeerDependencies: + - encoding + dev: true + + /jest-get-type@27.5.1: + resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: true + + /jest-get-type@29.4.3: + resolution: {integrity: sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /jest-haste-map@27.5.1: + resolution: {integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/graceful-fs': 4.1.6 + '@types/node': 20.3.1 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 27.5.1 + jest-serializer: 27.5.1 + jest-util: 27.5.1 + jest-worker: 27.5.1 + micromatch: 4.0.5 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /jest-jasmine2@27.5.1: + resolution: {integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/source-map': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 20.3.1 + chalk: 4.1.2 + co: 4.6.0 + expect: 27.5.1 + is-generator-fn: 2.1.0 + jest-each: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + pretty-format: 27.5.1 + throat: 6.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-leak-detector@27.5.1: + resolution: {integrity: sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + jest-get-type: 27.5.1 + pretty-format: 27.5.1 + dev: true + + /jest-matcher-utils@27.5.1: + resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 27.5.1 + jest-get-type: 27.5.1 + pretty-format: 27.5.1 + dev: true + + /jest-message-util@27.5.1: + resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/code-frame': 7.22.5 + '@jest/types': 27.5.1 + '@types/stack-utils': 2.0.1 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + pretty-format: 27.5.1 + slash: 3.0.0 + stack-utils: 2.0.6 + dev: true + + /jest-mock@27.5.1: + resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/node': 20.3.1 + dev: true + + /jest-pnp-resolver@1.2.3(jest-resolve@27.5.1): + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 27.5.1 + dev: true + + /jest-regex-util@27.5.1: + resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: true + + /jest-resolve-dependencies@27.5.1: + resolution: {integrity: sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + jest-regex-util: 27.5.1 + jest-snapshot: 27.5.1 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-resolve@27.5.1: + resolution: {integrity: sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 27.5.1 + jest-pnp-resolver: 1.2.3(jest-resolve@27.5.1) + jest-util: 27.5.1 + jest-validate: 27.5.1 + resolve: 1.22.2 + resolve.exports: 1.1.1 + slash: 3.0.0 + dev: true + + /jest-runner@27.5.1: + resolution: {integrity: sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/console': 27.5.1 + '@jest/environment': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 20.3.1 + chalk: 4.1.2 + emittery: 0.8.1 + graceful-fs: 4.2.11 + jest-docblock: 27.5.1 + jest-environment-jsdom: 27.5.1 + jest-environment-node: 27.5.1 + jest-haste-map: 27.5.1 + jest-leak-detector: 27.5.1 + jest-message-util: 27.5.1 + jest-resolve: 27.5.1 + jest-runtime: 27.5.1 + jest-util: 27.5.1 + jest-worker: 27.5.1 + source-map-support: 0.5.21 + throat: 6.0.2 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /jest-runtime@27.5.1: + resolution: {integrity: sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/fake-timers': 27.5.1 + '@jest/globals': 27.5.1 + '@jest/source-map': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + chalk: 4.1.2 + cjs-module-lexer: 1.2.3 + collect-v8-coverage: 1.0.2 + execa: 5.1.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-haste-map: 27.5.1 + jest-message-util: 27.5.1 + jest-mock: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-serializer@27.5.1: + resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@types/node': 20.3.1 + graceful-fs: 4.2.11 + dev: true + + /jest-snapshot@27.5.1: + resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/core': 7.22.8 + '@babel/generator': 7.22.7 + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.22.8) + '@babel/traverse': 7.22.8 + '@babel/types': 7.22.5 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/babel__traverse': 7.20.1 + '@types/prettier': 2.7.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.8) + chalk: 4.1.2 + expect: 27.5.1 + graceful-fs: 4.2.11 + jest-diff: 27.5.1 + jest-get-type: 27.5.1 + jest-haste-map: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + jest-util: 27.5.1 + natural-compare: 1.4.0 + pretty-format: 27.5.1 + semver: 7.3.8 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-util@27.5.1: + resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/node': 20.3.1 + chalk: 4.1.2 + ci-info: 3.8.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + dev: true + + /jest-validate@27.5.1: + resolution: {integrity: sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 27.5.1 + leven: 3.1.0 + pretty-format: 27.5.1 + dev: true + + /jest-watcher@27.5.1: + resolution: {integrity: sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 20.3.1 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + jest-util: 27.5.1 + string-length: 4.0.2 + dev: true + + /jest-websocket-mock@2.2.1(mock-socket@9.0.8): + resolution: {integrity: sha512-fhsGLXrPfs06PhHoxqOSA9yZ6Rb4qYrf4Wcm7/nfRzjlrf1gIeuhYUkzMRjjE0TMQ37SwkmeLanwrZY4ZaNp8g==} + peerDependencies: + mock-socket: ^8||^9 + dependencies: + jest-diff: 27.5.1 + mock-socket: 9.0.8 + dev: true + + /jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 20.3.1 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + + /jest@27.4.5(ts-node@10.4.0): + resolution: {integrity: sha512-uT5MiVN3Jppt314kidCk47MYIRilJjA/l2mxwiuzzxGUeJIvA8/pDaJOAX5KWvjAo7SCydcW0/4WEtgbLMiJkg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 27.5.1(ts-node@10.4.0) + import-local: 3.1.0 + jest-cli: 27.5.1(ts-node@10.4.0) + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + + /jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + dev: true + + /joi@17.9.2: + resolution: {integrity: sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw==} + dependencies: + '@hapi/hoek': 9.3.0 + '@hapi/topo': 5.1.0 + '@sideway/address': 4.1.4 + '@sideway/formula': 3.0.1 + '@sideway/pinpoint': 2.0.0 + dev: true + + /js-base64@2.6.4: + resolution: {integrity: sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==} + dev: true + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: true + + /js-yaml@3.13.1: + resolution: {integrity: sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: true + + /js-yaml@3.7.0: + resolution: {integrity: sha512-eIlkGty7HGmntbV6P/ZlAsoncFLGsNoM27lkTzS+oneY/EiNhj+geqD9ezg/ip+SW6Var0BJU2JtV0vEUZpWVQ==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 2.7.3 + dev: true + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: false + + /jsbn@0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + dev: true + + /jsdom@16.7.0: + resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} + engines: {node: '>=10'} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + dependencies: + abab: 2.0.6 + acorn: 8.8.2 + acorn-globals: 6.0.0 + cssom: 0.4.4 + cssstyle: 2.3.0 + data-urls: 2.0.0 + decimal.js: 10.4.3 + domexception: 2.0.1 + escodegen: 2.1.0 + form-data: 3.0.1 + html-encoding-sniffer: 2.0.1 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.1 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.7 + parse5: 6.0.1 + saxes: 5.0.1 + symbol-tree: 3.2.4 + tough-cookie: 4.1.3 + w3c-hr-time: 1.0.2 + w3c-xmlserializer: 2.0.0 + webidl-conversions: 6.1.0 + whatwg-encoding: 1.0.5 + whatwg-mimetype: 2.3.0 + whatwg-url: 8.7.0 + ws: 7.5.9 + xml-name-validator: 3.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + dev: true + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /jsonfile@5.0.0: + resolution: {integrity: sha512-NQRZ5CRo74MhMMC3/3r5g2k4fjodJ/wh8MxjFbCViWKFjxrnudWSY5vomh+23ZaXzAS7J3fBZIR2dV6WbmfM0w==} + dependencies: + universalify: 0.1.2 + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.11 + dev: true + + /jsprim@2.0.2: + resolution: {integrity: sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==} + engines: {'0': node >=0.6.0} + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.4.0 + verror: 1.10.0 + dev: true + + /just-debounce@1.1.0: + resolution: {integrity: sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==} + dev: true + + /katex@0.16.7: + resolution: {integrity: sha512-Xk9C6oGKRwJTfqfIbtr0Kes9OSv6IFsuhFGc7tW4urlpMJtuh+7YhzU6YEG9n8gmWKcMAFzkp7nr+r69kV0zrA==} + hasBin: true + dependencies: + commander: 8.3.0 + dev: true + + /keyv@4.5.2: + resolution: {integrity: sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==} + dependencies: + json-buffer: 3.0.1 + dev: true + + /kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + dev: true + + /kind-of@4.0.0: + resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + dev: true + + /kind-of@5.1.0: + resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} + engines: {node: '>=0.10.0'} + dev: true + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: true + + /kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + dev: true + + /last-run@1.1.1: + resolution: {integrity: sha512-U/VxvpX4N/rFvPzr3qG5EtLKEnNI0emvIQB3/ecEwv+8GHaUKbIB8vxv1Oai5FAF0d0r7LXHhLLe5K/yChm5GQ==} + engines: {node: '>= 0.10'} + dependencies: + default-resolution: 2.0.0 + es6-weak-map: 2.0.3 + dev: true + + /lazy-ass@1.6.0: + resolution: {integrity: sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==} + engines: {node: '> 0.8'} + dev: true + + /lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + dependencies: + readable-stream: 2.3.8 + dev: true + + /lcid@1.0.0: + resolution: {integrity: sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==} + engines: {node: '>=0.10.0'} + dependencies: + invert-kv: 1.0.0 + dev: true + + /lead@1.0.0: + resolution: {integrity: sha512-IpSVCk9AYvLHo5ctcIXxOBpMWUe+4TKN3VPWAKUbJikkmsGp0VrSM8IttVc32D6J4WUsiPE6aEFRNmIoF/gdow==} + engines: {node: '>= 0.10'} + dependencies: + flush-write-stream: 1.1.1 + dev: true + + /leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + dev: true + + /liftoff@3.1.0: + resolution: {integrity: sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==} + engines: {node: '>= 0.8'} + dependencies: + extend: 3.0.2 + findup-sync: 3.0.0 + fined: 1.2.0 + flagged-respawn: 1.0.1 + is-plain-object: 2.0.4 + object.map: 1.0.1 + rechoir: 0.6.2 + resolve: 1.22.2 + transitivePeerDependencies: + - supports-color + dev: true + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + + /listr2@3.14.0(enquirer@2.3.6): + resolution: {integrity: sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==} + engines: {node: '>=10.0.0'} + peerDependencies: + enquirer: '>= 2.3.0 < 3' + peerDependenciesMeta: + enquirer: + optional: true + dependencies: + cli-truncate: 2.1.0 + colorette: 2.0.20 + enquirer: 2.3.6 + log-update: 4.0.0 + p-map: 4.0.0 + rfdc: 1.3.0 + rxjs: 7.8.1 + through: 2.3.8 + wrap-ansi: 7.0.0 + dev: true + + /load-json-file@1.1.0: + resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} + engines: {node: '>=0.10.0'} + dependencies: + graceful-fs: 4.2.11 + parse-json: 2.2.0 + pify: 2.3.0 + pinkie-promise: 2.0.1 + strip-bom: 2.0.0 + dev: true + + /loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + dev: true + + /loadjs@4.2.0: + resolution: {integrity: sha512-AgQGZisAlTPbTEzrHPb6q+NYBMD+DP9uvGSIjSUM5uG+0jG15cb8axWpxuOIqrmQjn6scaaH8JwloiP27b2KXA==} + dev: true + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: true + + /lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + dev: true + + /lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + dev: true + + /lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + dev: true + + /lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + dev: true + + /lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + dev: true + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + /log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + dev: true + + /log-update@4.0.0: + resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} + engines: {node: '>=10'} + dependencies: + ansi-escapes: 4.3.2 + cli-cursor: 3.1.0 + slice-ansi: 4.0.0 + wrap-ansi: 6.2.0 + dev: true + + /lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + dev: true + + /lru-cache@4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + dependencies: + pseudomap: 1.0.2 + yallist: 2.1.2 + dev: true + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + + /magic-string@0.30.1: + resolution: {integrity: sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.0 + dev: true + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /make-iterator@1.0.1: + resolution: {integrity: sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 6.0.3 + dev: true + + /makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + dependencies: + tmpl: 1.0.5 + dev: true + + /map-cache@0.2.2: + resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} + engines: {node: '>=0.10.0'} + dev: true + + /map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + dev: true + + /map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + dev: true + + /map-stream@0.1.0: + resolution: {integrity: sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==} + dev: true + + /map-visit@1.0.0: + resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==} + engines: {node: '>=0.10.0'} + dependencies: + object-visit: 1.0.1 + dev: true + + /matchdep@2.0.0: + resolution: {integrity: sha512-LFgVbaHIHMqCRuCZyfCtUOq9/Lnzhi7Z0KFUE2fhD54+JN2jLh3hC02RLkqauJ3U4soU6H1J3tfj/Byk7GoEjA==} + engines: {node: '>= 0.10.0'} + dependencies: + findup-sync: 2.0.0 + micromatch: 3.1.10 + resolve: 1.22.2 + stack-trace: 0.0.10 + transitivePeerDependencies: + - supports-color + dev: true + + /math-expression-evaluator@1.4.0: + resolution: {integrity: sha512-4vRUvPyxdO8cWULGTh9dZWL2tZK6LDBvj+OGHBER7poH9Qdt7kXEoj20wiz4lQUbUXQZFjPbe5mVDo9nutizCw==} + dev: true + + /matter-js@0.18.0: + resolution: {integrity: sha512-/ZVem4WygUnbmo/iE4oHZpZS97btfBtYy5Iwn1396vUZU7YhgVEN8J4UWwfZwY1ZqoTYlPgjvSw9WXauuXL0mg==} + dev: true + + /meow@9.0.0: + resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==} + engines: {node: '>=10'} + dependencies: + '@types/minimist': 1.2.2 + camelcase-keys: 6.2.2 + decamelize: 1.2.0 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 + dev: true + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /mfm-js@0.23.3: + resolution: {integrity: sha512-o8scYmbey6rMUmWAlT3k3ntt6khaCLdxlmHhAWV5wTTMj2OK1atQvZfRUq0SIVm1Jig08qlZg/ps71xUqrScNA==} + dependencies: + twemoji-parser: 14.0.0 + dev: true + + /micromatch@3.1.10: + resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + braces: 2.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + extglob: 2.0.4 + fragment-cache: 0.2.1 + kind-of: 6.0.3 + nanomatch: 1.2.13 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: true + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: true + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + dev: true + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: true + + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: true + + /mixin-deep@1.3.2: + resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} + engines: {node: '>=0.10.0'} + dependencies: + for-in: 1.0.2 + is-extendable: 1.0.1 + dev: true + + /mixly@1.0.0: + resolution: {integrity: sha512-ks+xIMVeIDwuYK4LnOMXTfmiEI8oo3tFNFirpHd60C4r2H0wMwKN5/qHCrFBKFK+BYx2Gp7qs+evUJw7QO9D2w==} + engines: {node: '>= 0.10'} + dependencies: + fulcon: 1.0.2 + dev: true + + /mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /mock-socket@9.0.8: + resolution: {integrity: sha512-8Syqkaaa2SzRqW68DEsnZkKQicHP7hVzfj3uCvigB5TL79H1ljKbwmOcRIENkx0ZTyu/5W6u+Pk9Qy6JCp38Ww==} + engines: {node: '>= 8'} + dev: true + + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + + /mute-stdout@1.0.1: + resolution: {integrity: sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==} + engines: {node: '>= 0.10'} + dev: true + + /mylas@2.1.13: + resolution: {integrity: sha512-+MrqnJRtxdF+xngFfUUkIMQrUUL0KsxbADUkn23Z/4ibGg192Q+z+CQyiYwvWTsYjJygmMR8+w3ZDa98Zh6ESg==} + engines: {node: '>=12.0.0'} + dev: true + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + + /nanomatch@1.2.13: + resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} + engines: {node: '>=0.10.0'} + dependencies: + arr-diff: 4.0.0 + array-unique: 0.3.2 + define-property: 2.0.2 + extend-shallow: 3.0.2 + fragment-cache: 0.2.1 + is-windows: 1.0.2 + kind-of: 6.0.3 + object.pick: 1.3.0 + regex-not: 1.0.2 + snapdragon: 0.8.2 + to-regex: 3.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + dev: true + + /next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + dev: true + + /node-fetch@2.6.12: + resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + + /node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + dev: true + + /node-releases@2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + dev: true + + /normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.2 + semver: 5.7.1 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.12.1 + semver: 7.3.8 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-path@2.1.1: + resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} + engines: {node: '>=0.10.0'} + dependencies: + remove-trailing-separator: 1.1.0 + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: true + + /normalize-url@1.9.1: + resolution: {integrity: sha512-A48My/mtCklowHBlI8Fq2jFWK4tX4lJ5E6ytFsSOq1fzpvT0SQSgKhSg7lN5c2uYFOrUAOQp6zhhJnpp1eMloQ==} + engines: {node: '>=4'} + dependencies: + object-assign: 4.1.1 + prepend-http: 1.0.4 + query-string: 4.3.4 + sort-keys: 1.1.2 + dev: true + + /normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + dev: true + + /now-and-later@2.0.1: + resolution: {integrity: sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==} + engines: {node: '>= 0.10'} + dependencies: + once: 1.4.0 + dev: true + + /npm-run-path@2.0.2: + resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} + engines: {node: '>=4'} + dependencies: + path-key: 2.0.1 + dev: true + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /num2fraction@1.2.2: + resolution: {integrity: sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==} + dev: true + + /number-is-nan@1.0.1: + resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} + engines: {node: '>=0.10.0'} + dev: true + + /nwsapi@2.2.7: + resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} + dev: true + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: true + + /object-copy@0.1.0: + resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==} + engines: {node: '>=0.10.0'} + dependencies: + copy-descriptor: 0.1.1 + define-property: 0.2.5 + kind-of: 3.2.2 + dev: true + + /object-inspect@1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + dev: true + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true + + /object-visit@1.0.1: + resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /object.assign@4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + + /object.defaults@1.1.0: + resolution: {integrity: sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==} + engines: {node: '>=0.10.0'} + dependencies: + array-each: 1.0.1 + array-slice: 1.1.0 + for-own: 1.0.0 + isobject: 3.0.1 + dev: true + + /object.map@1.0.1: + resolution: {integrity: sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==} + engines: {node: '>=0.10.0'} + dependencies: + for-own: 1.0.0 + make-iterator: 1.0.1 + dev: true + + /object.pick@1.3.0: + resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} + engines: {node: '>=0.10.0'} + dependencies: + isobject: 3.0.1 + dev: true + + /object.reduce@1.0.1: + resolution: {integrity: sha512-naLhxxpUESbNkRqc35oQ2scZSJueHGQNUfMW/0U37IgN6tE2dgDWg3whf+NEliy3F/QysrO48XKUz/nGPe+AQw==} + engines: {node: '>=0.10.0'} + dependencies: + for-own: 1.0.0 + make-iterator: 1.0.1 + dev: true + + /oblivious-set@1.1.1: + resolution: {integrity: sha512-Oh+8fK09mgGmAshFdH6hSVco6KZmd1tTwNFWj35OvzdmJTMZtAkbn05zar2iG3v6sDs1JLEtOiBGNb6BHwkb2w==} + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /ordered-read-streams@1.0.1: + resolution: {integrity: sha512-Z87aSjx3r5c0ZB7bcJqIgIRX5bxR7A4aSzvIbaxd0oTkWBCOoKfuGHiKj60CHVUgg1Phm5yMZzBdt8XqRs73Mw==} + dependencies: + readable-stream: 2.3.8 + dev: true + + /os-filter-obj@2.0.0: + resolution: {integrity: sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg==} + engines: {node: '>=4'} + dependencies: + arch: 2.2.0 + dev: true + + /os-locale@1.4.0: + resolution: {integrity: sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==} + engines: {node: '>=0.10.0'} + dependencies: + lcid: 1.0.0 + dev: true + + /ospath@1.2.2: + resolution: {integrity: sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==} + dev: true + + /p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + dev: true + + /p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + dev: true + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: true + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + dependencies: + aggregate-error: 3.1.0 + dev: true + + /p-queue@6.6.2: + resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} + engines: {node: '>=8'} + dependencies: + eventemitter3: 4.0.7 + p-timeout: 3.2.0 + dev: true + + /p-timeout@3.2.0: + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} + dependencies: + p-finally: 1.0.0 + dev: true + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true + + /parse-filepath@1.0.2: + resolution: {integrity: sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==} + engines: {node: '>=0.8'} + dependencies: + is-absolute: 1.0.0 + map-cache: 0.2.2 + path-root: 0.1.1 + dev: true + + /parse-json@2.2.0: + resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} + engines: {node: '>=0.10.0'} + dependencies: + error-ex: 1.3.2 + dev: true + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.22.5 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + + /parse-node-version@1.0.1: + resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} + engines: {node: '>= 0.10'} + dev: true + + /parse-passwd@1.0.0: + resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} + engines: {node: '>=0.10.0'} + dev: true + + /parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + dev: true + + /pascalcase@0.1.1: + resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==} + engines: {node: '>=0.10.0'} + dev: true + + /path-dirname@1.0.2: + resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} + dev: true + + /path-exists@2.1.0: + resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} + engines: {node: '>=0.10.0'} + dependencies: + pinkie-promise: 2.0.1 + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-root-regex@0.1.2: + resolution: {integrity: sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==} + engines: {node: '>=0.10.0'} + dev: true + + /path-root@0.1.1: + resolution: {integrity: sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==} + engines: {node: '>=0.10.0'} + dependencies: + path-root-regex: 0.1.2 + dev: true + + /path-type@1.1.0: + resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} + engines: {node: '>=0.10.0'} + dependencies: + graceful-fs: 4.2.11 + pify: 2.3.0 + pinkie-promise: 2.0.1 + dev: true + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /pause-stream@0.0.11: + resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==} + dependencies: + through: 2.3.8 + dev: true + + /peek-readable@5.0.0: + resolution: {integrity: sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==} + engines: {node: '>=14.16'} + dev: true + + /pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + dev: true + + /performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + dev: true + + /photoswipe@5.3.7: + resolution: {integrity: sha512-zsyLsTTLFrj0XR1m4/hO7qNooboFKUrDy+Zt5i2d6qjFPAtBjzaj/Xtydso4uxzcXpcqbTmyxDibb3BcSISseg==} + engines: {node: '>= 0.12.0'} + dev: true + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: true + + /pinkie-promise@2.0.1: + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} + engines: {node: '>=0.10.0'} + dependencies: + pinkie: 2.0.4 + dev: true + + /pinkie@2.0.4: + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} + engines: {node: '>=0.10.0'} + dev: true + + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + dev: true + + /pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + dev: true + + /plimit-lit@1.5.0: + resolution: {integrity: sha512-Eb/MqCb1Iv/ok4m1FqIXqvUKPISufcjZ605hl3KM/n8GaX8zfhtgdLwZU3vKjuHGh2O9Rjog/bHTq8ofIShdng==} + dependencies: + queue-lit: 1.5.0 + dev: true + + /plugin-error@1.0.1: + resolution: {integrity: sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==} + engines: {node: '>= 0.10'} + dependencies: + ansi-colors: 1.1.0 + arr-diff: 4.0.0 + arr-union: 3.1.0 + extend-shallow: 3.0.2 + dev: true + + /plur@4.0.0: + resolution: {integrity: sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==} + engines: {node: '>=10'} + dependencies: + irregular-plurals: 3.5.0 + dev: true + + /posix-character-classes@0.1.1: + resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==} + engines: {node: '>=0.10.0'} + dev: true + + /postcss-calc@5.3.1: + resolution: {integrity: sha512-iBcptYFq+QUh9gzP7ta2btw50o40s4uLI4UDVgd5yRAZtUDWc5APdl5yQDd2h/TyiZNbJrv0HiYhT102CMgN7Q==} + dependencies: + postcss: 5.2.18 + postcss-message-helpers: 2.0.0 + reduce-css-calc: 1.3.0 + dev: true + + /postcss-colormin@2.2.2: + resolution: {integrity: sha512-XXitQe+jNNPf+vxvQXIQ1+pvdQKWKgkx8zlJNltcMEmLma1ypDRDQwlLt+6cP26fBreihNhZxohh1rcgCH2W5w==} + dependencies: + colormin: 1.1.2 + postcss: 5.2.18 + postcss-value-parser: 3.3.1 + dev: true + + /postcss-convert-values@2.6.1: + resolution: {integrity: sha512-SE7mf25D3ORUEXpu3WUqQqy0nCbMuM5BEny+ULE/FXdS/0UMA58OdzwvzuHJRpIFlk1uojt16JhaEogtP6W2oA==} + dependencies: + postcss: 5.2.18 + postcss-value-parser: 3.3.1 + dev: true + + /postcss-discard-comments@2.0.4: + resolution: {integrity: sha512-yGbyBDo5FxsImE90LD8C87vgnNlweQkODMkUZlDVM/CBgLr9C5RasLGJxxh9GjVOBeG8NcCMatoqI1pXg8JNXg==} + dependencies: + postcss: 5.2.18 + dev: true + + /postcss-discard-duplicates@2.1.0: + resolution: {integrity: sha512-+lk5W1uqO8qIUTET+UETgj9GWykLC3LOldr7EehmymV0Wu36kyoHimC4cILrAAYpHQ+fr4ypKcWcVNaGzm0reA==} + dependencies: + postcss: 5.2.18 + dev: true + + /postcss-discard-empty@2.1.0: + resolution: {integrity: sha512-IBFoyrwk52dhF+5z/ZAbzq5Jy7Wq0aLUsOn69JNS+7YeuyHaNzJwBIYE0QlUH/p5d3L+OON72Fsexyb7OK/3og==} + dependencies: + postcss: 5.2.18 + dev: true + + /postcss-discard-overridden@0.1.1: + resolution: {integrity: sha512-IyKoDL8QNObOiUc6eBw8kMxBHCfxUaERYTUe2QF8k7j/xiirayDzzkmlR6lMQjrAM1p1DDRTvWrS7Aa8lp6/uA==} + dependencies: + postcss: 5.2.18 + dev: true + + /postcss-discard-unused@2.2.3: + resolution: {integrity: sha512-nCbFNfqYAbKCw9J6PSJubpN9asnrwVLkRDFc4KCwyUEdOtM5XDE/eTW3OpqHrYY1L4fZxgan7LLRAAYYBzwzrg==} + dependencies: + postcss: 5.2.18 + uniqs: 2.0.0 + dev: true + + /postcss-filter-plugins@2.0.3: + resolution: {integrity: sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ==} + dependencies: + postcss: 5.2.18 + dev: true + + /postcss-merge-idents@2.1.7: + resolution: {integrity: sha512-9DHmfCZ7/hNHhIKnNkz4CU0ejtGen5BbTRJc13Z2uHfCedeCUsK2WEQoAJRBL+phs68iWK6Qf8Jze71anuysWA==} + dependencies: + has: 1.0.3 + postcss: 5.2.18 + postcss-value-parser: 3.3.1 + dev: true + + /postcss-merge-longhand@2.0.2: + resolution: {integrity: sha512-ma7YvxjdLQdifnc1HFsW/AW6fVfubGyR+X4bE3FOSdBVMY9bZjKVdklHT+odknKBB7FSCfKIHC3yHK7RUAqRPg==} + dependencies: + postcss: 5.2.18 + dev: true + + /postcss-merge-rules@2.1.2: + resolution: {integrity: sha512-Wgg2FS6W3AYBl+5L9poL6ZUISi5YzL+sDCJfM7zNw/Q1qsyVQXXZ2cbVui6mu2cYJpt1hOKCGj1xA4mq/obz/Q==} + dependencies: + browserslist: 1.7.7 + caniuse-api: 1.6.1 + postcss: 5.2.18 + postcss-selector-parser: 2.2.3 + vendors: 1.0.4 + dev: true + + /postcss-message-helpers@2.0.0: + resolution: {integrity: sha512-tPLZzVAiIJp46TBbpXtrUAKqedXSyW5xDEo1sikrfEfnTs+49SBZR/xDdqCiJvSSbtr615xDsaMF3RrxS2jZlA==} + dev: true + + /postcss-minify-font-values@1.0.5: + resolution: {integrity: sha512-vFSPzrJhNe6/8McOLU13XIsERohBJiIFFuC1PolgajOZdRWqRgKITP/A4Z/n4GQhEmtbxmO9NDw3QLaFfE1dFQ==} + dependencies: + object-assign: 4.1.1 + postcss: 5.2.18 + postcss-value-parser: 3.3.1 + dev: true + + /postcss-minify-gradients@1.0.5: + resolution: {integrity: sha512-DZhT0OE+RbVqVyGsTIKx84rU/5cury1jmwPa19bViqYPQu499ZU831yMzzsyC8EhiZVd73+h5Z9xb/DdaBpw7Q==} + dependencies: + postcss: 5.2.18 + postcss-value-parser: 3.3.1 + dev: true + + /postcss-minify-params@1.2.2: + resolution: {integrity: sha512-hhJdMVgP8vasrHbkKAk+ab28vEmPYgyuDzRl31V3BEB3QOR3L5TTIVEWLDNnZZ3+fiTi9d6Ker8GM8S1h8p2Ow==} + dependencies: + alphanum-sort: 1.0.2 + postcss: 5.2.18 + postcss-value-parser: 3.3.1 + uniqs: 2.0.0 + dev: true + + /postcss-minify-selectors@2.1.1: + resolution: {integrity: sha512-e13vxPBSo3ZaPne43KVgM+UETkx3Bs4/Qvm6yXI9HQpQp4nyb7HZ0gKpkF+Wn2x+/dbQ+swNpCdZSbMOT7+TIA==} + dependencies: + alphanum-sort: 1.0.2 + has: 1.0.3 + postcss: 5.2.18 + postcss-selector-parser: 2.2.3 + dev: true + + /postcss-normalize-charset@1.1.1: + resolution: {integrity: sha512-RKgjEks83l8w4yEhztOwNZ+nLSrJ+NvPNhpS+mVDzoaiRHZQVoG7NF2TP5qjwnaN9YswUhj6m1E0S0Z+WDCgEQ==} + dependencies: + postcss: 5.2.18 + dev: true + + /postcss-normalize-url@3.0.8: + resolution: {integrity: sha512-WqtWG6GV2nELsQEFES0RzfL2ebVwmGl/M8VmMbshKto/UClBo+mznX8Zi4/hkThdqx7ijwv+O8HWPdpK7nH/Ig==} + dependencies: + is-absolute-url: 2.1.0 + normalize-url: 1.9.1 + postcss: 5.2.18 + postcss-value-parser: 3.3.1 + dev: true + + /postcss-ordered-values@2.2.3: + resolution: {integrity: sha512-5RB1IUZhkxDCfa5fx/ogp/A82mtq+r7USqS+7zt0e428HJ7+BHCxyeY39ClmkkUtxdOd3mk8gD6d9bjH2BECMg==} + dependencies: + postcss: 5.2.18 + postcss-value-parser: 3.3.1 + dev: true + + /postcss-reduce-idents@2.4.0: + resolution: {integrity: sha512-0+Ow9e8JLtffjumJJFPqvN4qAvokVbdQPnijUDSOX8tfTwrILLP4ETvrZcXZxAtpFLh/U0c+q8oRMJLr1Kiu4w==} + dependencies: + postcss: 5.2.18 + postcss-value-parser: 3.3.1 + dev: true + + /postcss-reduce-initial@1.0.1: + resolution: {integrity: sha512-jJFrV1vWOPCQsIVitawGesRgMgunbclERQ/IRGW7r93uHrVzNQQmHQ7znsOIjJPZ4yWMzs5A8NFhp3AkPHPbDA==} + dependencies: + postcss: 5.2.18 + dev: true + + /postcss-reduce-transforms@1.0.4: + resolution: {integrity: sha512-lGgRqnSuAR5i5uUg1TA33r9UngfTadWxOyL2qx1KuPoCQzfmtaHjp9PuwX7yVyRxG3BWBzeFUaS5uV9eVgnEgQ==} + dependencies: + has: 1.0.3 + postcss: 5.2.18 + postcss-value-parser: 3.3.1 + dev: true + + /postcss-selector-parser@2.2.3: + resolution: {integrity: sha512-3pqyakeGhrO0BQ5+/tGTfvi5IAUAhHRayGK8WFSu06aEv2BmHoXw/Mhb+w7VY5HERIuC+QoUI7wgrCcq2hqCVA==} + dependencies: + flatten: 1.0.3 + indexes-of: 1.0.1 + uniq: 1.0.1 + dev: true + + /postcss-svgo@2.1.6: + resolution: {integrity: sha512-y5AdQdgBoF4rbpdbeWAJuxE953g/ylRfVNp6mvAi61VCN/Y25Tu9p5mh3CyI42WbTRIiwR9a1GdFtmDnNPeskQ==} + dependencies: + is-svg: 2.1.0 + postcss: 5.2.18 + postcss-value-parser: 3.3.1 + svgo: 0.7.2 + dev: true + + /postcss-unique-selectors@2.0.2: + resolution: {integrity: sha512-WZX8r1M0+IyljoJOJleg3kYm10hxNYF9scqAT7v/xeSX1IdehutOM85SNO0gP9K+bgs86XERr7Ud5u3ch4+D8g==} + dependencies: + alphanum-sort: 1.0.2 + postcss: 5.2.18 + uniqs: 2.0.0 + dev: true + + /postcss-value-parser@3.3.1: + resolution: {integrity: sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==} + dev: true + + /postcss-zindex@2.2.0: + resolution: {integrity: sha512-uhRZ2hRgj0lorxm9cr62B01YzpUe63h0RXMXQ4gWW3oa2rpJh+FJAiEAytaFCPU/VgaBS+uW2SJ1XKyDNz1h4w==} + dependencies: + has: 1.0.3 + postcss: 5.2.18 + uniqs: 2.0.0 + dev: true + + /postcss@5.2.18: + resolution: {integrity: sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==} + engines: {node: '>=0.12'} + dependencies: + chalk: 1.1.3 + js-base64: 2.6.4 + source-map: 0.5.7 + supports-color: 3.2.3 + dev: true + + /postcss@8.4.25: + resolution: {integrity: sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: true + + /prepend-http@1.0.4: + resolution: {integrity: sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==} + engines: {node: '>=0.10.0'} + dev: true + + /prettier-plugin-vue@1.1.6: + resolution: {integrity: sha512-trQ/oY+6hSsGe2zPIFThXMIM0TbxMEbk2VOrKjwHWuSz7OEo0rnumbz9a47OxVPCaAnGY9vZG8qDTiTmk9bq0A==} + dependencies: + prettier: 2.8.8 + dev: true + + /prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + + /pretty-bytes@5.6.0: + resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} + engines: {node: '>=6'} + dev: true + + /pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + dev: true + + /pretty-format@29.6.1: + resolution: {integrity: sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.0 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: true + + /pretty-hrtime@1.0.3: + resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} + engines: {node: '>= 0.8'} + dev: true + + /prismjs@1.29.0: + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + engines: {node: '>=6'} + dev: true + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true + + /promise-polyfill@8.3.0: + resolution: {integrity: sha512-H5oELycFml5yto/atYqmjyigJoAo3+OXwolYiH7OfQuYlAqhxNvTfiNMbV9hsC6Yp83yE5r2KTVmtrG6R9i6Pg==} + dev: true + + /prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: true + + /proxy-from-env@1.0.0: + resolution: {integrity: sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==} + dev: true + + /ps-tree@1.2.0: + resolution: {integrity: sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==} + engines: {node: '>= 0.10'} + hasBin: true + dependencies: + event-stream: 3.3.4 + dev: true + + /pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + dev: true + + /psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + dev: true + + /pump@2.0.1: + resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: true + + /pumpify@1.5.1: + resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} + dependencies: + duplexify: 3.7.1 + inherits: 2.0.4 + pump: 2.0.1 + dev: true + + /punycode@2.1.1: + resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} + engines: {node: '>=6'} + dev: true + + /q@1.5.1: + resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} + engines: {node: '>=0.6.0', teleport: '>=0.2.0'} + dev: true + + /qs@6.10.4: + resolution: {integrity: sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + dev: true + + /query-string@4.3.4: + resolution: {integrity: sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==} + engines: {node: '>=0.10.0'} + dependencies: + object-assign: 4.1.1 + strict-uri-encode: 1.1.0 + dev: true + + /querystring@0.2.1: + resolution: {integrity: sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==} + engines: {node: '>=0.4.x'} + deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. + dev: true + + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: true + + /queue-lit@1.5.0: + resolution: {integrity: sha512-IslToJ4eiCEE9xwMzq3viOO5nH8sUWUCwoElrhNMozzr9IIt2qqvB4I+uHu/zJTQVqc9R5DFwok4ijNK1pU3fA==} + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + dev: true + + /quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + dev: true + + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /rangestr@0.0.1: + resolution: {integrity: sha512-9CRCUX/w4+fNMzlYgA8GeJz7BZwBPwaGm3FhAm9Hi50k8wNy2CyiJQa8awygWJay87uVVCV0/FwbLcD6+/A9KQ==} + dev: true + + /rangetouch@2.0.1: + resolution: {integrity: sha512-sln+pNSc8NGaHoLzwNBssFSf/rSYkqeBXzX1AtJlkJiUaVSJSbRAWJk+4omsXkN+EJalzkZhWQ3th1m0FpR5xA==} + dev: true + + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: true + + /react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + dev: true + + /read-pkg-up@1.0.1: + resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} + engines: {node: '>=0.10.0'} + dependencies: + find-up: 1.1.2 + read-pkg: 1.1.0 + dev: true + + /read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: true + + /read-pkg@1.1.0: + resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} + engines: {node: '>=0.10.0'} + dependencies: + load-json-file: 1.1.0 + normalize-package-data: 2.5.0 + path-type: 1.1.0 + dev: true + + /read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': 2.4.1 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: true + + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: true + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: true + + /readable-web-to-node-stream@3.0.2: + resolution: {integrity: sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==} + engines: {node: '>=8'} + dependencies: + readable-stream: 3.6.2 + dev: true + + /readdirp@3.3.0: + resolution: {integrity: sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + dependencies: + resolve: 1.22.2 + dev: true + + /rechoir@0.8.0: + resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} + engines: {node: '>= 10.13.0'} + dependencies: + resolve: 1.22.2 + dev: true + + /reconnecting-websocket@4.4.0: + resolution: {integrity: sha512-D2E33ceRPga0NvTDhJmphEgJ7FUYF0v4lr1ki0csq06OdlxKfugGzN0dSkxM/NfqCxYELK4KcaTOUOjTV6Dcng==} + dev: false + + /redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + dev: true + + /redis-info@3.1.0: + resolution: {integrity: sha512-ER4L9Sh/vm63DkIE0bkSjxluQlioBiBgf5w1UuldaW/3vPcecdljVDisZhmnCMvsxHNiARTTDDHGg9cGwTfrKg==} + dependencies: + lodash: 4.17.21 + dev: false + + /reduce-css-calc@1.3.0: + resolution: {integrity: sha512-0dVfwYVOlf/LBA2ec4OwQ6p3X9mYxn/wOl2xTcLwjnPYrkgEfPx3VI4eGCH3rQLlPISG5v9I9bkZosKsNRTRKA==} + dependencies: + balanced-match: 0.4.2 + math-expression-evaluator: 1.4.0 + reduce-function-call: 1.0.3 + dev: true + + /reduce-function-call@1.0.3: + resolution: {integrity: sha512-Hl/tuV2VDgWgCSEeWMLwxLZqX7OK59eU1guxXsRKTAyeYimivsKdtcV4fu3r710tpG5GmDKDhQ0HSZLExnNmyQ==} + dependencies: + balanced-match: 1.0.2 + dev: true + + /regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + dev: true + + /regex-not@1.0.2: + resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 3.0.2 + safe-regex: 1.1.0 + dev: true + + /remove-bom-buffer@3.0.0: + resolution: {integrity: sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==} + engines: {node: '>=0.10.0'} + dependencies: + is-buffer: 1.1.6 + is-utf8: 0.2.1 + dev: true + + /remove-bom-stream@1.2.0: + resolution: {integrity: sha512-wigO8/O08XHb8YPzpDDT+QmRANfW6vLqxfaXm1YXhnFf3AkSLyjfG3GEFg4McZkmgL7KvCj5u2KczkvSP6NfHA==} + engines: {node: '>= 0.10'} + dependencies: + remove-bom-buffer: 3.0.0 + safe-buffer: 5.2.1 + through2: 2.0.5 + dev: true + + /remove-trailing-separator@1.1.0: + resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} + dev: true + + /repeat-element@1.1.4: + resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} + engines: {node: '>=0.10.0'} + dev: true + + /repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + dev: true + + /replace-ext@1.0.1: + resolution: {integrity: sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==} + engines: {node: '>= 0.10'} + dev: true + + /replace-homedir@1.0.0: + resolution: {integrity: sha512-CHPV/GAglbIB1tnQgaiysb8H2yCy8WQ7lcEwQ/eT+kLj0QHV8LnJW0zpqpE7RSkrMSRoa+EBoag86clf7WAgSg==} + engines: {node: '>= 0.10'} + dependencies: + homedir-polyfill: 1.0.3 + is-absolute: 1.0.0 + remove-trailing-separator: 1.1.0 + dev: true + + /replacestream@4.0.3: + resolution: {integrity: sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA==} + dependencies: + escape-string-regexp: 1.0.5 + object-assign: 4.1.1 + readable-stream: 2.3.8 + dev: true + + /request-progress@3.0.0: + resolution: {integrity: sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==} + dependencies: + throttleit: 1.0.0 + dev: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + + /require-main-filename@1.0.1: + resolution: {integrity: sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==} + dev: true + + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: true + + /resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + dev: true + + /resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + dependencies: + resolve-from: 5.0.0 + dev: true + + /resolve-dir@1.0.1: + resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} + engines: {node: '>=0.10.0'} + dependencies: + expand-tilde: 2.0.2 + global-modules: 1.0.0 + dev: true + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve-options@1.1.0: + resolution: {integrity: sha512-NYDgziiroVeDC29xq7bp/CacZERYsA9bXYd1ZmcJlF3BcrZv5pTb4NG7SjdyKDnXZ84aC4vo2u6sNKIA1LCu/A==} + engines: {node: '>= 0.10'} + dependencies: + value-or-function: 3.0.0 + dev: true + + /resolve-url@0.2.1: + resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} + deprecated: https://github.com/lydell/resolve-url#deprecated + dev: true + + /resolve.exports@1.1.1: + resolution: {integrity: sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==} + engines: {node: '>=10'} + dev: true + + /resolve@1.19.0: + resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} + dependencies: + is-core-module: 2.12.1 + path-parse: 1.0.7 + dev: true + + /resolve@1.22.2: + resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} + hasBin: true + dependencies: + is-core-module: 2.12.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + dependencies: + lowercase-keys: 2.0.0 + dev: true + + /restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: true + + /ret@0.1.15: + resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} + engines: {node: '>=0.12'} + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rfdc@1.3.0: + resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rndstr@1.0.0: + resolution: {integrity: sha512-3KN+BHTiHcsyW1qjRw3Xhms8TQfTIN4fUVgqqJpj6FnmuCnto5/lLyppSmGfdTmOiKDWeuXU4XPp58I9fsoWFQ==} + dependencies: + rangestr: 0.0.1 + seedrandom: 2.4.2 + dev: true + + /rollup@3.23.1: + resolution: {integrity: sha512-ybRdFVHOoljGEFILHLd2g/qateqUdjE6YS41WXq4p3C/WwD3xtWxV4FYWETA1u9TeXQc5K8L8zHE5d/scOvrOQ==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /rome@12.1.3: + resolution: {integrity: sha512-e+ff72hxDpe/t5/Us7YRBVw3PBET7SeczTQNn6tvrWdrCaAw3qOukQQ+tDCkyFtS4yGsnhjrJbm43ctNbz27Yg==} + engines: {node: '>=14.*'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@rometools/cli-darwin-arm64': 12.1.3 + '@rometools/cli-darwin-x64': 12.1.3 + '@rometools/cli-linux-arm64': 12.1.3 + '@rometools/cli-linux-x64': 12.1.3 + '@rometools/cli-win32-arm64': 12.1.3 + '@rometools/cli-win32-x64': 12.1.3 + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + dependencies: + tslib: 2.5.3 + dev: true + + /s-age@1.1.2: + resolution: {integrity: sha512-aSN2TlF39WLoZA/6cgYSJZhKt63kJ4EaadejPWjWY9/h4rksIqvfWY3gfd+3uAegSM1IXsA9aWeEhJtkxkFQtA==} + dev: true + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: true + + /safe-regex@1.1.0: + resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==} + dependencies: + ret: 0.1.15 + dev: true + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: true + + /sass@1.62.1: + resolution: {integrity: sha512-NHpxIzN29MXvWiuswfc1W3I0N8SXBd8UR26WntmDlRYf0bSADnwnOjsyMZ3lMezSlArD33Vs3YFhp7dWvL770A==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + chokidar: 3.3.1 + immutable: 4.3.0 + source-map-js: 1.0.2 + dev: true + + /sax@1.2.4: + resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} + dev: true + + /saxes@5.0.1: + resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} + engines: {node: '>=10'} + dependencies: + xmlchars: 2.2.0 + dev: true + + /schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/json-schema': 7.0.12 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + dev: true + + /seedrandom@2.4.2: + resolution: {integrity: sha512-uQ72txMoObtuJooiBLSVs5Yu2e9d/lHQz0boaqHjW8runXB9vR8nFtaZV54wYii613N0C8ZqTBLsfwDhAdpvqQ==} + dev: true + + /seedrandom@3.0.5: + resolution: {integrity: sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==} + + /semver-greatest-satisfied-range@1.1.0: + resolution: {integrity: sha512-Ny/iyOzSSa8M5ML46IAx3iXc6tfOsYU2R4AXi2UpHk60Zrgyq6eqPj/xiOfS0rRl/iiQ/rdJkVjw/5cdUyCntQ==} + engines: {node: '>= 0.10'} + dependencies: + sver-compat: 1.5.0 + dev: true + + /semver-regex@4.0.5: + resolution: {integrity: sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==} + engines: {node: '>=12'} + dev: true + + /semver-truncate@3.0.0: + resolution: {integrity: sha512-LJWA9kSvMolR51oDE6PN3kALBNaUdkxzAGcexw8gjMA8xr5zUqK0JiR3CgARSqanYF3Z1YHvsErb1KDgh+v7Rg==} + engines: {node: '>=12'} + dependencies: + semver: 7.3.8 + dev: true + + /semver@5.7.1: + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + hasBin: true + dev: true + + /semver@6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + dev: true + + /semver@7.3.8: + resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /semver@7.5.3: + resolution: {integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /serialize-javascript@6.0.1: + resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} + dependencies: + randombytes: 2.1.0 + dev: true + + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: true + + /set-value@2.0.1: + resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 2.0.1 + is-extendable: 0.1.1 + is-plain-object: 2.0.4 + split-string: 3.1.0 + dev: true + + /sha1@1.1.1: + resolution: {integrity: sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==} + dependencies: + charenc: 0.0.2 + crypt: 0.0.2 + dev: true + + /shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + dependencies: + kind-of: 6.0.3 + dev: true + + /shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + dependencies: + shebang-regex: 1.0.0 + dev: true + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + object-inspect: 1.12.3 + dev: true + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /slice-ansi@3.0.0: + resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: true + + /slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + dev: true + + /snapdragon-node@2.1.1: + resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 1.0.0 + isobject: 3.0.1 + snapdragon-util: 3.0.1 + dev: true + + /snapdragon-util@3.0.1: + resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /snapdragon@0.8.2: + resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==} + engines: {node: '>=0.10.0'} + dependencies: + base: 0.11.2 + debug: 2.6.9 + define-property: 0.2.5 + extend-shallow: 2.0.1 + map-cache: 0.2.2 + source-map: 0.5.7 + source-map-resolve: 0.5.3 + use: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /sort-keys-length@1.0.1: + resolution: {integrity: sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==} + engines: {node: '>=0.10.0'} + dependencies: + sort-keys: 1.1.2 + dev: true + + /sort-keys@1.1.2: + resolution: {integrity: sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==} + engines: {node: '>=0.10.0'} + dependencies: + is-plain-obj: 1.1.0 + dev: true + + /sortablejs@1.14.0: + resolution: {integrity: sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==} + dev: true + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map-resolve@0.5.3: + resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} + deprecated: See https://github.com/lydell/source-map-resolve#deprecated + dependencies: + atob: 2.1.2 + decode-uri-component: 0.2.2 + resolve-url: 0.2.1 + source-map-url: 0.4.1 + urix: 0.1.0 + dev: true + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map-url@0.4.1: + resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} + deprecated: See https://github.com/lydell/source-map-url#deprecated + dev: true + + /source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + dev: true + + /sparkles@1.0.1: + resolution: {integrity: sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==} + engines: {node: '>= 0.10'} + dev: true + + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.13 + dev: true + + /spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + dev: true + + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.13 + dev: true + + /spdx-license-ids@3.0.13: + resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} + dev: true + + /split-string@3.1.0: + resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} + engines: {node: '>=0.10.0'} + dependencies: + extend-shallow: 3.0.2 + dev: true + + /split@0.3.3: + resolution: {integrity: sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==} + dependencies: + through: 2.3.8 + dev: true + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: true + + /sshpk@1.17.0: + resolution: {integrity: sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + asn1: 0.2.6 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + dev: true + + /ssr-window@4.0.2: + resolution: {integrity: sha512-ISv/Ch+ig7SOtw7G2+qkwfVASzazUnvlDTwypdLoPoySv+6MqlOV10VwPSE6EWkGjhW50lUmghPmpYZXMu/+AQ==} + dev: true + + /stack-trace@0.0.10: + resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + dev: true + + /stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + dependencies: + escape-string-regexp: 2.0.0 + dev: true + + /start-server-and-test@1.15.2: + resolution: {integrity: sha512-t5xJX04Hg7hqxiKHMJBz/n4zIMsE6G7hpAcerFAH+4Vh9le/LeyFcJERJM7WLiPygWF9TOg33oroJF1XOzJtYQ==} + engines: {node: '>=6'} + hasBin: true + dependencies: + arg: 5.0.2 + bluebird: 3.7.2 + check-more-types: 2.24.0 + debug: 4.3.4(supports-color@8.1.1) + execa: 5.1.1 + lazy-ass: 1.6.0 + ps-tree: 1.2.0 + wait-on: 6.0.1(debug@4.3.4) + transitivePeerDependencies: + - supports-color + dev: true + + /static-extend@0.1.2: + resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 0.2.5 + object-copy: 0.1.0 + dev: true + + /stream-combiner@0.0.4: + resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==} + dependencies: + duplexer: 0.1.2 + dev: true + + /stream-exhaust@1.0.2: + resolution: {integrity: sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==} + dev: true + + /stream-shift@1.0.1: + resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} + dev: true + + /strict-event-emitter-types@2.0.0: + resolution: {integrity: sha512-Nk/brWYpD85WlOgzw5h173aci0Teyv8YdIAEtV+N88nDB0dLlazZyJMIsN6eo1/AR61l+p6CJTG1JIyFaoNEEA==} + dev: true + + /strict-uri-encode@1.1.0: + resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} + engines: {node: '>=0.10.0'} + dev: true + + /string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + dev: true + + /string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + dev: true + + /string-width@1.0.2: + resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} + engines: {node: '>=0.10.0'} + dependencies: + code-point-at: 1.1.0 + is-fullwidth-code-point: 1.0.0 + strip-ansi: 3.0.1 + dev: true + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /stringz@2.1.0: + resolution: {integrity: sha512-KlywLT+MZ+v0IRepfMxRtnSvDCMc3nR1qqCs3m/qIbSOWkNZYT8XHQA31rS3TnKp0c5xjZu3M4GY/2aRKSi/6A==} + dependencies: + char-regex: 1.0.2 + dev: true + + /strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + dev: true + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-bom@2.0.0: + resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} + engines: {node: '>=0.10.0'} + dependencies: + is-utf8: 0.2.1 + dev: true + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + dev: true + + /strip-eof@1.0.0: + resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} + engines: {node: '>=0.10.0'} + dev: true + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /strip-outer@2.0.0: + resolution: {integrity: sha512-A21Xsm1XzUkK0qK1ZrytDUvqsQWict2Cykhvi0fBQntGG5JSprESasEyV1EZ/4CiR5WB5KjzLTrP/bO37B0wPg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /strtok3@7.0.0: + resolution: {integrity: sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==} + engines: {node: '>=14.16'} + dependencies: + '@tokenizer/token': 0.3.0 + peek-readable: 5.0.0 + dev: true + + /supports-color@2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} + engines: {node: '>=0.8.0'} + dev: true + + /supports-color@3.2.3: + resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} + engines: {node: '>=0.8.0'} + dependencies: + has-flag: 1.0.0 + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-hyperlinks@2.3.0: + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /sver-compat@1.5.0: + resolution: {integrity: sha512-aFTHfmjwizMNlNE6dsGmoAM4lHjL0CyiobWaFiXWSlD7cIxshW422Nb8KbXCmR6z+0ZEPY+daXJrDyh/vuwTyg==} + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.3 + dev: true + + /svgo@0.7.2: + resolution: {integrity: sha512-jT/g9FFMoe9lu2IT6HtAxTA7RR2XOrmcrmCtGnyB/+GQnV6ZjNn+KOHZbZ35yL81+1F/aB6OeEsJztzBQ2EEwA==} + engines: {node: '>=0.10.0'} + deprecated: This SVGO version is no longer supported. Upgrade to v2.x.x. + hasBin: true + dependencies: + coa: 1.0.4 + colors: 1.1.2 + csso: 2.3.2 + js-yaml: 3.7.0 + mkdirp: 0.5.6 + sax: 1.2.4 + whet.extend: 0.9.9 + dev: true + + /swc-loader@0.2.3(@swc/core@1.3.62)(webpack@5.85.1): + resolution: {integrity: sha512-D1p6XXURfSPleZZA/Lipb3A8pZ17fP4NObZvFCDjK/OKljroqDpPmsBdTraWhVBqUNpcWBQY1imWdoPScRlQ7A==} + peerDependencies: + '@swc/core': ^1.2.147 + webpack: '>=2' + dependencies: + '@swc/core': 1.3.62 + webpack: 5.85.1(@swc/core@1.3.62)(webpack-cli@5.1.3) + dev: true + + /swiper@9.3.2: + resolution: {integrity: sha512-Kj9Z4kXRmJR3YT/Wj+XLWj8P6IcRt+WG38uL8M3/Wny7+6sV0TlP9vnE1X+Co9c7VzNooojWGnFa+Wf/9+CUMA==} + engines: {node: '>= 4.7.0'} + dependencies: + ssr-window: 4.0.2 + dev: true + + /symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + dev: true + + /syuilo-password-strength@0.0.1: + resolution: {integrity: sha512-g9rPT3V1Q4WjWFZ/t5BdGC1mT/FpYnsLdBl+M5e6MlRkuE1RSR+R43wcY/3mKI59B9KEr+vxdWCuWNMD3oNHKA==} + dev: true + + /tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + dev: true + + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + dev: true + + /terminal-link@2.1.1: + resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} + engines: {node: '>=8'} + dependencies: + ansi-escapes: 4.3.2 + supports-hyperlinks: 2.3.0 + dev: true + + /terser-webpack-plugin@5.3.9(@swc/core@1.3.62)(webpack@5.85.1): + resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.18 + '@swc/core': 1.3.62 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.1 + terser: 5.18.0 + webpack: 5.85.1(@swc/core@1.3.62)(webpack-cli@5.1.3) + dev: true + + /terser@5.18.0: + resolution: {integrity: sha512-pdL757Ig5a0I+owA42l6tIuEycRuM7FPY4n62h44mRLRfnOxJkkOHd6i89dOpwZlpF6JXBwaAHF6yWzFrt+QyA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.3 + acorn: 8.8.2 + commander: 2.20.3 + source-map-support: 0.5.21 + dev: true + + /test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + dev: true + + /textarea-caret@3.1.0: + resolution: {integrity: sha512-cXAvzO9pP5CGa6NKx0WYHl+8CHKZs8byMkt3PCJBCmq2a34YA9pO1NrQET5pzeqnBjBdToF5No4rrmkDUgQC2Q==} + dev: true + + /textextensions@3.3.0: + resolution: {integrity: sha512-mk82dS8eRABNbeVJrEiN5/UMSCliINAuz8mkUwH4SwslkNP//gbEzlWNS5au0z5Dpx40SQxzqZevZkn+WYJ9Dw==} + engines: {node: '>=8'} + dev: true + + /three@0.146.0: + resolution: {integrity: sha512-1lvNfLezN6OJ9NaFAhfX4sm5e9YCzHtaRgZ1+B4C+Hv6TibRMsuBAM5/wVKzxjpYIlMymvgsHEFrrigEfXnb2A==} + dev: true + + /throat@6.0.2: + resolution: {integrity: sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==} + dev: true + + /throttle-debounce@5.0.0: + resolution: {integrity: sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==} + engines: {node: '>=12.22'} + dev: true + + /throttleit@1.0.0: + resolution: {integrity: sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==} + dev: true + + /through2-filter@3.0.0: + resolution: {integrity: sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==} + dependencies: + through2: 2.0.5 + xtend: 4.0.2 + dev: true + + /through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + dev: true + + /through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + dependencies: + readable-stream: 3.6.2 + dev: true + + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + dev: true + + /time-stamp@1.1.0: + resolution: {integrity: sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw==} + engines: {node: '>=0.10.0'} + dev: true + + /tinycolor2@1.5.2: + resolution: {integrity: sha512-h80m9GPFGbcLzZByXlNSEhp1gf8Dy+VX/2JCGUZsWLo7lV1mnE/XlxGYgRBoMLJh1lIDXP0EMC4RPTjlRaV+Bg==} + dev: true + + /tmp@0.2.1: + resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} + engines: {node: '>=8.17.0'} + dependencies: + rimraf: 3.0.2 + dev: true + + /tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + dev: true + + /to-absolute-glob@2.0.2: + resolution: {integrity: sha512-rtwLUQEwT8ZeKQbyFJyomBRYXyE16U5VKuy0ftxLMK/PZb2fkOsg5r9kHdauuVDbsNdIBoC/HCthpidamQFXYA==} + engines: {node: '>=0.10.0'} + dependencies: + is-absolute: 1.0.0 + is-negated-glob: 1.0.0 + dev: true + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: true + + /to-object-path@0.3.0: + resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==} + engines: {node: '>=0.10.0'} + dependencies: + kind-of: 3.2.2 + dev: true + + /to-regex-range@2.1.1: + resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} + engines: {node: '>=0.10.0'} + dependencies: + is-number: 3.0.0 + repeat-string: 1.6.1 + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /to-regex@3.0.2: + resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==} + engines: {node: '>=0.10.0'} + dependencies: + define-property: 2.0.2 + extend-shallow: 3.0.2 + regex-not: 1.0.2 + safe-regex: 1.1.0 + dev: true + + /to-through@2.0.0: + resolution: {integrity: sha512-+QIz37Ly7acM4EMdw2PRN389OneM5+d844tirkGp4dPKzI5OE72V9OsbFp+CIYJDahZ41ZV05hNtcPAQUAm9/Q==} + engines: {node: '>= 0.10'} + dependencies: + through2: 2.0.5 + dev: true + + /token-types@5.0.1: + resolution: {integrity: sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==} + engines: {node: '>=14.16'} + dependencies: + '@tokenizer/token': 0.3.0 + ieee754: 1.2.1 + dev: true + + /tough-cookie@2.5.0: + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: '>=0.8'} + dependencies: + psl: 1.9.0 + punycode: 2.1.1 + dev: true + + /tough-cookie@4.1.3: + resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} + engines: {node: '>=6'} + dependencies: + psl: 1.9.0 + punycode: 2.1.1 + universalify: 0.2.0 + url-parse: 1.5.10 + dev: true + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: true + + /tr46@2.1.0: + resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} + engines: {node: '>=8'} + dependencies: + punycode: 2.1.1 + dev: true + + /trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + dev: true + + /trim-repeated@2.0.0: + resolution: {integrity: sha512-QUHBFTJGdOwmp0tbOG505xAgOp/YliZP/6UgafFXYZ26WT1bvQmSMJUvkeVSASuJJHbqsFbynTvkd5W8RBTipg==} + engines: {node: '>=12'} + dependencies: + escape-string-regexp: 5.0.0 + dev: true + + /ts-jest@27.1.2(@babel/core@7.22.8)(@types/jest@27.4.0)(jest@27.4.5)(typescript@5.1.3): + resolution: {integrity: sha512-eSOiJOWq6Hhs6Khzk5wKC5sgWIXgXqOCiIl1+3lfnearu58Hj4QpE5tUhQcA3xtZrELbcvAGCsd6HB8OsaVaTA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@types/jest': ^27.0.0 + babel-jest: '>=27.0.0 <28' + esbuild: ~0.14.0 + jest: ^27.0.0 + typescript: '>=3.8 <5.0' + peerDependenciesMeta: + '@babel/core': + optional: true + '@types/jest': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + '@babel/core': 7.22.8 + '@types/jest': 27.4.0 + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 27.4.5(ts-node@10.4.0) + jest-util: 27.5.1 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.3.8 + typescript: 5.1.3 + yargs-parser: 20.2.9 + dev: true + + /ts-node@10.4.0(@swc/core@1.3.62)(@types/node@20.3.1)(typescript@5.1.3): + resolution: {integrity: sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.7.0 + '@swc/core': 1.3.62 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 20.3.1 + acorn: 8.8.2 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.1.3 + yn: 3.1.1 + dev: true + + /tsc-alias@1.8.6: + resolution: {integrity: sha512-vq+i6VpE83IeMsSJVcFN03ZBofADhr8/gIJXjxpbnTRfN/MFXy0+SBaKG2o7p95QqXBGkeG98HYz3IkOOveFbg==} + hasBin: true + dependencies: + chokidar: 3.3.1 + commander: 9.5.0 + globby: 11.1.0 + mylas: 2.1.13 + normalize-path: 3.0.0 + plimit-lit: 1.5.0 + dev: true + + /tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tsd@0.28.1: + resolution: {integrity: sha512-FeYrfJ05QgEMW/qOukNCr4fAJHww4SaKnivAXRv4g5kj4FeLpNV7zH4dorzB9zAfVX4wmA7zWu/wQf7kkcvfbw==} + engines: {node: '>=14.16'} + hasBin: true + dependencies: + '@tsd/typescript': 5.0.4 + eslint-formatter-pretty: 4.1.0 + globby: 11.1.0 + jest-diff: 29.6.1 + meow: 9.0.0 + path-exists: 4.0.0 + read-pkg-up: 7.0.1 + dev: true + + /tslib@2.5.3: + resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} + dev: true + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + dev: true + + /twemoji-parser@14.0.0: + resolution: {integrity: sha512-9DUOTGLOWs0pFWnh1p6NF+C3CkQ96PWmEFwhOVmT3WbecRC+68AIqpsnJXygfkFcp4aXbOp8Dwbhh/HQgvoRxA==} + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + dev: true + + /type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + dev: true + + /type@1.2.0: + resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} + dev: true + + /type@2.7.2: + resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} + dev: true + + /typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + dependencies: + is-typedarray: 1.0.0 + dev: true + + /typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + dev: true + + /typescript@4.9.4: + resolution: {integrity: sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + + /typescript@5.0.4: + resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} + engines: {node: '>=12.20'} + hasBin: true + dev: true + + /typescript@5.1.3: + resolution: {integrity: sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /unc-path-regex@0.1.2: + resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} + engines: {node: '>=0.10.0'} + dev: true + + /undertaker-registry@1.0.1: + resolution: {integrity: sha512-UR1khWeAjugW3548EfQmL9Z7pGMlBgXteQpr1IZeZBtnkCJQJIJ1Scj0mb9wQaPvUZ9Q17XqW6TIaPchJkyfqw==} + engines: {node: '>= 0.10'} + dev: true + + /undertaker@1.3.0: + resolution: {integrity: sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==} + engines: {node: '>= 0.10'} + dependencies: + arr-flatten: 1.1.0 + arr-map: 2.0.2 + bach: 1.2.0 + collection-map: 1.0.0 + es6-weak-map: 2.0.3 + fast-levenshtein: 1.1.4 + last-run: 1.1.1 + object.defaults: 1.1.0 + object.reduce: 1.0.1 + undertaker-registry: 1.0.1 + dev: true + + /unicode-emoji-json@0.4.0: + resolution: {integrity: sha512-lVNOwh2AnmbwqtSrEVjAWKQoVzWgyWmXVqPuPkPfKb0tnA0+uYN/4ILCTdy9IRj/+3drAVhmjwjNJQr2dhCwnA==} + dev: true + + /union-value@1.0.1: + resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} + engines: {node: '>=0.10.0'} + dependencies: + arr-union: 3.1.0 + get-value: 2.0.6 + is-extendable: 0.1.1 + set-value: 2.0.1 + dev: true + + /uniq@1.0.1: + resolution: {integrity: sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==} + dev: true + + /uniqs@2.0.0: + resolution: {integrity: sha512-mZdDpf3vBV5Efh29kMw5tXoup/buMgxLzOt/XKFKcVmi+15ManNQWr6HfZ2aiZTYlYixbdNJ0KFmIZIv52tHSQ==} + dev: true + + /unique-stream@2.3.1: + resolution: {integrity: sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==} + dependencies: + json-stable-stringify-without-jsonify: 1.0.1 + through2-filter: 3.0.0 + dev: true + + /universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + dev: true + + /universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + dev: true + + /universalify@2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + dev: true + + /unload@2.4.1: + resolution: {integrity: sha512-IViSAm8Z3sRBYA+9wc0fLQmU9Nrxb16rcDmIiR6Y9LJSZzI7QY5QsDhqPpKOjAn0O9/kfK1TfNEMMAGPTIraPw==} + dev: true + + /unset-value@1.0.0: + resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==} + engines: {node: '>=0.10.0'} + dependencies: + has-value: 0.3.1 + isobject: 3.0.1 + dev: true + + /untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + dev: true + + /update-browserslist-db@1.0.11(browserslist@4.21.9): + resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.9 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.1.1 + dev: true + + /urix@0.1.0: + resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} + deprecated: Please see https://github.com/lydell/urix#deprecated + dev: true + + /url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: true + + /url-polyfill@1.1.12: + resolution: {integrity: sha512-mYFmBHCapZjtcNHW0MDq9967t+z4Dmg5CJ0KqysK3+ZbyoNOWQHksGCTWwDhxGXllkWlOc10Xfko6v4a3ucM6A==} + dev: true + + /use@3.1.1: + resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} + engines: {node: '>=0.10.0'} + dev: true + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /uuid@7.0.3: + resolution: {integrity: sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==} + hasBin: true + dev: true + + /uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + dev: true + + /uuid@9.0.0: + resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} + hasBin: true + dev: true + + /v8-to-istanbul@8.1.1: + resolution: {integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==} + engines: {node: '>=10.12.0'} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + convert-source-map: 1.9.0 + source-map: 0.7.4 + dev: true + + /v8flags@3.2.0: + resolution: {integrity: sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==} + engines: {node: '>= 0.10'} + dependencies: + homedir-polyfill: 1.0.3 + dev: true + + /validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + dev: true + + /validator@13.9.0: + resolution: {integrity: sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==} + engines: {node: '>= 0.10'} + dev: true + + /value-or-function@3.0.0: + resolution: {integrity: sha512-jdBB2FrWvQC/pnPtIqcLsMaQgjhdb6B7tk1MMyTKapox+tQZbdRP4uLxu/JY0t7fbfDCUMnuelzEYv5GsxHhdg==} + engines: {node: '>= 0.10'} + dev: true + + /vanilla-tilt@1.8.0: + resolution: {integrity: sha512-wVCHyyfRuiRdKhDTNxKPb60lkagmywDSqLgFETEr71Sm646AvGxuf/14Kx9A8FaISyYvMoKQHk6FTqt+YLGhEw==} + dev: true + + /vendors@1.0.4: + resolution: {integrity: sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==} + dev: true + + /verror@1.10.0: + resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} + engines: {'0': node >=0.6.0} + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + dev: true + + /vinyl-fs@3.0.3: + resolution: {integrity: sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==} + engines: {node: '>= 0.10'} + dependencies: + fs-mkdirp-stream: 1.0.0 + glob-stream: 6.1.0 + graceful-fs: 4.2.11 + is-valid-glob: 1.0.0 + lazystream: 1.0.1 + lead: 1.0.0 + object.assign: 4.1.4 + pumpify: 1.5.1 + readable-stream: 2.3.8 + remove-bom-buffer: 3.0.0 + remove-bom-stream: 1.2.0 + resolve-options: 1.1.0 + through2: 2.0.5 + to-through: 2.0.0 + value-or-function: 3.0.0 + vinyl: 2.2.1 + vinyl-sourcemap: 1.1.0 + dev: true + + /vinyl-sourcemap@1.1.0: + resolution: {integrity: sha512-NiibMgt6VJGJmyw7vtzhctDcfKch4e4n9TBeoWlirb7FMg9/1Ov9k+A5ZRAtywBpRPiyECvQRQllYM8dECegVA==} + engines: {node: '>= 0.10'} + dependencies: + append-buffer: 1.0.2 + convert-source-map: 1.9.0 + graceful-fs: 4.2.11 + normalize-path: 2.1.1 + now-and-later: 2.0.1 + remove-bom-buffer: 3.0.0 + vinyl: 2.2.1 + dev: true + + /vinyl-sourcemaps-apply@0.2.1: + resolution: {integrity: sha512-+oDh3KYZBoZC8hfocrbrxbLUeaYtQK7J5WU5Br9VqWqmCll3tFJqKp97GC9GmMsVIL0qnx2DgEDVxdo5EZ5sSw==} + dependencies: + source-map: 0.5.7 + dev: true + + /vinyl@2.2.1: + resolution: {integrity: sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==} + engines: {node: '>= 0.10'} + dependencies: + clone: 2.1.2 + clone-buffer: 1.0.0 + clone-stats: 1.0.0 + cloneable-readable: 1.1.3 + remove-trailing-separator: 1.1.0 + replace-ext: 1.0.1 + dev: true + + /vite-plugin-compression@0.5.1(vite@4.3.9): + resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==} + peerDependencies: + vite: '>=2.0.0' + dependencies: + chalk: 4.1.2 + debug: 4.3.4(supports-color@8.1.1) + fs-extra: 10.1.0 + vite: 4.3.9(sass@1.62.1) + transitivePeerDependencies: + - supports-color + dev: true + + /vite@4.3.9(sass@1.62.1): + resolution: {integrity: sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==} + engines: {node: ^14.18.0 || >=16.0.0} + hasBin: true + peerDependencies: + '@types/node': '>= 14' + less: '*' + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.17.19 + postcss: 8.4.25 + rollup: 3.23.1 + sass: 1.62.1 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /vue-isyourpasswordsafe@2.0.0: + resolution: {integrity: sha512-j3ORj18R9AgFiP2UOM35KuZbSeJAUiwCSyeRBFN3CGFYTJSKsxqU9qGqOHOz6OhLAYKMTin8JOmqugAbF9O+Bg==} + dependencies: + sha1: 1.1.1 + dev: true + + /vue-plyr@7.0.0: + resolution: {integrity: sha512-NvbO/ZzV1IxlBQQbQlon5Sk8hKuGAj3k4k0XVdi7gM4oSqu8mZMhJ3WM3FfAtNfV790jbLnb8P3dHYqaBqIv6g==} + dependencies: + plyr: github.com/sampotts/plyr/d434c9af16e641400aaee93188594208d88f2658 + vue: 2.7.14 + dev: true + + /vue-prism-editor@2.0.0-alpha.2(vue@3.3.4): + resolution: {integrity: sha512-Gu42ba9nosrE+gJpnAEuEkDMqG9zSUysIR8SdXUw8MQKDjBnnNR9lHC18uOr/ICz7yrA/5c7jHJr9lpElODC7w==} + engines: {node: '>=10'} + peerDependencies: + vue: ^3.0.0 + dependencies: + vue: 3.3.4 + dev: true + + /vue3-otp-input@0.4.1(vue@3.3.4): + resolution: {integrity: sha512-wVl9i3DcWlO0C7fBI9V+RIP3crm/1tY72fuhvb3YM2JfbLoYofB96aPl5AgFhA0Cse5bQEMYtIvOeiqW3rfbAw==} + engines: {node: '>=16.0.0', npm: '>=8.0.0'} + peerDependencies: + vue: ^3.0.* + dependencies: + vue: 3.3.4 + dev: true + + /vue@2.7.14: + resolution: {integrity: sha512-b2qkFyOM0kwqWFuQmgd4o+uHGU7T+2z3T+WQp8UBjADfEv2n4FEMffzBmCKNP0IGzOEEfYjvtcC62xaSKeQDrQ==} + dependencies: + '@vue/compiler-sfc': 2.7.14 + csstype: 3.1.2 + dev: true + + /vue@3.3.4: + resolution: {integrity: sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==} + dependencies: + '@vue/compiler-dom': 3.3.4 + '@vue/compiler-sfc': 3.3.4 + '@vue/runtime-dom': 3.3.4 + '@vue/server-renderer': 3.3.4(vue@3.3.4) + '@vue/shared': 3.3.4 + dev: true + + /vuedraggable@4.1.0(vue@3.3.4): + resolution: {integrity: sha512-FU5HCWBmsf20GpP3eudURW3WdWTKIbEIQxh9/8GE806hydR9qZqRRxRE3RjqX7PkuLuMQG/A7n3cfj9rCEchww==} + peerDependencies: + vue: ^3.0.1 + dependencies: + sortablejs: 1.14.0 + vue: 3.3.4 + dev: true + + /w3c-hr-time@1.0.2: + resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} + deprecated: Use your platform's native performance.now() and performance.timeOrigin. + dependencies: + browser-process-hrtime: 1.0.0 + dev: true + + /w3c-xmlserializer@2.0.0: + resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} + engines: {node: '>=10'} + dependencies: + xml-name-validator: 3.0.0 + dev: true + + /wait-on@6.0.1(debug@4.3.4): + resolution: {integrity: sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==} + engines: {node: '>=10.0.0'} + hasBin: true + dependencies: + axios: 0.25.0(debug@4.3.4) + joi: 17.9.2 + lodash: 4.17.21 + minimist: 1.2.8 + rxjs: 7.8.1 + transitivePeerDependencies: + - debug + dev: true + + /walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + dependencies: + makeerror: 1.0.12 + dev: true + + /watchpack@2.4.0: + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + engines: {node: '>=10.13.0'} + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + dev: true + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: true + + /webidl-conversions@5.0.0: + resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} + engines: {node: '>=8'} + dev: true + + /webidl-conversions@6.1.0: + resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} + engines: {node: '>=10.4'} + dev: true + + /webpack-cli@5.1.3(webpack@5.85.1): + resolution: {integrity: sha512-MTuk7NUMvEHQUSXCpvUrF1q2p0FJS40dPFfqQvG3jTWcgv/8plBNz2Kv2HXZiLGPnfmSAA5uCtCILO1JBmmkfw==} + engines: {node: '>=14.15.0'} + hasBin: true + peerDependencies: + '@webpack-cli/generators': '*' + webpack: 5.x.x + webpack-bundle-analyzer: '*' + webpack-dev-server: '*' + peerDependenciesMeta: + '@webpack-cli/generators': + optional: true + webpack-bundle-analyzer: + optional: true + webpack-dev-server: + optional: true + dependencies: + '@discoveryjs/json-ext': 0.5.7 + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.3)(webpack@5.85.1) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.3)(webpack@5.85.1) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.3)(webpack@5.85.1) + colorette: 2.0.20 + commander: 10.0.1 + cross-spawn: 7.0.3 + envinfo: 7.10.0 + fastest-levenshtein: 1.0.16 + import-local: 3.1.0 + interpret: 3.1.1 + rechoir: 0.8.0 + webpack: 5.85.1(@swc/core@1.3.62)(webpack-cli@5.1.3) + webpack-merge: 5.9.0 + dev: true + + /webpack-merge@5.9.0: + resolution: {integrity: sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==} + engines: {node: '>=10.0.0'} + dependencies: + clone-deep: 4.0.1 + wildcard: 2.0.1 + dev: true + + /webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + dev: true + + /webpack@5.85.1(@swc/core@1.3.62)(webpack-cli@5.1.3): + resolution: {integrity: sha512-xTb7MRf4LY8Z5rzn7aIx4TDrwYJrjcHnIfU1TqtyZOoObyuGSpAUwIvVuqq5wPnv7WEgQr8UvO1q/dgoGG4HjA==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.4 + '@types/estree': 1.0.1 + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/wasm-edit': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + acorn: 8.8.2 + acorn-import-assertions: 1.9.0(acorn@8.8.2) + browserslist: 4.21.9 + chrome-trace-event: 1.0.3 + enhanced-resolve: 5.15.0 + es-module-lexer: 1.3.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.9(@swc/core@1.3.62)(webpack@5.85.1) + watchpack: 2.4.0 + webpack-cli: 5.1.3(webpack@5.85.1) + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + dev: true + + /whatwg-encoding@1.0.5: + resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} + dependencies: + iconv-lite: 0.4.24 + dev: true + + /whatwg-mimetype@2.3.0: + resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} + dev: true + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: true + + /whatwg-url@8.7.0: + resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} + engines: {node: '>=10'} + dependencies: + lodash: 4.17.21 + tr46: 2.1.0 + webidl-conversions: 6.1.0 + dev: true + + /whet.extend@0.9.9: + resolution: {integrity: sha512-mmIPAft2vTgEILgPeZFqE/wWh24SEsR/k+N9fJ3Jxrz44iDFy9aemCxdksfURSHYFCLmvs/d/7Iso5XjPpNfrA==} + engines: {node: '>=0.6.0'} + dev: true + + /which-module@1.0.0: + resolution: {integrity: sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==} + dev: true + + /which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /wildcard@2.0.1: + resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + dev: true + + /wrap-ansi@2.1.0: + resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==} + engines: {node: '>=0.10.0'} + dependencies: + string-width: 1.0.2 + strip-ansi: 3.0.1 + dev: true + + /wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + dev: true + + /ws@7.5.9: + resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + + /xml-name-validator@3.0.0: + resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} + dev: true + + /xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + dev: true + + /xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + dev: true + + /y18n@3.2.2: + resolution: {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==} + dev: true + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yallist@2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + dev: true + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: true + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true + + /yargs-parser@5.0.1: + resolution: {integrity: sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==} + dependencies: + camelcase: 3.0.0 + object.assign: 4.1.4 + dev: true + + /yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + dev: true + + /yargs@7.1.2: + resolution: {integrity: sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==} + dependencies: + camelcase: 3.0.0 + cliui: 3.2.0 + decamelize: 1.2.0 + get-caller-file: 1.0.3 + os-locale: 1.4.0 + read-pkg-up: 1.0.1 + require-directory: 2.1.1 + require-main-filename: 1.0.1 + set-blocking: 2.0.0 + string-width: 1.0.2 + which-module: 1.0.0 + y18n: 3.2.2 + yargs-parser: 5.0.1 + dev: true + + /yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + dev: true + + /yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: true + + /z-schema@5.0.5: + resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} + engines: {node: '>=8.0.0'} + hasBin: true + dependencies: + lodash.get: 4.4.2 + lodash.isequal: 4.5.0 + validator: 13.9.0 + optionalDependencies: + commander: 9.5.0 + dev: true + + github.com/misskey-dev/browser-image-resizer/56f504427ad7f6500e141a6d9f3aee42023d7f3e: + resolution: {tarball: https://codeload.github.com/misskey-dev/browser-image-resizer/tar.gz/56f504427ad7f6500e141a6d9f3aee42023d7f3e} + name: browser-image-resizer + version: 2.2.1-misskey.4 + dev: true + + github.com/sampotts/plyr/d434c9af16e641400aaee93188594208d88f2658: + resolution: {tarball: https://codeload.github.com/sampotts/plyr/tar.gz/d434c9af16e641400aaee93188594208d88f2658} + name: plyr + version: 3.7.0 + dependencies: + core-js: 3.31.1 + custom-event-polyfill: 1.0.7 + loadjs: 4.2.0 + rangetouch: 2.0.1 + url-polyfill: 1.1.12 + dev: true + + github.com/thatonecalculator/emojilib/15fd9504f943763a057ff803ee2009ec0524c96b: + resolution: {tarball: https://codeload.github.com/thatonecalculator/emojilib/tar.gz/15fd9504f943763a057ff803ee2009ec0524c96b} + name: emojilib + version: 3.0.10 + dev: true diff --git a/fe_calckey/frontend/pnpm-workspace.yaml b/fe_calckey/frontend/pnpm-workspace.yaml new file mode 100644 index 0000000..aa05066 --- /dev/null +++ b/fe_calckey/frontend/pnpm-workspace.yaml @@ -0,0 +1,4 @@ +packages: + - 'client' + - 'sw' + - 'calckey-js' diff --git a/fe_calckey/frontend/scripts/clean-all.js b/fe_calckey/frontend/scripts/clean-all.js new file mode 100644 index 0000000..0de89a4 --- /dev/null +++ b/fe_calckey/frontend/scripts/clean-all.js @@ -0,0 +1,48 @@ +const fs = require("node:fs"); +const execa = require("execa"); +const { join } = require("node:path"); + +(async () => { + fs.rmSync(join(__dirname, "/../packages/backend/built"), { + recursive: true, + force: true, + }); + fs.rmSync(join(__dirname, "/../packages/backend/node_modules"), { + recursive: true, + force: true, + }); + + fs.rmSync(join(__dirname, "/../packages/backend/native-utils/built"), { + recursive: true, + force: true, + }); + fs.rmSync(join(__dirname, "/../packages/backend/native-utils/node_modules"), { + recursive: true, + force: true, + }); + + fs.rmSync(join(__dirname, "/../packages/calckey-js/built"), { + recursive: true, + force: true, + }); + fs.rmSync(join(__dirname, "/../packages/calckey-js/node_modules"), { + recursive: true, + force: true, + }); + + fs.rmSync(join(__dirname, "/../built"), { recursive: true, force: true }); + fs.rmSync(join(__dirname, "/../node_modules"), { + recursive: true, + force: true, + }); + + execa("pnpm", ["store", "prune"], { + cwd: join(__dirname, "/../"), + stdio: "inherit", + }); + + execa("cargo", ["clean"], { + cwd: join(__dirname, "/../packages/backend/native-utils"), + stdio: "inherit", + }); +})(); diff --git a/fe_calckey/frontend/scripts/clean.js b/fe_calckey/frontend/scripts/clean.js new file mode 100644 index 0000000..39cbc77 --- /dev/null +++ b/fe_calckey/frontend/scripts/clean.js @@ -0,0 +1,27 @@ +const fs = require("node:fs"); +const execa = require("execa"); +const { join } = require("node:path"); + +(async () => { + fs.rmSync(join(__dirname, "/../packages/backend/built"), { + recursive: true, + force: true, + }); + fs.rmSync(join(__dirname, "/../packages/backend/native-utils/built"), { + recursive: true, + force: true, + }); + fs.rmSync(join(__dirname, "/../packages/client/built"), { + recursive: true, + force: true, + }); + fs.rmSync(join(__dirname, "/../packages/sw/built"), { + recursive: true, + force: true, + }); + fs.rmSync(join(__dirname, "/../packages/calckey-js/built"), { + recursive: true, + force: true, + }); + fs.rmSync(join(__dirname, "/../built"), { recursive: true, force: true }); +})(); diff --git a/fe_calckey/frontend/sw/.swcrc b/fe_calckey/frontend/sw/.swcrc new file mode 100644 index 0000000..1d6d3b4 --- /dev/null +++ b/fe_calckey/frontend/sw/.swcrc @@ -0,0 +1,24 @@ +{ + "$schema": "https://json.schemastore.org/swcrc", + "jsc": { + "parser": { + "syntax": "typescript", + "dynamicImport": true, + "decorators": true + }, + "transform": { + "decoratorMetadata": true + }, + "experimental": { + "keepImportAssertions": true + }, + "baseUrl": ".", + "paths": { + "@/*": [ + "./src/*" + ] + }, + "target": "es2022" + }, + "minify": false +} diff --git a/fe_calckey/frontend/sw/package.json b/fe_calckey/frontend/sw/package.json new file mode 100644 index 0000000..0018038 --- /dev/null +++ b/fe_calckey/frontend/sw/package.json @@ -0,0 +1,20 @@ +{ + "name": "sw", + "private": true, + "scripts": { + "build": "webpack", + "watch": "pnpm swc src -d built -D -w", + "lint": "pnpm rome check \"src/**/*.ts\"", + "format": "pnpm rome format * --write" + }, + "devDependencies": { + "@swc/cli": "^0.1.62", + "@swc/core": "^1.3.62", + "@swc/core-android-arm64": "1.3.11", + "calckey-js": "workspace:*", + "idb-keyval": "^6.2.1", + "swc-loader": "^0.2.3", + "webpack": "^5.85.1", + "webpack-cli": "^5.1.3" + } +} diff --git a/fe_calckey/frontend/sw/src/filters/user.ts b/fe_calckey/frontend/sw/src/filters/user.ts new file mode 100644 index 0000000..782194d --- /dev/null +++ b/fe_calckey/frontend/sw/src/filters/user.ts @@ -0,0 +1,14 @@ +import * as misskey from "calckey-js"; +import * as Acct from "calckey-js/built/acct"; + +export const acct = (user: misskey.Acct) => { + return Acct.toString(user); +}; + +export const userName = (user: misskey.entities.User) => { + return user.name || user.username; +}; + +export const userPage = (user: misskey.Acct, path?, absolute = false) => { + return `${absolute ? origin : ""}/@${acct(user)}${path ? `/${path}` : ""}`; +}; diff --git a/fe_calckey/frontend/sw/src/scripts/create-notification.ts b/fe_calckey/frontend/sw/src/scripts/create-notification.ts new file mode 100644 index 0000000..5aaf908 --- /dev/null +++ b/fe_calckey/frontend/sw/src/scripts/create-notification.ts @@ -0,0 +1,341 @@ +/* + * Notification manager for SW + */ +declare let self: ServiceWorkerGlobalScope; + +import {swLang} from "@/scripts/lang"; +import {cli} from "@/scripts/operations"; +import {pushNotificationDataMap} from "@/types"; +import getUserName from "@/scripts/get-user-name"; +import {I18n} from "@/scripts/i18n"; +import {getAccountFromId} from "@/scripts/get-account-from-id"; +import * as url from "@/scripts/url"; + +const iconUrl = (name: string) => + `/static-assets/notification-badges/${name}.png`; + +export async function createNotification< + K extends keyof pushNotificationDataMap, +>(data: pushNotificationDataMap[K]) { + const n = await composeNotification(data); + + if (n) { + return self.registration.showNotification(...n); + } else { + console.error("Could not compose notification", data); + return createEmptyNotification(); + } +} + +async function composeNotification( + data: pushNotificationDataMap[K], +): Promise<[string, NotificationOptions] | null> { + if (!swLang.i18n) swLang.fetchLocale(); + const i18n = (await swLang.i18n) as I18n; + const { t } = i18n; + switch (data.type) { + /* + case 'driveFileCreated': // TODO (Server Side) + return [t('_notification.fileUploaded'), { + body: body.name, + icon: body.url, + data + }]; + */ + case "notification": + switch (data.body.type) { + case "follow": { + // users/showの型定義をswos.apiへ当てはめるのが困難なのでapiFetch.requestを直接使用 + const account = await getAccountFromId(data.userId); + if (!account) return null; + const userDetail = await cli.request( + "users/show", + { userId: data.body.userId }, + account.token, + ); + return [ + t("_notification.youWereFollowed"), + { + body: getUserName(data.body.user), + icon: data.body.user.avatarUrl, + badge: iconUrl("user-plus"), + data, + actions: userDetail.isFollowing + ? [] + : [ + { + action: "follow", + title: t("_notification._actions.followBack"), + }, + ], + }, + ]; + } + + case "mention": + return [ + t("_notification.youGotMention", { + name: getUserName(data.body.user), + }), + { + body: data.body.note.text || "", + icon: data.body.user.avatarUrl, + badge: iconUrl("at"), + data, + actions: [ + { + action: "reply", + title: t("_notification._actions.reply"), + }, + ], + }, + ]; + + case "reply": + return [ + t("_notification.youGotReply", { + name: getUserName(data.body.user), + }), + { + body: data.body.note.text || "", + icon: data.body.user.avatarUrl, + badge: iconUrl("reply"), + data, + actions: [ + { + action: "reply", + title: t("_notification._actions.reply"), + }, + ], + }, + ]; + + case "renote": + return [ + t("_notification.youRenoted", { + name: getUserName(data.body.user), + }), + { + body: data.body.note.text || "", + icon: data.body.user.avatarUrl, + badge: iconUrl("retweet"), + data, + actions: [ + { + action: "showUser", + title: getUserName(data.body.user), + }, + ], + }, + ]; + + case "quote": + return [ + t("_notification.youGotQuote", { + name: getUserName(data.body.user), + }), + { + body: data.body.note.text || "", + icon: data.body.user.avatarUrl, + badge: iconUrl("quote-right"), + data, + actions: [ + { + action: "reply", + title: t("_notification._actions.reply"), + }, + ...(data.body.note.visibility === "public" || + data.body.note.visibility === "home" + ? [ + { + action: "renote", + title: t("_notification._actions.renote"), + }, + ] + : []), + ], + }, + ]; + + case "reaction": { + let reaction = data.body.reaction; + let badge: string | undefined; + + if (reaction.startsWith(":")) { + // カスタム絵文字の場合 + const customEmoji = data.body.note.emojis.find( + (x) => x.name === reaction.substr(1, reaction.length - 2), + ); + if (customEmoji) { + if (reaction.includes("@")) { + reaction = `:${reaction.substr(1, reaction.indexOf("@") - 1)}:`; + } + + const u = new URL(customEmoji.url); + if (u.href.startsWith(`${origin}/proxy/`)) { + // もう既にproxyっぽそうだったらsearchParams付けるだけ + u.searchParams.set("badge", "1"); + badge = u.href; + } else { + const dummy = `${u.host}${u.pathname}`; // 拡張子がないとキャッシュしてくれないCDNがあるので + badge = `${origin}/proxy/${dummy}?${url.query({ + url: u.href, + badge: "1", + })}`; + } + } + } + + if ( + badge + ? await fetch(badge) + .then((res) => res.status !== 200) + .catch(() => true) + : true + ) { + badge = iconUrl("plus"); + } + + return [ + `${reaction} ${getUserName(data.body.user)}`, + { + body: data.body.note.text || "", + icon: data.body.user.avatarUrl, + badge, + data, + actions: [ + { + action: "showUser", + title: getUserName(data.body.user), + }, + ], + }, + ]; + } + + case "pollVote": + return [ + t("_notification.youGotPoll", { + name: getUserName(data.body.user), + }), + { + body: data.body.note.text || "", + icon: data.body.user.avatarUrl, + badge: iconUrl("poll-h"), + data, + }, + ]; + + case "pollEnded": + return [ + t("_notification.pollEnded"), + { + body: data.body.note.text || "", + badge: iconUrl("clipboard-check-solid"), + data, + }, + ]; + + case "receiveFollowRequest": + return [ + t("_notification.youReceivedFollowRequest"), + { + body: getUserName(data.body.user), + icon: data.body.user.avatarUrl, + badge: iconUrl("clock"), + data, + actions: [ + { + action: "accept", + title: t("accept"), + }, + { + action: "reject", + title: t("reject"), + }, + ], + }, + ]; + + case "followRequestAccepted": + return [ + t("_notification.yourFollowRequestAccepted"), + { + body: getUserName(data.body.user), + icon: data.body.user.avatarUrl, + badge: iconUrl("check"), + data, + }, + ]; + + case "groupInvited": + return [ + t("_notification.youWereInvitedToGroup", { + userName: getUserName(data.body.user), + }), + { + body: data.body.invitation.group.name, + badge: iconUrl("id-card-alt"), + data, + actions: [ + { + action: "accept", + title: t("accept"), + }, + { + action: "reject", + title: t("reject"), + }, + ], + }, + ]; + + case "app": + return [ + data.body.header || data.body.body, + { + body: data.body.header && data.body.body, + icon: data.body.icon, + data, + }, + ]; + + default: + return null; + } + default: + return null; + } +} + +export async function createEmptyNotification() { + return new Promise(async (res) => { + if (!swLang.i18n) swLang.fetchLocale(); + const i18n = (await swLang.i18n) as I18n; + const { t } = i18n; + + await self.registration.showNotification( + t("_notification.emptyPushNotificationMessage"), + { + silent: true, + badge: iconUrl("null"), + tag: "read_notification", + }, + ); + + res(); + + setTimeout(async () => { + for (const n of [ + ...(await self.registration.getNotifications({ + tag: "user_visible_auto_notification", + })), + ...(await self.registration.getNotifications({ + tag: "read_notification", + })), + ]) { + n.close(); + } + }, 1000); + }); +} diff --git a/fe_calckey/frontend/sw/src/scripts/get-account-from-id.ts b/fe_calckey/frontend/sw/src/scripts/get-account-from-id.ts new file mode 100644 index 0000000..24f5e59 --- /dev/null +++ b/fe_calckey/frontend/sw/src/scripts/get-account-from-id.ts @@ -0,0 +1,7 @@ +import { get } from "idb-keyval"; + +export async function getAccountFromId(id: string) { + const accounts = (await get("accounts")) as { token: string; id: string }[]; + if (!accounts) console.log("Accounts are not recorded"); + return accounts.find((e) => e.id === id); +} diff --git a/fe_calckey/frontend/sw/src/scripts/get-user-name.ts b/fe_calckey/frontend/sw/src/scripts/get-user-name.ts new file mode 100644 index 0000000..0f8916d --- /dev/null +++ b/fe_calckey/frontend/sw/src/scripts/get-user-name.ts @@ -0,0 +1,6 @@ +export default function (user: { + name?: string | null; + username: string; +}): string { + return user.name || user.username; +} diff --git a/fe_calckey/frontend/sw/src/scripts/i18n.ts b/fe_calckey/frontend/sw/src/scripts/i18n.ts new file mode 100644 index 0000000..06fe83f --- /dev/null +++ b/fe_calckey/frontend/sw/src/scripts/i18n.ts @@ -0,0 +1,31 @@ +export class I18n> { + public ts: T; + + constructor(locale: T) { + this.ts = locale; + + //#region BIND + this.t = this.t.bind(this); + //#endregion + } + + // string にしているのは、ドット区切りでのパス指定を許可するため + // なるべくこのメソッド使うよりもlocale直接参照の方がvueのキャッシュ効いてパフォーマンスが良いかも + public t(key: string, args?: Record): string { + try { + let str = key + .split(".") + .reduce((o, i) => o[i], this.ts) as unknown as string; + + if (args) { + for (const [k, v] of Object.entries(args)) { + str = str.replace(`{${k}}`, v); + } + } + return str; + } catch (err) { + console.warn(`missing localization '${key}'`); + return key; + } + } +} diff --git a/fe_calckey/frontend/sw/src/scripts/lang.ts b/fe_calckey/frontend/sw/src/scripts/lang.ts new file mode 100644 index 0000000..31cfb7b --- /dev/null +++ b/fe_calckey/frontend/sw/src/scripts/lang.ts @@ -0,0 +1,47 @@ +/* + * Language manager for SW + */ +declare let self: ServiceWorkerGlobalScope; + +import { get, set } from "idb-keyval"; +import { I18n } from "@/scripts/i18n"; + +class SwLang { + public cacheName = `mk-cache-${_VERSION_}`; + + public lang: Promise = get("lang").then(async (prelang) => { + if (!prelang) return "en-US"; + return prelang; + }); + + public setLang(newLang: string) { + this.lang = Promise.resolve(newLang); + set("lang", newLang); + return this.fetchLocale(); + } + + public i18n: Promise> | null = null; + + public fetchLocale() { + return this.i18n === this._fetch(); + } + + private async _fetch() { + // Service Workerは何度も起動しそのたびにlocaleを読み込むので、CacheStorageを使う + const localeUrl = `/assets/locales/${await this.lang}.${_VERSION_}.json`; + let localeRes = await caches.match(localeUrl); + + // _DEV_がtrueの場合は常に最新化 + if (!localeRes || _DEV_) { + localeRes = await fetch(localeUrl); + const clone = localeRes?.clone(); + if (!clone?.clone().ok) Error("locale fetching error"); + + caches.open(this.cacheName).then((cache) => cache.put(localeUrl, clone)); + } + + return new I18n(await localeRes.json()); + } +} + +export const swLang = new SwLang(); diff --git a/fe_calckey/frontend/sw/src/scripts/login-id.ts b/fe_calckey/frontend/sw/src/scripts/login-id.ts new file mode 100644 index 0000000..0fe3457 --- /dev/null +++ b/fe_calckey/frontend/sw/src/scripts/login-id.ts @@ -0,0 +1,11 @@ +export function getUrlWithLoginId(url: string, loginId: string) { + const u = new URL(url, origin); + u.searchParams.append("loginId", loginId); + return u.toString(); +} + +export function getUrlWithoutLoginId(url: string) { + const u = new URL(url); + u.searchParams.delete("loginId"); + return u.toString(); +} diff --git a/fe_calckey/frontend/sw/src/scripts/notification-read.ts b/fe_calckey/frontend/sw/src/scripts/notification-read.ts new file mode 100644 index 0000000..9ea4528 --- /dev/null +++ b/fe_calckey/frontend/sw/src/scripts/notification-read.ts @@ -0,0 +1,62 @@ +declare let self: ServiceWorkerGlobalScope; + +import { get } from "idb-keyval"; +import { pushNotificationDataMap } from "@/types"; +import { api } from "@/scripts/operations"; + +type Accounts = { + [x: string]: { + queue: string[]; + timeout: number | null; + }; +}; + +class SwNotificationReadManager { + private accounts: Accounts = {}; + + public async construct() { + const accounts = await get("accounts"); + if (!accounts) Error("Accounts are not recorded"); + + this.accounts = accounts.reduce((acc, e) => { + acc[e.id] = { + queue: [], + timeout: null, + }; + return acc; + }, {} as Accounts); + + return this; + } + + // プッシュ通知の既読をサーバーに送信 + public async read( + data: pushNotificationDataMap[K], + ) { + if (data.type !== "notification" || !(data.userId in this.accounts)) return; + + const account = this.accounts[data.userId]; + + account.queue.push(data.body.id as string); + + if (account.queue.length >= 20) { + if (account.timeout) clearTimeout(account.timeout); + const notificationIds = account.queue; + account.queue = []; + await api("notifications/read", data.userId, { notificationIds }); + return; + } + + // 最後の呼び出しから200ms待ってまとめて処理する + if (account.timeout) clearTimeout(account.timeout); + account.timeout = setTimeout(() => { + account.timeout = null; + + const notificationIds = account.queue; + account.queue = []; + api("notifications/read", data.userId, { notificationIds }); + }, 200); + } +} + +export const swNotificationRead = new SwNotificationReadManager().construct(); diff --git a/fe_calckey/frontend/sw/src/scripts/operations.ts b/fe_calckey/frontend/sw/src/scripts/operations.ts new file mode 100644 index 0000000..d3d33a6 --- /dev/null +++ b/fe_calckey/frontend/sw/src/scripts/operations.ts @@ -0,0 +1,79 @@ +/* + * Operations + * 各種操作 + */ +declare let self: ServiceWorkerGlobalScope; + +import * as Misskey from "calckey-js"; +import { SwMessage, swMessageOrderType } from "@/types"; +import { getAccountFromId } from "@/scripts/get-account-from-id"; +import { getUrlWithLoginId } from "@/scripts/login-id"; + +export const cli = new Misskey.api.APIClient({ + origin, + fetch: (...args) => fetch(...args), +}); + +export async function api( + endpoint: E, + userId: string, + options?: Misskey.Endpoints[E]["req"], +) { + const account = await getAccountFromId(userId); + if (!account) return; + + return cli.request(endpoint, options, account.token); +} + +// rendered acctからユーザーを開く +export function openUser(acct: string, loginId: string) { + return openClient("push", `/@${acct}`, loginId, { acct }); +} + +// noteIdからノートを開く +export function openNote(noteId: string, loginId: string) { + return openClient("push", `/notes/${noteId}`, loginId, { noteId }); +} + +// post-formのオプションから投稿フォームを開く +export async function openPost(options: any, loginId: string) { + // クエリを作成しておく + let url = "/share?"; + if (options.initialText) url += `text=${options.initialText}&`; + if (options.reply) url += `replyId=${options.reply.id}&`; + if (options.renote) url += `renoteId=${options.renote.id}&`; + + return openClient("post", url, loginId, { options }); +} + +export async function openClient( + order: swMessageOrderType, + url: string, + loginId: string, + query: any = {}, +) { + const client = await findClient(); + + if (client) { + client.postMessage({ + type: "order", + ...query, + order, + loginId, + url, + } as SwMessage); + return client; + } + + return self.clients.openWindow(getUrlWithLoginId(url, loginId)); +} + +export async function findClient() { + const clients = await self.clients.matchAll({ + type: "window", + }); + for (const c of clients) { + if (c.url.indexOf("?zen") < 0) return c; + } + return null; +} diff --git a/fe_calckey/frontend/sw/src/scripts/url.ts b/fe_calckey/frontend/sw/src/scripts/url.ts new file mode 100644 index 0000000..a11f5e2 --- /dev/null +++ b/fe_calckey/frontend/sw/src/scripts/url.ts @@ -0,0 +1,15 @@ +export function query(obj: {}): string { + const params = Object.entries(obj) + .filter(([, v]) => (Array.isArray(v) ? v.length : v !== undefined)) + .reduce((a, [k, v]) => ((a[k] = v), a), {} as Record); + + return Object.entries(params) + .map((e) => `${e[0]}=${encodeURIComponent(e[1])}`) + .join("&"); +} + +export function appendQuery(url: string, query: string): string { + return `${url}${ + /\?/.test(url) ? (url.endsWith("?") ? "" : "&") : "?" + }${query}`; +} diff --git a/fe_calckey/frontend/sw/src/sw.ts b/fe_calckey/frontend/sw/src/sw.ts new file mode 100644 index 0000000..f49cbb4 --- /dev/null +++ b/fe_calckey/frontend/sw/src/sw.ts @@ -0,0 +1,246 @@ +declare let self: ServiceWorkerGlobalScope; + +import { + createEmptyNotification, +} from "@/scripts/create-notification"; +import { swLang } from "@/scripts/lang"; +import { swNotificationRead } from "@/scripts/notification-read"; +import { pushNotificationDataMap } from "@/types"; +import * as swos from "@/scripts/operations"; +import { acct as getAcct } from "@/filters/user"; + +self.addEventListener("install", (ev) => { + ev.waitUntil(self.skipWaiting()); +}); + +self.addEventListener("activate", (ev) => { + ev.waitUntil( + caches + .keys() + .then((cacheNames) => + Promise.all( + cacheNames + .filter((v) => v !== swLang.cacheName) + .map((name) => caches.delete(name)), + ), + ) + .then(() => self.clients.claim()), + ); +}); + +self.addEventListener("fetch", (ev) => { + let isHTMLRequest = false; + if (ev.request.headers.get("sec-fetch-dest") === "document") { + isHTMLRequest = true; + } else if (ev.request.headers.get("accept")?.includes("/html")) { + isHTMLRequest = true; + } else if (ev.request.url.endsWith("/")) { + isHTMLRequest = true; + } + + if (!isHTMLRequest) return; + ev.respondWith( + fetch(ev.request).catch( + () => + new Response(`Offline. Service Worker @${_VERSION_}`, { status: 200 }), + ), + ); +}); + +self.addEventListener("push", (ev) => { + // クライアント取得 + ev.waitUntil( + self.clients + .matchAll({ + includeUncontrolled: true, + type: "window", + }) + .then( + async ( + clients: readonly WindowClient[], + ) => { + const data: pushNotificationDataMap[K] = ev.data?.json(); + + switch (data.type) { + // case 'driveFileCreated': + case "notification": + case "readAllNotifications": + for (const n of await self.registration.getNotifications()) { + if (n?.data?.type === "notification") n.close(); + } + break; + case "readNotifications": + for (const n of await self.registration.getNotifications()) { + if (data.body?.notificationIds?.includes(n.data.body.id)) { + n.close(); + } + } + break; + } + + return createEmptyNotification(); + }, + ), + ); +}); + +self.addEventListener( + "notificationclick", + ( + ev: ServiceWorkerGlobalScopeEventMap["notificationclick"], + ) => { + ev.waitUntil( + (async () => { + if (_DEV_) { + console.log("notificationclick", ev.action, ev.notification.data); + } + + const { action, notification } = ev; + const data: pushNotificationDataMap[K] = notification.data; + const { userId: id } = data; + let client: WindowClient | null = null; + + switch (data.type) { + case "notification": + switch (action) { + case "follow": + if ("userId" in data.body) + await swos.api("following/create", id, { + userId: data.body.userId, + }); + break; + case "showUser": + if ("user" in data.body) + client = await swos.openUser(getAcct(data.body.user), id); + break; + case "reply": + if ("note" in data.body) + client = await swos.openPost({ reply: data.body.note }, id); + break; + case "renote": + if ("note" in data.body) + await swos.api("notes/create", id, { + renoteId: data.body.note.id, + }); + break; + case "accept": + switch (data.body.type) { + case "receiveFollowRequest": + await swos.api("following/requests/accept", id, { + userId: data.body.userId, + }); + break; + case "groupInvited": + await swos.api("users/groups/invitations/accept", id, { + invitationId: data.body.invitation.id, + }); + break; + } + break; + case "reject": + switch (data.body.type) { + case "receiveFollowRequest": + await swos.api("following/requests/reject", id, { + userId: data.body.userId, + }); + break; + case "groupInvited": + await swos.api("users/groups/invitations/reject", id, { + invitationId: data.body.invitation.id, + }); + break; + } + break; + case "showFollowRequests": + client = await swos.openClient( + "push", + "/my/follow-requests", + id, + ); + break; + default: + switch (data.body.type) { + case "receiveFollowRequest": + client = await swos.openClient( + "push", + "/my/follow-requests", + id, + ); + break; + case "groupInvited": + client = await swos.openClient("push", "/my/groups", id); + break; + case "reaction": + client = await swos.openNote(data.body.note.id, id); + break; + default: + if ("note" in data.body) { + client = await swos.openNote(data.body.note.id, id); + } else if ("user" in data.body) { + client = await swos.openUser(getAcct(data.body.user), id); + } + break; + } + } + break; + } + + if (client) { + client.focus(); + } + if (data.type === "notification") { + swNotificationRead.then((that) => that.read(data)); + } + + notification.close(); + })(), + ); + }, +); + +self.addEventListener( + "notificationclose", + ( + ev: ServiceWorkerGlobalScopeEventMap["notificationclose"], + ) => { + const data: pushNotificationDataMap[K] = ev.notification.data; + + if (data.type === "notification") { + swNotificationRead.then((that) => that.read(data)); + } + }, +); + +self.addEventListener( + "message", + (ev: ServiceWorkerGlobalScopeEventMap["message"]) => { + ev.waitUntil( + (async () => { + switch (ev.data) { + case "clear": + // Cache Storage全削除 + await caches + .keys() + .then((cacheNames) => + Promise.all(cacheNames.map((name) => caches.delete(name))), + ); + return; // TODO + } + + if (typeof ev.data === "object") { + // E.g. '[object Array]' → 'array' + const otype = Object.prototype.toString + .call(ev.data) + .slice(8, -1) + .toLowerCase(); + + if (otype === "object") { + if (ev.data.msg === "initialize") { + swLang.setLang(ev.data.lang); + } + } + } + })(), + ); + }, +); diff --git a/fe_calckey/frontend/sw/src/types.ts b/fe_calckey/frontend/sw/src/types.ts new file mode 100644 index 0000000..2110a78 --- /dev/null +++ b/fe_calckey/frontend/sw/src/types.ts @@ -0,0 +1,31 @@ +import * as Misskey from "calckey-js"; + +export type swMessageOrderType = "post" | "push"; + +export type SwMessage = { + type: "order"; + order: swMessageOrderType; + loginId: string; + url: string; + [x: string]: any; +}; + +// Defined also @/services/push-notification.ts#L7-L14 +type pushNotificationDataSourceMap = { + notification: Misskey.entities.Notification; + readNotifications: { notificationIds: string[] }; + readAllNotifications: undefined; +}; + +export type pushNotificationData< + K extends keyof pushNotificationDataSourceMap, +> = { + type: K; + body: pushNotificationDataSourceMap[K]; + userId: string; + dateTime: number; +}; + +export type pushNotificationDataMap = { + [K in keyof pushNotificationDataSourceMap]: pushNotificationData; +}; diff --git a/fe_calckey/frontend/sw/tsconfig.json b/fe_calckey/frontend/sw/tsconfig.json new file mode 100644 index 0000000..fad2ae5 --- /dev/null +++ b/fe_calckey/frontend/sw/tsconfig.json @@ -0,0 +1,39 @@ +{ + "compilerOptions": { + "allowJs": true, + "noEmitOnError": false, + "noImplicitAny": false, + "noImplicitReturns": true, + "noUnusedParameters": false, + "noUnusedLocals": true, + "noFallthroughCasesInSwitch": true, + "declaration": false, + "sourceMap": false, + "target": "es2017", + "module": "esnext", + "moduleResolution": "node", + "removeComments": false, + "noLib": false, + "strict": true, + "strictNullChecks": true, + "experimentalDecorators": true, + "resolveJsonModule": true, + "isolatedModules": true, + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"], + }, + "typeRoots": [ + "node_modules/@types", + "@types", + ], + "lib": [ + "esnext", + "webworker" + ] + }, + "compileOnSave": false, + "include": [ + "./**/*.ts", "./**/*.d.ts", "./**/*.tsx", "./**/*.vue" + ] +} diff --git a/fe_calckey/frontend/sw/webpack.config.js b/fe_calckey/frontend/sw/webpack.config.js new file mode 100644 index 0000000..50e752c --- /dev/null +++ b/fe_calckey/frontend/sw/webpack.config.js @@ -0,0 +1,50 @@ +const webpack = require("webpack"); +const path = require("path"); +const locales = require("../locales"); +const meta = require("../package.json"); + +const isProduction = process.env.NODE_ENV === "production"; + +module.exports = { + mode: isProduction ? "production" : "development", + stats: "errors-only", + entry: "./src/sw.ts", + output: { + path: path.resolve(__dirname, "../built/_sw_dist_"), + filename: "sw.js", + }, + resolve: { + extensions: [".js", ".ts"], + }, + module: { + rules: [ + { + test: /\.ts$/, + exclude: /(node_modules|bower_components)/, + use: { + loader: "swc-loader", + options: { + // This makes swc-loader invoke swc synchronously. + sync: true, + jsc: { + parser: { + syntax: "typescript", + }, + }, + }, + }, + }, + ], + }, + plugins: [ + new webpack.DefinePlugin({ + _VERSION_: JSON.stringify(meta.version), + _LANGS_: JSON.stringify( + Object.entries(locales).map(([k, v]) => [k, v._lang_]), + ), + _ENV_: JSON.stringify(process.env.NODE_ENV), + _DEV_: !isProduction, + _PERF_PREFIX_: JSON.stringify("Calckey:"), + }), + ], +}; diff --git a/fe_calckey/src/frontend_render.rs b/fe_calckey/src/frontend_render.rs new file mode 100644 index 0000000..f97c7db --- /dev/null +++ b/fe_calckey/src/frontend_render.rs @@ -0,0 +1,140 @@ +use axum::extract::State; +use axum::headers::CacheControl; +use axum::http::StatusCode; +use axum::response::{Html, IntoResponse}; +use axum::routing::get; +use axum::{Router, TypedHeader}; +use magnetar_common::config::MagnetarConfig; +use serde::Serialize; +use serde_json::Value; +use std::sync::Arc; +use std::time::Duration; +use tera::{Context, Tera}; +use tracing::{error, info}; + +pub fn new_frontend_render_router(frontend_renderer_config: FrontendConfig) -> Router { + Router::new() + .route( + "/*path", + get(render_frontend).with_state(frontend_renderer_config.clone()), + ) + .route( + "/", + get(render_frontend).with_state(frontend_renderer_config), + ) +} + +#[derive(Debug, Clone)] +pub struct FrontendConfig { + pub magnetar_config: &'static MagnetarConfig, + pub templater: Arc, +} + +#[derive(Debug, Clone, Serialize)] +struct ClientEntryPoint { + file: String, + css: Vec, +} + +pub async fn render_frontend( + State(FrontendConfig { + magnetar_config, + templater, + }): State, +) -> Result { + let mut context = Context::new(); + // TODO: Better title + context.insert("title", &magnetar_config.branding.name); + context.insert("app_name", &magnetar_config.branding.name); + context.insert("version", &magnetar_config.branding.version); + + context.insert( + "boot_js", + &std::fs::read_to_string("fe_calckey/frontend/assets-be/template/boot.js").map_err( + |e| { + error!("Failed to read boot JS: {:?}", e); + StatusCode::INTERNAL_SERVER_ERROR + }, + )?, + ); + context.insert( + "style_css", + &std::fs::read_to_string("fe_calckey/frontend/assets-be/template/style.css").map_err( + |e| { + error!("Failed to read boot CSS: {:?}", e); + StatusCode::INTERNAL_SERVER_ERROR + }, + )?, + ); + + context.insert( + "base_url", + &format!("https://{}", magnetar_config.networking.host), + ); + + context.insert("instance_host", &magnetar_config.networking.host); + // TODO: Actual name + context.insert("instance_name", &magnetar_config.networking.host); + // TODO: Add to config or pull from the backend + context.insert("robots", &true); + + let manifest = std::fs::read_to_string("fe_calckey/frontend/built/_client_dist_/manifest.json") + .map_err(|e| { + error!("Failed to read manifest: {:?}", e); + StatusCode::INTERNAL_SERVER_ERROR + })?; + + let manifest_json: Value = serde_json::from_str(&manifest).map_err(|e| { + error!("Failed to parse manifest: {:?}", e); + StatusCode::INTERNAL_SERVER_ERROR + })?; + + let entry_point = manifest_json.get("src/init.ts").ok_or_else(|| { + error!("Missing entry point in manifest"); + StatusCode::INTERNAL_SERVER_ERROR + })?; + + context.insert( + "client_entry", + &ClientEntryPoint { + file: entry_point + .get("file") + .and_then(Value::as_str) + .ok_or_else(|| { + error!("Missing entry point file in manifest"); + StatusCode::INTERNAL_SERVER_ERROR + })? + .to_owned(), + css: entry_point + .get("css") + .and_then(Value::as_array) + .map_or_else(Vec::new, |css| { + css.iter() + .filter_map(Value::as_str) + .map(|s| s.to_owned()) + .collect::>() + }), + }, + ); + context.insert( + "timestamp", + &format!("v={}", &chrono::Utc::now().timestamp()), + ); + + let html = match templater.render("base.html", &context) { + Ok(html) => html, + Err(e) => { + error!("Failed to render template: {:?}", e); + return Err(StatusCode::INTERNAL_SERVER_ERROR); + } + }; + + Ok(( + TypedHeader( + CacheControl::new() + .with_public() + .with_max_age(Duration::from_secs(3)), + ), + Html(html), + )) +} diff --git a/fe_calckey/src/main.rs b/fe_calckey/src/main.rs new file mode 100644 index 0000000..fc0127c --- /dev/null +++ b/fe_calckey/src/main.rs @@ -0,0 +1,124 @@ +mod frontend_render; +mod manifest; +mod static_serve; +mod summary_proxy; + +use crate::frontend_render::{new_frontend_render_router, render_frontend, FrontendConfig}; +use crate::manifest::handle_manifest; +use crate::static_serve::{static_serve, static_serve_svg, static_serve_sw}; +use crate::summary_proxy::generate_summary; +use axum::headers::CacheControl; +use axum::routing::{any, get}; +use axum::{Router, TypedHeader}; +use dotenvy::dotenv; +use hyper::StatusCode; +use magnetar_common::config::MagnetarConfig; +use miette::{miette, IntoDiagnostic}; +use std::net::SocketAddr; +use std::sync::Arc; +use std::time::Duration; +use tera::Tera; +use thiserror::Error; +use tower::layer::layer_fn; +use tower_http::services::ServeFile; +use tower_http::trace::TraceLayer; +use tracing::log::info; +use tracing_subscriber::EnvFilter; + +#[derive(Debug, Error)] +pub enum RouterSetupError { + #[error("Failed to load template: {0}")] + TemplateLoadError(#[from] tera::Error), +} + +fn new_calckey_fe_router(config: &'static MagnetarConfig) -> Result { + let tera = Tera::new("fe_calckey/frontend/assets-be/template/**/*.html")?; + let frontend_renderer_config = FrontendConfig { + magnetar_config: config, + templater: Arc::new(tera), + }; + + Ok(Router::new() + .nest_service( + "/favicon.ico", + ServeFile::new("fe_calckey/frontend/assets/favicon.ico"), + ) + .nest_service( + "/favicon.png", + ServeFile::new("fe_calckey/frontend/assets/favicon.png"), + ) + .nest_service( + "/favicon.svg", + ServeFile::new("fe_calckey/frontend/assets/favicon.svg"), + ) + .route("/manifest.json", get(handle_manifest).with_state(config)) + .nest_service( + "/api-doc", + ServeFile::new("fe_calckey/frontend/assets/redoc.html"), + ) + .nest( + "/sw.js", + static_serve_sw("fe_calckey/frontend/built/_sw_dist_/sw.js"), + ) + .nest("/static-assets", static_serve("fe_calckey/frontend/assets")) + .nest( + "/client-assets", + static_serve("fe_calckey/frontend/client/assets"), + ) + .nest( + "/assets", + static_serve("fe_calckey/frontend/built/_client_dist_"), + ) + .nest( + "/twemoji", + static_serve_svg("fe_calckey/frontend/assets-be/twemoji"), + ) + .route("/url", get(generate_summary)) + .route( + "/streaming", + any(|| async { + ( + StatusCode::SERVICE_UNAVAILABLE, + TypedHeader( + CacheControl::new() + .with_max_age(Duration::from_secs(0)) + .with_private(), + ), + ) + }), + ) + .nest("", new_frontend_render_router(frontend_renderer_config))) +} + +#[tokio::main] +async fn main() -> miette::Result<()> { + dotenv().ok(); + + let filter_layer = EnvFilter::try_from_default_env() + .or_else(|_| EnvFilter::try_new("info")) + .unwrap(); + + tracing_subscriber::fmt() + .with_env_filter(filter_layer) + .with_test_writer() + .init(); + + let config = &*Box::leak::<'static>(Box::new( + magnetar_common::config::load_config().map_err(|e| miette!(e))?, + )); + info!("Loaded configuration: {config:#?}"); + + let app = Router::new() + .layer(TraceLayer::new_for_http()) + .nest("", new_calckey_fe_router(config).into_diagnostic()?); + + let addr = SocketAddr::from(( + config.calckey_frontend.bind_addr, + config.calckey_frontend.port, + )); + info!("Serving on: {addr}"); + axum::Server::bind(&addr) + .serve(app.into_make_service()) + .await + .map_err(|e| miette!("Error running server: {}", e)) +} diff --git a/fe_calckey/src/manifest.rs b/fe_calckey/src/manifest.rs new file mode 100644 index 0000000..492be20 --- /dev/null +++ b/fe_calckey/src/manifest.rs @@ -0,0 +1,23 @@ +use axum::extract::State; +use axum::headers::AccessControlMaxAge; +use axum::response::IntoResponse; +use axum::{Json, TypedHeader}; +use magnetar_common::config::MagnetarConfig; +use serde_json::Value; +use std::time::Duration; + +pub async fn handle_manifest(State(config): State<&'static MagnetarConfig>) -> impl IntoResponse { + let manifest = include_str!("../frontend/assets-be/manifest.json"); + let mut manifest_json: Value = serde_json::from_str(manifest).unwrap(); + manifest_json["short_name"] = Value::String(config.branding.name.clone()); + manifest_json["name"] = Value::String(config.branding.name.clone()); + + // TODO: Pull from instance metadata + + ( + TypedHeader(AccessControlMaxAge::from(Duration::from_secs( + 60 * 60 * 24 * 7, + ))), + Json(manifest_json), + ) +} diff --git a/fe_calckey/src/static_serve.rs b/fe_calckey/src/static_serve.rs new file mode 100644 index 0000000..448e10f --- /dev/null +++ b/fe_calckey/src/static_serve.rs @@ -0,0 +1,61 @@ +use axum::headers::{AccessControlMaxAge, HeaderMapExt}; +use axum::http::header::CONTENT_SECURITY_POLICY; +use axum::http::{Request, StatusCode}; +use axum::middleware::{from_fn, MapRequestLayer, Next}; +use axum::Router; +use hyper::Response; +use std::time::Duration; +use tower::util::MapResponseLayer; +use tower_http::services::{ServeDir, ServeFile}; + +pub fn static_serve_sw(file: &str) -> Router { + Router::new() + .nest_service("", ServeFile::new(file)) + .layer(MapResponseLayer::new(|mut res: Response<_>| { + res.headers_mut() + .typed_insert(AccessControlMaxAge::from(Duration::from_secs(60 * 10))); + + res + })) +} + +pub fn static_serve(dir: &str) -> Router { + let serve_dir = ServeDir::new(dir); + Router::new() + .nest_service("", serve_dir) + .layer(MapResponseLayer::new(|mut res: Response<_>| { + res.headers_mut() + .typed_insert(AccessControlMaxAge::from(Duration::from_secs( + 60 * 60 * 24 * 7, + ))); + + res + })) +} + +pub fn static_serve_svg(dir: &str) -> Router { + let serve_dir = ServeDir::new(dir); + Router::new() + .nest_service("", serve_dir) + .layer(from_fn(|req: Request<_>, next: Next<_>| async { + if !req.uri().path().ends_with(".svg") { + return Err(StatusCode::NOT_FOUND); + } + + Ok(next.run(req).await) + })) + .layer(MapResponseLayer::new(|mut res: Response<_>| { + let headers = res.headers_mut(); + headers.typed_insert(AccessControlMaxAge::from(Duration::from_secs( + 60 * 60 * 24 * 7, + ))); + headers.insert( + CONTENT_SECURITY_POLICY, + "default-src 'none'; style-src 'unsafe-inline'" + .parse() + .unwrap(), + ); + + res + })) +} diff --git a/fe_calckey/src/summary_proxy.rs b/fe_calckey/src/summary_proxy.rs new file mode 100644 index 0000000..55a2da3 --- /dev/null +++ b/fe_calckey/src/summary_proxy.rs @@ -0,0 +1,19 @@ +use axum::extract::Query; +use axum::Json; +use serde::Deserialize; +use serde_json::{json, Value}; + +#[derive(Deserialize)] +pub struct SummaryRequest { + url: String, +} + +pub async fn generate_summary( + Query(SummaryRequest { url: _url }): Query, +) -> Json { + // TODO: Stub, implement at least OpenGraph cards + // Will need a HTTP client and a HTML parser at least + // Would be nice to provide YouTube/... embeds + + Json(json!({})) +} diff --git a/magnetar_common/Cargo.toml b/magnetar_common/Cargo.toml new file mode 100644 index 0000000..642fe78 --- /dev/null +++ b/magnetar_common/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "magnetar_common" +version.workspace = true +edition.workspace = true + +[lib] +crate-type = ["rlib"] + +[dependencies] +magnetar_core = { path = "../core" } + +percent-encoding = { workspace = true } +serde = { workspace = true, features = ["derive"] } +toml = { workspace = true } +thiserror = { workspace = true } \ No newline at end of file diff --git a/src/config.rs b/magnetar_common/src/config.rs similarity index 75% rename from src/config.rs rename to magnetar_common/src/config.rs index ee421e0..520039d 100644 --- a/src/config.rs +++ b/magnetar_common/src/config.rs @@ -1,8 +1,7 @@ -use anyhow::anyhow; use serde::Deserialize; use std::fmt::{Display, Formatter}; use std::net::IpAddr; -use tracing::info; +use thiserror::Error; #[derive(Deserialize, Debug)] #[non_exhaustive] @@ -78,6 +77,37 @@ impl Default for MagnetarNetworking { } } +#[derive(Deserialize, Debug)] +#[non_exhaustive] +pub struct MagnetarCalckeyFrontendConfig { + pub bind_addr: IpAddr, + pub port: u16, +} + +fn env_fe_bind_addr() -> IpAddr { + std::env::var("MAG_C_CK_FE_BIND_ADDR") + .unwrap_or_else(|_| "::".to_owned()) + .parse() + .map_err(|e| format!("Failed to parse \"MAG_C_CK_FE_BIND_ADDR\": {e}")) + .unwrap() +} + +fn env_fe_port() -> u16 { + std::env::var("MAG_C_CK_FE_PORT") + .unwrap_or_else(|_| "4938".to_owned()) + .parse() + .expect("MAG_C_CK_FE_PORT must be a valid port number") +} + +impl Default for MagnetarCalckeyFrontendConfig { + fn default() -> Self { + MagnetarCalckeyFrontendConfig { + bind_addr: env_fe_bind_addr(), + port: env_fe_port(), + } + } +} + #[derive(Deserialize, Debug)] #[non_exhaustive] pub struct MagnetarBranding { @@ -144,20 +174,26 @@ pub struct MagnetarConfig { #[serde(default)] pub branding: MagnetarBranding, #[serde(default)] + pub calckey_frontend: MagnetarCalckeyFrontendConfig, + #[serde(default)] pub data: MagnetarData, } -pub fn load_config() -> anyhow::Result { +#[derive(Debug, Error)] +pub enum MagnetarConfigError { + #[error("Failed to load configuration: {0}")] + IoError(#[from] std::io::Error), + #[error("Failed to parse configuration: {0}")] + DeserializeError(#[from] toml::de::Error), +} + +pub fn load_config() -> Result { let path = std::env::var("MAG_CONFIG_PATH").unwrap_or_else(|_| "config/default.toml".to_owned()); - let str_cfg = - std::fs::read_to_string(path).map_err(|e| anyhow!("Failed to load configuration: {e}"))?; + let str_cfg = std::fs::read_to_string(path)?; - let config = - toml::from_str(&str_cfg).map_err(|e| anyhow!("Failed to parse configuration: {e}"))?; - - info!("Loaded configuration: {config:#?}"); + let config = toml::from_str(&str_cfg)?; Ok(config) } diff --git a/magnetar_common/src/lib.rs b/magnetar_common/src/lib.rs new file mode 100644 index 0000000..165cd84 --- /dev/null +++ b/magnetar_common/src/lib.rs @@ -0,0 +1,2 @@ +pub mod config; +pub mod util; diff --git a/src/util.rs b/magnetar_common/src/util.rs similarity index 71% rename from src/util.rs rename to magnetar_common/src/util.rs index 832361e..7eb2248 100644 --- a/src/util.rs +++ b/magnetar_common/src/util.rs @@ -1,7 +1,7 @@ -use anyhow::anyhow; use magnetar_core::web_model::acct::Acct; use percent_encoding::percent_decode_str; use std::borrow::Cow; +use thiserror::Error; #[derive(Clone, Debug)] pub struct FediverseTag { @@ -9,6 +9,14 @@ pub struct FediverseTag { pub host: Option, } +#[derive(Debug, Error)] +pub enum FediverseTagParseError { + #[error("Invalid char in tag: {0}")] + InvalidChar(String), + #[error("Invalid UTF-8 in tag: {0}")] + InvalidUtf8(#[from] std::str::Utf8Error), +} + impl, S2: AsRef> From<(S1, Option)> for FediverseTag { fn from((name, host): (S1, Option)) -> Self { Self { @@ -34,7 +42,7 @@ impl ToString for FediverseTag { } } -pub fn lenient_parse_acct(acct: &Acct) -> anyhow::Result { +pub fn lenient_parse_acct(acct: &Acct) -> Result { lenient_parse_tag(acct.as_ref()) } @@ -49,12 +57,12 @@ fn split_tag_inner(tag: impl AsRef) -> (String, Option) { } } -fn validate_tag_inner((name, host): (&str, Option<&str>)) -> anyhow::Result<()> { +fn validate_tag_inner((name, host): (&str, Option<&str>)) -> Result<(), FediverseTagParseError> { if name .chars() .any(|c| !c.is_alphanumeric() && c != '-' && c != '.') { - return Err(anyhow!("Invalid char in tag: {name}")); + return Err(FediverseTagParseError::InvalidChar(name.to_owned())); } if let Some(host_str) = host { @@ -62,14 +70,14 @@ fn validate_tag_inner((name, host): (&str, Option<&str>)) -> anyhow::Result<()> .chars() .any(|c| c.is_control() || c.is_whitespace() || c == '/' || c == '#') { - return Err(anyhow!("Invalid char in tag: {name}")); + return Err(FediverseTagParseError::InvalidChar(name.to_owned())); } } Ok(()) } -pub fn lenient_parse_tag(tag: impl AsRef) -> anyhow::Result { +pub fn lenient_parse_tag(tag: impl AsRef) -> Result { let (name, host) = split_tag_inner(tag); validate_tag_inner((&name, host.as_ref().map(String::as_ref)))?; @@ -77,11 +85,13 @@ pub fn lenient_parse_tag(tag: impl AsRef) -> anyhow::Result { Ok(FediverseTag { name, host }) } -pub fn lenient_parse_acct_decode(acct: &Acct) -> anyhow::Result { +pub fn lenient_parse_acct_decode(acct: &Acct) -> Result { lenient_parse_tag_decode(acct.as_ref()) } -pub fn lenient_parse_tag_decode(tag: impl AsRef) -> anyhow::Result { +pub fn lenient_parse_tag_decode( + tag: impl AsRef, +) -> Result { let (name, host) = split_tag_inner(tag); let name_decoded = percent_decode_str(&name).decode_utf8()?; diff --git a/src/main.rs b/src/main.rs index c9dcad4..e33ecd5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,14 +1,12 @@ -pub mod config; pub mod nodeinfo; -pub mod util; pub mod webfinger; use crate::nodeinfo::{handle_nodeinfo, handle_nodeinfo_20, handle_nodeinfo_21}; -use anyhow::anyhow; use axum::routing::get; use axum::Router; use dotenvy::dotenv; use magnetar_calckey_model::{CalckeyModel, ConnectorConfig}; +use miette::{miette, IntoDiagnostic}; use std::net::SocketAddr; use tower_http::cors::{Any, CorsLayer}; use tower_http::trace::TraceLayer; @@ -16,7 +14,7 @@ use tracing::info; use tracing_subscriber::EnvFilter; #[tokio::main] -async fn main() -> anyhow::Result<()> { +async fn main() -> miette::Result<()> { dotenv().ok(); let filter_layer = EnvFilter::try_from_default_env() @@ -28,12 +26,16 @@ async fn main() -> anyhow::Result<()> { .with_test_writer() .init(); - let config = &*Box::leak::<'static>(Box::new(config::load_config()?)); + let config = &*Box::leak::<'static>(Box::new( + magnetar_common::config::load_config().into_diagnostic()?, + )); + info!("Loaded configuration: {config:#?}"); let db = CalckeyModel::new(ConnectorConfig { url: config.data.database_url.clone(), }) - .await?; + .await + .into_diagnostic()?; let well_known_router = Router::new() .route( @@ -64,5 +66,5 @@ async fn main() -> anyhow::Result<()> { axum::Server::bind(&addr) .serve(app.into_make_service()) .await - .map_err(|e| anyhow!("Error running server: {}", e)) + .map_err(|e| miette!("Error running server: {}", e)) } diff --git a/src/nodeinfo.rs b/src/nodeinfo.rs index 5ffcbfc..c82153d 100644 --- a/src/nodeinfo.rs +++ b/src/nodeinfo.rs @@ -1,6 +1,6 @@ -use crate::config::MagnetarConfig; use axum::extract::State; use axum::Json; +use magnetar_common::config::MagnetarConfig; use magnetar_core::web_model::rel::{RelNodeInfo20, RelNodeInfo21}; use magnetar_core::web_model::Rel; use magnetar_nodeinfo::version_1_0::{ @@ -97,8 +97,8 @@ pub async fn handle_nodeinfo_20(State(config): State<&'static MagnetarConfig>) - #[cfg(test)] mod tests { - use crate::config::MagnetarConfig; use axum::extract::State; + use magnetar_common::config::MagnetarConfig; #[tokio::test] async fn test_nodeinfo() { diff --git a/src/webfinger.rs b/src/webfinger.rs index b0c1a10..7493c7a 100644 --- a/src/webfinger.rs +++ b/src/webfinger.rs @@ -1,11 +1,11 @@ -use crate::config::MagnetarConfig; -use crate::util::{lenient_parse_acct_decode, FediverseTag}; use axum::extract::{Query, State}; use axum::http::StatusCode; use axum::response::IntoResponse; use axum::Json; use hyper::header; use magnetar_calckey_model::CalckeyModel; +use magnetar_common::config::MagnetarConfig; +use magnetar_common::util::{lenient_parse_acct_decode, FediverseTag}; use magnetar_core::web_model::acct::Acct; use magnetar_core::web_model::content_type::{ContentActivityStreams, ContentHtml, ContentJrdJson}; use magnetar_core::web_model::rel::{RelOStatusSubscribe, RelSelf, RelWebFingerProfilePage};