Add support for generic timeline #525

Merged
Plume_migration_agent merged 58 commits from timeline into master 2019-10-07 17:08:21 +00:00
135 changed files with 35233 additions and 11744 deletions
Showing only changes of commit 7a92b4f5ce - Show all commits

View file

@ -55,11 +55,11 @@ aliases:
- &restore_cache
restore_cache:
keys:
- v1-plume-notest-{{ checksum "Cargo.lock" }}
- v1-plume-notest
- v2-plume-notest-{{ checksum "Cargo.lock" }}
- v2-plume-notest
- &save_cache
save_cache:
key: v1-plume-notest-{{ checksum "Cargo.lock" }}
key: v2-plume-notest-{{ checksum "Cargo.lock" }}
paths:
- ~/.cargo/
- ./target
@ -67,11 +67,11 @@ aliases:
- &restore_cache_web
restore_cache:
keys:
- v1-plume-web-{{ checksum "Cargo.lock" }}
- v1-plume-web
- v2-plume-web-{{ checksum "Cargo.lock" }}
- v2-plume-web
- &save_cache_web
save_cache:
key: v1-plume-web-{{ checksum "Cargo.lock" }}
key: v2-plume-web-{{ checksum "Cargo.lock" }}
paths:
- ~/.cargo/
- ./target
@ -79,29 +79,44 @@ aliases:
- &restore_cache_cli
restore_cache:
keys:
- v1-plume-notest-{{ checksum "Cargo.lock" }}-{{ checksum "/FEATURES" }}-cli
- v1-plume-notest-{{ checksum "Cargo.lock" }}-{{ checksum "/FEATURES" }}
- v1-plume-notest-{{ checksum "Cargo.lock" }}
- v1-plume-notest
- v2-plume-notest-{{ checksum "Cargo.lock" }}-{{ checksum "/FEATURES" }}-cli
- v2-plume-notest-{{ checksum "Cargo.lock" }}-{{ checksum "/FEATURES" }}
- v2-plume-notest-{{ checksum "Cargo.lock" }}
- v2-plume-notest
- &save_cache_cli
save_cache:
key: v1-plume-notest-{{ checksum "Cargo.lock" }}-{{ checksum "/FEATURES" }}-cli
key: v2-plume-notest-{{ checksum "Cargo.lock" }}-{{ checksum "/FEATURES" }}-cli
paths:
- ~/.cargo/
- target
- &restore_cache_release
restore_cache:
keys:
- v2-plume-release-{{ checksum "Cargo.lock" }}
- v2-plume-release
- v2-plume-notest-{{ checksum "Cargo.lock" }}
- v2-plume-notest
- &save_cache_release
save_cache:
key: v2-plume-release-{{ checksum "Cargo.lock" }}
paths:
- ~/.cargo
- target/release
- target/wasm32-unknown-unknown/release
- &restore_cache_plume_dead_code
restore_cache:
keys:
- v1-plume-test-{{ checksum "/FEATURES" }}-{{ checksum "Cargo.lock" }}-plume
- v1-plume-test-{{ checksum "/FEATURES" }}-{{ checksum "Cargo.lock" }}
- v1-plume-test-{{ checksum "/FEATURES" }}
- v1-plume-notest-{{ checksum "Cargo.lock" }}-{{ checksum "/FEATURES" }}
- v1-plume-notest-{{ checksum "Cargo.lock" }}
- v1-plume-notest
- v2-plume-test-{{ checksum "/FEATURES" }}-{{ checksum "Cargo.lock" }}-plume
- v2-plume-test-{{ checksum "/FEATURES" }}-{{ checksum "Cargo.lock" }}
- v2-plume-test-{{ checksum "/FEATURES" }}
- v2-plume-notest-{{ checksum "Cargo.lock" }}-{{ checksum "/FEATURES" }}
- v2-plume-notest-{{ checksum "Cargo.lock" }}
- v2-plume-notest
- &save_cache_plume_dead_code
save_cache:
key: v1-plume-test-{{ checksum "/FEATURES" }}-{{ checksum "Cargo.lock" }}-plume
key: v2-plume-test-{{ checksum "/FEATURES" }}-{{ checksum "Cargo.lock" }}-plume
paths:
- ~/.cargo/
- target
@ -150,10 +165,10 @@ aliases:
command: diesel migration run
- run:
name: install server
command: cargo install --debug --no-default-features --features="${FEATURES}",test --path . || cargo install --debug --no-default-features --features="${FEATURES}",test --path .
command: cargo install --debug --no-default-features --features="${FEATURES}",test --path . --force || cargo install --debug --no-default-features --features="${FEATURES}",test --path . --force
- run:
name: install plm
command: cargo install --debug --no-default-features --features="${FEATURES}" --path plume-cli || cargo install --debug --no-default-features --features="${FEATURES}" --path plume-cli
command: cargo install --debug --no-default-features --features="${FEATURES}" --path plume-cli --force || cargo install --debug --no-default-features --features="${FEATURES}" --path plume-cli --force
- run:
name: run test
command: ./script/run_browser_test.sh
@ -164,6 +179,26 @@ aliases:
command: ./script/upload_coverage.sh integration
- *save_cache_plume_dead_code
- &release
steps:
- *attach_workspace
- *restore_cache_release
- run:
name: build frontend
command: cargo web deploy -p plume-front --release
- run:
name: build server
command: cargo build --release --no-default-features --features="${FEATURES}" || cargo build --release --no-default-features --features="${FEATURES}"
- run:
name: build plm
command: cargo build --release --no-default-features --features="${FEATURES}" -p plume-cli || cargo build --release --no-default-features --features="${FEATURES}" -p plume-cli
- *save_cache_release
- run: script/generate_artifact.sh
- store_artifacts:
path: plume.tar.gz
destination: plume.tar.gz
jobs:
download_deps:
<<: *defaults
@ -171,6 +206,7 @@ jobs:
- checkout
- *attach_workspace
- *restore_cache
- run: git config --global --remove-section url."ssh://git@github.com"
- run: cargo fetch
- *save_cache
- *persist_to_workspace
@ -220,6 +256,19 @@ jobs:
<<: *selenium
<<: *env_sqlite
<<: *test_browser
all_ok:
docker:
- image: alpine:3.7
steps:
- run: /bin/true
release_postgresql:
<<: *defaults
<<: *env_postgresql
<<: *release
release_sqlite:
<<: *defaults
<<: *env_sqlite
<<: *release
workflows:
version: 2
@ -250,3 +299,18 @@ workflows:
- test_browser_sqlite:
requires:
- build_web
- all_ok:
requires:
- cargo_fmt
- test_cli_postgresql
- test_cli_sqlite
- test_unit_postgresql
- test_unit_sqlite
- test_browser_postgresql
- test_browser_sqlite
- release_postgresql:
requires:
- all_ok
- release_sqlite:
requires:
- all_ok

73
Cargo.lock generated
View file

@ -938,7 +938,7 @@ dependencies = [
[[package]]
name = "gettext"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
source = "git+https://github.com/Plume-org/gettext/?rev=294c54d74c699fbc66502b480a37cc66c1daa7f3#294c54d74c699fbc66502b480a37cc66c1daa7f3"
dependencies = [
"byteorder 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
"encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)",
@ -947,16 +947,16 @@ dependencies = [
[[package]]
name = "gettext-macros"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
source = "git+https://github.com/Plume-org/gettext-macros/?rev=a7c605f7edd6bfbfbfe7778026bfefd88d82db10#a7c605f7edd6bfbfbfe7778026bfefd88d82db10"
dependencies = [
"gettext 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
"gettext-utils 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"gettext 0.3.0 (git+https://github.com/Plume-org/gettext/?rev=294c54d74c699fbc66502b480a37cc66c1daa7f3)",
"gettext-utils 0.1.0 (git+https://github.com/Plume-org/gettext-macros/?rev=a7c605f7edd6bfbfbfe7778026bfefd88d82db10)",
]
[[package]]
name = "gettext-utils"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
source = "git+https://github.com/Plume-org/gettext-macros/?rev=a7c605f7edd6bfbfbfe7778026bfefd88d82db10#a7c605f7edd6bfbfbfe7778026bfefd88d82db10"
[[package]]
name = "guid"
@ -1777,7 +1777,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "plume"
version = "0.2.0"
version = "0.3.0"
dependencies = [
"activitypub 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"askama_escape 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
@ -1788,26 +1788,26 @@ dependencies = [
"ctrlc 3.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
"diesel 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
"dotenv 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)",
"failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
"gettext 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
"gettext-macros 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
"gettext-utils 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"gettext 0.3.0 (git+https://github.com/Plume-org/gettext/?rev=294c54d74c699fbc66502b480a37cc66c1daa7f3)",
"gettext-macros 0.4.0 (git+https://github.com/Plume-org/gettext-macros/?rev=a7c605f7edd6bfbfbfe7778026bfefd88d82db10)",
"gettext-utils 0.1.0 (git+https://github.com/Plume-org/gettext-macros/?rev=a7c605f7edd6bfbfbfe7778026bfefd88d82db10)",
"guid-create 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
"heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
"lettre 0.9.0 (git+https://github.com/lettre/lettre?rev=c988b1760ad8179d9e7f3fb8594d2b86cf2a0a49)",
"lettre_email 0.9.0 (git+https://github.com/lettre/lettre?rev=c988b1760ad8179d9e7f3fb8594d2b86cf2a0a49)",
"multipart 0.16.1 (registry+https://github.com/rust-lang/crates.io-index)",
"num_cpus 1.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
"plume-api 0.2.0",
"plume-common 0.2.0",
"plume-models 0.2.0",
"plume-api 0.3.0",
"plume-common 0.3.0",
"plume-models 0.3.0",
"rocket 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
"rocket_contrib 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
"rocket_csrf 0.1.0 (git+https://github.com/fdb-hiroshima/rocket_csrf?rev=4a72ea2ec716cb0b26188fb00bccf2ef7d1e031c)",
"rocket_i18n 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
"rocket_i18n 0.4.0 (git+https://github.com/Plume-org/rocket_i18n?rev=e922afa7c366038b3433278c03b1456b346074f2)",
"rpassword 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"rsass 0.9.8 (registry+https://github.com/rust-lang/crates.io-index)",
"ructe 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)",
"runtime-fmt 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
"scheduled-thread-pool 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_json 1.0.39 (registry+https://github.com/rust-lang/crates.io-index)",
@ -1819,7 +1819,7 @@ dependencies = [
[[package]]
name = "plume-api"
version = "0.2.0"
version = "0.3.0"
dependencies = [
"canapi 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)",
@ -1828,18 +1828,18 @@ dependencies = [
[[package]]
name = "plume-cli"
version = "0.2.0"
version = "0.3.0"
dependencies = [
"clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)",
"diesel 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
"dotenv 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)",
"plume-models 0.2.0",
"plume-models 0.3.0",
"rpassword 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "plume-common"
version = "0.2.0"
version = "0.3.0"
dependencies = [
"activitypub 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"activitystreams-derive 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
@ -1847,8 +1847,6 @@ dependencies = [
"array_tool 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
"base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
"chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
"failure 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
"failure_derive 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
"heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
"hex 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
"hyper 0.12.25 (registry+https://github.com/rust-lang/crates.io-index)",
@ -1863,18 +1861,18 @@ dependencies = [
[[package]]
name = "plume-front"
version = "0.1.0"
version = "0.3.0"
dependencies = [
"gettext 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
"gettext-macros 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
"gettext-utils 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
"gettext 0.3.0 (git+https://github.com/Plume-org/gettext/?rev=294c54d74c699fbc66502b480a37cc66c1daa7f3)",
"gettext-macros 0.4.0 (git+https://github.com/Plume-org/gettext-macros/?rev=a7c605f7edd6bfbfbfe7778026bfefd88d82db10)",
"gettext-utils 0.1.0 (git+https://github.com/Plume-org/gettext-macros/?rev=a7c605f7edd6bfbfbfe7778026bfefd88d82db10)",
"lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
"stdweb 0.4.14 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "plume-models"
version = "0.2.0"
version = "0.3.0"
dependencies = [
"activitypub 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
"ammonia 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
@ -1887,12 +1885,13 @@ dependencies = [
"guid-create 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
"heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
"itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
"lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
"lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
"openssl 0.10.19 (registry+https://github.com/rust-lang/crates.io-index)",
"plume-api 0.2.0",
"plume-common 0.2.0",
"plume-api 0.3.0",
"plume-common 0.3.0",
"reqwest 0.9.11 (registry+https://github.com/rust-lang/crates.io-index)",
"rocket 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
"rocket_i18n 0.4.0 (git+https://github.com/Plume-org/rocket_i18n?rev=e922afa7c366038b3433278c03b1456b346074f2)",
"scheduled-thread-pool 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
"serde 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)",
"serde_derive 1.0.89 (registry+https://github.com/rust-lang/crates.io-index)",
@ -2334,9 +2333,9 @@ dependencies = [
[[package]]
name = "rocket_i18n"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
source = "git+https://github.com/Plume-org/rocket_i18n?rev=e922afa7c366038b3433278c03b1456b346074f2#e922afa7c366038b3433278c03b1456b346074f2"
dependencies = [
"gettext 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
"gettext 0.3.0 (git+https://github.com/Plume-org/gettext/?rev=294c54d74c699fbc66502b480a37cc66c1daa7f3)",
"rocket 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
@ -2375,6 +2374,11 @@ dependencies = [
"nom 4.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "runtime-fmt"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "rust-stemmers"
version = "1.1.0"
@ -3366,9 +3370,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
"checksum futures 0.1.25 (registry+https://github.com/rust-lang/crates.io-index)" = "49e7653e374fe0d0c12de4250f0bdb60680b8c80eed558c5c7538eec9c89e21b"
"checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4"
"checksum generic-array 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c0f28c2f5bfb5960175af447a2da7c18900693738343dc896ffbcabd9839592"
"checksum gettext 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4378b8e09fd51cfdb0d48f40929a5c358efeeb62feb458c7d6eab979fae231f4"
"checksum gettext-macros 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2bdeb4255ca6caddbe341fb22fdbe654abb0b797358dfc2c569ed0d5d832ab8e"
"checksum gettext-utils 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "46dd079379f756f6a1ae74b051813e242893f84fbf6ac898bce827fc77958d70"
"checksum gettext 0.3.0 (git+https://github.com/Plume-org/gettext/?rev=294c54d74c699fbc66502b480a37cc66c1daa7f3)" = "<none>"
"checksum gettext-macros 0.4.0 (git+https://github.com/Plume-org/gettext-macros/?rev=a7c605f7edd6bfbfbfe7778026bfefd88d82db10)" = "<none>"
"checksum gettext-utils 0.1.0 (git+https://github.com/Plume-org/gettext-macros/?rev=a7c605f7edd6bfbfbfe7778026bfefd88d82db10)" = "<none>"
"checksum guid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e691c64d9b226c7597e29aeb46be753beb8c9eeef96d8c78dfd4d306338a38da"
"checksum guid-create 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fcea207bf7a6092166ab590f98fe5dde5a7deed1f1920d98dcac31f80814c40d"
"checksum guid-macro-impl 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "08d50f7c496073b5a5dec0f6f1c149113a50960ce25dd2a559987a5a71190816"
@ -3500,10 +3504,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
"checksum rocket_contrib 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f73e161dad5730435f51c815a5c6831d2e57b6b4299b1bf609d31b09aa9a2fa7"
"checksum rocket_csrf 0.1.0 (git+https://github.com/fdb-hiroshima/rocket_csrf?rev=4a72ea2ec716cb0b26188fb00bccf2ef7d1e031c)" = "<none>"
"checksum rocket_http 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba9d4f2ce5bba6e1b6d3100493bbad63879e99bbf6b4365d61e6f781daab324d"
"checksum rocket_i18n 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc76ce146d0650cd38ee343202c95c8a891311f1ddad54feb9ecf8709cc2c86b"
"checksum rocket_i18n 0.4.0 (git+https://github.com/Plume-org/rocket_i18n?rev=e922afa7c366038b3433278c03b1456b346074f2)" = "<none>"
"checksum rpassword 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d37473170aedbe66ffa3ad3726939ba677d83c646ad4fd99e5b4bc38712f45ec"
"checksum rsass 0.9.8 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4534cc03040beacd2668621815f26fe57e5b7cfe085790f98e5e87c1612316"
"checksum ructe 0.5.10 (registry+https://github.com/rust-lang/crates.io-index)" = "159f449df09bdd1c92080d0fc1d1c5e11abe81301496370dfee546d985a46dec"
"checksum runtime-fmt 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "647a821d66049faccc993fc3c379d1181b81a484097495cda79ffdb17b55b87f"
"checksum rust-stemmers 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05928c187b85b38f6b98db43057a24f0245163635a5ce6325a4f77a833d646aa"
"checksum rustc-demangle 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "adacaae16d02b6ec37fdc7acfcddf365978de76d1983d3ee22afc260e1ca9619"
"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"

View file

@ -1,7 +1,7 @@
[package]
authors = ["Plume contributors"]
name = "plume"
version = "0.2.0"
version = "0.3.0"
repository = "https://github.com/Plume-org/Plume"
[dependencies]
@ -11,10 +11,9 @@ atom_syndication = "0.6"
canapi = "0.2"
colored = "1.7"
dotenv = "0.13"
failure = "0.1"
gettext = "0.3"
gettext-macros = "0.4"
gettext-utils = "0.1"
gettext = { git = "https://github.com/Plume-org/gettext/", rev = "294c54d74c699fbc66502b480a37cc66c1daa7f3" }
gettext-macros = { git = "https://github.com/Plume-org/gettext-macros/", rev = "a7c605f7edd6bfbfbfe7778026bfefd88d82db10" }
gettext-utils = { git = "https://github.com/Plume-org/gettext-macros/", rev = "a7c605f7edd6bfbfbfe7778026bfefd88d82db10" }
guid-create = "0.1"
heck = "0.3.0"
lettre = { git = "https://github.com/lettre/lettre", rev = "c988b1760ad8179d9e7f3fb8594d2b86cf2a0a49" }
@ -22,8 +21,9 @@ lettre_email = { git = "https://github.com/lettre/lettre", rev = "c988b1760ad817
num_cpus = "1.0"
rocket = "0.4.0"
rocket_contrib = { version = "0.4.0", features = ["json"] }
rocket_i18n = "0.4.0"
rocket_i18n = { git = "https://github.com/Plume-org/rocket_i18n", rev = "e922afa7c366038b3433278c03b1456b346074f2" }
rpassword = "2.0"
runtime-fmt = "0.3.0"
scheduled-thread-pool = "0.2.0"
serde = "1.0"
serde_json = "1.0"

View file

@ -1,6 +1,6 @@
[package]
name = "plume-api"
version = "0.2.0"
version = "0.3.0"
authors = ["Plume contributors"]
[dependencies]

View file

@ -1,6 +1,6 @@
[package]
name = "plume-cli"
version = "0.2.0"
version = "0.3.0"
authors = ["Plume contributors"]
[[bin]]

View file

@ -1,6 +1,6 @@
[package]
name = "plume-common"
version = "0.2.0"
version = "0.3.0"
authors = ["Plume contributors"]
[dependencies]
@ -9,8 +9,6 @@ activitystreams-derive = "0.1.0"
activitystreams-traits = "0.1.0"
array_tool = "1.0"
base64 = "0.10"
failure = "0.1"
failure_derive = "0.1"
heck = "0.3.0"
hex = "0.3"
hyper = "0.12.20"

View file

@ -1,48 +1,606 @@
use activitypub::{activity::Create, Error as ApError, Object};
use reqwest::header::{HeaderValue, ACCEPT};
use std::fmt::Debug;
use activity_pub::Id;
/// Represents an ActivityPub inbox.
///
/// It routes an incoming Activity through the registered handlers.
///
/// # Example
///
/// ```rust
/// # extern crate activitypub;
/// # use activitypub::{actor::Person, activity::{Announce, Create}, object::Note};
/// # use plume_common::activity_pub::inbox::*;
/// # struct User;
/// # impl FromId<()> for User {
/// # type Error = ();
/// # type Object = Person;
/// #
/// # fn from_db(_: &(), _id: &str) -> Result<Self, Self::Error> {
/// # Ok(User)
/// # }
/// #
/// # fn from_activity(_: &(), obj: Person) -> Result<Self, Self::Error> {
/// # Ok(User)
/// # }
/// # }
/// # impl AsActor<&()> for User {
/// # fn get_inbox_url(&self) -> String {
/// # String::new()
/// # }
/// # fn is_local(&self) -> bool { false }
/// # }
/// # struct Message;
/// # impl FromId<()> for Message {
/// # type Error = ();
/// # type Object = Note;
/// #
/// # fn from_db(_: &(), _id: &str) -> Result<Self, Self::Error> {
/// # Ok(Message)
/// # }
/// #
/// # fn from_activity(_: &(), obj: Note) -> Result<Self, Self::Error> {
/// # Ok(Message)
/// # }
/// # }
/// # impl AsObject<User, Create, &()> for Message {
/// # type Error = ();
/// # type Output = ();
/// #
/// # fn activity(self, _: &(), _actor: User, _id: &str) -> Result<(), ()> {
/// # Ok(())
/// # }
/// # }
/// # impl AsObject<User, Announce, &()> for Message {
/// # type Error = ();
/// # type Output = ();
/// #
/// # fn activity(self, _: &(), _actor: User, _id: &str) -> Result<(), ()> {
/// # Ok(())
/// # }
/// # }
/// #
/// # let mut act = Create::default();
/// # act.object_props.set_id_string(String::from("https://test.ap/activity")).unwrap();
/// # let mut person = Person::default();
/// # person.object_props.set_id_string(String::from("https://test.ap/actor")).unwrap();
/// # act.create_props.set_actor_object(person).unwrap();
/// # act.create_props.set_object_object(Note::default()).unwrap();
/// # let activity_json = serde_json::to_value(act).unwrap();
/// #
/// # let conn = ();
/// #
/// let result: Result<(), ()> = Inbox::handle(&conn, activity_json)
/// .with::<User, Announce, Message>()
/// .with::<User, Create, Message>()
/// .done();
/// ```
pub enum Inbox<'a, C, E, R>
where
E: From<InboxError<E>> + Debug,
{
/// The activity has not been handled yet
///
/// # Structure
///
/// - the context to be passed to each handler.
/// - the activity
/// - the reason it has not been handled yet
NotHandled(&'a C, serde_json::Value, InboxError<E>),
#[derive(Fail, Debug)]
pub enum InboxError {
#[fail(display = "The `type` property is required, but was not present")]
NoType,
#[fail(display = "Invalid activity type")]
InvalidType,
#[fail(display = "Couldn't undo activity")]
CantUndo,
/// A matching handler have been found but failed
///
/// The wrapped value is the error returned by the handler
Failed(E),
/// The activity was successfully handled
///
/// The wrapped value is the value returned by the handler
Handled(R),
}
pub trait FromActivity<T: Object, C>: Sized {
type Error: From<ApError>;
/// Possible reasons of inbox failure
#[derive(Debug)]
pub enum InboxError<E: Debug> {
/// None of the registered handlers matched
NoMatch,
fn from_activity(conn: &C, obj: T, actor: Id) -> Result<Self, Self::Error>;
/// No ID was provided for the incoming activity, or it was not a string
InvalidID,
fn try_from_activity(conn: &C, act: Create) -> Result<Self, Self::Error> {
Self::from_activity(
conn,
act.create_props.object_object()?,
act.create_props.actor_link::<Id>()?,
)
/// The activity type matched for at least one handler, but then the actor was
/// not of the expected type
InvalidActor(Option<E>),
/// Activity and Actor types matched, but not the Object
InvalidObject(Option<E>),
/// Error while dereferencing the object
DerefError,
}
impl<T: Debug> From<InboxError<T>> for () {
fn from(_: InboxError<T>) {}
}
/*
Type arguments:
- C: Context
- E: Error
- R: Result
*/
impl<'a, C, E, R> Inbox<'a, C, E, R>
where
E: From<InboxError<E>> + Debug,
{
/// Creates a new `Inbox` to handle an incoming activity.
///
/// # Parameters
///
/// - `ctx`: the context to pass to each handler
/// - `json`: the JSON representation of the incoming activity
pub fn handle(ctx: &'a C, json: serde_json::Value) -> Inbox<'a, C, E, R> {
Inbox::NotHandled(ctx, json, InboxError::NoMatch)
}
/// Registers an handler on this Inbox.
pub fn with<A, V, M>(self) -> Inbox<'a, C, E, R>
where
A: AsActor<&'a C> + FromId<C, Error = E>,
V: activitypub::Activity,
M: AsObject<A, V, &'a C, Error = E> + FromId<C, Error = E>,
M::Output: Into<R>,
{
if let Inbox::NotHandled(ctx, mut act, e) = self {
if serde_json::from_value::<V>(act.clone()).is_ok() {
let act_clone = act.clone();
let act_id = match act_clone["id"].as_str() {
Some(x) => x,
None => return Inbox::NotHandled(ctx, act, InboxError::InvalidID),
};
// Get the actor ID
let actor_id = match get_id(act["actor"].clone()) {
Some(x) => x,
None => return Inbox::NotHandled(ctx, act, InboxError::InvalidActor(None)),
};
// Transform this actor to a model (see FromId for details about the from_id function)
let actor = match A::from_id(
ctx,
&actor_id,
serde_json::from_value(act["actor"].clone()).ok(),
) {
Ok(a) => a,
// If the actor was not found, go to the next handler
Err((json, e)) => {
if let Some(json) = json {
act["actor"] = json;
}
return Inbox::NotHandled(ctx, act, InboxError::InvalidActor(Some(e)));
}
};
// Same logic for "object"
let obj_id = match get_id(act["object"].clone()) {
Some(x) => x,
None => return Inbox::NotHandled(ctx, act, InboxError::InvalidObject(None)),
};
let obj = match M::from_id(
ctx,
&obj_id,
serde_json::from_value(act["object"].clone()).ok(),
) {
Ok(o) => o,
Err((json, e)) => {
if let Some(json) = json {
act["object"] = json;
}
return Inbox::NotHandled(ctx, act, InboxError::InvalidObject(Some(e)));
}
};
// Handle the activity
match obj.activity(ctx, actor, &act_id) {
Ok(res) => Inbox::Handled(res.into()),
Err(e) => Inbox::Failed(e),
}
} else {
// If the Activity type is not matching the expected one for
// this handler, try with the next one.
Inbox::NotHandled(ctx, act, e)
}
} else {
self
}
}
/// Transforms the inbox in a `Result`
pub fn done(self) -> Result<R, E> {
match self {
Inbox::Handled(res) => Ok(res),
Inbox::NotHandled(_, _, err) => Err(E::from(err)),
Inbox::Failed(err) => Err(err),
}
}
}
pub trait Notify<C> {
type Error;
fn notify(&self, conn: &C) -> Result<(), Self::Error>;
/// Get the ActivityPub ID of a JSON value.
///
/// If the value is a string, its value is returned.
/// If it is an object, and that its `id` field is a string, we return it.
///
/// Otherwise, `None` is returned.
fn get_id(json: serde_json::Value) -> Option<String> {
match json {
serde_json::Value::String(s) => Some(s),
serde_json::Value::Object(map) => map.get("id")?.as_str().map(ToString::to_string),
_ => None,
}
}
pub trait Deletable<C, A> {
type Error;
/// A trait for ActivityPub objects that can be retrieved or constructed from ID.
///
/// The two functions to implement are `from_activity` to create (and save) a new object
/// of this type from its AP representation, and `from_db` to try to find it in the database
/// using its ID.
///
/// When dealing with the "object" field of incoming activities, `Inbox` will try to see if it is
/// a full object, and if so, save it with `from_activity`. If it is only an ID, it will try to find
/// it in the database with `from_db`, and otherwise dereference (fetch) the full object and parse it
/// with `from_activity`.
pub trait FromId<C>: Sized {
/// The type representing a failure
type Error: From<InboxError<Self::Error>> + Debug;
fn delete(&self, conn: &C) -> Result<A, Self::Error>;
fn delete_id(id: &str, actor_id: &str, conn: &C) -> Result<A, Self::Error>;
/// The ActivityPub object type representing Self
type Object: activitypub::Object;
/// Tries to get an instance of `Self` from an ActivityPub ID.
///
/// # Parameters
///
/// - `ctx`: a context to get this instance (= a database in which to search)
/// - `id`: the ActivityPub ID of the object to find
/// - `object`: optional object that will be used if the object was not found in the database
/// If absent, the ID will be dereferenced.
fn from_id(
ctx: &C,
id: &str,
object: Option<Self::Object>,
) -> Result<Self, (Option<serde_json::Value>, Self::Error)> {
match Self::from_db(ctx, id) {
Ok(x) => Ok(x),
_ => match object {
Some(o) => Self::from_activity(ctx, o).map_err(|e| (None, e)),
None => Self::from_activity(ctx, Self::deref(id)?).map_err(|e| (None, e)),
},
}
}
/// Dereferences an ID
fn deref(id: &str) -> Result<Self::Object, (Option<serde_json::Value>, Self::Error)> {
reqwest::Client::new()
.get(id)
.header(
ACCEPT,
HeaderValue::from_str(
&super::ap_accept_header()
.into_iter()
.collect::<Vec<_>>()
.join(", "),
)
.map_err(|_| (None, InboxError::DerefError.into()))?,
)
.send()
.map_err(|_| (None, InboxError::DerefError))
.and_then(|mut r| {
let json: serde_json::Value = r
.json()
.map_err(|_| (None, InboxError::InvalidObject(None)))?;
serde_json::from_value(json.clone())
.map_err(|_| (Some(json), InboxError::InvalidObject(None)))
})
.map_err(|(json, e)| (json, e.into()))
}
/// Builds a `Self` from its ActivityPub representation
fn from_activity(ctx: &C, activity: Self::Object) -> Result<Self, Self::Error>;
/// Tries to find a `Self` with a given ID (`id`), using `ctx` (a database)
fn from_db(ctx: &C, id: &str) -> Result<Self, Self::Error>;
}
pub trait WithInbox {
/// Should be implemented by anything representing an ActivityPub actor.
///
/// # Type arguments
///
/// - `C`: the context to be passed to this activity handler from the `Inbox` (usually a database connection)
pub trait AsActor<C> {
/// Return the URL of this actor's inbox
fn get_inbox_url(&self) -> String;
fn get_shared_inbox_url(&self) -> Option<String>;
/// If this actor has shared inbox, its URL should be returned by this function
fn get_shared_inbox_url(&self) -> Option<String> {
None
}
/// `true` if this actor comes from the running ActivityPub server/instance
fn is_local(&self) -> bool;
}
/// Should be implemented by anything representing an ActivityPub object.
///
/// # Type parameters
///
/// - `A`: the actor type
/// - `V`: the ActivityPub verb/activity
/// - `O`: the ActivityPub type of the Object for this activity (usually the type corresponding to `Self`)
/// - `C`: the context needed to handle the activity (usually a database connection)
///
/// # Example
///
/// An implementation of AsObject that handles Note creation by an Account model,
/// representing the Note by a Message type, without any specific context.
///
/// ```rust
/// # extern crate activitypub;
/// # use activitypub::{activity::Create, actor::Person, object::Note};
/// # use plume_common::activity_pub::inbox::{AsActor, AsObject, FromId};
/// # struct Account;
/// # impl FromId<()> for Account {
/// # type Error = ();
/// # type Object = Person;
/// #
/// # fn from_db(_: &(), _id: &str) -> Result<Self, Self::Error> {
/// # Ok(Account)
/// # }
/// #
/// # fn from_activity(_: &(), obj: Person) -> Result<Self, Self::Error> {
/// # Ok(Account)
/// # }
/// # }
/// # impl AsActor<()> for Account {
/// # fn get_inbox_url(&self) -> String {
/// # String::new()
/// # }
/// # fn is_local(&self) -> bool { false }
/// # }
/// #[derive(Debug)]
/// struct Message {
/// text: String,
/// }
///
/// impl FromId<()> for Message {
/// type Error = ();
/// type Object = Note;
///
/// fn from_db(_: &(), _id: &str) -> Result<Self, Self::Error> {
/// Ok(Message { text: "From DB".into() })
/// }
///
/// fn from_activity(_: &(), obj: Note) -> Result<Self, Self::Error> {
/// Ok(Message { text: obj.object_props.content_string().map_err(|_| ())? })
/// }
/// }
///
/// impl AsObject<Account, Create, ()> for Message {
/// type Error = ();
/// type Output = ();
///
/// fn activity(self, _: (), _actor: Account, _id: &str) -> Result<(), ()> {
/// println!("New Note: {:?}", self);
/// Ok(())
/// }
/// }
/// ```
pub trait AsObject<A, V, C>
where
V: activitypub::Activity,
{
/// What kind of error is returned when something fails
type Error;
/// What is returned by `AsObject::activity`, if anything is returned
type Output = ();
/// Handle a specific type of activity dealing with this type of objects.
///
/// The implementations should check that the actor is actually authorized
/// to perform this action.
///
/// # Parameters
///
/// - `self`: the object on which the activity acts
/// - `ctx`: the context passed to `Inbox::handle`
/// - `actor`: the actor who did this activity
/// - `id`: the ID of this activity
fn activity(self, ctx: C, actor: A, id: &str) -> Result<Self::Output, Self::Error>;
}
#[cfg(test)]
mod tests {
use super::*;
use activitypub::{activity::*, actor::Person, object::Note};
struct MyActor;
impl FromId<()> for MyActor {
type Error = ();
type Object = Person;
fn from_db(_: &(), _id: &str) -> Result<Self, Self::Error> {
Ok(MyActor)
}
fn from_activity(_: &(), _obj: Person) -> Result<Self, Self::Error> {
Ok(MyActor)
}
}
impl AsActor<&()> for MyActor {
fn get_inbox_url(&self) -> String {
String::from("https://test.ap/my-actor/inbox")
}
fn is_local(&self) -> bool {
false
}
}
struct MyObject;
impl FromId<()> for MyObject {
type Error = ();
type Object = Note;
fn from_db(_: &(), _id: &str) -> Result<Self, Self::Error> {
Ok(MyObject)
}
fn from_activity(_: &(), _obj: Note) -> Result<Self, Self::Error> {
Ok(MyObject)
}
}
impl AsObject<MyActor, Create, &()> for MyObject {
type Error = ();
type Output = ();
fn activity(self, _: &(), _actor: MyActor, _id: &str) -> Result<Self::Output, Self::Error> {
println!("MyActor is creating a Note");
Ok(())
}
}
impl AsObject<MyActor, Like, &()> for MyObject {
type Error = ();
type Output = ();
fn activity(self, _: &(), _actor: MyActor, _id: &str) -> Result<Self::Output, Self::Error> {
println!("MyActor is liking a Note");
Ok(())
}
}
impl AsObject<MyActor, Delete, &()> for MyObject {
type Error = ();
type Output = ();
fn activity(self, _: &(), _actor: MyActor, _id: &str) -> Result<Self::Output, Self::Error> {
println!("MyActor is deleting a Note");
Ok(())
}
}
impl AsObject<MyActor, Announce, &()> for MyObject {
type Error = ();
type Output = ();
fn activity(self, _: &(), _actor: MyActor, _id: &str) -> Result<Self::Output, Self::Error> {
println!("MyActor is announcing a Note");
Ok(())
}
}
fn build_create() -> Create {
let mut act = Create::default();
act.object_props
.set_id_string(String::from("https://test.ap/activity"))
.unwrap();
let mut person = Person::default();
person
.object_props
.set_id_string(String::from("https://test.ap/actor"))
.unwrap();
act.create_props.set_actor_object(person).unwrap();
let mut note = Note::default();
note.object_props
.set_id_string(String::from("https://test.ap/note"))
.unwrap();
act.create_props.set_object_object(note).unwrap();
act
}
#[test]
fn test_inbox_basic() {
let act = serde_json::to_value(build_create()).unwrap();
let res: Result<(), ()> = Inbox::handle(&(), act)
.with::<MyActor, Create, MyObject>()
.done();
assert!(res.is_ok());
}
#[test]
fn test_inbox_multi_handlers() {
let act = serde_json::to_value(build_create()).unwrap();
let res: Result<(), ()> = Inbox::handle(&(), act)
.with::<MyActor, Announce, MyObject>()
.with::<MyActor, Delete, MyObject>()
.with::<MyActor, Create, MyObject>()
.with::<MyActor, Like, MyObject>()
.done();
assert!(res.is_ok());
}
#[test]
fn test_inbox_failure() {
let act = serde_json::to_value(build_create()).unwrap();
// Create is not handled by this inbox
let res: Result<(), ()> = Inbox::handle(&(), act)
.with::<MyActor, Announce, MyObject>()
.with::<MyActor, Like, MyObject>()
.done();
assert!(res.is_err());
}
struct FailingActor;
impl FromId<()> for FailingActor {
type Error = ();
type Object = Person;
fn from_db(_: &(), _id: &str) -> Result<Self, Self::Error> {
Err(())
}
fn from_activity(_: &(), _obj: Person) -> Result<Self, Self::Error> {
Err(())
}
}
impl AsActor<&()> for FailingActor {
fn get_inbox_url(&self) -> String {
String::from("https://test.ap/failing-actor/inbox")
}
fn is_local(&self) -> bool {
false
}
}
impl AsObject<FailingActor, Create, &()> for MyObject {
type Error = ();
type Output = ();
fn activity(
self,
_: &(),
_actor: FailingActor,
_id: &str,
) -> Result<Self::Output, Self::Error> {
println!("FailingActor is creating a Note");
Ok(())
}
}
#[test]
fn test_inbox_actor_failure() {
let act = serde_json::to_value(build_create()).unwrap();
let res: Result<(), ()> = Inbox::handle(&(), act.clone())
.with::<FailingActor, Create, MyObject>()
.done();
assert!(res.is_err());
let res: Result<(), ()> = Inbox::handle(&(), act.clone())
.with::<FailingActor, Create, MyObject>()
.with::<MyActor, Create, MyObject>()
.done();
assert!(res.is_ok());
}
}

View file

@ -16,7 +16,7 @@ pub mod request;
pub mod sign;
pub const CONTEXT_URL: &str = "https://www.w3.org/ns/activitystreams";
pub const PUBLIC_VISIBILTY: &str = "https://www.w3.org/ns/activitystreams#Public";
pub const PUBLIC_VISIBILITY: &str = "https://www.w3.org/ns/activitystreams#Public";
pub const AP_CONTENT_TYPE: &str =
r#"application/ld+json; profile="https://www.w3.org/ns/activitystreams""#;
@ -107,11 +107,12 @@ impl<'a, 'r> FromRequest<'a, 'r> for ApRequest {
.unwrap_or(Outcome::Forward(()))
}
}
pub fn broadcast<S: sign::Signer, A: Activity, T: inbox::WithInbox>(
sender: &S,
act: A,
to: Vec<T>,
) {
pub fn broadcast<S, A, T, C>(sender: &S, act: A, to: Vec<T>)
where
S: sign::Signer,
A: Activity,
T: inbox::AsActor<C>,
{
let boxes = to
.into_iter()
.filter(|u| !u.is_local())

View file

@ -1,4 +1,4 @@
#![feature(custom_attribute)]
#![feature(custom_attribute, associated_type_defaults)]
extern crate activitypub;
#[macro_use]
@ -7,9 +7,6 @@ extern crate activitystreams_traits;
extern crate array_tool;
extern crate base64;
extern crate chrono;
extern crate failure;
#[macro_use]
extern crate failure_derive;
extern crate heck;
extern crate hex;
extern crate openssl;

View file

@ -1,11 +1,11 @@
[package]
name = "plume-front"
version = "0.1.0"
version = "0.3.0"
authors = ["Plume contributors"]
[dependencies]
stdweb = "0.4"
gettext = "0.3"
gettext-macros = "0.4"
gettext-utils = "0.1"
gettext = { git = "https://github.com/Plume-org/gettext/", rev = "294c54d74c699fbc66502b480a37cc66c1daa7f3" }
gettext-macros = { git = "https://github.com/Plume-org/gettext-macros/", rev = "a7c605f7edd6bfbfbfe7778026bfefd88d82db10" }
gettext-utils = { git = "https://github.com/Plume-org/gettext-macros/", rev = "a7c605f7edd6bfbfbfe7778026bfefd88d82db10" }
lazy_static = "1.3"

View file

@ -11,7 +11,31 @@ extern crate stdweb;
use stdweb::web::{event::*, *};
init_i18n!("plume-front", en, fr);
init_i18n!(
"plume-front",
ar,
bg,
ca,
cs,
de,
en,
eo,
es,
fr,
gl,
hi,
hr,
it,
ja,
nb,
pl,
pt,
ro,
ru,
sr,
sk,
sv
);
mod editor;

View file

@ -1,6 +1,6 @@
[package]
name = "plume-models"
version = "0.2.0"
version = "0.3.0"
authors = ["Plume contributors"]
[dependencies]
@ -15,6 +15,7 @@ itertools = "0.8.0"
lazy_static = "*"
openssl = "0.10.15"
rocket = "0.4.0"
rocket_i18n = { git = "https://github.com/Plume-org/rocket_i18n", rev = "e922afa7c366038b3433278c03b1456b346074f2" }
reqwest = "0.9"
scheduled-thread-pool = "0.2.0"
serde = "1.0"

View file

@ -7,10 +7,6 @@ use openssl::{
rsa::Rsa,
sign::{Signer, Verifier},
};
use reqwest::{
header::{HeaderValue, ACCEPT},
Client,
};
use serde_json;
use url::Url;
use webfinger::*;
@ -18,8 +14,7 @@ use webfinger::*;
use instance::*;
use medias::Media;
use plume_common::activity_pub::{
ap_accept_header,
inbox::{Deletable, WithInbox},
inbox::{AsActor, FromId},
sign, ActivityStream, ApSignature, Id, IntoId, PublicKey, Source,
};
use posts::Post;
@ -27,7 +22,7 @@ use safe_string::SafeString;
use schema::blogs;
use search::Searcher;
use users::User;
use {Connection, Error, Result, CONFIG};
use {Connection, Error, PlumeRocket, Result};
pub type CustomGroup = CustomObject<ApSignature, Group>;
@ -135,121 +130,27 @@ impl Blog {
.map_err(Error::from)
}
pub fn find_by_fqn(conn: &Connection, fqn: &str) -> Result<Blog> {
pub fn find_by_fqn(c: &PlumeRocket, fqn: &str) -> Result<Blog> {
let from_db = blogs::table
.filter(blogs::fqn.eq(fqn))
.limit(1)
.load::<Blog>(conn)?
.load::<Blog>(&*c.conn)?
.into_iter()
.next();
if let Some(from_db) = from_db {
Ok(from_db)
} else {
Blog::fetch_from_webfinger(conn, fqn)
Blog::fetch_from_webfinger(c, fqn)
}
}
fn fetch_from_webfinger(conn: &Connection, acct: &str) -> Result<Blog> {
fn fetch_from_webfinger(c: &PlumeRocket, acct: &str) -> Result<Blog> {
resolve(acct.to_owned(), true)?
.links
Review

First return a Result<Blog, _>, optional convert it to a Result<Option<Blog>,...> so that if the error is not found, we can fetch the blog instead of not knowing it ever, but if the error is anything else, it's still an error

First return a `Result<Blog, _>`, [optional](https://docs.diesel.rs/diesel/result/trait.OptionalExtension.html) convert it to a `Result<Option<Blog>,...>` so that if the error is not found, we can fetch the blog instead of not knowing it ever, but if the error is anything else, it's still an error
igalic commented 2019-07-27 07:00:10 +00:00 (Migrated from github.com)
Review

thank you for the explanation!

thank you for the explanation!
.into_iter()
.find(|l| l.mime_type == Some(String::from("application/activity+json")))
.ok_or(Error::Webfinger)
.and_then(|l| Blog::fetch_from_url(conn, &l.href?))
}
fn fetch_from_url(conn: &Connection, url: &str) -> Result<Blog> {
let mut res = Client::new()
.get(url)
.header(
ACCEPT,
HeaderValue::from_str(
&ap_accept_header()
.into_iter()
.collect::<Vec<_>>()
.join(", "),
)?,
)
.send()?;
let text = &res.text()?;
let ap_sign: ApSignature = serde_json::from_str(text)?;
let mut json: CustomGroup = serde_json::from_str(text)?;
json.custom_props = ap_sign; // without this workaround, publicKey is not correctly deserialized
Blog::from_activity(conn, &json, Url::parse(url)?.host_str()?)
}
fn from_activity(conn: &Connection, acct: &CustomGroup, inst: &str) -> Result<Blog> {
let instance = Instance::find_by_domain(conn, inst).or_else(|_| {
Instance::insert(
conn,
NewInstance {
public_domain: inst.to_owned(),
name: inst.to_owned(),
local: false,
// We don't really care about all the following for remote instances
long_description: SafeString::new(""),
short_description: SafeString::new(""),
default_license: String::new(),
open_registrations: true,
short_description_html: String::new(),
long_description_html: String::new(),
},
)
})?;
let icon_id = acct
.object
.object_props
.icon_image()
.ok()
.and_then(|icon| {
let owner: String = icon.object_props.attributed_to_link::<Id>().ok()?.into();
Media::save_remote(
conn,
icon.object_props.url_string().ok()?,
&User::from_url(conn, &owner).ok()?,
)
.ok()
})
.map(|m| m.id);
let banner_id = acct
.object
.object_props
.image_image()
.ok()
.and_then(|banner| {
let owner: String = banner.object_props.attributed_to_link::<Id>().ok()?.into();
Media::save_remote(
conn,
banner.object_props.url_string().ok()?,
&User::from_url(conn, &owner).ok()?,
)
.ok()
})
.map(|m| m.id);
Blog::insert(
conn,
NewBlog {
actor_id: acct.object.ap_actor_props.preferred_username_string()?,
title: acct.object.object_props.name_string()?,
outbox_url: acct.object.ap_actor_props.outbox_string()?,
inbox_url: acct.object.ap_actor_props.inbox_string()?,
summary: acct.object.object_props.summary_string()?,
instance_id: instance.id,
ap_url: acct.object.object_props.id_string()?,
public_key: acct
.custom_props
.public_key_publickey()?
.public_key_pem_string()?,
private_key: None,
banner_id,
icon_id,
summary_html: SafeString::new(&acct.object.object_props.summary_string()?),
},
)
.and_then(|l| Blog::from_id(c, &l.href?, None).map_err(|(_, e)| e))
}
pub fn to_activity(&self, conn: &Connection) -> Result<CustomGroup> {
@ -368,18 +269,6 @@ impl Blog {
})
}
pub fn from_url(conn: &Connection, url: &str) -> Result<Blog> {
Blog::find_by_ap_url(conn, url).or_else(|_| {
// The requested blog was not in the DB
// We try to fetch it if it is remote
if Url::parse(url)?.host_str()? != CONFIG.base_url.as_str() {
Blog::fetch_from_url(conn, url)
} else {
Err(Error::NotFound)
}
})
}
pub fn icon_url(&self, conn: &Connection) -> String {
self.icon_id
.and_then(|id| Media::get(conn, id).and_then(|m| m.url(conn)).ok())
@ -394,7 +283,7 @@ impl Blog {
pub fn delete(&self, conn: &Connection, searcher: &Searcher) -> Result<()> {
for post in Post::get_for_blog(conn, &self)? {
post.delete(&(conn, searcher))?;
post.delete(conn, searcher)?;
}
diesel::delete(self)
.execute(conn)
@ -409,7 +298,106 @@ impl IntoId for Blog {
}
}
impl WithInbox for Blog {
impl FromId<PlumeRocket> for Blog {
type Error = Error;
type Object = CustomGroup;
fn from_db(c: &PlumeRocket, id: &str) -> Result<Self> {
Self::find_by_ap_url(&c.conn, id)
}
fn from_activity(c: &PlumeRocket, acct: CustomGroup) -> Result<Self> {
let url = Url::parse(&acct.object.object_props.id_string()?)?;
let inst = url.host_str()?;
let instance = Instance::find_by_domain(&c.conn, inst).or_else(|_| {
Instance::insert(
&c.conn,
NewInstance {
public_domain: inst.to_owned(),
name: inst.to_owned(),
local: false,
// We don't really care about all the following for remote instances
long_description: SafeString::new(""),
short_description: SafeString::new(""),
default_license: String::new(),
open_registrations: true,
short_description_html: String::new(),
long_description_html: String::new(),
},
)
})?;
let icon_id = acct
.object
.object_props
.icon_image()
.ok()
.and_then(|icon| {
let owner: String = icon.object_props.attributed_to_link::<Id>().ok()?.into();
Media::save_remote(
&c.conn,
icon.object_props.url_string().ok()?,
&User::from_id(c, &owner, None).ok()?,
)
.ok()
})
.map(|m| m.id);
let banner_id = acct
.object
.object_props
.image_image()
.ok()
.and_then(|banner| {
let owner: String = banner.object_props.attributed_to_link::<Id>().ok()?.into();
Media::save_remote(
&c.conn,
banner.object_props.url_string().ok()?,
&User::from_id(c, &owner, None).ok()?,
)
.ok()
})
.map(|m| m.id);
let name = acct.object.ap_actor_props.preferred_username_string()?;
if name.contains(&['<', '>', '&', '@', '\'', '"', ' ', '\t'][..]) {
return Err(Error::InvalidValue);
}
Blog::insert(
&c.conn,
NewBlog {
actor_id: name.clone(),
title: acct.object.object_props.name_string().unwrap_or(name),
outbox_url: acct.object.ap_actor_props.outbox_string()?,
inbox_url: acct.object.ap_actor_props.inbox_string()?,
summary: acct
.object
.ap_object_props
.source_object::<Source>()
.map(|s| s.content)
.unwrap_or_default(),
instance_id: instance.id,
ap_url: acct.object.object_props.id_string()?,
public_key: acct
.custom_props
.public_key_publickey()?
.public_key_pem_string()?,
private_key: None,
banner_id,
icon_id,
summary_html: SafeString::new(
&acct
.object
.object_props
.summary_string()
.unwrap_or_default(),
),
},
)
}
}
impl AsActor<&PlumeRocket> for Blog {
fn get_inbox_url(&self) -> String {
self.inbox_url.clone()
}
@ -419,7 +407,7 @@ impl WithInbox for Blog {
}
fn is_local(&self) -> bool {
self.instance_id == 0
self.instance_id == 1 // TODO: this is not always true
}
}
@ -469,9 +457,11 @@ impl NewBlog {
pub(crate) mod tests {
use super::*;
use blog_authors::*;
use diesel::Connection;
use instance::tests as instance_tests;
use medias::NewMedia;
use search::tests::get_searcher;
use tests::db;
use tests::{db, rockets};
use users::tests as usersTests;
use Connection as Conn;
@ -557,238 +547,318 @@ pub(crate) mod tests {
#[test]
fn get_instance() {
let conn = &db();
fill_database(conn);
conn.test_transaction::<_, (), _>(|| {
fill_database(conn);
let blog = Blog::insert(
conn,
NewBlog::new_local(
"SomeName".to_owned(),
"Some name".to_owned(),
"This is some blog".to_owned(),
Instance::get_local(conn).unwrap().id,
let blog = Blog::insert(
conn,
NewBlog::new_local(
"SomeName".to_owned(),
"Some name".to_owned(),
"This is some blog".to_owned(),
Instance::get_local(conn).unwrap().id,
)
.unwrap(),
)
.unwrap(),
)
.unwrap();
.unwrap();
assert_eq!(
blog.get_instance(conn).unwrap().id,
Instance::get_local(conn).unwrap().id
);
// TODO add tests for remote instance
assert_eq!(
blog.get_instance(conn).unwrap().id,
Instance::get_local(conn).unwrap().id
);
// TODO add tests for remote instance
Ok(())
})
}
#[test]
fn authors() {
let conn = &db();
let (user, _) = fill_database(conn);
conn.test_transaction::<_, (), _>(|| {
let (user, _) = fill_database(conn);
let b1 = Blog::insert(
conn,
NewBlog::new_local(
"SomeName".to_owned(),
"Some name".to_owned(),
"This is some blog".to_owned(),
Instance::get_local(conn).unwrap().id,
let b1 = Blog::insert(
conn,
NewBlog::new_local(
"SomeName".to_owned(),
"Some name".to_owned(),
"This is some blog".to_owned(),
Instance::get_local(conn).unwrap().id,
)
.unwrap(),
)
.unwrap(),
)
.unwrap();
let b2 = Blog::insert(
conn,
NewBlog::new_local(
"Blog".to_owned(),
"Blog".to_owned(),
"I've named my blog Blog".to_owned(),
Instance::get_local(conn).unwrap().id,
.unwrap();
let b2 = Blog::insert(
conn,
NewBlog::new_local(
"Blog".to_owned(),
"Blog".to_owned(),
"I've named my blog Blog".to_owned(),
Instance::get_local(conn).unwrap().id,
)
.unwrap(),
)
.unwrap(),
)
.unwrap();
let blog = vec![b1, b2];
.unwrap();
let blog = vec![b1, b2];
BlogAuthor::insert(
conn,
NewBlogAuthor {
blog_id: blog[0].id,
author_id: user[0].id,
is_owner: true,
},
)
.unwrap();
BlogAuthor::insert(
conn,
NewBlogAuthor {
blog_id: blog[0].id,
author_id: user[0].id,
is_owner: true,
},
)
.unwrap();
BlogAuthor::insert(
conn,
NewBlogAuthor {
blog_id: blog[0].id,
author_id: user[1].id,
is_owner: false,
},
)
.unwrap();
BlogAuthor::insert(
conn,
NewBlogAuthor {
blog_id: blog[0].id,
author_id: user[1].id,
is_owner: false,
},
)
.unwrap();
BlogAuthor::insert(
conn,
NewBlogAuthor {
blog_id: blog[1].id,
author_id: user[0].id,
is_owner: true,
},
)
.unwrap();
BlogAuthor::insert(
conn,
NewBlogAuthor {
blog_id: blog[1].id,
author_id: user[0].id,
is_owner: true,
},
)
.unwrap();
assert!(blog[0]
.list_authors(conn)
.unwrap()
.iter()
.any(|a| a.id == user[0].id));
assert!(blog[0]
.list_authors(conn)
.unwrap()
.iter()
.any(|a| a.id == user[1].id));
assert!(blog[1]
.list_authors(conn)
.unwrap()
.iter()
.any(|a| a.id == user[0].id));
assert!(!blog[1]
.list_authors(conn)
.unwrap()
.iter()
.any(|a| a.id == user[1].id));
assert!(blog[0]
.list_authors(conn)
.unwrap()
.iter()
.any(|a| a.id == user[0].id));
assert!(blog[0]
.list_authors(conn)
.unwrap()
.iter()
.any(|a| a.id == user[1].id));
assert!(blog[1]
.list_authors(conn)
.unwrap()
.iter()
.any(|a| a.id == user[0].id));
assert!(!blog[1]
.list_authors(conn)
.unwrap()
.iter()
.any(|a| a.id == user[1].id));
assert!(Blog::find_for_author(conn, &user[0])
.unwrap()
.iter()
.any(|b| b.id == blog[0].id));
assert!(Blog::find_for_author(conn, &user[1])
.unwrap()
.iter()
.any(|b| b.id == blog[0].id));
assert!(Blog::find_for_author(conn, &user[0])
.unwrap()
.iter()
.any(|b| b.id == blog[1].id));
assert!(!Blog::find_for_author(conn, &user[1])
.unwrap()
.iter()
.any(|b| b.id == blog[1].id));
assert!(Blog::find_for_author(conn, &user[0])
.unwrap()
.iter()
.any(|b| b.id == blog[0].id));
assert!(Blog::find_for_author(conn, &user[1])
.unwrap()
.iter()
.any(|b| b.id == blog[0].id));
assert!(Blog::find_for_author(conn, &user[0])
.unwrap()
.iter()
.any(|b| b.id == blog[1].id));
assert!(!Blog::find_for_author(conn, &user[1])
.unwrap()
.iter()
.any(|b| b.id == blog[1].id));
Ok(())
})
}
#[test]
fn find_local() {
let conn = &db();
fill_database(conn);
let r = rockets();
let conn = &*r.conn;
conn.test_transaction::<_, (), _>(|| {
fill_database(conn);
let blog = Blog::insert(
conn,
NewBlog::new_local(
"SomeName".to_owned(),
"Some name".to_owned(),
"This is some blog".to_owned(),
Instance::get_local(conn).unwrap().id,
let blog = Blog::insert(
conn,
NewBlog::new_local(
"SomeName".to_owned(),
"Some name".to_owned(),
"This is some blog".to_owned(),
Instance::get_local(conn).unwrap().id,
)
.unwrap(),
)
.unwrap(),
)
.unwrap();
.unwrap();
assert_eq!(Blog::find_by_fqn(conn, "SomeName").unwrap().id, blog.id);
assert_eq!(Blog::find_by_fqn(&r, "SomeName").unwrap().id, blog.id);
Ok(())
})
}
#[test]
fn get_fqn() {
let conn = &db();
fill_database(conn);
conn.test_transaction::<_, (), _>(|| {
fill_database(conn);
let blog = Blog::insert(
conn,
NewBlog::new_local(
"SomeName".to_owned(),
"Some name".to_owned(),
"This is some blog".to_owned(),
Instance::get_local(conn).unwrap().id,
let blog = Blog::insert(
conn,
NewBlog::new_local(
"SomeName".to_owned(),
"Some name".to_owned(),
"This is some blog".to_owned(),
Instance::get_local(conn).unwrap().id,
)
.unwrap(),
)
.unwrap(),
)
.unwrap();
.unwrap();
assert_eq!(blog.fqn, "SomeName");
assert_eq!(blog.fqn, "SomeName");
Ok(())
})
}
#[test]
fn delete() {
let conn = &db();
let (_, blogs) = fill_database(conn);
conn.test_transaction::<_, (), _>(|| {
let (_, blogs) = fill_database(conn);
blogs[0].delete(conn, &get_searcher()).unwrap();
assert!(Blog::get(conn, blogs[0].id).is_err());
blogs[0].delete(conn, &get_searcher()).unwrap();
assert!(Blog::get(conn, blogs[0].id).is_err());
Ok(())
})
}
#[test]
fn delete_via_user() {
let conn = &db();
let searcher = get_searcher();
let (user, _) = fill_database(conn);
conn.test_transaction::<_, (), _>(|| {
let searcher = get_searcher();
let (user, _) = fill_database(conn);
let b1 = Blog::insert(
conn,
NewBlog::new_local(
"SomeName".to_owned(),
"Some name".to_owned(),
"This is some blog".to_owned(),
Instance::get_local(conn).unwrap().id,
let b1 = Blog::insert(
conn,
NewBlog::new_local(
"SomeName".to_owned(),
"Some name".to_owned(),
"This is some blog".to_owned(),
Instance::get_local(conn).unwrap().id,
)
.unwrap(),
)
.unwrap(),
)
.unwrap();
let b2 = Blog::insert(
conn,
NewBlog::new_local(
"Blog".to_owned(),
"Blog".to_owned(),
"I've named my blog Blog".to_owned(),
Instance::get_local(conn).unwrap().id,
.unwrap();
let b2 = Blog::insert(
conn,
NewBlog::new_local(
"Blog".to_owned(),
"Blog".to_owned(),
"I've named my blog Blog".to_owned(),
Instance::get_local(conn).unwrap().id,
)
.unwrap(),
)
.unwrap(),
)
.unwrap();
let blog = vec![b1, b2];
.unwrap();
let blog = vec![b1, b2];
BlogAuthor::insert(
conn,
NewBlogAuthor {
blog_id: blog[0].id,
author_id: user[0].id,
is_owner: true,
},
)
.unwrap();
BlogAuthor::insert(
conn,
NewBlogAuthor {
blog_id: blog[0].id,
author_id: user[0].id,
is_owner: true,
},
)
.unwrap();
BlogAuthor::insert(
conn,
NewBlogAuthor {
blog_id: blog[0].id,
author_id: user[1].id,
is_owner: false,
},
)
.unwrap();
BlogAuthor::insert(
conn,
NewBlogAuthor {
blog_id: blog[0].id,
author_id: user[1].id,
is_owner: false,
},
)
.unwrap();
BlogAuthor::insert(
conn,
NewBlogAuthor {
blog_id: blog[1].id,
author_id: user[0].id,
is_owner: true,
},
)
.unwrap();
BlogAuthor::insert(
conn,
NewBlogAuthor {
blog_id: blog[1].id,
author_id: user[0].id,
is_owner: true,
},
)
.unwrap();
user[0].delete(conn, &searcher).unwrap();
assert!(Blog::get(conn, blog[0].id).is_ok());
assert!(Blog::get(conn, blog[1].id).is_err());
user[1].delete(conn, &searcher).unwrap();
assert!(Blog::get(conn, blog[0].id).is_err());
user[0].delete(conn, &searcher).unwrap();
assert!(Blog::get(conn, blog[0].id).is_ok());
assert!(Blog::get(conn, blog[1].id).is_err());
user[1].delete(conn, &searcher).unwrap();
assert!(Blog::get(conn, blog[0].id).is_err());
Ok(())
})
}
#[test]
fn self_federation() {
let r = rockets();
let conn = &*r.conn;
conn.test_transaction::<_, (), _>(|| {
let (users, mut blogs) = fill_database(conn);
blogs[0].icon_id = Some(
Media::insert(
conn,
NewMedia {
file_path: "aaa.png".into(),
alt_text: String::new(),
is_remote: false,
remote_url: None,
sensitive: false,
content_warning: None,
owner_id: users[0].id,
},
)
.unwrap()
.id,
);
blogs[0].banner_id = Some(
Media::insert(
conn,
NewMedia {
file_path: "bbb.png".into(),
alt_text: String::new(),
is_remote: false,
remote_url: None,
sensitive: false,
content_warning: None,
owner_id: users[0].id,
},
)
.unwrap()
.id,
);
let _: Blog = blogs[0].save_changes(conn).unwrap();
let ap_repr = blogs[0].to_activity(conn).unwrap();
blogs[0].delete(conn, &*r.searcher).unwrap();
let blog = Blog::from_activity(&r, ap_repr).unwrap();
assert_eq!(blog.actor_id, blogs[0].actor_id);
assert_eq!(blog.title, blogs[0].title);
assert_eq!(blog.summary, blogs[0].summary);
assert_eq!(blog.outbox_url, blogs[0].outbox_url);
assert_eq!(blog.inbox_url, blogs[0].inbox_url);
assert_eq!(blog.instance_id, blogs[0].instance_id);
assert_eq!(blog.ap_url, blogs[0].ap_url);
assert_eq!(blog.public_key, blogs[0].public_key);
assert_eq!(blog.fqn, blogs[0].fqn);
assert_eq!(blog.summary_html, blogs[0].summary_html);
assert_eq!(blog.icon_url(conn), blogs[0].icon_url(conn));
assert_eq!(blog.banner_url(conn), blogs[0].banner_url(conn));
Ok(())
})
}
}

View file

@ -15,15 +15,15 @@ use medias::Media;
use mentions::Mention;
use notifications::*;
use plume_common::activity_pub::{
inbox::{Deletable, FromActivity, Notify},
Id, IntoId, PUBLIC_VISIBILTY,
inbox::{AsObject, FromId},
Id, IntoId, PUBLIC_VISIBILITY,
};
use plume_common::utils;
use posts::Post;
use safe_string::SafeString;
use schema::comments;
use users::User;
use {Connection, Error, Result};
use {Connection, Error, PlumeRocket, Result};
#[derive(Queryable, Identifiable, Clone, AsChangeset)]
pub struct Comment {
@ -103,18 +103,17 @@ impl Comment {
.unwrap_or(false)
}
pub fn to_activity<'b>(&self, conn: &'b Connection) -> Result<Note> {
let author = User::get(conn, self.author_id)?;
pub fn to_activity(&self, c: &PlumeRocket) -> Result<Note> {
let author = User::get(&c.conn, self.author_id)?;
let (html, mentions, _hashtags) = utils::md_to_html(
self.content.get().as_ref(),
&Instance::get_local(conn)?.public_domain,
&Instance::get_local(&c.conn)?.public_domain,
true,
Some(Media::get_media_processor(conn, vec![&author])),
Some(Media::get_media_processor(&c.conn, vec![&author])),
);
let mut note = Note::default();
let to = vec![Id::new(PUBLIC_VISIBILTY.to_string())];
let to = vec![Id::new(PUBLIC_VISIBILITY.to_string())];
note.object_props
.set_id_string(self.ap_url.clone().unwrap_or_default())?;
@ -123,8 +122,8 @@ impl Comment {
note.object_props.set_content_string(html)?;
note.object_props
.set_in_reply_to_link(Id::new(self.in_response_to_id.map_or_else(
|| Ok(Post::get(conn, self.post_id)?.ap_url),
|id| Ok(Comment::get(conn, id)?.ap_url.unwrap_or_default()) as Result<String>,
|| Ok(Post::get(&c.conn, self.post_id)?.ap_url),
|id| Ok(Comment::get(&c.conn, id)?.ap_url.unwrap_or_default()) as Result<String>,
)?))?;
note.object_props
.set_published_string(chrono::Utc::now().to_rfc3339())?;
@ -134,16 +133,16 @@ impl Comment {
note.object_props.set_tag_link_vec(
mentions
.into_iter()
.filter_map(|m| Mention::build_activity(conn, &m).ok())
.filter_map(|m| Mention::build_activity(c, &m).ok())
.collect::<Vec<link::Mention>>(),
)?;
Ok(note)
}
pub fn create_activity(&self, conn: &Connection) -> Result<Create> {
let author = User::get(conn, self.author_id)?;
pub fn create_activity(&self, c: &PlumeRocket) -> Result<Create> {
let author = User::get(&c.conn, self.author_id)?;
let note = self.to_activity(conn)?;
let note = self.to_activity(c)?;
let mut act = Create::default();
act.create_props.set_actor_link(author.into_id())?;
act.create_props.set_object_object(note.clone())?;
@ -151,15 +150,53 @@ impl Comment {
.set_id_string(format!("{}/activity", self.ap_url.clone()?,))?;
act.object_props
.set_to_link_vec(note.object_props.to_link_vec::<Id>()?)?;
act.object_props.set_cc_link_vec::<Id>(vec![])?;
act.object_props
.set_cc_link_vec(vec![Id::new(self.get_author(&c.conn)?.followers_endpoint)])?;
Ok(act)
}
pub fn notify(&self, conn: &Connection) -> Result<()> {
for author in self.get_post(conn)?.get_authors(conn)? {
Notification::insert(
conn,
NewNotification {
kind: notification_kind::COMMENT.to_string(),
object_id: self.id,
user_id: author.id,
},
)?;
}
Ok(())
}
pub fn build_delete(&self, conn: &Connection) -> Result<Delete> {
let mut act = Delete::default();
act.delete_props
.set_actor_link(self.get_author(conn)?.into_id())?;
let mut tombstone = Tombstone::default();
tombstone.object_props.set_id_string(self.ap_url.clone()?)?;
act.delete_props.set_object_object(tombstone)?;
act.object_props
.set_id_string(format!("{}#delete", self.ap_url.clone().unwrap()))?;
act.object_props
.set_to_link_vec(vec![Id::new(PUBLIC_VISIBILITY)])?;
Ok(act)
}
}
impl FromActivity<Note, Connection> for Comment {
impl FromId<PlumeRocket> for Comment {
type Error = Error;
type Object = Note;
fn from_activity(conn: &Connection, note: Note, actor: Id) -> Result<Comment> {
fn from_db(c: &PlumeRocket, id: &str) -> Result<Self> {
Self::find_by_ap_url(&c.conn, id)
}
fn from_activity(c: &PlumeRocket, note: Note) -> Result<Self> {
let conn = &*c.conn;
let comm = {
let previous_url = note.object_props.in_reply_to.as_ref()?.as_str()?;
let previous_comment = Comment::find_by_ap_url(conn, previous_url);
@ -171,8 +208,8 @@ impl FromActivity<Note, Connection> for Comment {
serde_json::Value::Array(v) => v
.iter()
.filter_map(serde_json::Value::as_str)
.any(|s| s == PUBLIC_VISIBILTY),
serde_json::Value::String(s) => s == PUBLIC_VISIBILTY,
.any(|s| s == PUBLIC_VISIBILITY),
serde_json::Value::String(s) => s == PUBLIC_VISIBILITY,
_ => false,
};
@ -191,8 +228,17 @@ impl FromActivity<Note, Connection> for Comment {
post_id: previous_comment.map(|c| c.post_id).or_else(|_| {
Ok(Post::find_by_ap_url(conn, previous_url)?.id) as Result<i32>
})?,
author_id: User::from_url(conn, actor.as_ref())?.id,
sensitive: false, // "sensitive" is not a standard property, we need to think about how to support it with the activitypub crate
author_id: User::from_id(
c,
&{
let res: String = note.object_props.attributed_to_link::<Id>()?.into();
res
},
None,
)
.map_err(|(_, e)| e)?
.id,
sensitive: note.object_props.summary_string().is_ok(),
public_visibility,
},
)?;
@ -243,10 +289,10 @@ impl FromActivity<Note, Connection> for Comment {
.chain(cc)
.chain(bto)
.chain(bcc)
.collect::<HashSet<_>>() //remove duplicates (don't do a query more than once)
.collect::<HashSet<_>>() // remove duplicates (don't do a query more than once)
.into_iter()
.map(|v| {
if let Ok(user) = User::from_url(conn, &v) {
if let Ok(user) = User::from_id(c, &v, None) {
vec![user]
} else {
vec![] // TODO try to fetch collection
@ -272,20 +318,41 @@ impl FromActivity<Note, Connection> for Comment {
}
}
impl Notify<Connection> for Comment {
impl AsObject<User, Create, &PlumeRocket> for Comment {
type Error = Error;
type Output = Self;
fn notify(&self, conn: &Connection) -> Result<()> {
for author in self.get_post(conn)?.get_authors(conn)? {
Notification::insert(
conn,
NewNotification {
kind: notification_kind::COMMENT.to_string(),
object_id: self.id,
user_id: author.id,
},
)?;
fn activity(self, _c: &PlumeRocket, _actor: User, _id: &str) -> Result<Self> {
// The actual creation takes place in the FromId impl
Ok(self)
}
}
impl AsObject<User, Delete, &PlumeRocket> for Comment {
type Error = Error;
type Output = ();
fn activity(self, c: &PlumeRocket, actor: User, _id: &str) -> Result<()> {
if self.author_id != actor.id {
return Err(Error::Unauthorized);
}
for m in Mention::list_for_comment(&c.conn, self.id)? {
for n in Notification::find_for_mention(&c.conn, &m)? {
n.delete(&c.conn)?;
}
m.delete(&c.conn)?;
}
for n in Notification::find_for_comment(&c.conn, &self)? {
n.delete(&c.conn)?;
}
diesel::update(comments::table)
.filter(comments::in_response_to_id.eq(self.id))
.set(comments::in_response_to_id.eq(self.in_response_to_id))
.execute(&*c.conn)?;
diesel::delete(&self).execute(&*c.conn)?;
Ok(())
}
}
@ -316,49 +383,57 @@ impl CommentTree {
}
}
impl<'a> Deletable<Connection, Delete> for Comment {
type Error = Error;
#[cfg(test)]
mod tests {
use super::*;
use crate::inbox::{inbox, tests::fill_database, InboxResult};
use crate::safe_string::SafeString;
use crate::tests::rockets;
use diesel::Connection;
fn delete(&self, conn: &Connection) -> Result<Delete> {
let mut act = Delete::default();
act.delete_props
.set_actor_link(self.get_author(conn)?.into_id())?;
// creates a post, get it's Create activity, delete the post,
// "send" the Create to the inbox, and check it works
#[test]
fn self_federation() {
let r = rockets();
let conn = &*r.conn;
conn.test_transaction::<_, (), _>(|| {
let (posts, users, _) = fill_database(&r);
let mut tombstone = Tombstone::default();
tombstone.object_props.set_id_string(self.ap_url.clone()?)?;
act.delete_props.set_object_object(tombstone)?;
let original_comm = Comment::insert(
conn,
NewComment {
content: SafeString::new("My comment"),
in_response_to_id: None,
post_id: posts[0].id,
author_id: users[0].id,
ap_url: None,
sensitive: true,
spoiler_text: "My CW".into(),
public_visibility: true,
},
)
.unwrap();
let act = original_comm.create_activity(&r).unwrap();
inbox(
&r,
serde_json::to_value(original_comm.build_delete(conn).unwrap()).unwrap(),
)
.unwrap();
act.object_props
.set_id_string(format!("{}#delete", self.ap_url.clone().unwrap()))?;
act.object_props
.set_to_link_vec(vec![Id::new(PUBLIC_VISIBILTY)])?;
for m in Mention::list_for_comment(conn, self.id)? {
for n in Notification::find_for_mention(conn, &m)? {
n.delete(conn)?;
}
m.delete(conn)?;
}
for n in Notification::find_for_comment(conn, &self)? {
n.delete(conn)?;
}
diesel::update(comments::table)
.filter(comments::in_response_to_id.eq(self.id))
.set(comments::in_response_to_id.eq(self.in_response_to_id))
.execute(conn)?;
diesel::delete(self).execute(conn)?;
Ok(act)
}
fn delete_id(id: &str, actor_id: &str, conn: &Connection) -> Result<Delete> {
let actor = User::find_by_ap_url(conn, actor_id)?;
let comment = Comment::find_by_ap_url(conn, id)?;
if comment.author_id == actor.id {
comment.delete(conn)
} else {
Err(Error::Unauthorized)
}
match inbox(&r, serde_json::to_value(act).unwrap()).unwrap() {
InboxResult::Commented(c) => {
// TODO: one is HTML, the other markdown: assert_eq!(c.content, original_comm.content);
assert_eq!(c.in_response_to_id, original_comm.in_response_to_id);
assert_eq!(c.post_id, original_comm.post_id);
assert_eq!(c.author_id, original_comm.author_id);
assert_eq!(c.ap_url, original_comm.ap_url);
assert_eq!(c.spoiler_text, original_comm.spoiler_text);
assert_eq!(c.public_visibility, original_comm.public_visibility);
}
_ => panic!("Unexpected result"),
};
Ok(())
})
}
}

View file

@ -33,7 +33,7 @@ fn get_rocket_config() -> Result<RocketConfig, RocketError> {
.unwrap_or(7878);
let secret_key = var("ROCKET_SECRET_KEY").map_err(|_| RocketError::InvalidSecretKey)?;
let form_size = var("FORM_SIZE")
.unwrap_or_else(|_| "32".to_owned())
.unwrap_or_else(|_| "128".to_owned())
.parse::<u64>()
.unwrap();
let activity_size = var("ACTIVITY_SIZE")

View file

@ -59,3 +59,19 @@ impl CustomizeConnection<Connection, ConnError> for PragmaForeignKey {
})
}
}
#[cfg(test)]
pub(crate) mod tests {
use super::*;
use diesel::Connection as _;
#[derive(Debug)]
pub struct TestConnectionCustomizer;
impl CustomizeConnection<Connection, ConnError> for TestConnectionCustomizer {
fn on_acquire(&self, conn: &mut Connection) -> Result<(), ConnError> {
PragmaForeignKey.on_acquire(conn)?;
Ok(conn.begin_test_transaction().unwrap())
}
}
}

View file

@ -1,20 +1,16 @@
use activitypub::{
activity::{Accept, Follow as FollowAct, Undo},
actor::Person,
};
use activitypub::activity::{Accept, Follow as FollowAct, Undo};
use diesel::{self, ExpressionMethods, QueryDsl, RunQueryDsl, SaveChangesDsl};
use blogs::Blog;
use notifications::*;
use plume_common::activity_pub::{
broadcast,
inbox::{Deletable, FromActivity, Notify, WithInbox},
inbox::{AsActor, AsObject, FromId},
sign::Signer,
Id, IntoId,
Id, IntoId, PUBLIC_VISIBILITY,
};
use schema::follows;
use users::User;
use {ap_url, Connection, Error, Result, CONFIG};
use {ap_url, Connection, Error, PlumeRocket, Result, CONFIG};
#[derive(Clone, Queryable, Identifiable, Associations, AsChangeset)]
#[belongs_to(User, foreign_key = "following_id")]
@ -65,14 +61,26 @@ impl Follow {
act.follow_props
.set_object_link::<Id>(target.clone().into_id())?;
act.object_props.set_id_string(self.ap_url.clone())?;
act.object_props.set_to_link(target.into_id())?;
act.object_props.set_cc_link_vec::<Id>(vec![])?;
act.object_props.set_to_link_vec(vec![target.into_id()])?;
act.object_props
.set_cc_link_vec(vec![Id::new(PUBLIC_VISIBILITY.to_string())])?;
Ok(act)
}
pub fn notify(&self, conn: &Connection) -> Result<Notification> {
Notification::insert(
conn,
NewNotification {
kind: notification_kind::FOLLOW.to_string(),
object_id: self.id,
user_id: self.following_id,
},
)
}
/// from -> The one sending the follow request
/// target -> The target of the request, responding with Accept
pub fn accept_follow<A: Signer + IntoId + Clone, B: Clone + WithInbox + IntoId>(
pub fn accept_follow<A: Signer + IntoId + Clone, B: Clone + AsActor<T> + IntoId, T>(
conn: &Connection,
from: &B,
target: &A,
@ -88,6 +96,7 @@ impl Follow {
ap_url: follow.object_props.id_string()?,
},
)?;
res.notify(conn)?;
let mut accept = Accept::default();
let accept_id = ap_url(&format!(
@ -96,8 +105,12 @@ impl Follow {
&res.id
));
accept.object_props.set_id_string(accept_id)?;
accept.object_props.set_to_link(from.clone().into_id())?;
accept.object_props.set_cc_link_vec::<Id>(vec![])?;
accept
.object_props
.set_to_link_vec(vec![from.clone().into_id()])?;
accept
.object_props
.set_cc_link_vec(vec![Id::new(PUBLIC_VISIBILITY.to_string())])?;
accept
.accept_props
.set_actor_link::<Id>(target.clone().into_id())?;
@ -105,61 +118,8 @@ impl Follow {
broadcast(&*target, accept, vec![from.clone()]);
Ok(res)
}
}
impl FromActivity<FollowAct, Connection> for Follow {
type Error = Error;
fn from_activity(conn: &Connection, follow: FollowAct, _actor: Id) -> Result<Follow> {
let from_id = follow
.follow_props
.actor_link::<Id>()
.map(Into::into)
.or_else(|_| {
Ok(follow
.follow_props
.actor_object::<Person>()?
.object_props
.id_string()?) as Result<String>
})?;
let from = User::from_url(conn, &from_id)?;
match User::from_url(conn, follow.follow_props.object.as_str()?) {
Ok(user) => Follow::accept_follow(conn, &from, &user, follow, from.id, user.id),
Err(_) => {
let blog = Blog::from_url(conn, follow.follow_props.object.as_str()?)?;
Follow::accept_follow(conn, &from, &blog, follow, from.id, blog.id)
}
}
}
}
impl Notify<Connection> for Follow {
type Error = Error;
fn notify(&self, conn: &Connection) -> Result<()> {
Notification::insert(
conn,
NewNotification {
kind: notification_kind::FOLLOW.to_string(),
object_id: self.id,
user_id: self.following_id,
},
)
.map(|_| ())
}
}
impl Deletable<Connection, Undo> for Follow {
type Error = Error;
fn delete(&self, conn: &Connection) -> Result<Undo> {
diesel::delete(self).execute(conn)?;
// delete associated notification if any
if let Ok(notif) = Notification::find(conn, notification_kind::FOLLOW, self.id) {
diesel::delete(&notif).execute(conn)?;
}
pub fn build_undo(&self, conn: &Connection) -> Result<Undo> {
let mut undo = Undo::default();
undo.undo_props
.set_actor_link(User::get(conn, self.follower_id)?.into_id())?;
@ -167,14 +127,77 @@ impl Deletable<Connection, Undo> for Follow {
.set_id_string(format!("{}/undo", self.ap_url))?;
undo.undo_props
.set_object_link::<Id>(self.clone().into_id())?;
undo.object_props
.set_to_link_vec(vec![User::get(conn, self.following_id)?.into_id()])?;
undo.object_props
.set_cc_link_vec(vec![Id::new(PUBLIC_VISIBILITY.to_string())])?;
Ok(undo)
}
}
fn delete_id(id: &str, actor_id: &str, conn: &Connection) -> Result<Undo> {
let follow = Follow::find_by_ap_url(conn, id)?;
let user = User::find_by_ap_url(conn, actor_id)?;
if user.id == follow.follower_id {
follow.delete(conn)
impl AsObject<User, FollowAct, &PlumeRocket> for User {
type Error = Error;
type Output = Follow;
fn activity(self, c: &PlumeRocket, actor: User, id: &str) -> Result<Follow> {
// Mastodon (at least) requires the full Follow object when accepting it,
// so we rebuilt it here
let mut follow = FollowAct::default();
follow.object_props.set_id_string(id.to_string())?;
follow
.follow_props
.set_actor_link::<Id>(actor.clone().into_id())?;
Follow::accept_follow(&c.conn, &actor, &self, follow, actor.id, self.id)
}
}
impl FromId<PlumeRocket> for Follow {
type Error = Error;
type Object = FollowAct;
fn from_db(c: &PlumeRocket, id: &str) -> Result<Self> {
Follow::find_by_ap_url(&c.conn, id)
}
fn from_activity(c: &PlumeRocket, follow: FollowAct) -> Result<Self> {
let actor = User::from_id(
c,
&{
let res: String = follow.follow_props.actor_link::<Id>()?.into();
res
},
None,
)
.map_err(|(_, e)| e)?;
let target = User::from_id(
c,
&{
let res: String = follow.follow_props.object_link::<Id>()?.into();
res
},
None,
)
.map_err(|(_, e)| e)?;
Follow::accept_follow(&c.conn, &actor, &target, follow, actor.id, target.id)
}
}
impl AsObject<User, Undo, &PlumeRocket> for Follow {
type Error = Error;
type Output = ();
fn activity(self, c: &PlumeRocket, actor: User, _id: &str) -> Result<()> {
let conn = &*c.conn;
if self.follower_id == actor.id {
diesel::delete(&self).execute(conn)?;
// delete associated notification if any
if let Ok(notif) = Notification::find(conn, notification_kind::FOLLOW, self.id) {
diesel::delete(&notif).execute(conn)?;
}
Ok(())
} else {
Err(Error::Unauthorized)
}
@ -190,36 +213,41 @@ impl IntoId for Follow {
#[cfg(test)]
mod tests {
use super::*;
use diesel::Connection;
use tests::db;
use users::tests as user_tests;
#[test]
fn test_id() {
let conn = db();
let users = user_tests::fill_database(&conn);
let follow = Follow::insert(
&conn,
NewFollow {
follower_id: users[0].id,
following_id: users[1].id,
ap_url: String::new(),
},
)
.expect("Couldn't insert new follow");
assert_eq!(
follow.ap_url,
format!("https://{}/follows/{}", CONFIG.base_url, follow.id)
);
conn.test_transaction::<_, (), _>(|| {
let users = user_tests::fill_database(&conn);
let follow = Follow::insert(
&conn,
NewFollow {
follower_id: users[0].id,
following_id: users[1].id,
ap_url: String::new(),
},
)
.expect("Couldn't insert new follow");
assert_eq!(
follow.ap_url,
format!("https://{}/follows/{}", CONFIG.base_url, follow.id)
);
let follow = Follow::insert(
&conn,
NewFollow {
follower_id: users[1].id,
following_id: users[0].id,
ap_url: String::from("https://some.url/"),
},
)
.expect("Couldn't insert new follow");
assert_eq!(follow.ap_url, String::from("https://some.url/"));
let follow = Follow::insert(
&conn,
NewFollow {
follower_id: users[1].id,
following_id: users[0].id,
ap_url: String::from("https://some.url/"),
},
)
.expect("Couldn't insert new follow");
assert_eq!(follow.ap_url, String::from("https://some.url/"));
Ok(())
})
}
}

476
plume-models/src/inbox.rs Normal file
View file

@ -0,0 +1,476 @@
use activitypub::activity::*;
use serde_json;
use crate::{
comments::Comment,
follows, likes,
posts::{Post, PostUpdate},
reshares::Reshare,
users::User,
Error, PlumeRocket,
};
use plume_common::activity_pub::inbox::Inbox;
macro_rules! impl_into_inbox_result {
( $( $t:ty => $variant:ident ),+ ) => {
$(
impl From<$t> for InboxResult {
fn from(x: $t) -> InboxResult {
InboxResult::$variant(x)
}
}
)+
}
}
pub enum InboxResult {
Commented(Comment),
Followed(follows::Follow),
Liked(likes::Like),
Other,
Post(Post),
Reshared(Reshare),
}
impl From<()> for InboxResult {
fn from(_: ()) -> InboxResult {
InboxResult::Other
}
}
impl_into_inbox_result! {
Comment => Commented,
follows::Follow => Followed,
likes::Like => Liked,
Post => Post,
Reshare => Reshared
}
pub fn inbox(ctx: &PlumeRocket, act: serde_json::Value) -> Result<InboxResult, Error> {
Inbox::handle(ctx, act)
.with::<User, Announce, Post>()
.with::<User, Create, Comment>()
.with::<User, Create, Post>()
.with::<User, Delete, Comment>()
.with::<User, Delete, Post>()
.with::<User, Follow, User>()
.with::<User, Like, Post>()
.with::<User, Undo, Reshare>()
.with::<User, Undo, follows::Follow>()
.with::<User, Undo, likes::Like>()
.with::<User, Update, PostUpdate>()
.done()
}
#[cfg(test)]
pub(crate) mod tests {
use super::InboxResult;
use crate::blogs::tests::fill_database as blog_fill_db;
use crate::safe_string::SafeString;
use crate::tests::rockets;
use crate::PlumeRocket;
use diesel::Connection;
pub fn fill_database(
rockets: &PlumeRocket,
) -> (
Vec<crate::posts::Post>,
Vec<crate::users::User>,
Vec<crate::blogs::Blog>,
) {
use crate::post_authors::*;
use crate::posts::*;
let (users, blogs) = blog_fill_db(&rockets.conn);
let post = Post::insert(
&rockets.conn,
NewPost {
blog_id: blogs[0].id,
slug: "testing".to_owned(),
title: "Testing".to_owned(),
content: crate::safe_string::SafeString::new("Hello"),
published: true,
license: "WTFPL".to_owned(),
creation_date: None,
ap_url: format!("https://plu.me/~/{}/testing", blogs[0].actor_id),
subtitle: String::new(),
source: String::new(),
cover_id: None,
},
&rockets.searcher,
)
.unwrap();
PostAuthor::insert(
&rockets.conn,
NewPostAuthor {
post_id: post.id,
author_id: users[0].id,
},
)
.unwrap();
(vec![post], users, blogs)
}
#[test]
fn announce_post() {
let r = rockets();
let conn = &*r.conn;
conn.test_transaction::<_, (), _>(|| {
let (posts, users, _) = fill_database(&r);
let act = json!({
"id": "https://plu.me/announce/1",
"actor": users[0].ap_url,
"object": posts[0].ap_url,
"type": "Announce",
});
match super::inbox(&r, act).unwrap() {
super::InboxResult::Reshared(r) => {
assert_eq!(r.post_id, posts[0].id);
assert_eq!(r.user_id, users[0].id);
assert_eq!(r.ap_url, "https://plu.me/announce/1".to_owned());
}
_ => panic!("Unexpected result"),
};
Ok(())
});
}
#[test]
fn create_comment() {
let r = rockets();
let conn = &*r.conn;
conn.test_transaction::<_, (), _>(|| {
let (posts, users, _) = fill_database(&r);
let act = json!({
"id": "https://plu.me/comment/1/activity",
"actor": users[0].ap_url,
"object": {
"type": "Note",
"id": "https://plu.me/comment/1",
"attributedTo": users[0].ap_url,
"inReplyTo": posts[0].ap_url,
"content": "Hello.",
"to": [plume_common::activity_pub::PUBLIC_VISIBILITY]
},
"type": "Create",
});
match super::inbox(&r, act).unwrap() {
super::InboxResult::Commented(c) => {
assert_eq!(c.author_id, users[0].id);
assert_eq!(c.post_id, posts[0].id);
assert_eq!(c.in_response_to_id, None);
assert_eq!(c.content, SafeString::new("Hello."));
assert!(c.public_visibility);
}
_ => panic!("Unexpected result"),
};
Ok(())
});
}
#[test]
fn create_post() {
let r = rockets();
let conn = &*r.conn;
conn.test_transaction::<_, (), _>(|| {
let (_, users, blogs) = fill_database(&r);
let act = json!({
"id": "https://plu.me/comment/1/activity",
"actor": users[0].ap_url,
"object": {
"type": "Article",
"id": "https://plu.me/~/Blog/my-article",
"attributedTo": [users[0].ap_url, blogs[0].ap_url],
"content": "Hello.",
"name": "My Article",
"summary": "Bye.",
"source": {
"content": "Hello.",
"mediaType": "text/markdown"
},
"published": "2014-12-12T12:12:12Z",
"to": [plume_common::activity_pub::PUBLIC_VISIBILITY]
},
"type": "Create",
});
match super::inbox(&r, act).unwrap() {
super::InboxResult::Post(p) => {
assert!(p.is_author(conn, users[0].id).unwrap());
assert_eq!(p.source, "Hello.".to_owned());
assert_eq!(p.blog_id, blogs[0].id);
assert_eq!(p.content, SafeString::new("Hello."));
assert_eq!(p.subtitle, "Bye.".to_owned());
assert_eq!(p.title, "My Article".to_owned());
}
_ => panic!("Unexpected result"),
};
Ok(())
});
}
#[test]
fn delete_comment() {
use crate::comments::*;
let r = rockets();
let conn = &*r.conn;
conn.test_transaction::<_, (), _>(|| {
let (posts, users, _) = fill_database(&r);
Comment::insert(
conn,
NewComment {
content: SafeString::new("My comment"),
in_response_to_id: None,
post_id: posts[0].id,
author_id: users[0].id,
ap_url: Some("https://plu.me/comment/1".to_owned()),
sensitive: false,
spoiler_text: "spoiler".to_owned(),
public_visibility: true,
},
)
.unwrap();
let fail_act = json!({
"id": "https://plu.me/comment/1/delete",
"actor": users[1].ap_url, // Not the author of the comment, it should fail
"object": "https://plu.me/comment/1",
"type": "Delete",
});
assert!(super::inbox(&r, fail_act).is_err());
let ok_act = json!({
"id": "https://plu.me/comment/1/delete",
"actor": users[0].ap_url,
"object": "https://plu.me/comment/1",
"type": "Delete",
});
assert!(super::inbox(&r, ok_act).is_ok());
Ok(())
})
}
#[test]
fn delete_post() {
let r = rockets();
let conn = &*r.conn;
conn.test_transaction::<_, (), _>(|| {
let (posts, users, _) = fill_database(&r);
let fail_act = json!({
"id": "https://plu.me/comment/1/delete",
"actor": users[1].ap_url, // Not the author of the post, it should fail
"object": posts[0].ap_url,
"type": "Delete",
});
assert!(super::inbox(&r, fail_act).is_err());
let ok_act = json!({
"id": "https://plu.me/comment/1/delete",
"actor": users[0].ap_url,
"object": posts[0].ap_url,
"type": "Delete",
});
assert!(super::inbox(&r, ok_act).is_ok());
Ok(())
});
}
#[test]
fn follow() {
let r = rockets();
let conn = &*r.conn;
conn.test_transaction::<_, (), _>(|| {
let (_, users, _) = fill_database(&r);
let act = json!({
"id": "https://plu.me/follow/1",
"actor": users[0].ap_url,
"object": users[1].ap_url,
"type": "Follow",
});
match super::inbox(&r, act).unwrap() {
InboxResult::Followed(f) => {
assert_eq!(f.follower_id, users[0].id);
assert_eq!(f.following_id, users[1].id);
assert_eq!(f.ap_url, "https://plu.me/follow/1".to_owned());
}
_ => panic!("Unexpected result"),
}
Ok(())
});
}
#[test]
fn like() {
let r = rockets();
let conn = &*r.conn;
conn.test_transaction::<_, (), _>(|| {
let (posts, users, _) = fill_database(&r);
let act = json!({
"id": "https://plu.me/like/1",
"actor": users[1].ap_url,
"object": posts[0].ap_url,
"type": "Like",
});
match super::inbox(&r, act).unwrap() {
InboxResult::Liked(l) => {
assert_eq!(l.user_id, users[1].id);
assert_eq!(l.post_id, posts[0].id);
assert_eq!(l.ap_url, "https://plu.me/like/1".to_owned());
}
_ => panic!("Unexpected result"),
}
Ok(())
});
}
#[test]
fn undo_reshare() {
use crate::reshares::*;
let r = rockets();
let conn = &*r.conn;
conn.test_transaction::<_, (), _>(|| {
let (posts, users, _) = fill_database(&r);
let announce = Reshare::insert(
conn,
NewReshare {
post_id: posts[0].id,
user_id: users[1].id,
ap_url: "https://plu.me/announce/1".to_owned(),
},
)
.unwrap();
let fail_act = json!({
"id": "https://plu.me/undo/1",
"actor": users[0].ap_url,
"object": announce.ap_url,
"type": "Undo",
});
assert!(super::inbox(&r, fail_act).is_err());
let ok_act = json!({
"id": "https://plu.me/undo/1",
"actor": users[1].ap_url,
"object": announce.ap_url,
"type": "Undo",
});
assert!(super::inbox(&r, ok_act).is_ok());
Ok(())
});
}
#[test]
fn undo_follow() {
use crate::follows::*;
let r = rockets();
let conn = &*r.conn;
conn.test_transaction::<_, (), _>(|| {
let (_, users, _) = fill_database(&r);
let follow = Follow::insert(
conn,
NewFollow {
follower_id: users[0].id,
following_id: users[1].id,
ap_url: "https://plu.me/follow/1".to_owned(),
},
)
.unwrap();
let fail_act = json!({
"id": "https://plu.me/undo/1",
"actor": users[2].ap_url,
"object": follow.ap_url,
"type": "Undo",
});
assert!(super::inbox(&r, fail_act).is_err());
let ok_act = json!({
"id": "https://plu.me/undo/1",
"actor": users[0].ap_url,
"object": follow.ap_url,
"type": "Undo",
});
assert!(super::inbox(&r, ok_act).is_ok());
Ok(())
});
}
#[test]
fn undo_like() {
use crate::likes::*;
let r = rockets();
let conn = &*r.conn;
conn.test_transaction::<_, (), _>(|| {
let (posts, users, _) = fill_database(&r);
let like = Like::insert(
conn,
NewLike {
post_id: posts[0].id,
user_id: users[1].id,
ap_url: "https://plu.me/like/1".to_owned(),
},
)
.unwrap();
let fail_act = json!({
"id": "https://plu.me/undo/1",
"actor": users[0].ap_url,
"object": like.ap_url,
"type": "Undo",
});
assert!(super::inbox(&r, fail_act).is_err());
let ok_act = json!({
"id": "https://plu.me/undo/1",
"actor": users[1].ap_url,
"object": like.ap_url,
"type": "Undo",
});
assert!(super::inbox(&r, ok_act).is_ok());
Ok(())
});
}
#[test]
fn update_post() {
let r = rockets();
let conn = &*r.conn;
conn.test_transaction::<_, (), _>(|| {
let (posts, users, _) = fill_database(&r);
let act = json!({
"id": "https://plu.me/update/1",
"actor": users[0].ap_url,
"object": {
"type": "Article",
"id": posts[0].ap_url,
"name": "Mia Artikolo",
"summary": "Jes, mi parolas esperanton nun",
"content": "<b>Saluton</b>, mi skribas testojn",
"source": {
"mediaType": "text/markdown",
"content": "**Saluton**, mi skribas testojn"
},
},
"type": "Update",
});
super::inbox(&r, act).unwrap();
Ok(())
});
}
}

View file

@ -166,6 +166,7 @@ impl Instance {
#[cfg(test)]
pub(crate) mod tests {
use super::*;
use diesel::Connection;
use tests::db;
use Connection as Conn;
@ -230,176 +231,192 @@ pub(crate) mod tests {
#[test]
fn local_instance() {
let conn = &db();
let inserted = fill_database(conn)
.into_iter()
.map(|(inserted, _)| inserted)
.find(|inst| inst.local)
.unwrap();
let res = Instance::get_local(conn).unwrap();
conn.test_transaction::<_, (), _>(|| {
let inserted = fill_database(conn)
.into_iter()
.map(|(inserted, _)| inserted)
.find(|inst| inst.local)
.unwrap();
let res = Instance::get_local(conn).unwrap();
part_eq!(
res,
inserted,
[
default_license,
local,
long_description,
short_description,
name,
open_registrations,
public_domain
]
);
assert_eq!(
res.long_description_html.get(),
&inserted.long_description_html
);
assert_eq!(
res.short_description_html.get(),
&inserted.short_description_html
);
part_eq!(
res,
inserted,
[
default_license,
local,
long_description,
short_description,
name,
open_registrations,
public_domain
]
);
assert_eq!(
res.long_description_html.get(),
&inserted.long_description_html
);
assert_eq!(
res.short_description_html.get(),
&inserted.short_description_html
);
Ok(())
});
}
#[test]
fn remote_instance() {
let conn = &db();
let inserted = fill_database(conn);
assert_eq!(Instance::count(conn).unwrap(), inserted.len() as i64);
conn.test_transaction::<_, (), _>(|| {
let inserted = fill_database(conn);
assert_eq!(Instance::count(conn).unwrap(), inserted.len() as i64);
let res = Instance::get_remotes(conn).unwrap();
assert_eq!(
res.len(),
inserted.iter().filter(|(inst, _)| !inst.local).count()
);
let res = Instance::get_remotes(conn).unwrap();
assert_eq!(
res.len(),
inserted.iter().filter(|(inst, _)| !inst.local).count()
);
inserted
.iter()
.filter(|(newinst, _)| !newinst.local)
.map(|(newinst, inst)| (newinst, res.iter().find(|res| res.id == inst.id).unwrap()))
.for_each(|(newinst, inst)| {
part_eq!(
newinst,
inst,
[
default_license,
local,
long_description,
short_description,
name,
open_registrations,
public_domain
]
);
assert_eq!(
&newinst.long_description_html,
inst.long_description_html.get()
);
assert_eq!(
&newinst.short_description_html,
inst.short_description_html.get()
);
});
inserted
.iter()
.filter(|(newinst, _)| !newinst.local)
.map(|(newinst, inst)| (newinst, res.iter().find(|res| res.id == inst.id).unwrap()))
.for_each(|(newinst, inst)| {
part_eq!(
newinst,
inst,
[
default_license,
local,
long_description,
short_description,
name,
open_registrations,
public_domain
]
);
assert_eq!(
&newinst.long_description_html,
inst.long_description_html.get()
);
assert_eq!(
&newinst.short_description_html,
inst.short_description_html.get()
);
});
let page = Instance::page(conn, (0, 2)).unwrap();
assert_eq!(page.len(), 2);
let page1 = &page[0];
let page2 = &page[1];
assert!(page1.public_domain <= page2.public_domain);
let page = Instance::page(conn, (0, 2)).unwrap();
assert_eq!(page.len(), 2);
let page1 = &page[0];
let page2 = &page[1];
assert!(page1.public_domain <= page2.public_domain);
let mut last_domaine: String = Instance::page(conn, (0, 1)).unwrap()[0]
.public_domain
.clone();
for i in 1..inserted.len() as i32 {
let page = Instance::page(conn, (i, i + 1)).unwrap();
assert_eq!(page.len(), 1);
assert!(last_domaine <= page[0].public_domain);
last_domaine = page[0].public_domain.clone();
}
let mut last_domaine: String = Instance::page(conn, (0, 1)).unwrap()[0]
.public_domain
.clone();
for i in 1..inserted.len() as i32 {
let page = Instance::page(conn, (i, i + 1)).unwrap();
assert_eq!(page.len(), 1);
assert!(last_domaine <= page[0].public_domain);
last_domaine = page[0].public_domain.clone();
}
Ok(())
});
}
#[test]
fn blocked() {
let conn = &db();
let inst_list = fill_database(conn);
let inst = &inst_list[0].1;
let inst_list = &inst_list[1..];
conn.test_transaction::<_, (), _>(|| {
let inst_list = fill_database(conn);
let inst = &inst_list[0].1;
let inst_list = &inst_list[1..];
let blocked = inst.blocked;
inst.toggle_block(conn).unwrap();
let inst = Instance::get(conn, inst.id).unwrap();
assert_eq!(inst.blocked, !blocked);
assert_eq!(
inst_list
.iter()
.filter(|(_, inst)| inst.blocked != Instance::get(conn, inst.id).unwrap().blocked)
.count(),
0
);
assert_eq!(
Instance::is_blocked(conn, &format!("https://{}/something", inst.public_domain))
.unwrap(),
inst.blocked
);
assert_eq!(
Instance::is_blocked(conn, &format!("https://{}a/something", inst.public_domain))
.unwrap(),
Instance::find_by_domain(conn, &format!("{}a", inst.public_domain))
.map(|inst| inst.blocked)
.unwrap_or(false)
);
let blocked = inst.blocked;
inst.toggle_block(conn).unwrap();
let inst = Instance::get(conn, inst.id).unwrap();
assert_eq!(inst.blocked, !blocked);
assert_eq!(
inst_list
.iter()
.filter(
|(_, inst)| inst.blocked != Instance::get(conn, inst.id).unwrap().blocked
)
.count(),
0
);
assert_eq!(
Instance::is_blocked(conn, &format!("https://{}/something", inst.public_domain))
.unwrap(),
inst.blocked
);
assert_eq!(
Instance::is_blocked(conn, &format!("https://{}a/something", inst.public_domain))
.unwrap(),
Instance::find_by_domain(conn, &format!("{}a", inst.public_domain))
.map(|inst| inst.blocked)
.unwrap_or(false)
);
inst.toggle_block(conn).unwrap();
let inst = Instance::get(conn, inst.id).unwrap();
assert_eq!(inst.blocked, blocked);
assert_eq!(
Instance::is_blocked(conn, &format!("https://{}/something", inst.public_domain))
.unwrap(),
inst.blocked
);
assert_eq!(
Instance::is_blocked(conn, &format!("https://{}a/something", inst.public_domain))
.unwrap(),
Instance::find_by_domain(conn, &format!("{}a", inst.public_domain))
.map(|inst| inst.blocked)
.unwrap_or(false)
);
assert_eq!(
inst_list
.iter()
.filter(|(_, inst)| inst.blocked != Instance::get(conn, inst.id).unwrap().blocked)
.count(),
0
);
inst.toggle_block(conn).unwrap();
let inst = Instance::get(conn, inst.id).unwrap();
assert_eq!(inst.blocked, blocked);
assert_eq!(
Instance::is_blocked(conn, &format!("https://{}/something", inst.public_domain))
.unwrap(),
inst.blocked
);
assert_eq!(
Instance::is_blocked(conn, &format!("https://{}a/something", inst.public_domain))
.unwrap(),
Instance::find_by_domain(conn, &format!("{}a", inst.public_domain))
.map(|inst| inst.blocked)
.unwrap_or(false)
);
assert_eq!(
inst_list
.iter()
.filter(
|(_, inst)| inst.blocked != Instance::get(conn, inst.id).unwrap().blocked
)
.count(),
0
);
Ok(())
});
}
#[test]
fn update() {
let conn = &db();
let inst = &fill_database(conn)[0].1;
conn.test_transaction::<_, (), _>(|| {
let inst = &fill_database(conn)[0].1;
inst.update(
conn,
"NewName".to_owned(),
false,
SafeString::new("[short](#link)"),
SafeString::new("[long_description](/with_link)"),
)
.unwrap();
let inst = Instance::get(conn, inst.id).unwrap();
assert_eq!(inst.name, "NewName".to_owned());
assert_eq!(inst.open_registrations, false);
assert_eq!(
inst.long_description.get(),
"[long_description](/with_link)"
);
assert_eq!(
inst.long_description_html,
SafeString::new("<p><a href=\"/with_link\">long_description</a></p>\n")
);
assert_eq!(inst.short_description.get(), "[short](#link)");
assert_eq!(
inst.short_description_html,
SafeString::new("<p><a href=\"#link\">short</a></p>\n")
);
inst.update(
conn,
"NewName".to_owned(),
false,
SafeString::new("[short](#link)"),
SafeString::new("[long_description](/with_link)"),
)
.unwrap();
let inst = Instance::get(conn, inst.id).unwrap();
assert_eq!(inst.name, "NewName".to_owned());
assert_eq!(inst.open_registrations, false);
assert_eq!(
inst.long_description.get(),
"[long_description](/with_link)"
);
assert_eq!(
inst.long_description_html,
SafeString::new("<p><a href=\"/with_link\">long_description</a></p>\n")
);
assert_eq!(inst.short_description.get(), "[short](#link)");
assert_eq!(
inst.short_description_html,
SafeString::new("<p><a href=\"#link\">short</a></p>\n")
);
Ok(())
});
}
}

View file

@ -20,6 +20,7 @@ extern crate plume_api;
extern crate plume_common;
extern crate reqwest;
extern crate rocket;
extern crate rocket_i18n;
extern crate scheduled_thread_pool;
extern crate serde;
#[macro_use]
@ -36,6 +37,8 @@ extern crate whatlang;
#[macro_use]
extern crate diesel_migrations;
use plume_common::activity_pub::inbox::InboxError;
#[cfg(not(any(feature = "sqlite", feature = "postgres")))]
compile_error!("Either feature \"sqlite\" or \"postgres\" must be enabled for this crate.");
#[cfg(all(feature = "sqlite", feature = "postgres"))]
@ -51,6 +54,7 @@ pub type Connection = diesel::PgConnection;
#[derive(Debug)]
pub enum Error {
Db(diesel::result::Error),
Inbox(Box<InboxError<Error>>),
InvalidValue,
Io(std::io::Error),
MissingApProperty,
@ -146,6 +150,15 @@ impl From<std::io::Error> for Error {
}
}
impl From<InboxError<Error>> for Error {
fn from(err: InboxError<Error>) -> Error {
match err {
InboxError::InvalidActor(Some(e)) | InboxError::InvalidObject(Some(e)) => e,
e => Error::Inbox(Box::new(e)),
}
}
}
pub type Result<T> = std::result::Result<T, Error>;
pub type ApiResult<T> = std::result::Result<T, canapi::Error>;
@ -295,9 +308,13 @@ pub fn ap_url(url: &str) -> String {
#[cfg(test)]
#[macro_use]
mod tests {
use diesel::Connection;
use db_conn;
use diesel::r2d2::ConnectionManager;
#[cfg(feature = "sqlite")]
use diesel::{dsl::sql_query, RunQueryDsl};
use scheduled_thread_pool::ScheduledThreadPool;
use search;
use std::sync::Arc;
use Connection as Conn;
use CONFIG;
@ -318,17 +335,28 @@ mod tests {
};
}
pub fn db() -> Conn {
let conn = Conn::establish(CONFIG.database_url.as_str())
.expect("Couldn't connect to the database");
#[cfg(feature = "sqlite")]
sql_query("PRAGMA foreign_keys = on;")
.execute(&conn)
.expect("PRAGMA foreign_keys fail");
conn.begin_test_transaction()
.expect("Couldn't start test transaction");
embedded_migrations::run(&conn).expect("Couldn't run migrations");
conn
pub fn db<'a>() -> db_conn::DbConn {
db_conn::DbConn((*DB_POOL).get().unwrap())
}
lazy_static! {
static ref DB_POOL: db_conn::DbPool = {
let pool = db_conn::DbPool::builder()
.connection_customizer(Box::new(db_conn::tests::TestConnectionCustomizer))
.build(ConnectionManager::<Conn>::new(CONFIG.database_url.as_str()))
.unwrap();
embedded_migrations::run(&*pool.get().unwrap()).expect("Migrations error");
pool
};
}
pub fn rockets() -> super::PlumeRocket {
super::PlumeRocket {
conn: db_conn::DbConn((*DB_POOL).get().unwrap()),
searcher: Arc::new(search::tests::get_searcher()),
worker: Arc::new(ScheduledThreadPool::new(2)),
user: None,
}
}
}
@ -342,12 +370,14 @@ pub mod comments;
pub mod db_conn;
pub mod follows;
pub mod headers;
pub mod inbox;
pub mod instance;
pub mod likes;
pub mod lists;
pub mod medias;
pub mod mentions;
pub mod notifications;
pub mod plume_rocket;
pub mod post_authors;
pub mod posts;
pub mod reshares;
@ -357,3 +387,4 @@ pub mod search;
pub mod tags;
pub mod timeline;
pub mod users;
pub use plume_rocket::PlumeRocket;

View file

@ -4,13 +4,13 @@ use diesel::{self, ExpressionMethods, QueryDsl, RunQueryDsl};
use notifications::*;
use plume_common::activity_pub::{
inbox::{Deletable, FromActivity, Notify},
Id, IntoId, PUBLIC_VISIBILTY,
inbox::{AsObject, FromId},
Id, IntoId, PUBLIC_VISIBILITY,
};
use posts::Post;
use schema::likes;
use users::User;
use {Connection, Error, Result};
use {Connection, Error, PlumeRocket, Result};
#[derive(Clone, Queryable, Identifiable)]
pub struct Like {
@ -42,37 +42,16 @@ impl Like {
act.like_props
.set_object_link(Post::get(conn, self.post_id)?.into_id())?;
act.object_props
.set_to_link(Id::new(PUBLIC_VISIBILTY.to_string()))?;
act.object_props.set_cc_link_vec::<Id>(vec![])?;
.set_to_link_vec(vec![Id::new(PUBLIC_VISIBILITY.to_string())])?;
act.object_props.set_cc_link_vec(vec![Id::new(
User::get(conn, self.user_id)?.followers_endpoint,
)])?;
act.object_props.set_id_string(self.ap_url.clone())?;
Ok(act)
}
}
impl FromActivity<activity::Like, Connection> for Like {
type Error = Error;
fn from_activity(conn: &Connection, like: activity::Like, _actor: Id) -> Result<Like> {
let liker = User::from_url(conn, like.like_props.actor.as_str()?)?;
let post = Post::find_by_ap_url(conn, like.like_props.object.as_str()?)?;
let res = Like::insert(
conn,
NewLike {
post_id: post.id,
user_id: liker.id,
ap_url: like.object_props.id_string()?,
},
)?;
res.notify(conn)?;
Ok(res)
}
}
impl Notify<Connection> for Like {
type Error = Error;
fn notify(&self, conn: &Connection) -> Result<()> {
pub fn notify(&self, conn: &Connection) -> Result<()> {
let post = Post::get(conn, self.post_id)?;
for author in post.get_authors(conn)? {
Notification::insert(
@ -86,19 +65,8 @@ impl Notify<Connection> for Like {
}
Ok(())
}
}
impl Deletable<Connection, activity::Undo> for Like {
type Error = Error;
fn delete(&self, conn: &Connection) -> Result<activity::Undo> {
diesel::delete(self).execute(conn)?;
// delete associated notification if any
if let Ok(notif) = Notification::find(conn, notification_kind::LIKE, self.id) {
diesel::delete(&notif).execute(conn)?;
}
pub fn build_undo(&self, conn: &Connection) -> Result<activity::Undo> {
let mut act = activity::Undo::default();
act.undo_props
.set_actor_link(User::get(conn, self.user_id)?.into_id())?;
@ -106,17 +74,87 @@ impl Deletable<Connection, activity::Undo> for Like {
act.object_props
.set_id_string(format!("{}#delete", self.ap_url))?;
act.object_props
.set_to_link(Id::new(PUBLIC_VISIBILTY.to_string()))?;
act.object_props.set_cc_link_vec::<Id>(vec![])?;
.set_to_link_vec(vec![Id::new(PUBLIC_VISIBILITY.to_string())])?;
act.object_props.set_cc_link_vec(vec![Id::new(
User::get(conn, self.user_id)?.followers_endpoint,
)])?;
Ok(act)
}
}
fn delete_id(id: &str, actor_id: &str, conn: &Connection) -> Result<activity::Undo> {
let like = Like::find_by_ap_url(conn, id)?;
let user = User::find_by_ap_url(conn, actor_id)?;
if user.id == like.user_id {
like.delete(conn)
impl AsObject<User, activity::Like, &PlumeRocket> for Post {
type Error = Error;
type Output = Like;
fn activity(self, c: &PlumeRocket, actor: User, id: &str) -> Result<Like> {
let res = Like::insert(
&c.conn,
NewLike {
post_id: self.id,
user_id: actor.id,
ap_url: id.to_string(),
},
)?;
res.notify(&c.conn)?;
Review

I might be reading this wrong, but this enum (Kind) is made to tell if this is a new post, or a like/reshare of an "old" one, and by whom. This is in the part that handle likes, so I think this should be Kind::Like(&actor). There is probably the same issue with reshare in other places

I might be reading this wrong, but this enum (Kind) is made to tell if this is a new post, or a like/reshare of an "old" one, and by whom. This is in the part that handle likes, so I think this should be `Kind::Like(&actor)`. There is probably the same issue with reshare in other places
elegaanz commented 2019-07-07 19:09:32 +00:00 (Migrated from github.com)
Review

Indeed, thanks. I probably copied it from somewhere else and forgot to change it (I should really stop copy/pasting code…)

Indeed, thanks. I probably copied it from somewhere else and forgot to change it (I should really stop copy/pasting code…)
Ok(res)
}
}
impl FromId<PlumeRocket> for Like {
type Error = Error;
type Object = activity::Like;
fn from_db(c: &PlumeRocket, id: &str) -> Result<Self> {
Like::find_by_ap_url(&c.conn, id)
}
fn from_activity(c: &PlumeRocket, act: activity::Like) -> Result<Self> {
let res = Like::insert(
&c.conn,
NewLike {
post_id: Post::from_id(
c,
&{
let res: String = act.like_props.object_link::<Id>()?.into();
res
},
None,
)
.map_err(|(_, e)| e)?
.id,
user_id: User::from_id(
c,
&{
let res: String = act.like_props.actor_link::<Id>()?.into();
res
},
None,
)
.map_err(|(_, e)| e)?
.id,
ap_url: act.object_props.id_string()?,
},
)?;
res.notify(&c.conn)?;
Ok(res)
}
}
impl AsObject<User, activity::Undo, &PlumeRocket> for Like {
type Error = Error;
type Output = ();
fn activity(self, c: &PlumeRocket, actor: User, _id: &str) -> Result<()> {
let conn = &*c.conn;
if actor.id == self.user_id {
diesel::delete(&self).execute(conn)?;
// delete associated notification if any
if let Ok(notif) = Notification::find(conn, notification_kind::LIKE, self.id) {
diesel::delete(&notif).execute(conn)?;
}
Ok(())
} else {
Err(Error::Unauthorized)
}
@ -125,6 +163,7 @@ impl Deletable<Connection, activity::Undo> for Like {
impl NewLike {
pub fn new(p: &Post, u: &User) -> Self {
// TODO: this URL is not valid
let ap_url = format!("{}/like/{}", u.ap_url, p.ap_url);
NewLike {
post_id: p.id,

View file

@ -399,6 +399,7 @@ pub(super) mod private {
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
mod tests {
use super::*;
use blogs::tests as blog_tests;
use diesel::Connection;
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
use tests::db;
#[test]
@ -412,169 +413,182 @@ mod tests {
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
#[test]
fn list_lists() {
let conn = &db();
let (users, _) = blog_tests::fill_database(conn);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
conn.test_transaction::<_, (), _>(|| {
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
let (users, _) = blog_tests::fill_database(conn);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
let l1 = List::new(conn, "list1", None, ListType::User).unwrap();
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
let l2 = List::new(conn, "list2", None, ListType::Blog).unwrap();
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
let l1u = List::new(conn, "list1", Some(&users[0]), ListType::Word).unwrap();
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
let l1 = List::new(conn, "list1", None, ListType::User).unwrap();
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
let l2 = List::new(conn, "list2", None, ListType::Blog).unwrap();
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
let l1u = List::new(conn, "list1", Some(&users[0]), ListType::Word).unwrap();
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
let l_eq = |l1: &List, l2: &List| {
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!(l1.id, l2.id);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!(l1.user_id, l2.user_id);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!(l1.name, l2.name);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!(l1.type_, l2.type_);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
};
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
let l_eq = |l1: &List, l2: &List| {
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!(l1.id, l2.id);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!(l1.user_id, l2.user_id);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!(l1.name, l2.name);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!(l1.type_, l2.type_);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
};
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
let l1bis = List::get(conn, l1.id).unwrap();
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
l_eq(&l1, &l1bis);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
let l1bis = List::get(conn, l1.id).unwrap();
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
l_eq(&l1, &l1bis);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
let l_inst = List::list_for_user(conn, None).unwrap();
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
let l_user = List::list_for_user(conn, Some(users[0].id)).unwrap();
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!(2, l_inst.len());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!(1, l_user.len());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l_inst.iter().all(|l| l.id != l1u.id));
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
let l_inst = List::list_for_user(conn, None).unwrap();
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
let l_user = List::list_for_user(conn, Some(users[0].id)).unwrap();
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!(2, l_inst.len());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!(1, l_user.len());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l_inst.iter().all(|l| l.id != l1u.id));
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
l_eq(&l1u, &l_user[0]);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
if l_inst[0].id == l1.id {
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
l_eq(&l1, &l_inst[0]);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
l_eq(&l2, &l_inst[1]);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
} else {
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
l_eq(&l1, &l_inst[1]);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
l_eq(&l2, &l_inst[0]);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
}
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
l_eq(&l1u, &l_user[0]);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
if l_inst[0].id == l1.id {
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
l_eq(&l1, &l_inst[0]);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
l_eq(&l2, &l_inst[1]);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
} else {
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
l_eq(&l1, &l_inst[1]);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
l_eq(&l2, &l_inst[0]);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
}
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
l_eq(
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
&l1,
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
&List::find_by_name(conn, l1.user_id, &l1.name).unwrap(),
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
l_eq(
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
&&l1u,
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
&List::find_by_name(conn, l1u.user_id, &l1u.name).unwrap(),
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
l_eq(
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
&l1,
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
&List::find_by_name(conn, l1.user_id, &l1.name).unwrap(),
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
l_eq(
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
&&l1u,
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
&List::find_by_name(conn, l1u.user_id, &l1u.name).unwrap(),
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
Ok(())
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
});
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
}
#[test]
fn test_user_list() {
let conn = &db();
let (users, blogs) = blog_tests::fill_database(conn);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
conn.test_transaction::<_, (), _>(|| {
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
let (users, blogs) = blog_tests::fill_database(conn);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
let l = List::new(conn, "list", None, ListType::User).unwrap();
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
let l = List::new(conn, "list", None, ListType::User).unwrap();
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!(l.kind(), ListType::User);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.list_users(conn).unwrap().is_empty());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!(l.kind(), ListType::User);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.list_users(conn).unwrap().is_empty());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(!l.contains_user(conn, users[0].id).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.add_users(conn, &[users[0].id]).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.contains_user(conn, users[0].id).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(!l.contains_user(conn, users[0].id).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.add_users(conn, &[users[0].id]).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.contains_user(conn, users[0].id).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.add_users(conn, &[users[1].id]).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.contains_user(conn, users[0].id).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.contains_user(conn, users[1].id).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!(2, l.list_users(conn).unwrap().len());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.add_users(conn, &[users[1].id]).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.contains_user(conn, users[0].id).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.contains_user(conn, users[1].id).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!(2, l.list_users(conn).unwrap().len());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.set_users(conn, &[users[0].id]).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.contains_user(conn, users[0].id).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(!l.contains_user(conn, users[1].id).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!(1, l.list_users(conn).unwrap().len());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(users[0] == l.list_users(conn).unwrap()[0]);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.set_users(conn, &[users[0].id]).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.contains_user(conn, users[0].id).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(!l.contains_user(conn, users[1].id).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!(1, l.list_users(conn).unwrap().len());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(users[0] == l.list_users(conn).unwrap()[0]);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
l.clear(conn).unwrap();
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.list_users(conn).unwrap().is_empty());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
l.clear(conn).unwrap();
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.list_users(conn).unwrap().is_empty());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(!l.add_blogs(conn, &[blogs[0].id]).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(!l.add_blogs(conn, &[blogs[0].id]).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
Ok(())
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
});
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
}
#[test]
fn test_blog_list() {
let conn = &db();
let (users, blogs) = blog_tests::fill_database(conn);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
conn.test_transaction::<_, (), _>(|| {
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
let (users, blogs) = blog_tests::fill_database(conn);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
let l = List::new(conn, "list", None, ListType::Blog).unwrap();
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
let l = List::new(conn, "list", None, ListType::Blog).unwrap();
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!(l.kind(), ListType::Blog);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.list_blogs(conn).unwrap().is_empty());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!(l.kind(), ListType::Blog);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.list_blogs(conn).unwrap().is_empty());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(!l.contains_blog(conn, blogs[0].id).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.add_blogs(conn, &[blogs[0].id]).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.contains_blog(conn, blogs[0].id).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(!l.contains_blog(conn, blogs[0].id).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.add_blogs(conn, &[blogs[0].id]).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.contains_blog(conn, blogs[0].id).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.add_blogs(conn, &[blogs[1].id]).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.contains_blog(conn, blogs[0].id).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.contains_blog(conn, blogs[1].id).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!(2, l.list_blogs(conn).unwrap().len());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.add_blogs(conn, &[blogs[1].id]).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.contains_blog(conn, blogs[0].id).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.contains_blog(conn, blogs[1].id).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!(2, l.list_blogs(conn).unwrap().len());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.set_blogs(conn, &[blogs[0].id]).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.contains_blog(conn, blogs[0].id).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(!l.contains_blog(conn, blogs[1].id).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!(1, l.list_blogs(conn).unwrap().len());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!(blogs[0].id, l.list_blogs(conn).unwrap()[0].id);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.set_blogs(conn, &[blogs[0].id]).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.contains_blog(conn, blogs[0].id).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(!l.contains_blog(conn, blogs[1].id).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!(1, l.list_blogs(conn).unwrap().len());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!(blogs[0].id, l.list_blogs(conn).unwrap()[0].id);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
l.clear(conn).unwrap();
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.list_blogs(conn).unwrap().is_empty());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
l.clear(conn).unwrap();
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.list_blogs(conn).unwrap().is_empty());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(!l.add_users(conn, &[users[0].id]).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(!l.add_users(conn, &[users[0].id]).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
Ok(())
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
});
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
}
#[test]
fn test_word_list() {
let conn = &db();
conn.test_transaction::<_, (), _>(|| {
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
let l = List::new(conn, "list", None, ListType::Word).unwrap();
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
let l = List::new(conn, "list", None, ListType::Word).unwrap();
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!(l.kind(), ListType::Word);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.list_words(conn).unwrap().is_empty());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!(l.kind(), ListType::Word);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.list_words(conn).unwrap().is_empty());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(!l.contains_word(conn, "plume").unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.add_words(conn, &["plume"]).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.contains_word(conn, "plume").unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(!l.contains_word(conn, "plumelin").unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(!l.contains_word(conn, "plume").unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.add_words(conn, &["plume"]).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.contains_word(conn, "plume").unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(!l.contains_word(conn, "plumelin").unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.add_words(conn, &["amsterdam"]).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.contains_word(conn, "plume").unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.contains_word(conn, "amsterdam").unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!(2, l.list_words(conn).unwrap().len());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.add_words(conn, &["amsterdam"]).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.contains_word(conn, "plume").unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.contains_word(conn, "amsterdam").unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!(2, l.list_words(conn).unwrap().len());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.set_words(conn, &["plume"]).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.contains_word(conn, "plume").unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(!l.contains_word(conn, "amsterdam").unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!(1, l.list_words(conn).unwrap().len());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!("plume", l.list_words(conn).unwrap()[0]);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.set_words(conn, &["plume"]).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.contains_word(conn, "plume").unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(!l.contains_word(conn, "amsterdam").unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!(1, l.list_words(conn).unwrap().len());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!("plume", l.list_words(conn).unwrap()[0]);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
l.clear(conn).unwrap();
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.list_words(conn).unwrap().is_empty());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
l.clear(conn).unwrap();
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.list_words(conn).unwrap().is_empty());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(!l.add_prefixes(conn, &["something"]).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(!l.add_prefixes(conn, &["something"]).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
Ok(())
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
});
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
}
#[test]
fn test_prefix_list() {
let conn = &db();
conn.test_transaction::<_, (), _>(|| {
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
let l = List::new(conn, "list", None, ListType::Prefix).unwrap();
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
let l = List::new(conn, "list", None, ListType::Prefix).unwrap();
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!(l.kind(), ListType::Prefix);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.list_prefixes(conn).unwrap().is_empty());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!(l.kind(), ListType::Prefix);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.list_prefixes(conn).unwrap().is_empty());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(!l.contains_prefix(conn, "plume").unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.add_prefixes(conn, &["plume"]).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.contains_prefix(conn, "plume").unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.contains_prefix(conn, "plumelin").unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(!l.contains_prefix(conn, "plume").unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.add_prefixes(conn, &["plume"]).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.contains_prefix(conn, "plume").unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.contains_prefix(conn, "plumelin").unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.add_prefixes(conn, &["amsterdam"]).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.contains_prefix(conn, "plume").unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.contains_prefix(conn, "amsterdam").unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!(2, l.list_prefixes(conn).unwrap().len());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.add_prefixes(conn, &["amsterdam"]).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.contains_prefix(conn, "plume").unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.contains_prefix(conn, "amsterdam").unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!(2, l.list_prefixes(conn).unwrap().len());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.set_prefixes(conn, &["plume"]).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.contains_prefix(conn, "plume").unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(!l.contains_prefix(conn, "amsterdam").unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!(1, l.list_prefixes(conn).unwrap().len());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!("plume", l.list_prefixes(conn).unwrap()[0]);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.set_prefixes(conn, &["plume"]).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.contains_prefix(conn, "plume").unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(!l.contains_prefix(conn, "amsterdam").unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!(1, l.list_prefixes(conn).unwrap().len());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert_eq!("plume", l.list_prefixes(conn).unwrap()[0]);
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
l.clear(conn).unwrap();
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.list_prefixes(conn).unwrap().is_empty());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
l.clear(conn).unwrap();
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(l.list_prefixes(conn).unwrap().is_empty());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(!l.add_words(conn, &["something"]).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
assert!(!l.add_words(conn, &["something"]).unwrap());
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
Ok(())
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
});
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
}
}

igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing
igalic commented 2019-07-25 13:57:35 +00:00 (Migrated from github.com)
Review

Invalid without the e

`Invalid` without the `e`
igalic commented 2019-07-25 14:04:32 +00:00 (Migrated from github.com)
Review

i dunno, this feels like an error…

i dunno, this feels like an error…
Review

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private

this gives this module more visibility from the outer code, while keeping it private from other crates. It was probably necessary at some point, but rn it could be plain private
Review

I's a find by (list) name, in context of the given user (or instance if None)

I's a find by (list) name, in context of the given user (or instance if None)
igalic commented 2019-07-27 06:59:46 +00:00 (Migrated from github.com)
Review

that needs either documentation or different names, because this way it's just way too confusing

that needs either documentation or different names, because this way it's just way too confusing

View file

@ -5,13 +5,16 @@ use guid_create::GUID;
use reqwest;
use std::{fs, path::Path};
use plume_common::{activity_pub::Id, utils::MediaProcessor};
use plume_common::{
activity_pub::{inbox::FromId, Id},
utils::MediaProcessor,
};
use instance::Instance;
use safe_string::SafeString;
use schema::medias;
use users::User;
use {ap_url, Connection, Error, Result};
use {ap_url, Connection, Error, PlumeRocket, Result};
#[derive(Clone, Identifiable, Queryable)]
pub struct Media {
@ -183,7 +186,8 @@ impl Media {
}
// TODO: merge with save_remote?
pub fn from_activity(conn: &Connection, image: &Image) -> Result<Media> {
pub fn from_activity(c: &PlumeRocket, image: &Image) -> Result<Media> {
let conn = &*c.conn;
let remote_url = image.object_props.url_string().ok()?;
let ext = remote_url
.rsplit('.')
@ -210,8 +214,8 @@ impl Media {
remote_url: None,
sensitive: image.object_props.summary_string().is_ok(),
content_warning: image.object_props.summary_string().ok(),
owner_id: User::from_url(
conn,
owner_id: User::from_id(
c,
image
.object_props
.attributed_to_link_vec::<Id>()
@ -219,7 +223,9 @@ impl Media {
.into_iter()
.next()?
.as_ref(),
)?
None,
)
.map_err(|(_, e)| e)?
.id,
},
)
@ -242,6 +248,7 @@ impl Media {
#[cfg(test)]
pub(crate) mod tests {
use super::*;
use diesel::Connection;
use std::env::{current_dir, set_current_dir};
use std::fs;
use std::path::Path;
@ -309,80 +316,83 @@ pub(crate) mod tests {
}
}
//set_owner
#[test]
fn delete() {
let conn = &db();
let user = fill_database(conn).0[0].id;
conn.test_transaction::<_, (), _>(|| {
let user = fill_database(conn).0[0].id;
let path = "static/media/test_deletion".to_owned();
fs::write(path.clone(), []).unwrap();
let path = "static/media/test_deletion".to_owned();
fs::write(path.clone(), []).unwrap();
let media = Media::insert(
conn,
NewMedia {
file_path: path.clone(),
alt_text: "alt message".to_owned(),
is_remote: false,
remote_url: None,
sensitive: false,
content_warning: None,
owner_id: user,
},
)
.unwrap();
let media = Media::insert(
conn,
NewMedia {
file_path: path.clone(),
alt_text: "alt message".to_owned(),
is_remote: false,
remote_url: None,
sensitive: false,
content_warning: None,
owner_id: user,
},
)
.unwrap();
assert!(Path::new(&path).exists());
media.delete(conn).unwrap();
assert!(!Path::new(&path).exists());
assert!(Path::new(&path).exists());
media.delete(conn).unwrap();
assert!(!Path::new(&path).exists());
clean(conn);
clean(conn);
Ok(())
});
}
#[test]
fn set_owner() {
let conn = &db();
let (users, _) = fill_database(conn);
let u1 = &users[0];
let u2 = &users[1];
conn.test_transaction::<_, (), _>(|| {
let (users, _) = fill_database(conn);
let u1 = &users[0];
let u2 = &users[1];
let path = "static/media/test_set_owner".to_owned();
fs::write(path.clone(), []).unwrap();
let path = "static/media/test_set_owner".to_owned();
fs::write(path.clone(), []).unwrap();
let media = Media::insert(
conn,
NewMedia {
file_path: path.clone(),
alt_text: "alt message".to_owned(),
is_remote: false,
remote_url: None,
sensitive: false,
content_warning: None,
owner_id: u1.id,
},
)
.unwrap();
let media = Media::insert(
conn,
NewMedia {
file_path: path.clone(),
alt_text: "alt message".to_owned(),
is_remote: false,
remote_url: None,
sensitive: false,
content_warning: None,
owner_id: u1.id,
},
)
.unwrap();
assert!(Media::for_user(conn, u1.id)
.unwrap()
.iter()
.any(|m| m.id == media.id));
assert!(!Media::for_user(conn, u2.id)
.unwrap()
.iter()
.any(|m| m.id == media.id));
media.set_owner(conn, u2).unwrap();
assert!(!Media::for_user(conn, u1.id)
.unwrap()
.iter()
.any(|m| m.id == media.id));
assert!(Media::for_user(conn, u2.id)
.unwrap()
.iter()
.any(|m| m.id == media.id));
assert!(Media::for_user(conn, u1.id)
.unwrap()
.iter()
.any(|m| m.id == media.id));
assert!(!Media::for_user(conn, u2.id)
.unwrap()
.iter()
.any(|m| m.id == media.id));
media.set_owner(conn, u2).unwrap();
assert!(!Media::for_user(conn, u1.id)
.unwrap()
.iter()
.any(|m| m.id == media.id));
assert!(Media::for_user(conn, u2.id)
.unwrap()
.iter()
.any(|m| m.id == media.id));
clean(conn);
clean(conn);
Ok(())
});
}
}

View file

@ -3,10 +3,10 @@ use diesel::{self, ExpressionMethods, QueryDsl, RunQueryDsl};
use comments::Comment;
use notifications::*;
use plume_common::activity_pub::inbox::Notify;
use posts::Post;
use schema::mentions;
use users::User;
use PlumeRocket;
use {Connection, Error, Result};
#[derive(Clone, Queryable, Identifiable)]
@ -55,8 +55,8 @@ impl Mention {
}
}
pub fn build_activity(conn: &Connection, ment: &str) -> Result<link::Mention> {
let user = User::find_by_fqn(conn, ment)?;
pub fn build_activity(c: &PlumeRocket, ment: &str) -> Result<link::Mention> {
let user = User::find_by_fqn(c, ment)?;
let mut mention = link::Mention::default();
mention.link_props.set_href_string(user.ap_url)?;
mention.link_props.set_name_string(format!("@{}", ment))?;
@ -126,10 +126,7 @@ impl Mention {
.map(|_| ())
.map_err(Error::from)
}
}
impl Notify<Connection> for Mention {
type Error = Error;
fn notify(&self, conn: &Connection) -> Result<()> {
let m = self.get_mentioned(conn)?;
Notification::insert(

View file

@ -0,0 +1,80 @@
pub use self::module::PlumeRocket;
#[cfg(not(test))]
mod module {
use crate::db_conn::DbConn;
use crate::search;
use crate::users;
use rocket::{
request::{self, FromRequest, Request},
Outcome, State,
};
use scheduled_thread_pool::ScheduledThreadPool;
use std::sync::Arc;
/// Common context needed by most routes and operations on models
pub struct PlumeRocket {
pub conn: DbConn,
pub intl: rocket_i18n::I18n,
pub user: Option<users::User>,
pub searcher: Arc<search::Searcher>,
pub worker: Arc<ScheduledThreadPool>,
}
impl<'a, 'r> FromRequest<'a, 'r> for PlumeRocket {
type Error = ();
fn from_request(request: &'a Request<'r>) -> request::Outcome<PlumeRocket, ()> {
let conn = request.guard::<DbConn>()?;
let intl = request.guard::<rocket_i18n::I18n>()?;
let user = request.guard::<users::User>().succeeded();
let worker = request.guard::<State<Arc<ScheduledThreadPool>>>()?;
let searcher = request.guard::<State<Arc<search::Searcher>>>()?;
Outcome::Success(PlumeRocket {
conn,
intl,
user,
worker: worker.clone(),
searcher: searcher.clone(),
})
}
}
}
#[cfg(test)]
mod module {
use crate::db_conn::DbConn;
use crate::search;
use crate::users;
use rocket::{
request::{self, FromRequest, Request},
Outcome, State,
};
use scheduled_thread_pool::ScheduledThreadPool;
use std::sync::Arc;
/// Common context needed by most routes and operations on models
pub struct PlumeRocket {
pub conn: DbConn,
pub user: Option<users::User>,
pub searcher: Arc<search::Searcher>,
pub worker: Arc<ScheduledThreadPool>,
}
impl<'a, 'r> FromRequest<'a, 'r> for PlumeRocket {
type Error = ();
fn from_request(request: &'a Request<'r>) -> request::Outcome<PlumeRocket, ()> {
let conn = request.guard::<DbConn>()?;
let user = request.guard::<users::User>().succeeded();
let worker = request.guard::<State<Arc<ScheduledThreadPool>>>()?;
let searcher = request.guard::<State<Arc<search::Searcher>>>()?;
Outcome::Success(PlumeRocket {
conn,
user,
worker: worker.clone(),
searcher: searcher.clone(),
})
}
}
}

View file

@ -8,7 +8,6 @@ use canapi::{Error as ApiError, Provider};
use chrono::{NaiveDateTime, TimeZone, Utc};
use diesel::{self, BelongingToDsl, ExpressionMethods, QueryDsl, RunQueryDsl, SaveChangesDsl};
use heck::{CamelCase, KebabCase};
use scheduled_thread_pool::ScheduledThreadPool as Worker;
use serde_json;
use std::collections::HashSet;
@ -20,8 +19,8 @@ use plume_api::posts::PostEndpoint;
use plume_common::{
activity_pub::{
broadcast,
inbox::{Deletable, FromActivity},
Hashtag, Id, IntoId, Licensed, Source, PUBLIC_VISIBILTY,
inbox::{AsObject, FromId},
Hashtag, Id, IntoId, Licensed, Source, PUBLIC_VISIBILITY,
},
utils::md_to_html,
};
@ -31,7 +30,7 @@ use schema::posts;
use search::Searcher;
use tags::*;
use users::User;
use {ap_url, ApiResult, Connection, Error, Result, CONFIG};
use {ap_url, ApiResult, Connection, Error, PlumeRocket, Result, CONFIG};
pub type LicensedArticle = CustomObject<Licensed, Article>;
@ -68,17 +67,17 @@ pub struct NewPost {
pub cover_id: Option<i32>,
}
impl<'a> Provider<(&'a Connection, &'a Worker, &'a Searcher, Option<i32>)> for Post {
impl Provider<PlumeRocket> for Post {
type Data = PostEndpoint;
fn get(
(conn, _worker, _search, user_id): &(&Connection, &Worker, &Searcher, Option<i32>),
id: i32,
) -> ApiResult<PostEndpoint> {
fn get(rockets: &PlumeRocket, id: i32) -> ApiResult<PostEndpoint> {
let conn = &*rockets.conn;
if let Ok(post) = Post::get(conn, id) {
if !post.published
&& !user_id
.map(|u| post.is_author(conn, u).unwrap_or(false))
&& !rockets
.user
.as_ref()
.and_then(|u| post.is_author(conn, u.id).ok())
.unwrap_or(false)
{
return Err(ApiError::Authorization(
@ -115,10 +114,8 @@ impl<'a> Provider<(&'a Connection, &'a Worker, &'a Searcher, Option<i32>)> for P
}
}
fn list(
(conn, _worker, _search, user_id): &(&Connection, &Worker, &Searcher, Option<i32>),
filter: PostEndpoint,
) -> Vec<PostEndpoint> {
fn list(rockets: &PlumeRocket, filter: PostEndpoint) -> Vec<PostEndpoint> {
let conn = &*rockets.conn;
let mut query = posts::table.into_boxed();
if let Some(title) = filter.title {
query = query.filter(posts::title.eq(title));
@ -131,13 +128,15 @@ impl<'a> Provider<(&'a Connection, &'a Worker, &'a Searcher, Option<i32>)> for P
}
query
.get_results::<Post>(*conn)
.get_results::<Post>(conn)
.map(|ps| {
ps.into_iter()
.filter(|p| {
p.published
|| user_id
.map(|u| p.is_author(conn, u).unwrap_or(false))
|| rockets
.user
.as_ref()
.and_then(|u| p.is_author(conn, u.id).ok())
.unwrap_or(false)
})
.map(|p| PostEndpoint {
@ -166,31 +165,33 @@ impl<'a> Provider<(&'a Connection, &'a Worker, &'a Searcher, Option<i32>)> for P
}
fn update(
(_conn, _worker, _search, _user_id): &(&Connection, &Worker, &Searcher, Option<i32>),
_rockets: &PlumeRocket,
_id: i32,
_new_data: PostEndpoint,
) -> ApiResult<PostEndpoint> {
unimplemented!()
}
fn delete(
(conn, _worker, search, user_id): &(&Connection, &Worker, &Searcher, Option<i32>),
id: i32,
) {
let user_id = user_id.expect("Post as Provider::delete: not authenticated");
fn delete(rockets: &PlumeRocket, id: i32) {
let conn = &*rockets.conn;
let user_id = rockets
.user
.as_ref()
.expect("Post as Provider::delete: not authenticated")
.id;
if let Ok(post) = Post::get(conn, id) {
if post.is_author(conn, user_id).unwrap_or(false) {
post.delete(&(conn, search))
post.delete(conn, &rockets.searcher)
.expect("Post as Provider::delete: delete error");
}
}
}
fn create(
(conn, worker, search, user_id): &(&Connection, &Worker, &Searcher, Option<i32>),
query: PostEndpoint,
) -> ApiResult<PostEndpoint> {
if user_id.is_none() {
fn create(rockets: &PlumeRocket, query: PostEndpoint) -> ApiResult<PostEndpoint> {
let conn = &*rockets.conn;
let search = &rockets.searcher;
let worker = &rockets.worker;
if rockets.user.is_none() {
return Err(ApiError::Authorization(
"You are not authorized to create new articles.".to_string(),
));
@ -207,11 +208,10 @@ impl<'a> Provider<(&'a Connection, &'a Worker, &'a Searcher, Option<i32>)> for P
let domain = &Instance::get_local(&conn)
.map_err(|_| ApiError::NotFound("posts::update: Error getting local instance".into()))?
.public_domain;
let author = User::get(
conn,
user_id.expect("<Post as Provider>::create: no user_id error"),
)
.map_err(|_| ApiError::NotFound("Author not found".into()))?;
let author = rockets
.user
.clone()
.ok_or_else(|| ApiError::NotFound("Author not found".into()))?;
let (content, mentions, hashtags) = md_to_html(
query.source.clone().unwrap_or_default().clone().as_ref(),
@ -298,7 +298,7 @@ impl<'a> Provider<(&'a Connection, &'a Worker, &'a Searcher, Option<i32>)> for P
for m in mentions.into_iter() {
Mention::from_activity(
&*conn,
&Mention::build_activity(&*conn, &m)
&Mention::build_activity(&rockets, &m)
.map_err(|_| ApiError::NotFound("Couldn't build mentions".into()))?,
post.id,
true,
@ -367,6 +367,7 @@ impl Post {
searcher.add_document(conn, &post)?;
Ok(post)
}
pub fn update(&self, conn: &Connection, searcher: &Searcher) -> Result<Self> {
diesel::update(self).set(self).execute(conn)?;
let post = Self::get(conn, self.id)?;
@ -374,6 +375,15 @@ impl Post {
Ok(post)
}
pub fn delete(&self, conn: &Connection, searcher: &Searcher) -> Result<()> {
for m in Mention::list_for_post(&conn, self.id)? {
m.delete(conn)?;
}
diesel::delete(self).execute(conn)?;
searcher.delete_document(self);
Ok(())
}
pub fn list_by_tag(
conn: &Connection,
tag: String,
@ -625,7 +635,7 @@ impl Post {
pub fn to_activity(&self, conn: &Connection) -> Result<LicensedArticle> {
let cc = self.get_receivers_urls(conn)?;
let to = vec![PUBLIC_VISIBILTY.to_string()];
let to = vec![PUBLIC_VISIBILITY.to_string()];
let mut mentions_json = Mention::list_for_post(conn, self.id)?
.into_iter()
@ -726,77 +736,6 @@ impl Post {
Ok(act)
}
pub fn handle_update(
conn: &Connection,
updated: &LicensedArticle,
searcher: &Searcher,
) -> Result<()> {
let id = updated.object.object_props.id_string()?;
let mut post = Post::find_by_ap_url(conn, &id)?;
if let Ok(title) = updated.object.object_props.name_string() {
post.slug = title.to_kebab_case();
post.title = title;
}
if let Ok(content) = updated.object.object_props.content_string() {
post.content = SafeString::new(&content);
}
if let Ok(subtitle) = updated.object.object_props.summary_string() {
post.subtitle = subtitle;
}
if let Ok(ap_url) = updated.object.object_props.url_string() {
post.ap_url = ap_url;
}
if let Ok(source) = updated.object.ap_object_props.source_object::<Source>() {
post.source = source.content;
}
if let Ok(license) = updated.custom_props.license_string() {
post.license = license;
}
let mut txt_hashtags = md_to_html(&post.source, "", false, None)
.2
.into_iter()
.map(|s| s.to_camel_case())
.collect::<HashSet<_>>();
if let Some(serde_json::Value::Array(mention_tags)) =
updated.object.object_props.tag.clone()
{
let mut mentions = vec![];
let mut tags = vec![];
let mut hashtags = vec![];
for tag in mention_tags {
serde_json::from_value::<link::Mention>(tag.clone())
.map(|m| mentions.push(m))
.ok();
serde_json::from_value::<Hashtag>(tag.clone())
.map_err(Error::from)
.and_then(|t| {
let tag_name = t.name_string()?;
if txt_hashtags.remove(&tag_name) {
hashtags.push(t);
} else {
tags.push(t);
}
Ok(())
})
.ok();
}
post.update_mentions(conn, mentions)?;
post.update_tags(conn, tags)?;
post.update_hashtags(conn, hashtags)?;
}
post.update(conn, searcher)?;
Ok(())
}
pub fn update_mentions(&self, conn: &Connection, mentions: Vec<link::Mention>) -> Result<()> {
let mentions = mentions
.into_iter()
@ -925,112 +864,8 @@ impl Post {
.and_then(|i| Media::get(conn, i).ok())
.and_then(|c| c.url(conn).ok())
}
}
impl<'a> FromActivity<LicensedArticle, (&'a Connection, &'a Searcher)> for Post {
type Error = Error;
fn from_activity(
(conn, searcher): &(&'a Connection, &'a Searcher),
article: LicensedArticle,
_actor: Id,
) -> Result<Post> {
let license = article.custom_props.license_string().unwrap_or_default();
let article = article.object;
if let Ok(post) =
Post::find_by_ap_url(conn, &article.object_props.id_string().unwrap_or_default())
{
Ok(post)
} else {
let (blog, authors) = article
.object_props
.attributed_to_link_vec::<Id>()?
.into_iter()
.fold((None, vec![]), |(blog, mut authors), link| {
let url: String = link.into();
match User::from_url(conn, &url) {
Ok(u) => {
authors.push(u);
(blog, authors)
}
Err(_) => (blog.or_else(|| Blog::from_url(conn, &url).ok()), authors),
}
});
let cover = article
.object_props
.icon_object::<Image>()
.ok()
.and_then(|img| Media::from_activity(conn, &img).ok().map(|m| m.id));
let title = article.object_props.name_string()?;
let post = Post::insert(
conn,
NewPost {
blog_id: blog?.id,
slug: title.to_kebab_case(),
title,
content: SafeString::new(&article.object_props.content_string()?),
published: true,
license,
// FIXME: This is wrong: with this logic, we may use the display URL as the AP ID. We need two different fields
ap_url: article
.object_props
.url_string()
.or_else(|_| article.object_props.id_string())?,
creation_date: Some(article.object_props.published_utctime()?.naive_utc()),
subtitle: article.object_props.summary_string()?,
source: article.ap_object_props.source_object::<Source>()?.content,
cover_id: cover,
},
searcher,
)?;
for author in authors {
PostAuthor::insert(
conn,
NewPostAuthor {
post_id: post.id,
author_id: author.id,
},
)?;
}
// save mentions and tags
let mut hashtags = md_to_html(&post.source, "", false, None)
.2
.into_iter()
.map(|s| s.to_camel_case())
.collect::<HashSet<_>>();
if let Some(serde_json::Value::Array(tags)) = article.object_props.tag.clone() {
for tag in tags {
serde_json::from_value::<link::Mention>(tag.clone())
.map(|m| Mention::from_activity(conn, &m, post.id, true, true))
.ok();
serde_json::from_value::<Hashtag>(tag.clone())
.map_err(Error::from)
.and_then(|t| {
let tag_name = t.name_string()?;
Ok(Tag::from_activity(
conn,
&t,
post.id,
hashtags.remove(&tag_name),
))
})
.ok();
}
}
Ok(post)
}
}
}
impl<'a> Deletable<(&'a Connection, &'a Searcher), Delete> for Post {
type Error = Error;
fn delete(&self, (conn, searcher): &(&Connection, &Searcher)) -> Result<Delete> {
pub fn build_delete(&self, conn: &Connection) -> Result<Delete> {
let mut act = Delete::default();
act.delete_props
.set_actor_link(self.get_authors(conn)?[0].clone().into_id())?;
@ -1042,37 +877,360 @@ impl<'a> Deletable<(&'a Connection, &'a Searcher), Delete> for Post {
act.object_props
.set_id_string(format!("{}#delete", self.ap_url))?;
act.object_props
.set_to_link_vec(vec![Id::new(PUBLIC_VISIBILTY)])?;
for m in Mention::list_for_post(&conn, self.id)? {
m.delete(conn)?;
}
diesel::delete(self).execute(*conn)?;
searcher.delete_document(self);
.set_to_link_vec(vec![Id::new(PUBLIC_VISIBILITY)])?;
Ok(act)
}
}
fn delete_id(
id: &str,
actor_id: &str,
(conn, searcher): &(&Connection, &Searcher),
) -> Result<Delete> {
let actor = User::find_by_ap_url(conn, actor_id)?;
let post = Post::find_by_ap_url(conn, id)?;
let can_delete = post
.get_authors(conn)?
impl FromId<PlumeRocket> for Post {
type Error = Error;
type Object = LicensedArticle;
fn from_db(c: &PlumeRocket, id: &str) -> Result<Self> {
Self::find_by_ap_url(&c.conn, id)
}
fn from_activity(c: &PlumeRocket, article: LicensedArticle) -> Result<Self> {
let conn = &*c.conn;
let searcher = &c.searcher;
let license = article.custom_props.license_string().unwrap_or_default();
let article = article.object;
let (blog, authors) = article
.object_props
.attributed_to_link_vec::<Id>()?
.into_iter()
.fold((None, vec![]), |(blog, mut authors), link| {
let url: String = link.into();
match User::from_id(&c, &url, None) {
Ok(u) => {
authors.push(u);
(blog, authors)
}
Err(_) => (blog.or_else(|| Blog::from_id(&c, &url, None).ok()), authors),
}
});
let cover = article
.object_props
.icon_object::<Image>()
.ok()
.and_then(|img| Media::from_activity(&c, &img).ok().map(|m| m.id));
let title = article.object_props.name_string()?;
let post = Post::insert(
conn,
NewPost {
blog_id: blog?.id,
slug: title.to_kebab_case(),
title,
content: SafeString::new(&article.object_props.content_string()?),
published: true,
license,
// FIXME: This is wrong: with this logic, we may use the display URL as the AP ID. We need two different fields
ap_url: article
.object_props
.url_string()
.or_else(|_| article.object_props.id_string())?,
creation_date: Some(article.object_props.published_utctime()?.naive_utc()),
subtitle: article.object_props.summary_string()?,
source: article.ap_object_props.source_object::<Source>()?.content,
cover_id: cover,
},
searcher,
)?;
for author in authors {
PostAuthor::insert(
conn,
NewPostAuthor {
post_id: post.id,
author_id: author.id,
},
)?;
}
// save mentions and tags
let mut hashtags = md_to_html(&post.source, "", false, None)
.2
.into_iter()
.map(|s| s.to_camel_case())
.collect::<HashSet<_>>();
if let Some(serde_json::Value::Array(tags)) = article.object_props.tag.clone() {
for tag in tags {
serde_json::from_value::<link::Mention>(tag.clone())
.map(|m| Mention::from_activity(conn, &m, post.id, true, true))
.ok();
serde_json::from_value::<Hashtag>(tag.clone())
.map_err(Error::from)
.and_then(|t| {
let tag_name = t.name_string()?;
Ok(Tag::from_activity(
conn,
&t,
post.id,
hashtags.remove(&tag_name),
))
})
.ok();
}
}
Ok(post)
}
}
impl AsObject<User, Create, &PlumeRocket> for Post {
type Error = Error;
type Output = Post;
fn activity(self, _c: &PlumeRocket, _actor: User, _id: &str) -> Result<Post> {
// TODO: check that _actor is actually one of the author?
Ok(self)
}
}
impl AsObject<User, Delete, &PlumeRocket> for Post {
type Error = Error;
type Output = ();
fn activity(self, c: &PlumeRocket, actor: User, _id: &str) -> Result<()> {
let can_delete = self
.get_authors(&c.conn)?
.into_iter()
.any(|a| actor.id == a.id);
if can_delete {
post.delete(&(conn, searcher))
self.delete(&c.conn, &c.searcher).map(|_| ())
} else {
Err(Error::Unauthorized)
}
}
}
pub struct PostUpdate {
pub ap_url: String,
pub title: Option<String>,
pub subtitle: Option<String>,
pub content: Option<String>,
pub cover: Option<i32>,
pub source: Option<String>,
pub license: Option<String>,
pub tags: Option<serde_json::Value>,
}
impl FromId<PlumeRocket> for PostUpdate {
type Error = Error;
type Object = LicensedArticle;
fn from_db(_: &PlumeRocket, _: &str) -> Result<Self> {
// Always fail because we always want to deserialize the AP object
Err(Error::NotFound)
}
fn from_activity(c: &PlumeRocket, updated: LicensedArticle) -> Result<Self> {
Ok(PostUpdate {
ap_url: updated.object.object_props.id_string()?,
title: updated.object.object_props.name_string().ok(),
subtitle: updated.object.object_props.summary_string().ok(),
content: updated.object.object_props.content_string().ok(),
cover: updated
.object
.object_props
.icon_object::<Image>()
.ok()
.and_then(|img| Media::from_activity(&c, &img).ok().map(|m| m.id)),
source: updated
.object
.ap_object_props
.source_object::<Source>()
.ok()
.map(|x| x.content),
license: updated.custom_props.license_string().ok(),
tags: updated.object.object_props.tag.clone(),
})
}
}
impl AsObject<User, Update, &PlumeRocket> for PostUpdate {
type Error = Error;
type Output = ();
fn activity(self, c: &PlumeRocket, actor: User, _id: &str) -> Result<()> {
let conn = &*c.conn;
let searcher = &c.searcher;
let mut post = Post::from_id(c, &self.ap_url, None).map_err(|(_, e)| e)?;
if !post.is_author(conn, actor.id)? {
// TODO: maybe the author was added in the meantime
return Err(Error::Unauthorized);
}
if let Some(title) = self.title {
post.slug = title.to_kebab_case();
post.title = title;
}
if let Some(content) = self.content {
post.content = SafeString::new(&content);
}
if let Some(subtitle) = self.subtitle {
post.subtitle = subtitle;
}
post.cover_id = self.cover;
if let Some(source) = self.source {
post.source = source;
}
if let Some(license) = self.license {
post.license = license;
}
let mut txt_hashtags = md_to_html(&post.source, "", false, None)
.2
.into_iter()
.map(|s| s.to_camel_case())
.collect::<HashSet<_>>();
if let Some(serde_json::Value::Array(mention_tags)) = self.tags {
let mut mentions = vec![];
let mut tags = vec![];
let mut hashtags = vec![];
for tag in mention_tags {
serde_json::from_value::<link::Mention>(tag.clone())
.map(|m| mentions.push(m))
.ok();
serde_json::from_value::<Hashtag>(tag.clone())
.map_err(Error::from)
.and_then(|t| {
let tag_name = t.name_string()?;
if txt_hashtags.remove(&tag_name) {
hashtags.push(t);
} else {
tags.push(t);
}
Ok(())
})
.ok();
}
post.update_mentions(conn, mentions)?;
post.update_tags(conn, tags)?;
post.update_hashtags(conn, hashtags)?;
}
post.update(conn, searcher)?;
Ok(())
}
}
impl IntoId for Post {
fn into_id(self) -> Id {
Id::new(self.ap_url.clone())
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::inbox::{inbox, tests::fill_database, InboxResult};
use crate::safe_string::SafeString;
use crate::tests::rockets;
use diesel::Connection;
// creates a post, get it's Create activity, delete the post,
// "send" the Create to the inbox, and check it works
#[test]
fn self_federation() {
let r = rockets();
let conn = &*r.conn;
conn.test_transaction::<_, (), _>(|| {
let (_, users, blogs) = fill_database(&r);
let post = Post::insert(
conn,
NewPost {
blog_id: blogs[0].id,
slug: "yo".into(),
title: "Yo".into(),
content: SafeString::new("Hello"),
published: true,
license: "WTFPL".to_string(),
creation_date: None,
ap_url: String::new(), // automatically updated when inserting
subtitle: "Testing".into(),
source: "Hello".into(),
cover_id: None,
},
&r.searcher,
)
.unwrap();
PostAuthor::insert(
conn,
NewPostAuthor {
post_id: post.id,
author_id: users[0].id,
},
)
.unwrap();
let create = post.create_activity(conn).unwrap();
post.delete(conn, &r.searcher).unwrap();
match inbox(&r, serde_json::to_value(create).unwrap()).unwrap() {
InboxResult::Post(p) => {
assert!(p.is_author(conn, users[0].id).unwrap());
assert_eq!(p.source, "Hello".to_owned());
assert_eq!(p.blog_id, blogs[0].id);
assert_eq!(p.content, SafeString::new("Hello"));
assert_eq!(p.subtitle, "Testing".to_owned());
assert_eq!(p.title, "Yo".to_owned());
}
_ => panic!("Unexpected result"),
};
Ok(())
});
}
#[test]
fn licensed_article_serde() {
let mut article = Article::default();
article.object_props.set_id_string("Yo".into()).unwrap();
let mut license = Licensed::default();
license.set_license_string("WTFPL".into()).unwrap();
let full_article = LicensedArticle::new(article, license);
let json = serde_json::to_value(full_article).unwrap();
let article_from_json: LicensedArticle = serde_json::from_value(json).unwrap();
assert_eq!(
"Yo",
&article_from_json.object.object_props.id_string().unwrap()
);
assert_eq!(
"WTFPL",
&article_from_json.custom_props.license_string().unwrap()
);
}
#[test]
fn licensed_article_deserialization() {
let json = json!({
"type": "Article",
"id": "https://plu.me/~/Blog/my-article",
"attributedTo": ["https://plu.me/@/Admin", "https://plu.me/~/Blog"],
"content": "Hello.",
"name": "My Article",
"summary": "Bye.",
"source": {
"content": "Hello.",
"mediaType": "text/markdown"
},
"published": "2014-12-12T12:12:12Z",
"to": [plume_common::activity_pub::PUBLIC_VISIBILITY]
});
let article: LicensedArticle = serde_json::from_value(json).unwrap();
assert_eq!(
"https://plu.me/~/Blog/my-article",
&article.object.object_props.id_string().unwrap()
);
}
}

View file

@ -4,13 +4,13 @@ use diesel::{self, ExpressionMethods, QueryDsl, RunQueryDsl};
use notifications::*;
use plume_common::activity_pub::{
inbox::{Deletable, FromActivity, Notify},
Id, IntoId, PUBLIC_VISIBILTY,
inbox::{AsObject, FromId},
Id, IntoId, PUBLIC_VISIBILITY,
};
use posts::Post;
use schema::reshares;
use users::User;
use {Connection, Error, Result};
use {Connection, Error, PlumeRocket, Result};
#[derive(Clone, Queryable, Identifiable)]
pub struct Reshare {
@ -69,37 +69,14 @@ impl Reshare {
.set_object_link(Post::get(conn, self.post_id)?.into_id())?;
act.object_props.set_id_string(self.ap_url.clone())?;
act.object_props
.set_to_link(Id::new(PUBLIC_VISIBILTY.to_string()))?;
act.object_props.set_cc_link_vec::<Id>(vec![])?;
.set_to_link_vec(vec![Id::new(PUBLIC_VISIBILITY.to_string())])?;
act.object_props
.set_cc_link_vec(vec![Id::new(self.get_user(conn)?.followers_endpoint)])?;
Ok(act)
}
}
impl FromActivity<Announce, Connection> for Reshare {
type Error = Error;
fn from_activity(conn: &Connection, announce: Announce, _actor: Id) -> Result<Reshare> {
let user = User::from_url(conn, announce.announce_props.actor_link::<Id>()?.as_ref())?;
let post =
Post::find_by_ap_url(conn, announce.announce_props.object_link::<Id>()?.as_ref())?;
let reshare = Reshare::insert(
conn,
NewReshare {
post_id: post.id,
user_id: user.id,
ap_url: announce.object_props.id_string().unwrap_or_default(),
},
)?;
reshare.notify(conn)?;
Ok(reshare)
}
}
impl Notify<Connection> for Reshare {
type Error = Error;
fn notify(&self, conn: &Connection) -> Result<()> {
pub fn notify(&self, conn: &Connection) -> Result<()> {
let post = self.get_post(conn)?;
for author in post.get_authors(conn)? {
Notification::insert(
@ -113,19 +90,8 @@ impl Notify<Connection> for Reshare {
}
Ok(())
}
}
impl Deletable<Connection, Undo> for Reshare {
type Error = Error;
fn delete(&self, conn: &Connection) -> Result<Undo> {
diesel::delete(self).execute(conn)?;
// delete associated notification if any
if let Ok(notif) = Notification::find(conn, notification_kind::RESHARE, self.id) {
diesel::delete(&notif).execute(conn)?;
}
pub fn build_undo(&self, conn: &Connection) -> Result<Undo> {
let mut act = Undo::default();
act.undo_props
.set_actor_link(User::get(conn, self.user_id)?.into_id())?;
@ -133,17 +99,88 @@ impl Deletable<Connection, Undo> for Reshare {
act.object_props
.set_id_string(format!("{}#delete", self.ap_url))?;
act.object_props
.set_to_link(Id::new(PUBLIC_VISIBILTY.to_string()))?;
act.object_props.set_cc_link_vec::<Id>(vec![])?;
.set_to_link_vec(vec![Id::new(PUBLIC_VISIBILITY.to_string())])?;
act.object_props
.set_cc_link_vec(vec![Id::new(self.get_user(conn)?.followers_endpoint)])?;
Ok(act)
}
}
fn delete_id(id: &str, actor_id: &str, conn: &Connection) -> Result<Undo> {
let reshare = Reshare::find_by_ap_url(conn, id)?;
let actor = User::find_by_ap_url(conn, actor_id)?;
if actor.id == reshare.user_id {
reshare.delete(conn)
impl AsObject<User, Announce, &PlumeRocket> for Post {
type Error = Error;
type Output = Reshare;
fn activity(self, c: &PlumeRocket, actor: User, id: &str) -> Result<Reshare> {
let conn = &*c.conn;
let reshare = Reshare::insert(
conn,
NewReshare {
post_id: self.id,
user_id: actor.id,
ap_url: id.to_string(),
},
)?;
reshare.notify(conn)?;
Review

see previous comment

see previous comment
Ok(reshare)
}
}
impl FromId<PlumeRocket> for Reshare {
type Error = Error;
type Object = Announce;
fn from_db(c: &PlumeRocket, id: &str) -> Result<Self> {
Reshare::find_by_ap_url(&c.conn, id)
}
fn from_activity(c: &PlumeRocket, act: Announce) -> Result<Self> {
let res = Reshare::insert(
&c.conn,
NewReshare {
post_id: Post::from_id(
c,
&{
let res: String = act.announce_props.object_link::<Id>()?.into();
res
},
None,
)
.map_err(|(_, e)| e)?
.id,
user_id: User::from_id(
c,
&{
let res: String = act.announce_props.actor_link::<Id>()?.into();
res
},
None,
)
.map_err(|(_, e)| e)?
.id,
ap_url: act.object_props.id_string()?,
},
)?;
res.notify(&c.conn)?;
Ok(res)
}
}
impl AsObject<User, Undo, &PlumeRocket> for Reshare {
type Error = Error;
type Output = ();
fn activity(self, c: &PlumeRocket, actor: User, _id: &str) -> Result<()> {
let conn = &*c.conn;
if actor.id == self.user_id {
diesel::delete(&self).execute(conn)?;
// delete associated notification if any
if let Ok(notif) = Notification::find(&conn, notification_kind::RESHARE, self.id) {
diesel::delete(&notif).execute(conn)?;
}
Ok(())
} else {
Err(Error::Unauthorized)
}

View file

@ -7,11 +7,11 @@ pub use self::searcher::*;
#[cfg(test)]
pub(crate) mod tests {
use super::{Query, Searcher};
use diesel::Connection;
use std::env::temp_dir;
use std::str::FromStr;
use blogs::tests::fill_database;
use plume_common::activity_pub::inbox::Deletable;
use plume_common::utils::random_hex;
use post_authors::*;
use posts::{NewPost, Post};
@ -19,7 +19,7 @@ pub(crate) mod tests {
use tests::db;
pub(crate) fn get_searcher() -> Searcher {
let dir = temp_dir().join("plume-test");
let dir = temp_dir().join(&format!("plume-test-{}", random_hex()));
if dir.exists() {
Searcher::open(&dir)
} else {
@ -96,11 +96,10 @@ pub(crate) mod tests {
#[test]
fn open() {
let dir = temp_dir().join(format!("plume-test-{}", random_hex()));
{
get_searcher()
}; //make sure $tmp/plume-test-tantivy exist
let dir = temp_dir().join("plume-test");
Searcher::create(&dir).unwrap();
}
Searcher::open(&dir).unwrap();
}
@ -118,62 +117,65 @@ pub(crate) mod tests {
#[test]
fn search() {
let conn = &db();
let searcher = get_searcher();
let blog = &fill_database(conn).1[0];
let author = &blog.list_authors(conn).unwrap()[0];
conn.test_transaction::<_, (), _>(|| {
let searcher = get_searcher();
let blog = &fill_database(conn).1[0];
let author = &blog.list_authors(conn).unwrap()[0];
let title = random_hex()[..8].to_owned();
let title = random_hex()[..8].to_owned();
let mut post = Post::insert(
conn,
NewPost {
blog_id: blog.id,
slug: title.clone(),
title: title.clone(),
content: SafeString::new(""),
published: true,
license: "CC-BY-SA".to_owned(),
ap_url: "".to_owned(),
creation_date: None,
subtitle: "".to_owned(),
source: "".to_owned(),
cover_id: None,
},
&searcher,
)
.unwrap();
PostAuthor::insert(
conn,
NewPostAuthor {
post_id: post.id,
author_id: author.id,
},
)
.unwrap();
let mut post = Post::insert(
conn,
NewPost {
blog_id: blog.id,
slug: title.clone(),
title: title.clone(),
content: SafeString::new(""),
published: true,
license: "CC-BY-SA".to_owned(),
ap_url: "".to_owned(),
creation_date: None,
subtitle: "".to_owned(),
source: "".to_owned(),
cover_id: None,
},
&searcher,
)
.unwrap();
PostAuthor::insert(
conn,
NewPostAuthor {
post_id: post.id,
author_id: author.id,
},
)
.unwrap();
searcher.commit();
assert_eq!(
searcher.search_document(conn, Query::from_str(&title).unwrap(), (0, 1))[0].id,
post.id
);
searcher.commit();
assert_eq!(
searcher.search_document(conn, Query::from_str(&title).unwrap(), (0, 1))[0].id,
post.id
);
let newtitle = random_hex()[..8].to_owned();
post.title = newtitle.clone();
post.update(conn, &searcher).unwrap();
searcher.commit();
assert_eq!(
searcher.search_document(conn, Query::from_str(&newtitle).unwrap(), (0, 1))[0].id,
post.id
);
assert!(searcher
.search_document(conn, Query::from_str(&title).unwrap(), (0, 1))
.is_empty());
let newtitle = random_hex()[..8].to_owned();
post.title = newtitle.clone();
post.update(conn, &searcher).unwrap();
searcher.commit();
assert_eq!(
searcher.search_document(conn, Query::from_str(&newtitle).unwrap(), (0, 1))[0].id,
post.id
);
assert!(searcher
.search_document(conn, Query::from_str(&title).unwrap(), (0, 1))
.is_empty());
post.delete(&(conn, &searcher)).unwrap();
searcher.commit();
assert!(searcher
.search_document(conn, Query::from_str(&newtitle).unwrap(), (0, 1))
.is_empty());
post.delete(conn, &searcher).unwrap();
searcher.commit();
assert!(searcher
.search_document(conn, Query::from_str(&newtitle).unwrap(), (0, 1))
.is_empty());
Ok(())
});
}
#[test]

View file

@ -1,6 +1,6 @@
use blogs::Blog;
use lists::{self, ListType};
use plume_common::activity_pub::inbox::WithInbox;
use plume_common::activity_pub::inbox::AsActor;
use posts::Post;
use tags::Tag;
use users::User;

View file

@ -12,7 +12,7 @@ use openssl::{
};
use plume_common::activity_pub::{
ap_accept_header,
inbox::{Deletable, WithInbox},
inbox::{AsActor, FromId},
sign::{gen_keypair, Signer},
ActivityStream, ApSignature, Id, IntoId, PublicKey,
};
@ -43,7 +43,7 @@ use posts::Post;
use safe_string::SafeString;
use schema::users;
use search::Searcher;
use {ap_url, Connection, Error, Result, CONFIG};
use {ap_url, Connection, Error, PlumeRocket, Result};
pub type CustomPerson = CustomObject<ApSignature, Person>;
@ -168,7 +168,7 @@ impl User {
.unwrap_or(&0)
> &0;
if !has_other_authors {
Post::get(conn, post_id)?.delete(&(conn, searcher))?;
Post::get(conn, post_id)?.delete(conn, searcher)?;
}
}
@ -230,27 +230,36 @@ impl User {
.map_err(Error::from)
}
pub fn find_by_fqn(conn: &Connection, fqn: &str) -> Result<User> {
pub fn find_by_fqn(c: &PlumeRocket, fqn: &str) -> Result<User> {
let from_db = users::table
.filter(users::fqn.eq(fqn))
.limit(1)
.load::<User>(conn)?
.load::<User>(&*c.conn)?
.into_iter()
.next();
if let Some(from_db) = from_db {
Ok(from_db)
} else {
User::fetch_from_webfinger(conn, fqn)
User::fetch_from_webfinger(c, fqn)
}
}
fn fetch_from_webfinger(conn: &Connection, acct: &str) -> Result<User> {
fn fetch_from_webfinger(c: &PlumeRocket, acct: &str) -> Result<User> {
let link = resolve(acct.to_owned(), true)?
.links
.into_iter()
.find(|l| l.mime_type == Some(String::from("application/activity+json")))
.ok_or(Error::Webfinger)?;
User::fetch_from_url(conn, link.href.as_ref()?)
User::from_id(c, link.href.as_ref()?, None).map_err(|(_, e)| e)
}
pub fn fetch_remote_interact_uri(acct: &str) -> Result<String> {
resolve(acct.to_owned(), true)?
.links
.into_iter()
.find(|l| l.rel == "http://ostatus.org/schema/1.0/subscribe")
.and_then(|l| l.template)
.ok_or(Error::Webfinger)
}
fn fetch(url: &str) -> Result<CustomPerson> {
@ -274,97 +283,8 @@ impl User {
Ok(json)
}
pub fn fetch_from_url(conn: &Connection, url: &str) -> Result<User> {
User::fetch(url)
.and_then(|json| User::from_activity(conn, &json, Url::parse(url)?.host_str()?))
}
fn from_activity(conn: &Connection, acct: &CustomPerson, inst: &str) -> Result<User> {
let instance = Instance::find_by_domain(conn, inst).or_else(|_| {
Instance::insert(
conn,
NewInstance {
name: inst.to_owned(),
public_domain: inst.to_owned(),
local: false,
// We don't really care about all the following for remote instances
long_description: SafeString::new(""),
short_description: SafeString::new(""),
default_license: String::new(),
open_registrations: true,
short_description_html: String::new(),
long_description_html: String::new(),
},
)
})?;
if acct
.object
.ap_actor_props
.preferred_username_string()?
.contains(&['<', '>', '&', '@', '\'', '"'][..])
{
return Err(Error::InvalidValue);
}
let user = User::insert(
conn,
NewUser {
username: acct
.object
.ap_actor_props
.preferred_username_string()
.unwrap(),
display_name: acct.object.object_props.name_string()?,
outbox_url: acct.object.ap_actor_props.outbox_string()?,
inbox_url: acct.object.ap_actor_props.inbox_string()?,
is_admin: false,
summary: acct
.object
.object_props
.summary_string()
.unwrap_or_default(),
summary_html: SafeString::new(
&acct
.object
.object_props
.summary_string()
.unwrap_or_default(),
),
email: None,
hashed_password: None,
instance_id: instance.id,
ap_url: acct.object.object_props.id_string()?,
public_key: acct
.custom_props
.public_key_publickey()?
.public_key_pem_string()?,
private_key: None,
shared_inbox_url: acct
.object
.ap_actor_props
.endpoints_endpoint()
.and_then(|e| e.shared_inbox_string())
.ok(),
followers_endpoint: acct.object.ap_actor_props.followers_string()?,
avatar_id: None,
},
)?;
let avatar = Media::save_remote(
conn,
acct.object
.object_props
.icon_image()?
.object_props
.url_string()?,
&user,
);
if let Ok(avatar) = avatar {
user.set_avatar(conn, avatar.id)?;
}
Ok(user)
pub fn fetch_from_url(c: &PlumeRocket, url: &str) -> Result<User> {
User::fetch(url).and_then(|json| User::from_activity(c, json))
}
pub fn refetch(&self, conn: &Connection) -> Result<()> {
@ -688,10 +608,11 @@ impl User {
.ap_actor_props
.set_followers_string(self.followers_endpoint.clone())?;
let mut endpoints = Endpoint::default();
endpoints
.set_shared_inbox_string(ap_url(&format!("{}/inbox/", CONFIG.base_url.as_str())))?;
actor.ap_actor_props.set_endpoints_endpoint(endpoints)?;
if let Some(shared_inbox_url) = self.shared_inbox_url.clone() {
let mut endpoints = Endpoint::default();
endpoints.set_shared_inbox_string(shared_inbox_url)?;
actor.ap_actor_props.set_endpoints_endpoint(endpoints)?;
}
let mut public_key = PublicKey::default();
public_key.set_id_string(format!("{}#main-key", self.ap_url))?;
@ -728,7 +649,7 @@ impl User {
links: vec![
Link {
rel: String::from("http://webfinger.net/rel/profile-page"),
mime_type: None,
mime_type: Some(String::from("text/html")),
href: Some(self.ap_url.clone()),
template: None,
},
@ -748,22 +669,19 @@ impl User {
href: Some(self.ap_url.clone()),
template: None,
},
Link {
rel: String::from("http://ostatus.org/schema/1.0/subscribe"),
mime_type: None,
href: None,
template: Some(format!(
"{}/remote_interact?{{uri}}",
self.get_instance(conn)?.public_domain
)),
},
],
})
}
pub fn from_url(conn: &Connection, url: &str) -> Result<User> {
User::find_by_ap_url(conn, url).or_else(|_| {
// The requested user was not in the DB
// We try to fetch it if it is remote
if Url::parse(&url)?.host_str()? != CONFIG.base_url.as_str() {
User::fetch_from_url(conn, url)
} else {
Err(Error::NotFound)
}
})
}
pub fn set_avatar(&self, conn: &Connection, id: i32) -> Result<()> {
diesel::update(self)
.set(users::avatar_id.eq(id))
@ -807,7 +725,100 @@ impl IntoId for User {
impl Eq for User {}
impl WithInbox for User {
impl FromId<PlumeRocket> for User {
type Error = Error;
type Object = CustomPerson;
fn from_db(c: &PlumeRocket, id: &str) -> Result<Self> {
Self::find_by_ap_url(&c.conn, id)
}
fn from_activity(c: &PlumeRocket, acct: CustomPerson) -> Result<Self> {
let url = Url::parse(&acct.object.object_props.id_string()?)?;
let inst = url.host_str()?;
let instance = Instance::find_by_domain(&c.conn, inst).or_else(|_| {
Instance::insert(
&c.conn,
NewInstance {
name: inst.to_owned(),
public_domain: inst.to_owned(),
local: false,
// We don't really care about all the following for remote instances
long_description: SafeString::new(""),
short_description: SafeString::new(""),
default_license: String::new(),
open_registrations: true,
short_description_html: String::new(),
long_description_html: String::new(),
},
)
})?;
let username = acct.object.ap_actor_props.preferred_username_string()?;
if username.contains(&['<', '>', '&', '@', '\'', '"', ' ', '\t'][..]) {
return Err(Error::InvalidValue);
}
let user = User::insert(
&c.conn,
NewUser {
display_name: acct
.object
.object_props
.name_string()
.unwrap_or_else(|_| username.clone()),
username,
outbox_url: acct.object.ap_actor_props.outbox_string()?,
inbox_url: acct.object.ap_actor_props.inbox_string()?,
is_admin: false,
summary: acct
.object
.object_props
.summary_string()
.unwrap_or_default(),
summary_html: SafeString::new(
&acct
.object
.object_props
.summary_string()
.unwrap_or_default(),
),
email: None,
hashed_password: None,
instance_id: instance.id,
ap_url: acct.object.object_props.id_string()?,
public_key: acct
.custom_props
.public_key_publickey()?
.public_key_pem_string()?,
private_key: None,
shared_inbox_url: acct
.object
.ap_actor_props
.endpoints_endpoint()
.and_then(|e| e.shared_inbox_string())
.ok(),
followers_endpoint: acct.object.ap_actor_props.followers_string()?,
avatar_id: None,
},
)?;
if let Ok(icon) = acct.object.object_props.icon_image() {
if let Ok(url) = icon.object_props.url_string() {
let avatar = Media::save_remote(&c.conn, url, &user);
if let Ok(avatar) = avatar {
user.set_avatar(&c.conn, avatar.id)?;
}
}
}
Ok(user)
}
}
impl AsActor<&PlumeRocket> for User {
fn get_inbox_url(&self) -> String {
self.inbox_url.clone()
}
@ -890,9 +901,10 @@ impl NewUser {
#[cfg(test)]
pub(crate) mod tests {
use super::*;
use diesel::Connection;
use instance::{tests as instance_tests, Instance};
use search::tests::get_searcher;
use tests::db;
use tests::{db, rockets};
use Connection as Conn;
pub(crate) fn fill_database(conn: &Conn) -> Vec<User> {
@ -932,136 +944,181 @@ pub(crate) mod tests {
#[test]
fn find_by() {
let conn = &db();
fill_database(conn);
let test_user = NewUser::new_local(
conn,
"test".to_owned(),
"test user".to_owned(),
false,
"Hello I'm a test",
"test@example.com".to_owned(),
User::hash_pass("test_password").unwrap(),
)
.unwrap();
assert_eq!(
test_user.id,
User::find_by_name(conn, "test", Instance::get_local(conn).unwrap().id)
let r = rockets();
let conn = &*r.conn;
conn.test_transaction::<_, (), _>(|| {
fill_database(conn);
let test_user = NewUser::new_local(
conn,
"test".to_owned(),
"test user".to_owned(),
false,
"Hello I'm a test",
"test@example.com".to_owned(),
User::hash_pass("test_password").unwrap(),
)
.unwrap();
assert_eq!(
test_user.id,
User::find_by_name(conn, "test", Instance::get_local(conn).unwrap().id)
.unwrap()
.id
);
assert_eq!(
test_user.id,
User::find_by_fqn(&r, &test_user.fqn).unwrap().id
);
assert_eq!(
test_user.id,
User::find_by_email(conn, "test@example.com").unwrap().id
);
assert_eq!(
test_user.id,
User::find_by_ap_url(
conn,
&format!(
"https://{}/@/{}/",
Instance::get_local(conn).unwrap().public_domain,
"test"
)
)
.unwrap()
.id
);
assert_eq!(
test_user.id,
User::find_by_fqn(conn, &test_user.fqn).unwrap().id
);
assert_eq!(
test_user.id,
User::find_by_email(conn, "test@example.com").unwrap().id
);
assert_eq!(
test_user.id,
User::find_by_ap_url(
conn,
&format!(
"https://{}/@/{}/",
Instance::get_local(conn).unwrap().public_domain,
"test"
)
)
.unwrap()
.id
);
);
Ok(())
});
}
#[test]
fn delete() {
let conn = &db();
let inserted = fill_database(conn);
conn.test_transaction::<_, (), _>(|| {
let inserted = fill_database(conn);
assert!(User::get(conn, inserted[0].id).is_ok());
inserted[0].delete(conn, &get_searcher()).unwrap();
assert!(User::get(conn, inserted[0].id).is_err());
assert!(User::get(conn, inserted[0].id).is_ok());
inserted[0].delete(conn, &get_searcher()).unwrap();
assert!(User::get(conn, inserted[0].id).is_err());
Ok(())
});
}
#[test]
fn admin() {
let conn = &db();
let inserted = fill_database(conn);
let local_inst = Instance::get_local(conn).unwrap();
let mut i = 0;
while local_inst.has_admin(conn).unwrap() {
assert!(i < 100); //prevent from looping indefinitelly
local_inst
.main_admin(conn)
.unwrap()
.revoke_admin_rights(conn)
.unwrap();
i += 1;
}
inserted[0].grant_admin_rights(conn).unwrap();
assert_eq!(inserted[0].id, local_inst.main_admin(conn).unwrap().id);
conn.test_transaction::<_, (), _>(|| {
let inserted = fill_database(conn);
let local_inst = Instance::get_local(conn).unwrap();
let mut i = 0;
while local_inst.has_admin(conn).unwrap() {
assert!(i < 100); //prevent from looping indefinitelly
local_inst
.main_admin(conn)
.unwrap()
.revoke_admin_rights(conn)
.unwrap();
i += 1;
}
inserted[0].grant_admin_rights(conn).unwrap();
assert_eq!(inserted[0].id, local_inst.main_admin(conn).unwrap().id);
Ok(())
});
}
#[test]
fn update() {
let conn = &db();
let inserted = fill_database(conn);
let updated = inserted[0]
.update(
conn,
"new name".to_owned(),
"em@il".to_owned(),
"<p>summary</p><script></script>".to_owned(),
)
.unwrap();
assert_eq!(updated.display_name, "new name");
assert_eq!(updated.email.unwrap(), "em@il");
assert_eq!(updated.summary_html.get(), "<p>summary</p>");
conn.test_transaction::<_, (), _>(|| {
let inserted = fill_database(conn);
let updated = inserted[0]
.update(
conn,
"new name".to_owned(),
"em@il".to_owned(),
"<p>summary</p><script></script>".to_owned(),
)
.unwrap();
assert_eq!(updated.display_name, "new name");
assert_eq!(updated.email.unwrap(), "em@il");
assert_eq!(updated.summary_html.get(), "<p>summary</p>");
Ok(())
});
}
#[test]
fn auth() {
let conn = &db();
fill_database(conn);
let test_user = NewUser::new_local(
conn,
"test".to_owned(),
"test user".to_owned(),
false,
"Hello I'm a test",
"test@example.com".to_owned(),
User::hash_pass("test_password").unwrap(),
)
.unwrap();
conn.test_transaction::<_, (), _>(|| {
fill_database(conn);
let test_user = NewUser::new_local(
conn,
"test".to_owned(),
"test user".to_owned(),
false,
"Hello I'm a test",
"test@example.com".to_owned(),
User::hash_pass("test_password").unwrap(),
)
.unwrap();
assert!(test_user.auth("test_password"));
assert!(!test_user.auth("other_password"));
assert!(test_user.auth("test_password"));
assert!(!test_user.auth("other_password"));
Ok(())
});
}
#[test]
fn get_local_page() {
let conn = &db();
fill_database(conn);
conn.test_transaction::<_, (), _>(|| {
fill_database(conn);
let page = User::get_local_page(conn, (0, 2)).unwrap();
assert_eq!(page.len(), 2);
assert!(page[0].username <= page[1].username);
let page = User::get_local_page(conn, (0, 2)).unwrap();
assert_eq!(page.len(), 2);
assert!(page[0].username <= page[1].username);
let mut last_username = User::get_local_page(conn, (0, 1)).unwrap()[0]
.username
.clone();
for i in 1..User::count_local(conn).unwrap() as i32 {
let page = User::get_local_page(conn, (i, i + 1)).unwrap();
assert_eq!(page.len(), 1);
assert!(last_username <= page[0].username);
last_username = page[0].username.clone();
}
assert_eq!(
User::get_local_page(conn, (0, User::count_local(conn).unwrap() as i32 + 10))
.unwrap()
.len() as i64,
User::count_local(conn).unwrap()
);
let mut last_username = User::get_local_page(conn, (0, 1)).unwrap()[0]
.username
.clone();
for i in 1..User::count_local(conn).unwrap() as i32 {
let page = User::get_local_page(conn, (i, i + 1)).unwrap();
assert_eq!(page.len(), 1);
assert!(last_username <= page[0].username);
last_username = page[0].username.clone();
}
assert_eq!(
User::get_local_page(conn, (0, User::count_local(conn).unwrap() as i32 + 10))
.unwrap()
.len() as i64,
User::count_local(conn).unwrap()
);
Ok(())
});
}
#[test]
fn self_federation() {
let r = rockets();
let conn = &*r.conn;
conn.test_transaction::<_, (), _>(|| {
let users = fill_database(conn);
let ap_repr = users[0].to_activity(conn).unwrap();
users[0].delete(conn, &*r.searcher).unwrap();
let user = User::from_activity(&r, ap_repr).unwrap();
assert_eq!(user.username, users[0].username);
assert_eq!(user.display_name, users[0].display_name);
assert_eq!(user.outbox_url, users[0].outbox_url);
assert_eq!(user.inbox_url, users[0].inbox_url);
assert_eq!(user.instance_id, users[0].instance_id);
assert_eq!(user.ap_url, users[0].ap_url);
assert_eq!(user.public_key, users[0].public_key);
assert_eq!(user.shared_inbox_url, users[0].shared_inbox_url);
assert_eq!(user.followers_endpoint, users[0].followers_endpoint);
assert_eq!(user.avatar_url(conn), users[0].avatar_url(conn));
assert_eq!(user.fqn, users[0].fqn);
assert_eq!(user.summary_html, users[0].summary_html);
Ok(())
});
}
}

58
po/plume-front/af.po Normal file
View file

@ -0,0 +1,58 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 19:54\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Afrikaans\n"
"Language: af_ZA\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: af\n"
"X-Crowdin-File: /master/po/plume-front/plume-front.pot\n"
# plume-front/src/editor.rs:114
msgid "Open the rich text editor"
msgstr ""
# plume-front/src/editor.rs:143
msgid "Title"
msgstr ""
# plume-front/src/editor.rs:147
msgid "Subtitle or summary"
msgstr ""
# plume-front/src/editor.rs:154
msgid "Write your article here. Markdown is supported."
msgstr ""
# plume-front/src/editor.rs:165
msgid "Around {} characters left"
msgstr ""
# plume-front/src/editor.rs:228
msgid "Tags"
msgstr ""
# plume-front/src/editor.rs:229
msgid "License"
msgstr ""
# plume-front/src/editor.rs:232
msgid "Cover"
msgstr ""
# plume-front/src/editor.rs:252
msgid "This is a draft"
msgstr ""
# plume-front/src/editor.rs:259
msgid "Publish"
msgstr ""

59
po/plume-front/ar.po Normal file
View file

@ -0,0 +1,59 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 19:54\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Arabic\n"
"Language: ar_SA\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: ar\n"
"X-Crowdin-File: /master/po/plume-front/plume-front.pot\n"
# plume-front/src/editor.rs:114
msgid "Open the rich text editor"
msgstr ""
# plume-front/src/editor.rs:143
msgid "Title"
msgstr "العنوان"
# plume-front/src/editor.rs:147
#, fuzzy
msgid "Subtitle, or summary"
msgstr "العنوان الثانوي أو الملخص"
# plume-front/src/editor.rs:154
msgid "Write your article here. Markdown is supported."
msgstr ""
# plume-front/src/editor.rs:165
msgid "Around {} characters left"
msgstr ""
# plume-front/src/editor.rs:228
msgid "Tags"
msgstr "الوسوم"
# plume-front/src/editor.rs:229
msgid "License"
msgstr "الرخصة"
# plume-front/src/editor.rs:232
msgid "Cover"
msgstr "الغلاف"
# plume-front/src/editor.rs:252
msgid "This is a draft"
msgstr ""
# plume-front/src/editor.rs:259
msgid "Publish"
msgstr "نشر كتابا"

57
po/plume-front/bg.po Normal file
View file

@ -0,0 +1,57 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 18:15\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Bulgarian\n"
"Language: bg_BG\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: bg\n"
"X-Crowdin-File: /master/po/plume-front/plume-front.pot\n"
# plume-front/src/editor.rs:114
msgid "Open the rich text editor"
msgstr ""
# plume-front/src/editor.rs:143
msgid "Title"
msgstr ""
# plume-front/src/editor.rs:149
msgid "Subtitle, or summary"
msgstr ""
# plume-front/src/editor.rs:154
msgid "Write your article here. Markdown is supported."
msgstr ""
# plume-front/src/editor.rs:165
msgid "Around {} characters left"
msgstr ""
# plume-front/src/editor.rs:228
msgid "Tags"
msgstr ""
# plume-front/src/editor.rs:229
msgid "License"
msgstr ""
# plume-front/src/editor.rs:232
msgid "Cover"
msgstr ""
# plume-front/src/editor.rs:252
msgid "This is a draft"
msgstr ""
# plume-front/src/editor.rs:259
msgid "Publish"
msgstr ""

57
po/plume-front/ca.po Normal file
View file

@ -0,0 +1,57 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 19:55\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Catalan\n"
"Language: ca_ES\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: ca\n"
"X-Crowdin-File: /master/po/plume-front/plume-front.pot\n"
# plume-front/src/editor.rs:114
msgid "Open the rich text editor"
msgstr ""
# plume-front/src/editor.rs:143
msgid "Title"
msgstr ""
# plume-front/src/editor.rs:149
msgid "Subtitle, or summary"
msgstr ""
# plume-front/src/editor.rs:154
msgid "Write your article here. Markdown is supported."
msgstr ""
# plume-front/src/editor.rs:165
msgid "Around {} characters left"
msgstr ""
# plume-front/src/editor.rs:228
msgid "Tags"
msgstr ""
# plume-front/src/editor.rs:229
msgid "License"
msgstr ""
# plume-front/src/editor.rs:232
msgid "Cover"
msgstr ""
# plume-front/src/editor.rs:252
msgid "This is a draft"
msgstr ""
# plume-front/src/editor.rs:259
msgid "Publish"
msgstr ""

58
po/plume-front/cs.po Normal file
View file

@ -0,0 +1,58 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 18:15\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Czech\n"
"Language: cs_CZ\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 3;\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: cs\n"
"X-Crowdin-File: /master/po/plume-front/plume-front.pot\n"
# plume-front/src/editor.rs:114
msgid "Open the rich text editor"
msgstr "Otevřít editor formátovaného textu"
# plume-front/src/editor.rs:143
msgid "Title"
msgstr "Nadpis"
# plume-front/src/editor.rs:147
#, fuzzy
msgid "Subtitle, or summary"
msgstr "Podnadpis, nebo shrnutí"
# plume-front/src/editor.rs:154
msgid "Write your article here. Markdown is supported."
msgstr "Napište sem svůj článek. Markdown je podporován."
# plume-front/src/editor.rs:165
msgid "Around {} characters left"
msgstr "Zbývá kolem {} znaků"
# plume-front/src/editor.rs:228
msgid "Tags"
msgstr "Tagy"
# plume-front/src/editor.rs:229
msgid "License"
msgstr "Licence"
# plume-front/src/editor.rs:232
msgid "Cover"
msgstr "Titulka"
# plume-front/src/editor.rs:252
msgid "This is a draft"
msgstr "Tohle je koncept"
# plume-front/src/editor.rs:259
msgid "Publish"
msgstr "Zveřejnit"

58
po/plume-front/cy.po Normal file
View file

@ -0,0 +1,58 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-06 15:05\n"
"Last-Translator: AnaGelez <ana@gelez.xyz>\n"
"Language-Team: Welsh\n"
"Language: cy_GB\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=6; plural=(n == 0) ? 0 : ((n == 1) ? 1 : ((n == 2) ? 2 : ((n == 3) ? 3 : ((n == 6) ? 4 : 5))));\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: cy\n"
"X-Crowdin-File: /master/po/plume-front/plume-front.pot\n"
# plume-front/src/editor.rs:114
msgid "Open the rich text editor"
msgstr ""
# plume-front/src/editor.rs:143
msgid "Title"
msgstr ""
# plume-front/src/editor.rs:147
msgid "Subtitle or summary"
msgstr ""
# plume-front/src/editor.rs:154
msgid "Write your article here. Markdown is supported."
msgstr ""
# plume-front/src/editor.rs:165
msgid "Around {} characters left"
msgstr ""
# plume-front/src/editor.rs:228
msgid "Tags"
msgstr ""
# plume-front/src/editor.rs:229
msgid "License"
msgstr ""
# plume-front/src/editor.rs:232
msgid "Cover"
msgstr ""
# plume-front/src/editor.rs:252
msgid "This is a draft"
msgstr ""
# plume-front/src/editor.rs:259
msgid "Publish"
msgstr ""

58
po/plume-front/da.po Normal file
View file

@ -0,0 +1,58 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 18:15\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Danish\n"
"Language: da_DK\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: da\n"
"X-Crowdin-File: /master/po/plume-front/plume-front.pot\n"
# plume-front/src/editor.rs:114
msgid "Open the rich text editor"
msgstr ""
# plume-front/src/editor.rs:143
msgid "Title"
msgstr ""
# plume-front/src/editor.rs:147
msgid "Subtitle or summary"
msgstr ""
# plume-front/src/editor.rs:154
msgid "Write your article here. Markdown is supported."
msgstr ""
# plume-front/src/editor.rs:165
msgid "Around {} characters left"
msgstr ""
# plume-front/src/editor.rs:228
msgid "Tags"
msgstr ""
# plume-front/src/editor.rs:229
msgid "License"
msgstr ""
# plume-front/src/editor.rs:232
msgid "Cover"
msgstr ""
# plume-front/src/editor.rs:252
msgid "This is a draft"
msgstr ""
# plume-front/src/editor.rs:259
msgid "Publish"
msgstr ""

58
po/plume-front/de.po Normal file
View file

@ -0,0 +1,58 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 18:14\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: German\n"
"Language: de_DE\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: de\n"
"X-Crowdin-File: /master/po/plume-front/plume-front.pot\n"
# plume-front/src/editor.rs:114
msgid "Open the rich text editor"
msgstr ""
# plume-front/src/editor.rs:143
msgid "Title"
msgstr "Titel"
# plume-front/src/editor.rs:147
#, fuzzy
msgid "Subtitle, or summary"
msgstr "Untertitel oder Übersicht"
# plume-front/src/editor.rs:154
msgid "Write your article here. Markdown is supported."
msgstr "Schreibe deinen Artikel hier. Markdown ist unterstützt."
# plume-front/src/editor.rs:165
msgid "Around {} characters left"
msgstr "Ungefähr {} Zeichen übrig"
# plume-front/src/editor.rs:228
msgid "Tags"
msgstr "Tags"
# plume-front/src/editor.rs:229
msgid "License"
msgstr "Lizenz"
# plume-front/src/editor.rs:232
msgid "Cover"
msgstr "Einband"
# plume-front/src/editor.rs:252
msgid "This is a draft"
msgstr "Dies ist ein Entwurf"
# plume-front/src/editor.rs:259
msgid "Publish"
msgstr "Veröffentlichen"

58
po/plume-front/el.po Normal file
View file

@ -0,0 +1,58 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 18:14\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Greek\n"
"Language: el_GR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: el\n"
"X-Crowdin-File: /master/po/plume-front/plume-front.pot\n"
# plume-front/src/editor.rs:114
msgid "Open the rich text editor"
msgstr ""
# plume-front/src/editor.rs:143
msgid "Title"
msgstr ""
# plume-front/src/editor.rs:147
msgid "Subtitle or summary"
msgstr ""
# plume-front/src/editor.rs:154
msgid "Write your article here. Markdown is supported."
msgstr ""
# plume-front/src/editor.rs:165
msgid "Around {} characters left"
msgstr ""
# plume-front/src/editor.rs:228
msgid "Tags"
msgstr ""
# plume-front/src/editor.rs:229
msgid "License"
msgstr ""
# plume-front/src/editor.rs:232
msgid "Cover"
msgstr ""
# plume-front/src/editor.rs:252
msgid "This is a draft"
msgstr ""
# plume-front/src/editor.rs:259
msgid "Publish"
msgstr ""

View file

@ -1,53 +1,57 @@
msgid ""
msgstr ""
"Project-Id-Version: plume-front\n"
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2018-06-15 16:33-0700\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: en\n"
"PO-Revision-Date: 2019-04-17 18:15\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: English\n"
"Language: en_US\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: en\n"
"X-Crowdin-File: /master/po/plume-front/plume-front.pot\n"
# plume-front/src/editor.rs:110
# plume-front/src/editor.rs:114
msgid "Open the rich text editor"
msgstr ""
# plume-front/src/editor.rs:57
# plume-front/src/editor.rs:143
msgid "Title"
msgstr "Title"
# plume-front/src/editor.rs:61
msgid "Subtitle or summary"
msgstr ""
# plume-front/src/editor.rs:68
# plume-front/src/editor.rs:149
msgid "Subtitle, or summary"
msgstr ""
# plume-front/src/editor.rs:154
msgid "Write your article here. Markdown is supported."
msgstr ""
# plume-front/src/editor.rs:46
# plume-front/src/editor.rs:165
msgid "Around {} characters left"
msgstr ""
# plume-front/src/editor.rs:96
# plume-front/src/editor.rs:228
msgid "Tags"
msgstr ""
# plume-front/src/editor.rs:97
# plume-front/src/editor.rs:229
msgid "License"
msgstr ""
# plume-front/src/editor.rs:100
# plume-front/src/editor.rs:232
msgid "Cover"
msgstr ""
# plume-front/src/editor.rs:167
# plume-front/src/editor.rs:252
msgid "This is a draft"
msgstr ""
# plume-front/src/editor.rs:111
# plume-front/src/editor.rs:259
msgid "Publish"
msgstr ""

58
po/plume-front/eo.po Normal file
View file

@ -0,0 +1,58 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 18:15\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Esperanto\n"
"Language: eo_UY\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: eo\n"
"X-Crowdin-File: /master/po/plume-front/plume-front.pot\n"
# plume-front/src/editor.rs:114
msgid "Open the rich text editor"
msgstr "Malfermi la riĉan redaktilon"
# plume-front/src/editor.rs:143
msgid "Title"
msgstr "Titolo"
# plume-front/src/editor.rs:147
#, fuzzy
msgid "Subtitle, or summary"
msgstr "Subtitolo aŭ resumo"
# plume-front/src/editor.rs:154
msgid "Write your article here. Markdown is supported."
msgstr "Verku vian artikolon ĉi tie. Markdown estas subtenita."
# plume-front/src/editor.rs:165
msgid "Around {} characters left"
msgstr "Proksimume {} signoj restantaj"
# plume-front/src/editor.rs:228
msgid "Tags"
msgstr "Etikedoj"
# plume-front/src/editor.rs:229
msgid "License"
msgstr "Permesilo"
# plume-front/src/editor.rs:232
msgid "Cover"
msgstr "Kovro"
# plume-front/src/editor.rs:252
msgid "This is a draft"
msgstr "Malfinias"
# plume-front/src/editor.rs:259
msgid "Publish"
msgstr "Eldoni"

58
po/plume-front/es.po Normal file
View file

@ -0,0 +1,58 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 18:15\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Spanish\n"
"Language: es_ES\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: es-ES\n"
"X-Crowdin-File: /master/po/plume-front/plume-front.pot\n"
# plume-front/src/editor.rs:114
msgid "Open the rich text editor"
msgstr "Abrir el editor de texto enriquecido"
# plume-front/src/editor.rs:143
msgid "Title"
msgstr "Título"
# plume-front/src/editor.rs:147
#, fuzzy
msgid "Subtitle, or summary"
msgstr "Subtítulo o resumen"
# plume-front/src/editor.rs:154
msgid "Write your article here. Markdown is supported."
msgstr "Escriba su artículo aquí. Puede utilizar Markdown."
# plume-front/src/editor.rs:165
msgid "Around {} characters left"
msgstr "Quedan unos {} caracteres"
# plume-front/src/editor.rs:228
msgid "Tags"
msgstr "Etiquetas"
# plume-front/src/editor.rs:229
msgid "License"
msgstr "Licencia"
# plume-front/src/editor.rs:232
msgid "Cover"
msgstr "Cobertura"
# plume-front/src/editor.rs:252
msgid "This is a draft"
msgstr "Esto es un borrador"
# plume-front/src/editor.rs:259
msgid "Publish"
msgstr "Publicar"

58
po/plume-front/fa.po Normal file
View file

@ -0,0 +1,58 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 19:55\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Persian\n"
"Language: fa_IR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: fa\n"
"X-Crowdin-File: /master/po/plume-front/plume-front.pot\n"
# plume-front/src/editor.rs:114
msgid "Open the rich text editor"
msgstr ""
# plume-front/src/editor.rs:143
msgid "Title"
msgstr ""
# plume-front/src/editor.rs:147
msgid "Subtitle or summary"
msgstr ""
# plume-front/src/editor.rs:154
msgid "Write your article here. Markdown is supported."
msgstr ""
# plume-front/src/editor.rs:165
msgid "Around {} characters left"
msgstr ""
# plume-front/src/editor.rs:228
msgid "Tags"
msgstr ""
# plume-front/src/editor.rs:229
msgid "License"
msgstr ""
# plume-front/src/editor.rs:232
msgid "Cover"
msgstr ""
# plume-front/src/editor.rs:252
msgid "This is a draft"
msgstr ""
# plume-front/src/editor.rs:259
msgid "Publish"
msgstr ""

58
po/plume-front/fi.po Normal file
View file

@ -0,0 +1,58 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 18:14\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Finnish\n"
"Language: fi_FI\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: fi\n"
"X-Crowdin-File: /master/po/plume-front/plume-front.pot\n"
# plume-front/src/editor.rs:114
msgid "Open the rich text editor"
msgstr ""
# plume-front/src/editor.rs:143
msgid "Title"
msgstr ""
# plume-front/src/editor.rs:147
msgid "Subtitle or summary"
msgstr ""
# plume-front/src/editor.rs:154
msgid "Write your article here. Markdown is supported."
msgstr ""
# plume-front/src/editor.rs:165
msgid "Around {} characters left"
msgstr ""
# plume-front/src/editor.rs:228
msgid "Tags"
msgstr ""
# plume-front/src/editor.rs:229
msgid "License"
msgstr ""
# plume-front/src/editor.rs:232
msgid "Cover"
msgstr ""
# plume-front/src/editor.rs:252
msgid "This is a draft"
msgstr ""
# plume-front/src/editor.rs:259
msgid "Publish"
msgstr ""

View file

@ -1,53 +1,58 @@
msgid ""
msgstr ""
"Project-Id-Version: plume-front\n"
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2018-06-15 16:33-0700\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: fr\n"
"PO-Revision-Date: 2019-04-17 18:14\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: French\n"
"Language: fr_FR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: fr\n"
"X-Crowdin-File: /master/po/plume-front/plume-front.pot\n"
# plume-front/src/editor.rs:110
# plume-front/src/editor.rs:114
msgid "Open the rich text editor"
msgstr ""
msgstr "Ouvrir l'éditeur de texte avancé"
# plume-front/src/editor.rs:57
# plume-front/src/editor.rs:143
msgid "Title"
msgstr "Titre"
# plume-front/src/editor.rs:61
msgid "Subtitle or summary"
# plume-front/src/editor.rs:147
#, fuzzy
msgid "Subtitle, or summary"
msgstr "Sous-titre ou résumé"
# plume-front/src/editor.rs:68
# plume-front/src/editor.rs:154
msgid "Write your article here. Markdown is supported."
msgstr "Écrivez votre article ici. Vous pouvez utiliser du Markdown."
# plume-front/src/editor.rs:46
# plume-front/src/editor.rs:165
msgid "Around {} characters left"
msgstr ""
msgstr "Environ {} caractères restant"
# plume-front/src/editor.rs:96
# plume-front/src/editor.rs:228
msgid "Tags"
msgstr ""
msgstr "Étiquettes"
# plume-front/src/editor.rs:97
# plume-front/src/editor.rs:229
msgid "License"
msgstr ""
msgstr "Licence"
# plume-front/src/editor.rs:100
# plume-front/src/editor.rs:232
msgid "Cover"
msgstr ""
msgstr "Illustration"
# plume-front/src/editor.rs:167
# plume-front/src/editor.rs:252
msgid "This is a draft"
msgstr ""
msgstr "Ceci est un brouillon"
# plume-front/src/editor.rs:111
# plume-front/src/editor.rs:259
msgid "Publish"
msgstr "Publier"

58
po/plume-front/gl.po Normal file
View file

@ -0,0 +1,58 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 18:14\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Galician\n"
"Language: gl_ES\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: gl\n"
"X-Crowdin-File: /master/po/plume-front/plume-front.pot\n"
# plume-front/src/editor.rs:114
msgid "Open the rich text editor"
msgstr "Abra o editor de texto enriquecido"
# plume-front/src/editor.rs:143
msgid "Title"
msgstr "Título"
# plume-front/src/editor.rs:147
#, fuzzy
msgid "Subtitle, or summary"
msgstr "Subtítulo ou resumo"
# plume-front/src/editor.rs:154
msgid "Write your article here. Markdown is supported."
msgstr "Escriba aquí o seu artigo: pode utilizar Markdown."
# plume-front/src/editor.rs:165
msgid "Around {} characters left"
msgstr "Dispón de {} caracteres restantes"
# plume-front/src/editor.rs:228
msgid "Tags"
msgstr "Etiquetas"
# plume-front/src/editor.rs:229
msgid "License"
msgstr "Licenza"
# plume-front/src/editor.rs:232
msgid "Cover"
msgstr "Portada"
# plume-front/src/editor.rs:252
msgid "This is a draft"
msgstr "Este é un borrador"
# plume-front/src/editor.rs:259
msgid "Publish"
msgstr "Publicar"

58
po/plume-front/he.po Normal file
View file

@ -0,0 +1,58 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 18:14\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Hebrew\n"
"Language: he_IL\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3;\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: he\n"
"X-Crowdin-File: /master/po/plume-front/plume-front.pot\n"
# plume-front/src/editor.rs:114
msgid "Open the rich text editor"
msgstr ""
# plume-front/src/editor.rs:143
msgid "Title"
msgstr ""
# plume-front/src/editor.rs:147
msgid "Subtitle or summary"
msgstr ""
# plume-front/src/editor.rs:154
msgid "Write your article here. Markdown is supported."
msgstr ""
# plume-front/src/editor.rs:165
msgid "Around {} characters left"
msgstr ""
# plume-front/src/editor.rs:228
msgid "Tags"
msgstr ""
# plume-front/src/editor.rs:229
msgid "License"
msgstr ""
# plume-front/src/editor.rs:232
msgid "Cover"
msgstr ""
# plume-front/src/editor.rs:252
msgid "This is a draft"
msgstr ""
# plume-front/src/editor.rs:259
msgid "Publish"
msgstr ""

58
po/plume-front/hi.po Normal file
View file

@ -0,0 +1,58 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 18:14\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Hindi\n"
"Language: hi_IN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: hi\n"
"X-Crowdin-File: /master/po/plume-front/plume-front.pot\n"
# plume-front/src/editor.rs:114
msgid "Open the rich text editor"
msgstr ""
# plume-front/src/editor.rs:143
msgid "Title"
msgstr "शीर्षक"
# plume-front/src/editor.rs:147
#, fuzzy
msgid "Subtitle, or summary"
msgstr "उपशीर्षक या सारांश"
# plume-front/src/editor.rs:154
msgid "Write your article here. Markdown is supported."
msgstr "अपना आर्टिकल या लेख यहाँ लिखें. Markdown उपलब्ध है."
# plume-front/src/editor.rs:165
msgid "Around {} characters left"
msgstr "लगभग {} अक्षर बाकी हैं"
# plume-front/src/editor.rs:228
msgid "Tags"
msgstr "टैग्स"
# plume-front/src/editor.rs:229
msgid "License"
msgstr "लाइसेंस"
# plume-front/src/editor.rs:232
msgid "Cover"
msgstr ""
# plume-front/src/editor.rs:252
msgid "This is a draft"
msgstr ""
# plume-front/src/editor.rs:259
msgid "Publish"
msgstr "पब्लिश करें"

59
po/plume-front/hr.po Normal file
View file

@ -0,0 +1,59 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 18:15\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Croatian\n"
"Language: hr_HR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: hr\n"
"X-Crowdin-File: /master/po/plume-front/plume-front.pot\n"
# plume-front/src/editor.rs:114
msgid "Open the rich text editor"
msgstr ""
# plume-front/src/editor.rs:143
msgid "Title"
msgstr "Naslov"
# plume-front/src/editor.rs:147
#, fuzzy
msgid "Subtitle, or summary"
msgstr "Podnaslov ili sažetak"
# plume-front/src/editor.rs:154
msgid "Write your article here. Markdown is supported."
msgstr ""
# plume-front/src/editor.rs:165
msgid "Around {} characters left"
msgstr ""
# plume-front/src/editor.rs:228
msgid "Tags"
msgstr "Tagovi"
# plume-front/src/editor.rs:229
msgid "License"
msgstr "Licenca"
# plume-front/src/editor.rs:232
msgid "Cover"
msgstr ""
# plume-front/src/editor.rs:252
msgid "This is a draft"
msgstr ""
# plume-front/src/editor.rs:259
msgid "Publish"
msgstr "Objavi"

58
po/plume-front/hu.po Normal file
View file

@ -0,0 +1,58 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 18:15\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Hungarian\n"
"Language: hu_HU\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: hu\n"
"X-Crowdin-File: /master/po/plume-front/plume-front.pot\n"
# plume-front/src/editor.rs:114
msgid "Open the rich text editor"
msgstr ""
# plume-front/src/editor.rs:143
msgid "Title"
msgstr ""
# plume-front/src/editor.rs:147
msgid "Subtitle or summary"
msgstr ""
# plume-front/src/editor.rs:154
msgid "Write your article here. Markdown is supported."
msgstr ""
# plume-front/src/editor.rs:165
msgid "Around {} characters left"
msgstr ""
# plume-front/src/editor.rs:228
msgid "Tags"
msgstr ""
# plume-front/src/editor.rs:229
msgid "License"
msgstr ""
# plume-front/src/editor.rs:232
msgid "Cover"
msgstr ""
# plume-front/src/editor.rs:252
msgid "This is a draft"
msgstr ""
# plume-front/src/editor.rs:259
msgid "Publish"
msgstr ""

58
po/plume-front/it.po Normal file
View file

@ -0,0 +1,58 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 18:15\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Italian\n"
"Language: it_IT\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: it\n"
"X-Crowdin-File: /master/po/plume-front/plume-front.pot\n"
# plume-front/src/editor.rs:114
msgid "Open the rich text editor"
msgstr "Apri il compositore di testo avanzato"
# plume-front/src/editor.rs:143
msgid "Title"
msgstr "Titolo"
# plume-front/src/editor.rs:147
#, fuzzy
msgid "Subtitle, or summary"
msgstr "Sottotitolo o sommario"
# plume-front/src/editor.rs:154
msgid "Write your article here. Markdown is supported."
msgstr "Scrivi qui il tuo articolo. È supportato il Markdown."
# plume-front/src/editor.rs:165
msgid "Around {} characters left"
msgstr "Circa {} caratteri rimasti"
# plume-front/src/editor.rs:228
msgid "Tags"
msgstr "Etichette"
# plume-front/src/editor.rs:229
msgid "License"
msgstr "Licenza"
# plume-front/src/editor.rs:232
msgid "Cover"
msgstr "Copertina"
# plume-front/src/editor.rs:252
msgid "This is a draft"
msgstr "Questa è una bozza"
# plume-front/src/editor.rs:259
msgid "Publish"
msgstr "Pubblica"

58
po/plume-front/ja.po Normal file
View file

@ -0,0 +1,58 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 18:15\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Japanese\n"
"Language: ja_JP\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: ja\n"
"X-Crowdin-File: /master/po/plume-front/plume-front.pot\n"
# plume-front/src/editor.rs:114
msgid "Open the rich text editor"
msgstr "リッチテキストエディターを開く"
# plume-front/src/editor.rs:143
msgid "Title"
msgstr "タイトル"
# plume-front/src/editor.rs:147
#, fuzzy
msgid "Subtitle, or summary"
msgstr "サブタイトルまたは概要"
# plume-front/src/editor.rs:154
msgid "Write your article here. Markdown is supported."
msgstr "投稿をここに書きます。Markdown がサポートされています。"
# plume-front/src/editor.rs:165
msgid "Around {} characters left"
msgstr "残り約 {} 文字"
# plume-front/src/editor.rs:228
msgid "Tags"
msgstr "タグ"
# plume-front/src/editor.rs:229
msgid "License"
msgstr "ライセンス"
# plume-front/src/editor.rs:232
msgid "Cover"
msgstr "カバー"
# plume-front/src/editor.rs:252
msgid "This is a draft"
msgstr "これは下書きです"
# plume-front/src/editor.rs:259
msgid "Publish"
msgstr "公開"

58
po/plume-front/ko.po Normal file
View file

@ -0,0 +1,58 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 18:15\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Korean\n"
"Language: ko_KR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: ko\n"
"X-Crowdin-File: /master/po/plume-front/plume-front.pot\n"
# plume-front/src/editor.rs:114
msgid "Open the rich text editor"
msgstr ""
# plume-front/src/editor.rs:143
msgid "Title"
msgstr ""
# plume-front/src/editor.rs:147
msgid "Subtitle or summary"
msgstr ""
# plume-front/src/editor.rs:154
msgid "Write your article here. Markdown is supported."
msgstr ""
# plume-front/src/editor.rs:165
msgid "Around {} characters left"
msgstr ""
# plume-front/src/editor.rs:228
msgid "Tags"
msgstr ""
# plume-front/src/editor.rs:229
msgid "License"
msgstr ""
# plume-front/src/editor.rs:232
msgid "Cover"
msgstr ""
# plume-front/src/editor.rs:252
msgid "This is a draft"
msgstr ""
# plume-front/src/editor.rs:259
msgid "Publish"
msgstr ""

53
po/plume-front/nb.po Normal file
View file

@ -0,0 +1,53 @@
msgid ""
msgstr ""
"Project-Id-Version: plume-front\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2018-06-15 16:33-0700\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: nb\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
# plume-front/src/editor.rs:115
msgid "Open the rich text editor"
msgstr ""
# plume-front/src/editor.rs:145
msgid "Title"
msgstr ""
# plume-front/src/editor.rs:149
msgid "Subtitle, or summary"
msgstr ""
# plume-front/src/editor.rs:156
msgid "Write your article here. Markdown is supported."
msgstr ""
# plume-front/src/editor.rs:167
msgid "Around {} characters left"
msgstr ""
# plume-front/src/editor.rs:243
msgid "Tags"
msgstr ""
# plume-front/src/editor.rs:244
msgid "License"
msgstr ""
# plume-front/src/editor.rs:247
msgid "Cover"
msgstr ""
# plume-front/src/editor.rs:267
msgid "This is a draft"
msgstr ""
# plume-front/src/editor.rs:274
msgid "Publish"
msgstr ""

58
po/plume-front/nl.po Normal file
View file

@ -0,0 +1,58 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 18:15\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Dutch\n"
"Language: nl_NL\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: nl\n"
"X-Crowdin-File: /master/po/plume-front/plume-front.pot\n"
# plume-front/src/editor.rs:114
msgid "Open the rich text editor"
msgstr ""
# plume-front/src/editor.rs:143
msgid "Title"
msgstr ""
# plume-front/src/editor.rs:147
msgid "Subtitle or summary"
msgstr ""
# plume-front/src/editor.rs:154
msgid "Write your article here. Markdown is supported."
msgstr ""
# plume-front/src/editor.rs:165
msgid "Around {} characters left"
msgstr ""
# plume-front/src/editor.rs:228
msgid "Tags"
msgstr ""
# plume-front/src/editor.rs:229
msgid "License"
msgstr ""
# plume-front/src/editor.rs:232
msgid "Cover"
msgstr ""
# plume-front/src/editor.rs:252
msgid "This is a draft"
msgstr ""
# plume-front/src/editor.rs:259
msgid "Publish"
msgstr ""

58
po/plume-front/no.po Normal file
View file

@ -0,0 +1,58 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 19:55\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Norwegian\n"
"Language: no_NO\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: no\n"
"X-Crowdin-File: /master/po/plume-front/plume-front.pot\n"
# plume-front/src/editor.rs:114
msgid "Open the rich text editor"
msgstr ""
# plume-front/src/editor.rs:143
msgid "Title"
msgstr ""
# plume-front/src/editor.rs:147
msgid "Subtitle or summary"
msgstr ""
# plume-front/src/editor.rs:154
msgid "Write your article here. Markdown is supported."
msgstr ""
# plume-front/src/editor.rs:165
msgid "Around {} characters left"
msgstr ""
# plume-front/src/editor.rs:228
msgid "Tags"
msgstr ""
# plume-front/src/editor.rs:229
msgid "License"
msgstr ""
# plume-front/src/editor.rs:232
msgid "Cover"
msgstr ""
# plume-front/src/editor.rs:252
msgid "This is a draft"
msgstr ""
# plume-front/src/editor.rs:259
msgid "Publish"
msgstr ""

59
po/plume-front/pl.po Normal file
View file

@ -0,0 +1,59 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 19:55\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Polish\n"
"Language: pl_PL\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n"
"%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n"
"%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: pl\n"
"X-Crowdin-File: /master/po/plume-front/plume-front.pot\n"
# plume-front/src/editor.rs:114
msgid "Open the rich text editor"
msgstr "Otwórz edytor tekstu sformatowanego"
# plume-front/src/editor.rs:143
msgid "Title"
msgstr "Tytuł"
# plume-front/src/editor.rs:149
msgid "Subtitle, or summary"
msgstr ""
# plume-front/src/editor.rs:154
msgid "Write your article here. Markdown is supported."
msgstr "Napisz swój artykuł tutaj. Markdown jest obsługiwany."
# plume-front/src/editor.rs:165
msgid "Around {} characters left"
msgstr "Pozostało w okolicy {} znaków"
# plume-front/src/editor.rs:228
msgid "Tags"
msgstr "Tagi"
# plume-front/src/editor.rs:229
msgid "License"
msgstr "Licencja"
# plume-front/src/editor.rs:232
msgid "Cover"
msgstr "Okładka"
# plume-front/src/editor.rs:252
msgid "This is a draft"
msgstr "To jest szkic"
# plume-front/src/editor.rs:259
msgid "Publish"
msgstr "Opublikuj"

View file

@ -12,42 +12,42 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
# plume-front/src/editor.rs:114
# plume-front/src/editor.rs:115
msgid "Open the rich text editor"
msgstr ""
# plume-front/src/editor.rs:143
# plume-front/src/editor.rs:145
msgid "Title"
msgstr ""
# plume-front/src/editor.rs:147
msgid "Subtitle or summary"
# plume-front/src/editor.rs:149
msgid "Subtitle, or summary"
msgstr ""
# plume-front/src/editor.rs:154
# plume-front/src/editor.rs:156
msgid "Write your article here. Markdown is supported."
msgstr ""
# plume-front/src/editor.rs:165
# plume-front/src/editor.rs:167
msgid "Around {} characters left"
msgstr ""
# plume-front/src/editor.rs:228
# plume-front/src/editor.rs:243
msgid "Tags"
msgstr ""
# plume-front/src/editor.rs:229
# plume-front/src/editor.rs:244
msgid "License"
msgstr ""
# plume-front/src/editor.rs:232
# plume-front/src/editor.rs:247
msgid "Cover"
msgstr ""
# plume-front/src/editor.rs:252
# plume-front/src/editor.rs:267
msgid "This is a draft"
msgstr ""
# plume-front/src/editor.rs:259
# plume-front/src/editor.rs:274
msgid "Publish"
msgstr ""

58
po/plume-front/pt.po Normal file
View file

@ -0,0 +1,58 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-18 07:05\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Portuguese\n"
"Language: pt_PT\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: pt-PT\n"
"X-Crowdin-File: /master/po/plume-front/plume-front.pot\n"
# plume-front/src/editor.rs:114
msgid "Open the rich text editor"
msgstr ""
# plume-front/src/editor.rs:143
msgid "Title"
msgstr "Título"
# plume-front/src/editor.rs:147
#, fuzzy
msgid "Subtitle, or summary"
msgstr "Legenda ou resumo"
# plume-front/src/editor.rs:154
msgid "Write your article here. Markdown is supported."
msgstr "Escreva seu artigo aqui. Markdown pode ser usado."
# plume-front/src/editor.rs:165
msgid "Around {} characters left"
msgstr "Cerca de {} caracteres restantes"
# plume-front/src/editor.rs:228
msgid "Tags"
msgstr "Tags"
# plume-front/src/editor.rs:229
msgid "License"
msgstr "Licença"
# plume-front/src/editor.rs:232
msgid "Cover"
msgstr "Capa"
# plume-front/src/editor.rs:252
msgid "This is a draft"
msgstr "Isso é um rascunho"
# plume-front/src/editor.rs:259
msgid "Publish"
msgstr "Publicar"

59
po/plume-front/ro.po Normal file
View file

@ -0,0 +1,59 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 19:55\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Romanian\n"
"Language: ro_RO\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100>0 && n"
"%100<20)) ? 1 : 2);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: ro\n"
"X-Crowdin-File: /master/po/plume-front/plume-front.pot\n"
# plume-front/src/editor.rs:114
msgid "Open the rich text editor"
msgstr "Deschide editorul de text"
# plume-front/src/editor.rs:143
msgid "Title"
msgstr "Titlu"
# plume-front/src/editor.rs:147
#, fuzzy
msgid "Subtitle, or summary"
msgstr "Subtitlu sau rezumat"
# plume-front/src/editor.rs:154
msgid "Write your article here. Markdown is supported."
msgstr "Scrie articolul tău aici. Markdown este acceptat."
# plume-front/src/editor.rs:165
msgid "Around {} characters left"
msgstr "În apropiere de {} caractere rămase"
# plume-front/src/editor.rs:228
msgid "Tags"
msgstr "Etichete"
# plume-front/src/editor.rs:229
msgid "License"
msgstr "Licenţă"
# plume-front/src/editor.rs:232
msgid "Cover"
msgstr "Coperta"
# plume-front/src/editor.rs:252
msgid "This is a draft"
msgstr "Aceasta este o ciornă"
# plume-front/src/editor.rs:259
msgid "Publish"
msgstr "Publică"

59
po/plume-front/ru.po Normal file
View file

@ -0,0 +1,59 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 19:55\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Russian\n"
"Language: ru_RU\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 "
"&& n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 "
"&& n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: ru\n"
"X-Crowdin-File: /master/po/plume-front/plume-front.pot\n"
# plume-front/src/editor.rs:114
msgid "Open the rich text editor"
msgstr ""
# plume-front/src/editor.rs:143
msgid "Title"
msgstr ""
# plume-front/src/editor.rs:149
msgid "Subtitle, or summary"
msgstr ""
# plume-front/src/editor.rs:154
msgid "Write your article here. Markdown is supported."
msgstr ""
# plume-front/src/editor.rs:165
msgid "Around {} characters left"
msgstr ""
# plume-front/src/editor.rs:228
msgid "Tags"
msgstr ""
# plume-front/src/editor.rs:229
msgid "License"
msgstr ""
# plume-front/src/editor.rs:232
msgid "Cover"
msgstr ""
# plume-front/src/editor.rs:252
msgid "This is a draft"
msgstr ""
# plume-front/src/editor.rs:259
msgid "Publish"
msgstr ""

58
po/plume-front/sk.po Normal file
View file

@ -0,0 +1,58 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 18:15\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Slovak\n"
"Language: sk_SK\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 3;\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: sk\n"
"X-Crowdin-File: /master/po/plume-front/plume-front.pot\n"
# plume-front/src/editor.rs:114
msgid "Open the rich text editor"
msgstr "Otvor editor formátovaného textu"
# plume-front/src/editor.rs:143
msgid "Title"
msgstr "Nadpis"
# plume-front/src/editor.rs:147
#, fuzzy
msgid "Subtitle, or summary"
msgstr "Zhrnutie, alebo podnadpis"
# plume-front/src/editor.rs:154
msgid "Write your article here. Markdown is supported."
msgstr "Tu napíš svoj článok. Markdown je podporovaný."
# plume-front/src/editor.rs:165
msgid "Around {} characters left"
msgstr "Zostáva asi {} znakov"
# plume-front/src/editor.rs:228
msgid "Tags"
msgstr "Štítky"
# plume-front/src/editor.rs:229
msgid "License"
msgstr "Licencia"
# plume-front/src/editor.rs:232
msgid "Cover"
msgstr "Obálka"
# plume-front/src/editor.rs:252
msgid "This is a draft"
msgstr "Toto je koncept"
# plume-front/src/editor.rs:259
msgid "Publish"
msgstr "Zverejniť"

58
po/plume-front/sl.po Normal file
View file

@ -0,0 +1,58 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 19:55\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Slovenian\n"
"Language: sl_SI\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: sl\n"
"X-Crowdin-File: /master/po/plume-front/plume-front.pot\n"
# plume-front/src/editor.rs:114
msgid "Open the rich text editor"
msgstr ""
# plume-front/src/editor.rs:143
msgid "Title"
msgstr "Naslov"
# plume-front/src/editor.rs:147
msgid "Subtitle or summary"
msgstr ""
# plume-front/src/editor.rs:154
msgid "Write your article here. Markdown is supported."
msgstr ""
# plume-front/src/editor.rs:165
msgid "Around {} characters left"
msgstr ""
# plume-front/src/editor.rs:228
msgid "Tags"
msgstr "Oznake"
# plume-front/src/editor.rs:229
msgid "License"
msgstr "Licenca"
# plume-front/src/editor.rs:232
msgid "Cover"
msgstr ""
# plume-front/src/editor.rs:252
msgid "This is a draft"
msgstr "To je osnutek"
# plume-front/src/editor.rs:259
msgid "Publish"
msgstr "Objavi"

58
po/plume-front/sr.po Normal file
View file

@ -0,0 +1,58 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 20:49\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Serbian (Latin)\n"
"Language: sr_CS\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: sr-CS\n"
"X-Crowdin-File: /master/po/plume-front/plume-front.pot\n"
# plume-front/src/editor.rs:114
msgid "Open the rich text editor"
msgstr ""
# plume-front/src/editor.rs:143
msgid "Title"
msgstr "Naslov"
# plume-front/src/editor.rs:149
msgid "Subtitle, or summary"
msgstr ""
# plume-front/src/editor.rs:154
msgid "Write your article here. Markdown is supported."
msgstr ""
# plume-front/src/editor.rs:165
msgid "Around {} characters left"
msgstr ""
# plume-front/src/editor.rs:228
msgid "Tags"
msgstr ""
# plume-front/src/editor.rs:229
msgid "License"
msgstr ""
# plume-front/src/editor.rs:232
msgid "Cover"
msgstr ""
# plume-front/src/editor.rs:252
msgid "This is a draft"
msgstr ""
# plume-front/src/editor.rs:259
msgid "Publish"
msgstr ""

58
po/plume-front/sv.po Normal file
View file

@ -0,0 +1,58 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 18:15\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Swedish\n"
"Language: sv_SE\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: sv-SE\n"
"X-Crowdin-File: /master/po/plume-front/plume-front.pot\n"
# plume-front/src/editor.rs:114
msgid "Open the rich text editor"
msgstr ""
# plume-front/src/editor.rs:143
msgid "Title"
msgstr "Titel"
# plume-front/src/editor.rs:147
#, fuzzy
msgid "Subtitle, or summary"
msgstr "Undertitel eller sammanfattning"
# plume-front/src/editor.rs:154
msgid "Write your article here. Markdown is supported."
msgstr "Skriv din artikel här. Markdown stöds."
# plume-front/src/editor.rs:165
msgid "Around {} characters left"
msgstr "Ungefär {} karaktärer kvar"
# plume-front/src/editor.rs:228
msgid "Tags"
msgstr "Taggar"
# plume-front/src/editor.rs:229
msgid "License"
msgstr "Licens"
# plume-front/src/editor.rs:232
msgid "Cover"
msgstr "Omslag"
# plume-front/src/editor.rs:252
msgid "This is a draft"
msgstr ""
# plume-front/src/editor.rs:259
msgid "Publish"
msgstr "Publicera"

58
po/plume-front/tr.po Normal file
View file

@ -0,0 +1,58 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 18:15\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Turkish\n"
"Language: tr_TR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: tr\n"
"X-Crowdin-File: /master/po/plume-front/plume-front.pot\n"
# plume-front/src/editor.rs:114
msgid "Open the rich text editor"
msgstr ""
# plume-front/src/editor.rs:143
msgid "Title"
msgstr ""
# plume-front/src/editor.rs:147
msgid "Subtitle or summary"
msgstr ""
# plume-front/src/editor.rs:154
msgid "Write your article here. Markdown is supported."
msgstr ""
# plume-front/src/editor.rs:165
msgid "Around {} characters left"
msgstr ""
# plume-front/src/editor.rs:228
msgid "Tags"
msgstr ""
# plume-front/src/editor.rs:229
msgid "License"
msgstr ""
# plume-front/src/editor.rs:232
msgid "Cover"
msgstr ""
# plume-front/src/editor.rs:252
msgid "This is a draft"
msgstr ""
# plume-front/src/editor.rs:259
msgid "Publish"
msgstr ""

58
po/plume-front/uk.po Normal file
View file

@ -0,0 +1,58 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 18:15\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Ukrainian\n"
"Language: uk_UA\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=((n%10==1 && n%100!=11) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 11 && n%100 <= 14)) ? 2 : 3));\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: uk\n"
"X-Crowdin-File: /master/po/plume-front/plume-front.pot\n"
# plume-front/src/editor.rs:114
msgid "Open the rich text editor"
msgstr ""
# plume-front/src/editor.rs:143
msgid "Title"
msgstr ""
# plume-front/src/editor.rs:147
msgid "Subtitle or summary"
msgstr ""
# plume-front/src/editor.rs:154
msgid "Write your article here. Markdown is supported."
msgstr ""
# plume-front/src/editor.rs:165
msgid "Around {} characters left"
msgstr ""
# plume-front/src/editor.rs:228
msgid "Tags"
msgstr ""
# plume-front/src/editor.rs:229
msgid "License"
msgstr ""
# plume-front/src/editor.rs:232
msgid "Cover"
msgstr ""
# plume-front/src/editor.rs:252
msgid "This is a draft"
msgstr ""
# plume-front/src/editor.rs:259
msgid "Publish"
msgstr ""

58
po/plume-front/vi.po Normal file
View file

@ -0,0 +1,58 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 18:15\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Vietnamese\n"
"Language: vi_VN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: vi\n"
"X-Crowdin-File: /master/po/plume-front/plume-front.pot\n"
# plume-front/src/editor.rs:114
msgid "Open the rich text editor"
msgstr ""
# plume-front/src/editor.rs:143
msgid "Title"
msgstr ""
# plume-front/src/editor.rs:147
msgid "Subtitle or summary"
msgstr ""
# plume-front/src/editor.rs:154
msgid "Write your article here. Markdown is supported."
msgstr ""
# plume-front/src/editor.rs:165
msgid "Around {} characters left"
msgstr ""
# plume-front/src/editor.rs:228
msgid "Tags"
msgstr ""
# plume-front/src/editor.rs:229
msgid "License"
msgstr ""
# plume-front/src/editor.rs:232
msgid "Cover"
msgstr ""
# plume-front/src/editor.rs:252
msgid "This is a draft"
msgstr ""
# plume-front/src/editor.rs:259
msgid "Publish"
msgstr ""

58
po/plume-front/zh.po Normal file
View file

@ -0,0 +1,58 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 18:15\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Chinese Simplified\n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: zh-CN\n"
"X-Crowdin-File: /master/po/plume-front/plume-front.pot\n"
# plume-front/src/editor.rs:114
msgid "Open the rich text editor"
msgstr ""
# plume-front/src/editor.rs:143
msgid "Title"
msgstr ""
# plume-front/src/editor.rs:147
msgid "Subtitle or summary"
msgstr ""
# plume-front/src/editor.rs:154
msgid "Write your article here. Markdown is supported."
msgstr ""
# plume-front/src/editor.rs:165
msgid "Around {} characters left"
msgstr ""
# plume-front/src/editor.rs:228
msgid "Tags"
msgstr ""
# plume-front/src/editor.rs:229
msgid "License"
msgstr ""
# plume-front/src/editor.rs:232
msgid "Cover"
msgstr ""
# plume-front/src/editor.rs:252
msgid "This is a draft"
msgstr ""
# plume-front/src/editor.rs:259
msgid "Publish"
msgstr ""

807
po/plume/af.po Normal file
View file

@ -0,0 +1,807 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 20:48\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Afrikaans\n"
"Language: af_ZA\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: af\n"
"X-Crowdin-File: /master/po/plume/plume.pot\n"
# src/template_utils.rs:68
msgid "{0} commented on your article."
msgstr ""
# src/template_utils.rs:69
msgid "{0} is subscribed to you."
msgstr ""
# src/template_utils.rs:70
msgid "{0} liked your article."
msgstr ""
# src/template_utils.rs:71
msgid "{0} mentioned you."
msgstr ""
# src/template_utils.rs:72
msgid "{0} boosted your article."
msgstr ""
# src/template_utils.rs:108
msgid "{0}'s avatar"
msgstr ""
# src/routes/blogs.rs:70
msgid "To create a new blog, you need to be logged in"
msgstr ""
# src/routes/blogs.rs:109
msgid "A blog with the same name already exists."
msgstr ""
# src/routes/blogs.rs:172
msgid "You are not allowed to delete this blog."
msgstr ""
# src/routes/blogs.rs:217
msgid "You are not allowed to edit this blog."
msgstr ""
# src/routes/blogs.rs:262
msgid "You can't use this media as a blog icon."
msgstr ""
# src/routes/blogs.rs:280
msgid "You can't use this media as a blog banner."
msgstr ""
# src/routes/likes.rs:51
msgid "To like a post, you need to be logged in"
msgstr ""
# src/routes/notifications.rs:29
msgid "To see your notifications, you need to be logged in"
msgstr ""
# src/routes/posts.rs:93
msgid "This post isn't published yet."
msgstr ""
# src/routes/posts.rs:122
msgid "To write a new post, you need to be logged in"
msgstr ""
# src/routes/posts.rs:140
msgid "You are not an author of this blog."
msgstr ""
# src/routes/posts.rs:147
msgid "New post"
msgstr ""
# src/routes/posts.rs:192
msgid "Edit {0}"
msgstr ""
# src/routes/posts.rs:630
msgid "Couldn't obtain enough information about your account. Please make sure your username is correct."
msgstr ""
# src/routes/reshares.rs:51
msgid "To reshare a post, you need to be logged in"
msgstr ""
# src/routes/session.rs:181
msgid "Password reset"
msgstr ""
# src/routes/session.rs:182
msgid "Here is the link to reset your password: {0}"
msgstr ""
# src/routes/session.rs:259
msgid "Your password was successfully reset."
msgstr ""
# src/routes/session.rs:263
msgid "Sorry, but the link expired. Try again"
msgstr ""
# src/routes/user.rs:136
msgid "To access your dashboard, you need to be logged in"
msgstr ""
# src/routes/user.rs:244
msgid "To subscribe to someone, you need to be logged in"
msgstr ""
# src/routes/user.rs:344
msgid "To edit your profile, you need to be logged in"
msgstr ""
msgid "Reset your password"
msgstr ""
# src/template_utils.rs:217
msgid "E-mail"
msgstr ""
# src/template_utils.rs:220
msgid "Optional"
msgstr ""
msgid "Send password reset link"
msgstr ""
msgid "Check your inbox!"
msgstr ""
msgid "We sent a mail to the address you gave us, with a link to reset your password."
msgstr ""
msgid "Log in"
msgstr ""
# src/template_utils.rs:217
msgid "Username, or email"
msgstr ""
# src/template_utils.rs:217
msgid "Password"
msgstr ""
# src/template_utils.rs:217
msgid "New password"
msgstr ""
# src/template_utils.rs:217
msgid "Confirmation"
msgstr ""
msgid "Update password"
msgstr ""
msgid "Administration of {0}"
msgstr ""
msgid "Instances"
msgstr ""
msgid "Configuration"
msgstr ""
msgid "Users"
msgstr ""
msgid "Unblock"
msgstr ""
msgid "Block"
msgstr ""
msgid "About {0}"
msgstr ""
msgid "Home to <em>{0}</em> people"
msgstr ""
msgid "Who wrote <em>{0}</em> articles"
msgstr ""
msgid "And are connected to <em>{0}</em> other instances"
msgstr ""
msgid "Administred by"
msgstr ""
msgid "Runs Plume {0}"
msgstr ""
msgid "All the articles of the Fediverse"
msgstr ""
msgid "Latest articles"
msgstr ""
msgid "Your feed"
msgstr ""
msgid "Federated feed"
msgstr ""
msgid "Local feed"
msgstr ""
msgid "Welcome to {}"
msgstr ""
msgid "Articles from {}"
msgstr ""
msgid "Ban"
msgstr ""
msgid "Nothing to see here yet. Try subscribing to more people."
msgstr ""
msgid "Administration"
msgstr ""
# src/template_utils.rs:217
msgid "Name"
msgstr ""
msgid "Allow anyone to register here"
msgstr ""
msgid "Short description"
msgstr ""
msgid "Markdown syntax is supported"
msgstr ""
msgid "Long description"
msgstr ""
# src/template_utils.rs:217
msgid "Default article license"
msgstr ""
msgid "Save these settings"
msgstr ""
msgid "Search"
msgstr ""
msgid "Your query"
msgstr ""
msgid "Advanced search"
msgstr ""
# src/template_utils.rs:305
msgid "Article title matching these words"
msgstr ""
msgid "Title"
msgstr ""
# src/template_utils.rs:305
msgid "Subtitle matching these words"
msgstr ""
msgid "Subtitle - byline"
msgstr ""
# src/template_utils.rs:305
msgid "Content matching these words"
msgstr ""
msgid "Body content"
msgstr ""
# src/template_utils.rs:305
msgid "From this date"
msgstr ""
# src/template_utils.rs:305
msgid "To this date"
msgstr ""
# src/template_utils.rs:305
msgid "Containing these tags"
msgstr ""
msgid "Tags"
msgstr ""
# src/template_utils.rs:305
msgid "Posted on one of these instances"
msgstr ""
msgid "Instance domain"
msgstr ""
# src/template_utils.rs:305
msgid "Posted by one of these authors"
msgstr ""
msgid "Authors"
msgstr ""
# src/template_utils.rs:305
msgid "Posted on one of these blogs"
msgstr ""
msgid "Blog title"
msgstr ""
# src/template_utils.rs:305
msgid "Written in this language"
msgstr ""
msgid "Language"
msgstr ""
# src/template_utils.rs:305
msgid "Published under this license"
msgstr ""
msgid "Article license"
msgstr ""
msgid "Search result for \"{0}\""
msgstr ""
msgid "Search result"
msgstr ""
msgid "No result for your query"
msgstr ""
msgid "No more results for your query"
msgstr ""
msgid "Edit \"{}\""
msgstr ""
msgid "Description"
msgstr ""
msgid "You can upload images to your gallery, to use them as blog icons, or banners."
msgstr ""
msgid "Upload images"
msgstr ""
msgid "Blog icon"
msgstr ""
msgid "Blog banner"
msgstr ""
msgid "Update blog"
msgstr ""
msgid "Danger zone"
msgstr ""
msgid "Be very careful, any action taken here can't be reversed."
msgstr ""
msgid "Permanently delete this blog"
msgstr ""
msgid "{}'s icon"
msgstr ""
msgid "New article"
msgstr ""
msgid "Edit"
msgstr ""
msgid "There's one author on this blog: "
msgid_plural "There are {0} authors on this blog: "
msgstr[0] ""
msgstr[1] ""
msgid "No posts to see here yet."
msgstr ""
msgid "New Blog"
msgstr ""
msgid "Create a blog"
msgstr ""
msgid "Create blog"
msgstr ""
msgid "Articles tagged \"{0}\""
msgstr ""
msgid "There are currently no articles with such a tag"
msgstr ""
msgid "Written by {0}"
msgstr ""
msgid "Are you sure?"
msgstr ""
msgid "Delete this article"
msgstr ""
msgid "Draft"
msgstr ""
msgid "All rights reserved."
msgstr ""
msgid "This article is under the {0} license."
msgstr ""
msgid "Unsubscribe"
msgstr ""
msgid "Subscribe"
msgstr ""
msgid "One like"
msgid_plural "{0} likes"
msgstr[0] ""
msgstr[1] ""
msgid "I don't like this anymore"
msgstr ""
msgid "Add yours"
msgstr ""
msgid "One boost"
msgid_plural "{0} boosts"
msgstr[0] ""
msgstr[1] ""
msgid "I don't want to boost this anymore"
msgstr ""
msgid "Boost"
msgstr ""
msgid "{0}Log in{1}, or {2}use your Fediverse account{3} to interact with this article"
msgstr ""
msgid "Comments"
msgstr ""
# src/template_utils.rs:217
msgid "Content warning"
msgstr ""
msgid "Your comment"
msgstr ""
msgid "Submit comment"
msgstr ""
msgid "No comments yet. Be the first to react!"
msgstr ""
msgid "Interact with {}"
msgstr ""
msgid "Log in to interact"
msgstr ""
msgid "Enter your full username to interact"
msgstr ""
msgid "Publish"
msgstr ""
msgid "Classic editor (any changes will be lost)"
msgstr ""
# src/template_utils.rs:217
msgid "Subtitle"
msgstr ""
msgid "Content"
msgstr ""
msgid "You can upload media to your gallery, and then copy their Markdown code into your articles to insert them."
msgstr ""
msgid "Upload media"
msgstr ""
# src/template_utils.rs:217
msgid "Tags, separated by commas"
msgstr ""
# src/template_utils.rs:217
msgid "License"
msgstr ""
# src/template_utils.rs:225
msgid "Leave it empty to reserve all rights"
msgstr ""
msgid "Illustration"
msgstr ""
msgid "This is a draft, don't publish it yet."
msgstr ""
msgid "Update"
msgstr ""
msgid "Update, or publish"
msgstr ""
msgid "Publish your post"
msgstr ""
msgid "I'm from this instance"
msgstr ""
msgid "I'm from another instance"
msgstr ""
# src/template_utils.rs:217
msgid "Username"
msgstr ""
# src/template_utils.rs:225
msgid "Example: user@plu.me"
msgstr ""
msgid "Continue to your instance"
msgstr ""
msgid "View all"
msgstr ""
msgid "By {0}"
msgstr ""
msgid "What is Plume?"
msgstr ""
msgid "Plume is a decentralized blogging engine."
msgstr ""
msgid "Authors can manage multiple blogs, each as its own website."
msgstr ""
msgid "Articles are also visible on other Plume instances, and you can interact with them directly from other platforms like Mastodon."
msgstr ""
msgid "Create your account"
msgstr ""
msgid "Read the detailed rules"
msgstr ""
msgid "Respond"
msgstr ""
msgid "Delete this comment"
msgstr ""
msgid "None"
msgstr ""
msgid "No description"
msgstr ""
msgid "Notifications"
msgstr ""
msgid "Plume"
msgstr ""
msgid "Menu"
msgstr ""
msgid "Dashboard"
msgstr ""
msgid "Log Out"
msgstr ""
msgid "My account"
msgstr ""
msgid "Log In"
msgstr ""
msgid "Register"
msgstr ""
msgid "About this instance"
msgstr ""
msgid "Source code"
msgstr ""
msgid "Matrix room"
msgstr ""
msgid "Your media"
msgstr ""
msgid "Upload"
msgstr ""
msgid "You don't have any media yet."
msgstr ""
msgid "Content warning: {0}"
msgstr ""
msgid "Delete"
msgstr ""
msgid "Details"
msgstr ""
msgid "Media details"
msgstr ""
msgid "Go back to the gallery"
msgstr ""
msgid "Markdown syntax"
msgstr ""
msgid "Copy it into your articles, to insert this media:"
msgstr ""
msgid "Use as an avatar"
msgstr ""
msgid "Media upload"
msgstr ""
msgid "Useful for visually impaired people, as well as licensing information"
msgstr ""
msgid "Leave it empty, if none is needed"
msgstr ""
msgid "File"
msgstr ""
msgid "Send"
msgstr ""
msgid "{0}'s subscriptions"
msgstr ""
msgid "Articles"
msgstr ""
msgid "Subscribers"
msgstr ""
msgid "Subscriptions"
msgstr ""
msgid "Your Dashboard"
msgstr ""
msgid "Your Blogs"
msgstr ""
msgid "You don't have any blog yet. Create your own, or ask to join one."
msgstr ""
msgid "Start a new blog"
msgstr ""
msgid "Your Drafts"
msgstr ""
msgid "Go to your gallery"
msgstr ""
msgid "Admin"
msgstr ""
msgid "It is you"
msgstr ""
msgid "Edit your profile"
msgstr ""
msgid "Open on {0}"
msgstr ""
msgid "{0}'s subscribers"
msgstr ""
msgid "Edit your account"
msgstr ""
msgid "Your Profile"
msgstr ""
msgid "To change your avatar, upload it to your gallery and then select from there."
msgstr ""
msgid "Upload an avatar"
msgstr ""
# src/template_utils.rs:217
msgid "Display name"
msgstr ""
# src/template_utils.rs:217
msgid "Email"
msgstr ""
msgid "Summary"
msgstr ""
msgid "Update account"
msgstr ""
msgid "Be very careful, any action taken here can't be cancelled."
msgstr ""
msgid "Delete your account"
msgstr ""
msgid "Sorry, but as an admin, you can't leave your own instance."
msgstr ""
msgid "Atom feed"
msgstr ""
msgid "Recently boosted"
msgstr ""
msgid "Create an account"
msgstr ""
# src/template_utils.rs:217
msgid "Password confirmation"
msgstr ""
msgid "Apologies, but registrations are closed on this particular instance. You can, however, find a different one."
msgstr ""
msgid "Follow {}"
msgstr ""
msgid "Login to follow"
msgstr ""
msgid "Enter your full username to follow"
msgstr ""
msgid "Internal server error"
msgstr ""
msgid "Something broke on our side."
msgstr ""
msgid "Sorry about that. If you think this is a bug, please report it."
msgstr ""
msgid "Page not found"
msgstr ""
msgid "We couldn't find this page."
msgstr ""
msgid "The link that led you here may be broken."
msgstr ""
msgid "Invalid CSRF token"
msgstr ""
msgid "Something is wrong with your CSRF token. Make sure cookies are enabled in you browser, and try reloading this page. If you continue to see this error message, please report it."
msgstr ""
msgid "You are not authorized."
msgstr ""
msgid "The content you sent can't be processed."
msgstr ""
msgid "Maybe it was too long."
msgstr ""

File diff suppressed because it is too large Load diff

828
po/plume/bg.po Normal file
View file

@ -0,0 +1,828 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-19 08:17\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Bulgarian\n"
"Language: bg_BG\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: bg\n"
"X-Crowdin-File: /master/po/plume/plume.pot\n"
# src/template_utils.rs:68
msgid "{0} commented on your article."
msgstr ""
# src/template_utils.rs:69
msgid "{0} is subscribed to you."
msgstr ""
# src/template_utils.rs:70
msgid "{0} liked your article."
msgstr "{0} хареса(ха) вашата статия."
# src/template_utils.rs:71
msgid "{0} mentioned you."
msgstr "{0} ви спомена(ха)."
# src/template_utils.rs:72
msgid "{0} boosted your article."
msgstr "{0} подсили(ха) вашата статия."
# src/template_utils.rs:108
msgid "{0}'s avatar"
msgstr ""
# src/routes/blogs.rs:70
msgid "To create a new blog, you need to be logged in"
msgstr ""
# src/routes/blogs.rs:109
msgid "A blog with the same name already exists."
msgstr "Вече съществува блог със същото име."
# src/routes/blogs.rs:172
msgid "You are not allowed to delete this blog."
msgstr ""
# src/routes/blogs.rs:217
msgid "You are not allowed to edit this blog."
msgstr ""
# src/routes/blogs.rs:262
msgid "You can't use this media as a blog icon."
msgstr ""
# src/routes/blogs.rs:280
msgid "You can't use this media as a blog banner."
msgstr ""
# src/routes/likes.rs:51
msgid "To like a post, you need to be logged in"
msgstr ""
# src/routes/notifications.rs:29
msgid "To see your notifications, you need to be logged in"
msgstr ""
# src/routes/posts.rs:93
msgid "This post isn't published yet."
msgstr ""
# src/routes/posts.rs:122
msgid "To write a new post, you need to be logged in"
msgstr ""
# src/routes/posts.rs:140
msgid "You are not an author of this blog."
msgstr "Вие не сте автор на този блог."
# src/routes/posts.rs:147
msgid "New post"
msgstr "Нова публикация"
# src/routes/posts.rs:192
msgid "Edit {0}"
msgstr ""
# src/routes/posts.rs:630
msgid ""
"Couldn't obtain enough information about your account. Please make sure your "
"username is correct."
msgstr ""
# src/routes/reshares.rs:51
msgid "To reshare a post, you need to be logged in"
msgstr ""
# src/routes/session.rs:181
msgid "Password reset"
msgstr ""
# src/routes/session.rs:182
msgid "Here is the link to reset your password: {0}"
msgstr ""
# src/routes/session.rs:259
msgid "Your password was successfully reset."
msgstr ""
# src/routes/session.rs:263
msgid "Sorry, but the link expired. Try again"
msgstr ""
# src/routes/user.rs:136
msgid "To access your dashboard, you need to be logged in"
msgstr ""
# src/routes/user.rs:244
msgid "To subscribe to someone, you need to be logged in"
msgstr ""
# src/routes/user.rs:344
msgid "To edit your profile, you need to be logged in"
msgstr ""
msgid "Reset your password"
msgstr ""
# src/template_utils.rs:217
msgid "E-mail"
msgstr ""
# src/template_utils.rs:220
msgid "Optional"
msgstr "По избор"
msgid "Send password reset link"
msgstr ""
msgid "Check your inbox!"
msgstr ""
msgid ""
"We sent a mail to the address you gave us, with a link to reset your "
"password."
msgstr ""
msgid "Log in"
msgstr "Влез"
# src/template_utils.rs:217
msgid "Username, or email"
msgstr "Потребителско име или имейл"
# src/template_utils.rs:217
msgid "Password"
msgstr "Парола"
# src/template_utils.rs:217
msgid "New password"
msgstr ""
# src/template_utils.rs:217
msgid "Confirmation"
msgstr ""
msgid "Update password"
msgstr ""
msgid "Administration of {0}"
msgstr ""
msgid "Instances"
msgstr ""
msgid "Configuration"
msgstr "Конфигурация"
msgid "Users"
msgstr ""
msgid "Unblock"
msgstr ""
msgid "Block"
msgstr ""
msgid "About {0}"
msgstr ""
msgid "Home to <em>{0}</em> people"
msgstr ""
msgid "Who wrote <em>{0}</em> articles"
msgstr ""
msgid "And are connected to <em>{0}</em> other instances"
msgstr ""
msgid "Administred by"
msgstr ""
msgid "Runs Plume {0}"
msgstr "Писти Pluma {0}"
msgid "All the articles of the Fediverse"
msgstr ""
msgid "Latest articles"
msgstr "Последни статии"
msgid "Your feed"
msgstr ""
msgid "Federated feed"
msgstr ""
msgid "Local feed"
msgstr ""
msgid "Welcome to {}"
msgstr ""
msgid "Articles from {}"
msgstr ""
msgid "Ban"
msgstr ""
msgid "Nothing to see here yet. Try subscribing to more people."
msgstr ""
msgid "Administration"
msgstr "Aдминистрация"
# src/template_utils.rs:217
msgid "Name"
msgstr "Име"
msgid "Allow anyone to register here"
msgstr "Позволете на всеки да се регистрира"
msgid "Short description"
msgstr "Кратко описание"
msgid "Markdown syntax is supported"
msgstr "Поддържа се от Markdown"
msgid "Long description"
msgstr "Дълго описание"
# src/template_utils.rs:217
msgid "Default article license"
msgstr "Лиценз по подразбиране"
msgid "Save these settings"
msgstr "Запаметете тези настройките"
msgid "Search"
msgstr ""
msgid "Your query"
msgstr ""
msgid "Advanced search"
msgstr ""
# src/template_utils.rs:305
msgid "Article title matching these words"
msgstr ""
msgid "Title"
msgstr "Заглавие"
# src/template_utils.rs:305
msgid "Subtitle matching these words"
msgstr ""
msgid "Subtitle - byline"
msgstr ""
# src/template_utils.rs:305
msgid "Content matching these words"
msgstr ""
msgid "Body content"
msgstr ""
# src/template_utils.rs:305
msgid "From this date"
msgstr ""
# src/template_utils.rs:305
msgid "To this date"
msgstr ""
# src/template_utils.rs:305
msgid "Containing these tags"
msgstr ""
msgid "Tags"
msgstr ""
# src/template_utils.rs:305
msgid "Posted on one of these instances"
msgstr ""
msgid "Instance domain"
msgstr ""
# src/template_utils.rs:305
msgid "Posted by one of these authors"
msgstr ""
msgid "Authors"
msgstr ""
# src/template_utils.rs:305
msgid "Posted on one of these blogs"
msgstr ""
msgid "Blog title"
msgstr ""
# src/template_utils.rs:305
msgid "Written in this language"
msgstr ""
msgid "Language"
msgstr ""
# src/template_utils.rs:305
msgid "Published under this license"
msgstr ""
msgid "Article license"
msgstr ""
msgid "Search result for \"{0}\""
msgstr ""
msgid "Search result"
msgstr ""
msgid "No result for your query"
msgstr ""
msgid "No more results for your query"
msgstr ""
msgid "Edit \"{}\""
msgstr ""
msgid "Description"
msgstr ""
msgid ""
"You can upload images to your gallery, to use them as blog icons, or banners."
msgstr ""
msgid "Upload images"
msgstr ""
msgid "Blog icon"
msgstr ""
msgid "Blog banner"
msgstr ""
msgid "Update blog"
msgstr ""
msgid "Danger zone"
msgstr ""
msgid "Be very careful, any action taken here can't be reversed."
msgstr ""
msgid "Permanently delete this blog"
msgstr ""
msgid "{}'s icon"
msgstr ""
msgid "New article"
msgstr "Нова статия"
msgid "Edit"
msgstr ""
msgid "There's one author on this blog: "
msgid_plural "There are {0} authors on this blog: "
msgstr[0] "Има Един автор в този блог: "
msgstr[1] "Има {0} автора в този блог: "
msgid "No posts to see here yet."
msgstr "Все още няма публикации."
msgid "New Blog"
msgstr "Нов блог"
msgid "Create a blog"
msgstr "Създайте блог"
msgid "Create blog"
msgstr "Създайте блог"
msgid "Articles tagged \"{0}\""
msgstr ""
msgid "There are currently no articles with such a tag"
msgstr ""
msgid "Written by {0}"
msgstr "Написано от {0}"
msgid "Are you sure?"
msgstr ""
msgid "Delete this article"
msgstr ""
msgid "Draft"
msgstr ""
msgid "All rights reserved."
msgstr ""
msgid "This article is under the {0} license."
msgstr "Тази статия се разпространява под {0} лиценз."
msgid "Unsubscribe"
msgstr ""
msgid "Subscribe"
msgstr ""
msgid "One like"
msgid_plural "{0} likes"
msgstr[0] "Едно харесване"
msgstr[1] "{0} харесвания"
msgid "I don't like this anymore"
msgstr "Това вече не ми харесва"
msgid "Add yours"
msgstr "Добавете вашите"
msgid "One boost"
msgid_plural "{0} boosts"
msgstr[0] "Едно Подсилване"
msgstr[1] "{0} Подсилвания"
msgid "I don't want to boost this anymore"
msgstr "Не искам повече да го подсилвам"
msgid "Boost"
msgstr "Подсилване"
msgid ""
"{0}Log in{1}, or {2}use your Fediverse account{3} to interact with this "
"article"
msgstr ""
"{0}Влезте {1}или {2}използвайте акаунта си в Fediverse{3}, за да "
"взаимодействате с тази статия"
msgid "Comments"
msgstr "Коментари"
# src/template_utils.rs:217
msgid "Content warning"
msgstr ""
msgid "Your comment"
msgstr "Вашият коментар"
msgid "Submit comment"
msgstr "Публикувайте коментар"
msgid "No comments yet. Be the first to react!"
msgstr "Все още няма коментари. Бъдете първите!"
msgid "Interact with {}"
msgstr ""
msgid "Log in to interact"
msgstr ""
msgid "Enter your full username to interact"
msgstr ""
msgid "Publish"
msgstr "Публикувайте"
msgid "Classic editor (any changes will be lost)"
msgstr ""
# src/template_utils.rs:217
msgid "Subtitle"
msgstr ""
msgid "Content"
msgstr "Съдържание"
msgid ""
"You can upload media to your gallery, and then copy their Markdown code into "
"your articles to insert them."
msgstr ""
msgid "Upload media"
msgstr ""
# src/template_utils.rs:217
msgid "Tags, separated by commas"
msgstr ""
# src/template_utils.rs:217
msgid "License"
msgstr ""
# src/template_utils.rs:225
msgid "Leave it empty to reserve all rights"
msgstr ""
msgid "Illustration"
msgstr ""
msgid "This is a draft, don't publish it yet."
msgstr ""
msgid "Update"
msgstr ""
msgid "Update, or publish"
msgstr ""
msgid "Publish your post"
msgstr ""
msgid "I'm from this instance"
msgstr ""
msgid "I'm from another instance"
msgstr ""
# src/template_utils.rs:217
msgid "Username"
msgstr "Потребителско име"
# src/template_utils.rs:225
msgid "Example: user@plu.me"
msgstr ""
msgid "Continue to your instance"
msgstr ""
msgid "View all"
msgstr ""
msgid "By {0}"
msgstr "С {0}"
msgid "What is Plume?"
msgstr "Какво е Pluma?"
msgid "Plume is a decentralized blogging engine."
msgstr "Pluma е децентрализиран двигател за блогове."
msgid "Authors can manage multiple blogs, each as its own website."
msgstr ""
msgid ""
"Articles are also visible on other Plume instances, and you can interact "
"with them directly from other platforms like Mastodon."
msgstr ""
msgid "Create your account"
msgstr ""
msgid "Read the detailed rules"
msgstr ""
msgid "Respond"
msgstr "Отговори"
msgid "Delete this comment"
msgstr ""
msgid "None"
msgstr ""
msgid "No description"
msgstr ""
msgid "Notifications"
msgstr "Известия"
msgid "Plume"
msgstr "Pluma"
msgid "Menu"
msgstr "Меню"
msgid "Dashboard"
msgstr "Контролен панел"
msgid "Log Out"
msgstr "Излез"
msgid "My account"
msgstr "Моят профил"
msgid "Log In"
msgstr "Влез"
msgid "Register"
msgstr "Регистрация"
msgid "About this instance"
msgstr "За тази инстанция"
msgid "Source code"
msgstr "Изходен код"
msgid "Matrix room"
msgstr ""
msgid "Your media"
msgstr ""
msgid "Upload"
msgstr ""
msgid "You don't have any media yet."
msgstr ""
msgid "Content warning: {0}"
msgstr ""
msgid "Delete"
msgstr ""
msgid "Details"
msgstr ""
msgid "Media details"
msgstr ""
msgid "Go back to the gallery"
msgstr ""
msgid "Markdown syntax"
msgstr ""
msgid "Copy it into your articles, to insert this media:"
msgstr ""
msgid "Use as an avatar"
msgstr ""
msgid "Media upload"
msgstr ""
msgid "Useful for visually impaired people, as well as licensing information"
msgstr ""
msgid "Leave it empty, if none is needed"
msgstr ""
msgid "File"
msgstr ""
msgid "Send"
msgstr ""
msgid "{0}'s subscriptions"
msgstr ""
msgid "Articles"
msgstr ""
msgid "Subscribers"
msgstr ""
msgid "Subscriptions"
msgstr ""
msgid "Your Dashboard"
msgstr "Вашият контролен панел"
msgid "Your Blogs"
msgstr "Вашият Блог"
msgid "You don't have any blog yet. Create your own, or ask to join one."
msgstr ""
"Все още нямате блог. Създайте свой собствен или поискайте да се присъедините "
"към някой друг."
msgid "Start a new blog"
msgstr "Започнете нов блог"
msgid "Your Drafts"
msgstr ""
msgid "Go to your gallery"
msgstr ""
msgid "Admin"
msgstr "Администратор"
msgid "It is you"
msgstr "Това си ти"
msgid "Edit your profile"
msgstr "Редактиране на вашият профил"
msgid "Open on {0}"
msgstr "Отворен на {0}"
msgid "{0}'s subscribers"
msgstr ""
msgid "Edit your account"
msgstr "Редактирайте профила си"
msgid "Your Profile"
msgstr "Вашият профил"
msgid ""
"To change your avatar, upload it to your gallery and then select from there."
msgstr ""
msgid "Upload an avatar"
msgstr ""
# src/template_utils.rs:217
msgid "Display name"
msgstr "Показвано име"
# src/template_utils.rs:217
msgid "Email"
msgstr "Електронна поща"
msgid "Summary"
msgstr "Резюме"
msgid "Update account"
msgstr "Актуализиране на профил"
msgid "Be very careful, any action taken here can't be cancelled."
msgstr ""
msgid "Delete your account"
msgstr ""
msgid "Sorry, but as an admin, you can't leave your own instance."
msgstr ""
msgid "Atom feed"
msgstr ""
msgid "Recently boosted"
msgstr "Наскоро подсилен"
msgid "Create an account"
msgstr "Създай профил"
# src/template_utils.rs:217
msgid "Password confirmation"
msgstr "Потвърждение на парола"
msgid ""
"Apologies, but registrations are closed on this particular instance. You "
"can, however, find a different one."
msgstr ""
msgid "Follow {}"
msgstr ""
msgid "Login to follow"
msgstr ""
msgid "Enter your full username to follow"
msgstr ""
msgid "Internal server error"
msgstr "Вътрешна грешка в сървъра"
msgid "Something broke on our side."
msgstr "Възникна грешка от ваша страна."
msgid "Sorry about that. If you think this is a bug, please report it."
msgstr ""
"Извиняваме се за това. Ако смятате, че това е грешка, моля докладвайте я."
msgid "Page not found"
msgstr ""
msgid "We couldn't find this page."
msgstr "Не можахме да намерим тази страница."
msgid "The link that led you here may be broken."
msgstr "Възможно е връзката, от която сте дошли да е неправилна."
msgid "Invalid CSRF token"
msgstr ""
msgid ""
"Something is wrong with your CSRF token. Make sure cookies are enabled in "
"you browser, and try reloading this page. If you continue to see this error "
"message, please report it."
msgstr ""
msgid "You are not authorized."
msgstr "Не сте упълномощени."
msgid "The content you sent can't be processed."
msgstr ""
msgid "Maybe it was too long."
msgstr ""

824
po/plume/ca.po Normal file
View file

@ -0,0 +1,824 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 20:49\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Catalan\n"
"Language: ca_ES\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: ca\n"
"X-Crowdin-File: /master/po/plume/plume.pot\n"
# src/template_utils.rs:68
msgid "{0} commented on your article."
msgstr ""
# src/template_utils.rs:69
msgid "{0} is subscribed to you."
msgstr ""
# src/template_utils.rs:70
msgid "{0} liked your article."
msgstr "A {0} lha agradat el vostre article."
# src/template_utils.rs:71
msgid "{0} mentioned you."
msgstr "{0} us ha esmentat."
# src/template_utils.rs:72
msgid "{0} boosted your article."
msgstr ""
# src/template_utils.rs:108
msgid "{0}'s avatar"
msgstr ""
# src/routes/blogs.rs:70
msgid "To create a new blog, you need to be logged in"
msgstr ""
# src/routes/blogs.rs:109
msgid "A blog with the same name already exists."
msgstr ""
# src/routes/blogs.rs:172
msgid "You are not allowed to delete this blog."
msgstr ""
# src/routes/blogs.rs:217
msgid "You are not allowed to edit this blog."
msgstr ""
# src/routes/blogs.rs:262
msgid "You can't use this media as a blog icon."
msgstr ""
# src/routes/blogs.rs:280
msgid "You can't use this media as a blog banner."
msgstr ""
# src/routes/likes.rs:51
msgid "To like a post, you need to be logged in"
msgstr ""
# src/routes/notifications.rs:29
msgid "To see your notifications, you need to be logged in"
msgstr ""
# src/routes/posts.rs:93
msgid "This post isn't published yet."
msgstr ""
# src/routes/posts.rs:122
msgid "To write a new post, you need to be logged in"
msgstr ""
# src/routes/posts.rs:140
msgid "You are not an author of this blog."
msgstr ""
# src/routes/posts.rs:147
msgid "New post"
msgstr "Apunt nou"
# src/routes/posts.rs:192
msgid "Edit {0}"
msgstr ""
# src/routes/posts.rs:630
msgid ""
"Couldn't obtain enough information about your account. Please make sure your "
"username is correct."
msgstr ""
# src/routes/reshares.rs:51
msgid "To reshare a post, you need to be logged in"
msgstr ""
# src/routes/session.rs:181
msgid "Password reset"
msgstr "Reinicialització de contrasenya"
# src/routes/session.rs:182
msgid "Here is the link to reset your password: {0}"
msgstr ""
# src/routes/session.rs:259
msgid "Your password was successfully reset."
msgstr ""
# src/routes/session.rs:263
msgid "Sorry, but the link expired. Try again"
msgstr ""
# src/routes/user.rs:136
msgid "To access your dashboard, you need to be logged in"
msgstr ""
# src/routes/user.rs:244
msgid "To subscribe to someone, you need to be logged in"
msgstr ""
# src/routes/user.rs:344
msgid "To edit your profile, you need to be logged in"
msgstr ""
msgid "Reset your password"
msgstr "Reinicialitza la contrasenya"
# src/template_utils.rs:217
msgid "E-mail"
msgstr "Adreça electrónica"
# src/template_utils.rs:220
msgid "Optional"
msgstr "Opcional"
msgid "Send password reset link"
msgstr ""
msgid "Check your inbox!"
msgstr "Reviseu la vostra safata dentrada."
msgid ""
"We sent a mail to the address you gave us, with a link to reset your "
"password."
msgstr ""
msgid "Log in"
msgstr ""
# src/template_utils.rs:217
msgid "Username, or email"
msgstr ""
# src/template_utils.rs:217
msgid "Password"
msgstr "Contrasenya"
# src/template_utils.rs:217
msgid "New password"
msgstr "Contrasenya nova"
# src/template_utils.rs:217
msgid "Confirmation"
msgstr "Confirmació"
msgid "Update password"
msgstr "Actualitza la contrasenya"
msgid "Administration of {0}"
msgstr ""
msgid "Instances"
msgstr "Instàncies"
msgid "Configuration"
msgstr "Configuració"
msgid "Users"
msgstr "Usuaris"
msgid "Unblock"
msgstr "Desbloca"
msgid "Block"
msgstr "Bloca"
msgid "About {0}"
msgstr "Quant a {0}"
msgid "Home to <em>{0}</em> people"
msgstr ""
msgid "Who wrote <em>{0}</em> articles"
msgstr ""
msgid "And are connected to <em>{0}</em> other instances"
msgstr ""
msgid "Administred by"
msgstr ""
msgid "Runs Plume {0}"
msgstr ""
msgid "All the articles of the Fediverse"
msgstr ""
msgid "Latest articles"
msgstr "Darrers articles"
msgid "Your feed"
msgstr ""
msgid "Federated feed"
msgstr ""
msgid "Local feed"
msgstr ""
msgid "Welcome to {}"
msgstr "Us donem la benvinguda a {}"
msgid "Articles from {}"
msgstr ""
msgid "Ban"
msgstr ""
msgid "Nothing to see here yet. Try subscribing to more people."
msgstr ""
msgid "Administration"
msgstr "Administració"
# src/template_utils.rs:217
msgid "Name"
msgstr "Nom"
msgid "Allow anyone to register here"
msgstr ""
msgid "Short description"
msgstr ""
msgid "Markdown syntax is supported"
msgstr ""
msgid "Long description"
msgstr ""
# src/template_utils.rs:217
msgid "Default article license"
msgstr ""
msgid "Save these settings"
msgstr ""
msgid "Search"
msgstr "Cerca"
msgid "Your query"
msgstr ""
msgid "Advanced search"
msgstr "Cerca avançada"
# src/template_utils.rs:305
msgid "Article title matching these words"
msgstr ""
msgid "Title"
msgstr "Títol"
# src/template_utils.rs:305
msgid "Subtitle matching these words"
msgstr ""
msgid "Subtitle - byline"
msgstr ""
# src/template_utils.rs:305
msgid "Content matching these words"
msgstr ""
msgid "Body content"
msgstr ""
# src/template_utils.rs:305
msgid "From this date"
msgstr ""
# src/template_utils.rs:305
msgid "To this date"
msgstr ""
# src/template_utils.rs:305
msgid "Containing these tags"
msgstr ""
msgid "Tags"
msgstr ""
# src/template_utils.rs:305
msgid "Posted on one of these instances"
msgstr ""
msgid "Instance domain"
msgstr ""
# src/template_utils.rs:305
msgid "Posted by one of these authors"
msgstr ""
msgid "Authors"
msgstr "Autors"
# src/template_utils.rs:305
msgid "Posted on one of these blogs"
msgstr ""
msgid "Blog title"
msgstr "Títol del blog"
# src/template_utils.rs:305
msgid "Written in this language"
msgstr "Escrit en aquesta llengua"
msgid "Language"
msgstr "Llengua"
# src/template_utils.rs:305
msgid "Published under this license"
msgstr "Publicat segons aquesta llicència"
msgid "Article license"
msgstr ""
msgid "Search result for \"{0}\""
msgstr "Resultats de la cerca «{0}»"
msgid "Search result"
msgstr "Resultats de la cerca"
msgid "No result for your query"
msgstr "La vostra consulta no ha produït cap resultat"
msgid "No more results for your query"
msgstr ""
msgid "Edit \"{}\""
msgstr "Edita «{}»"
msgid "Description"
msgstr "Descripció"
msgid ""
"You can upload images to your gallery, to use them as blog icons, or banners."
msgstr ""
msgid "Upload images"
msgstr ""
msgid "Blog icon"
msgstr ""
msgid "Blog banner"
msgstr ""
msgid "Update blog"
msgstr "Actualitza el blog"
msgid "Danger zone"
msgstr ""
msgid "Be very careful, any action taken here can't be reversed."
msgstr ""
msgid "Permanently delete this blog"
msgstr "Suprimeix permanentment aquest blog"
msgid "{}'s icon"
msgstr "Icona per a {}"
msgid "New article"
msgstr "Article nou"
msgid "Edit"
msgstr "Edita"
msgid "There's one author on this blog: "
msgid_plural "There are {0} authors on this blog: "
msgstr[0] "Hi ha 1 autor en aquest blog: "
msgstr[1] "Hi ha {0} autors en aquest blog: "
msgid "No posts to see here yet."
msgstr "Encara no hi ha cap apunt."
msgid "New Blog"
msgstr "Blog nou"
msgid "Create a blog"
msgstr "Crea un blog"
msgid "Create blog"
msgstr "Crea un blog"
msgid "Articles tagged \"{0}\""
msgstr "Articles amb letiqueta «{0}»"
msgid "There are currently no articles with such a tag"
msgstr ""
msgid "Written by {0}"
msgstr "Escrit per {0}"
msgid "Are you sure?"
msgstr ""
msgid "Delete this article"
msgstr "Suprimeix aquest article"
msgid "Draft"
msgstr "Esborrany"
msgid "All rights reserved."
msgstr "Tots els drets reservats."
msgid "This article is under the {0} license."
msgstr ""
msgid "Unsubscribe"
msgstr ""
msgid "Subscribe"
msgstr ""
msgid "One like"
msgid_plural "{0} likes"
msgstr[0] ""
msgstr[1] ""
msgid "I don't like this anymore"
msgstr "Això ja no magrada"
msgid "Add yours"
msgstr ""
msgid "One boost"
msgid_plural "{0} boosts"
msgstr[0] ""
msgstr[1] ""
msgid "I don't want to boost this anymore"
msgstr ""
msgid "Boost"
msgstr ""
msgid ""
"{0}Log in{1}, or {2}use your Fediverse account{3} to interact with this "
"article"
msgstr ""
msgid "Comments"
msgstr "Comentaris"
# src/template_utils.rs:217
msgid "Content warning"
msgstr ""
msgid "Your comment"
msgstr "El vostre comentari"
msgid "Submit comment"
msgstr "Envia el comentari"
msgid "No comments yet. Be the first to react!"
msgstr ""
msgid "Interact with {}"
msgstr ""
msgid "Log in to interact"
msgstr ""
msgid "Enter your full username to interact"
msgstr ""
msgid "Publish"
msgstr "Publica"
msgid "Classic editor (any changes will be lost)"
msgstr ""
# src/template_utils.rs:217
msgid "Subtitle"
msgstr "Subtítol"
msgid "Content"
msgstr "Contingut"
msgid ""
"You can upload media to your gallery, and then copy their Markdown code into "
"your articles to insert them."
msgstr ""
msgid "Upload media"
msgstr ""
# src/template_utils.rs:217
msgid "Tags, separated by commas"
msgstr ""
# src/template_utils.rs:217
msgid "License"
msgstr ""
# src/template_utils.rs:225
msgid "Leave it empty to reserve all rights"
msgstr ""
msgid "Illustration"
msgstr ""
msgid "This is a draft, don't publish it yet."
msgstr ""
msgid "Update"
msgstr "Actualitza"
msgid "Update, or publish"
msgstr "Actualitza o publica"
msgid "Publish your post"
msgstr ""
#, fuzzy
msgid "I'm from this instance"
msgstr "Quant a aquesta instància"
msgid "I'm from another instance"
msgstr ""
# src/template_utils.rs:217
msgid "Username"
msgstr "Nom dusuari"
# src/template_utils.rs:225
msgid "Example: user@plu.me"
msgstr ""
msgid "Continue to your instance"
msgstr ""
msgid "View all"
msgstr "Mostra-ho tot"
msgid "By {0}"
msgstr "Per {0}"
msgid "What is Plume?"
msgstr "Què és el Plume?"
msgid "Plume is a decentralized blogging engine."
msgstr ""
msgid "Authors can manage multiple blogs, each as its own website."
msgstr ""
msgid ""
"Articles are also visible on other Plume instances, and you can interact "
"with them directly from other platforms like Mastodon."
msgstr ""
msgid "Create your account"
msgstr ""
msgid "Read the detailed rules"
msgstr ""
msgid "Respond"
msgstr ""
msgid "Delete this comment"
msgstr "Suprimeix aquest comentari"
msgid "None"
msgstr "Cap"
msgid "No description"
msgstr "Cap descripció"
msgid "Notifications"
msgstr "Notificacions"
msgid "Plume"
msgstr ""
msgid "Menu"
msgstr "Menú"
msgid "Dashboard"
msgstr ""
msgid "Log Out"
msgstr "Finalitza la sessió"
msgid "My account"
msgstr "El meu compte"
msgid "Log In"
msgstr "Inicia la sessió"
msgid "Register"
msgstr "Registre"
msgid "About this instance"
msgstr "Quant a aquesta instància"
msgid "Source code"
msgstr "Codi font"
msgid "Matrix room"
msgstr ""
msgid "Your media"
msgstr ""
msgid "Upload"
msgstr "Puja"
msgid "You don't have any media yet."
msgstr ""
msgid "Content warning: {0}"
msgstr ""
msgid "Delete"
msgstr "Suprimeix"
msgid "Details"
msgstr "Detalls"
msgid "Media details"
msgstr "Detalls del fitxer multimèdia"
msgid "Go back to the gallery"
msgstr "Torna a la galeria"
msgid "Markdown syntax"
msgstr "Sintaxi Markdown"
msgid "Copy it into your articles, to insert this media:"
msgstr ""
msgid "Use as an avatar"
msgstr ""
msgid "Media upload"
msgstr ""
msgid "Useful for visually impaired people, as well as licensing information"
msgstr ""
msgid "Leave it empty, if none is needed"
msgstr ""
msgid "File"
msgstr "Fitxer"
msgid "Send"
msgstr "Envia"
msgid "{0}'s subscriptions"
msgstr ""
msgid "Articles"
msgstr "Articles"
msgid "Subscribers"
msgstr "Subscriptors"
msgid "Subscriptions"
msgstr "Subscripcions"
msgid "Your Dashboard"
msgstr ""
msgid "Your Blogs"
msgstr "Els vostres blogs"
msgid "You don't have any blog yet. Create your own, or ask to join one."
msgstr ""
msgid "Start a new blog"
msgstr ""
msgid "Your Drafts"
msgstr ""
msgid "Go to your gallery"
msgstr ""
msgid "Admin"
msgstr ""
msgid "It is you"
msgstr ""
msgid "Edit your profile"
msgstr ""
msgid "Open on {0}"
msgstr ""
msgid "{0}'s subscribers"
msgstr ""
msgid "Edit your account"
msgstr ""
msgid "Your Profile"
msgstr "El vostre perfil"
msgid ""
"To change your avatar, upload it to your gallery and then select from there."
msgstr ""
msgid "Upload an avatar"
msgstr ""
# src/template_utils.rs:217
msgid "Display name"
msgstr ""
# src/template_utils.rs:217
msgid "Email"
msgstr "Adreça electrònica"
msgid "Summary"
msgstr "Resum"
msgid "Update account"
msgstr "Actualitza el compte"
msgid "Be very careful, any action taken here can't be cancelled."
msgstr ""
msgid "Delete your account"
msgstr ""
msgid "Sorry, but as an admin, you can't leave your own instance."
msgstr ""
msgid "Atom feed"
msgstr ""
msgid "Recently boosted"
msgstr ""
msgid "Create an account"
msgstr ""
# src/template_utils.rs:217
msgid "Password confirmation"
msgstr "Confirmació de la contrasenya"
msgid ""
"Apologies, but registrations are closed on this particular instance. You "
"can, however, find a different one."
msgstr ""
msgid "Follow {}"
msgstr ""
msgid "Login to follow"
msgstr ""
msgid "Enter your full username to follow"
msgstr ""
msgid "Internal server error"
msgstr ""
msgid "Something broke on our side."
msgstr ""
msgid "Sorry about that. If you think this is a bug, please report it."
msgstr ""
msgid "Page not found"
msgstr ""
msgid "We couldn't find this page."
msgstr ""
msgid "The link that led you here may be broken."
msgstr ""
msgid "Invalid CSRF token"
msgstr ""
msgid ""
"Something is wrong with your CSRF token. Make sure cookies are enabled in "
"you browser, and try reloading this page. If you continue to see this error "
"message, please report it."
msgstr ""
msgid "You are not authorized."
msgstr ""
msgid "The content you sent can't be processed."
msgstr ""
msgid "Maybe it was too long."
msgstr ""

853
po/plume/cs.po Normal file
View file

@ -0,0 +1,853 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-18 19:40\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Czech\n"
"Language: cs_CZ\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 3;\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: cs\n"
"X-Crowdin-File: /master/po/plume/plume.pot\n"
# src/template_utils.rs:68
msgid "{0} commented on your article."
msgstr "{0} komentoval/a váš článek."
# src/template_utils.rs:69
msgid "{0} is subscribed to you."
msgstr "{0} vás odebírá."
# src/template_utils.rs:70
msgid "{0} liked your article."
msgstr "{0} si oblíbil/a váš článek."
# src/template_utils.rs:71
msgid "{0} mentioned you."
msgstr "{0} vás zmínil/a."
# src/template_utils.rs:72
msgid "{0} boosted your article."
msgstr "{0} povýšil/a váš článek."
# src/template_utils.rs:108
msgid "{0}'s avatar"
msgstr "Avatar uživatele {0}"
# src/routes/blogs.rs:70
msgid "To create a new blog, you need to be logged in"
msgstr "Pro vytvoření nového blogu musíte být přihlášeni"
# src/routes/blogs.rs:109
msgid "A blog with the same name already exists."
msgstr "Blog s rovnakým názvem již existuje."
# src/routes/blogs.rs:172
msgid "You are not allowed to delete this blog."
msgstr "Nemáte oprávnění zmazat tento blog."
# src/routes/blogs.rs:217
msgid "You are not allowed to edit this blog."
msgstr "Nemáte oprávnění upravovat tento blog."
# src/routes/blogs.rs:262
msgid "You can't use this media as a blog icon."
msgstr "Toto médium nelze použít jako ikonu blogu."
# src/routes/blogs.rs:280
msgid "You can't use this media as a blog banner."
msgstr "Toto médium nelze použít jako banner blogu."
# src/routes/likes.rs:51
msgid "To like a post, you need to be logged in"
msgstr "Pro oblíbení příspěvku musíte být přihlášen/a"
# src/routes/notifications.rs:29
msgid "To see your notifications, you need to be logged in"
msgstr "Pokud chcete vidět vaše notifikace, musíte být přihlášeni"
# src/routes/posts.rs:93
msgid "This post isn't published yet."
msgstr "Tento příspěvek ještě není publikován."
# src/routes/posts.rs:122
msgid "To write a new post, you need to be logged in"
msgstr "K napsaní nového příspěvku musíte být přihlášeni"
# src/routes/posts.rs:140
msgid "You are not an author of this blog."
msgstr "Nejste autorem tohto blogu."
# src/routes/posts.rs:147
msgid "New post"
msgstr "Nový příspěvek"
# src/routes/posts.rs:192
msgid "Edit {0}"
msgstr "Upravit {0}"
# src/routes/posts.rs:630
msgid ""
"Couldn't obtain enough information about your account. Please make sure your "
"username is correct."
msgstr ""
"Nemohli jsme zjistit dostatečné množství informací ohledne vašeho účtu. "
"Prosím ověřte si, že vaše předzývka je správná."
# src/routes/reshares.rs:51
msgid "To reshare a post, you need to be logged in"
msgstr "Pro sdílení příspěvku musíte být přihlášeni"
# src/routes/session.rs:181
msgid "Password reset"
msgstr "Obnovit heslo"
# src/routes/session.rs:182
msgid "Here is the link to reset your password: {0}"
msgstr "Zde je odkaz na obnovení vášho hesla: {0}"
# src/routes/session.rs:259
msgid "Your password was successfully reset."
msgstr "Vaše heslo bylo úspěšně obnoveno."
# src/routes/session.rs:263
msgid "Sorry, but the link expired. Try again"
msgstr "Omlouváme se, ale odkaz vypršel. Zkuste to znovu"
# src/routes/user.rs:136
msgid "To access your dashboard, you need to be logged in"
msgstr "Pro přístup k vaší nástěnce musíte být přihlášen/a"
# src/routes/user.rs:244
msgid "To subscribe to someone, you need to be logged in"
msgstr "Chcete-li někoho odebírat, musíte být přihlášeni"
# src/routes/user.rs:344
msgid "To edit your profile, you need to be logged in"
msgstr "Pro úpravu vášho profilu musíte být přihlášeni"
msgid "Reset your password"
msgstr "Obnovte své heslo"
# src/template_utils.rs:217
msgid "E-mail"
msgstr "E-mail"
# src/template_utils.rs:220
msgid "Optional"
msgstr "Nepovinné"
msgid "Send password reset link"
msgstr "Poslat odkaz na obnovení hesla"
msgid "Check your inbox!"
msgstr "Zkontrolujte svou příchozí poštu!"
msgid ""
"We sent a mail to the address you gave us, with a link to reset your "
"password."
msgstr ""
"Zaslali jsme email na adresu, kterou jste nám dodali, s odkazem na obnovu "
"vášho hesla."
msgid "Log in"
msgstr "Přihlásit se"
# src/template_utils.rs:217
msgid "Username, or email"
msgstr "Uživatelské jméno, nebo email"
# src/template_utils.rs:217
msgid "Password"
msgstr "Heslo"
# src/template_utils.rs:217
msgid "New password"
msgstr "Nové heslo"
# src/template_utils.rs:217
msgid "Confirmation"
msgstr "Potvrzení"
msgid "Update password"
msgstr "Aktualizovat heslo"
msgid "Administration of {0}"
msgstr "Správa {0}"
msgid "Instances"
msgstr "Instance"
msgid "Configuration"
msgstr "Nastavení"
msgid "Users"
msgstr "Uživatelé"
msgid "Unblock"
msgstr "Odblokovat"
msgid "Block"
msgstr "Blokovat"
msgid "About {0}"
msgstr "O {0}"
msgid "Home to <em>{0}</em> people"
msgstr "Domov pro <em>{0}</em> lidí"
msgid "Who wrote <em>{0}</em> articles"
msgstr "Co napsali <em>{0}</em> článků"
msgid "And are connected to <em>{0}</em> other instances"
msgstr "A jsou napojeni na <em>{0}</em> dalších instancí"
msgid "Administred by"
msgstr "Správcem je"
msgid "Runs Plume {0}"
msgstr "Beží na Plume {0}"
msgid "All the articles of the Fediverse"
msgstr "Všechny články Fediversa"
msgid "Latest articles"
msgstr "Nejposlednejší články"
msgid "Your feed"
msgstr "Vaše zdroje"
msgid "Federated feed"
msgstr "Federované zdroje"
msgid "Local feed"
msgstr "Místni zdroje"
msgid "Welcome to {}"
msgstr "Vítejte na {}"
msgid "Articles from {}"
msgstr "Články z {}"
msgid "Ban"
msgstr "Zakázat"
msgid "Nothing to see here yet. Try subscribing to more people."
msgstr "Ještě tu nic není k vidění. Zkuste odebírat obsah od více lidí."
msgid "Administration"
msgstr "Správa"
# src/template_utils.rs:217
msgid "Name"
msgstr "Pojmenování"
msgid "Allow anyone to register here"
msgstr "Povolit komukoli se zde zaregistrovat"
msgid "Short description"
msgstr "Stručný popis"
msgid "Markdown syntax is supported"
msgstr "Markdown syntaxe je podporována"
msgid "Long description"
msgstr "Detailní popis"
# src/template_utils.rs:217
msgid "Default article license"
msgstr "Výchozí licence článků"
msgid "Save these settings"
msgstr "Uložit tyhle nastavení"
msgid "Search"
msgstr "Hledat"
msgid "Your query"
msgstr "Váš dotaz"
msgid "Advanced search"
msgstr "Pokročilé vyhledávání"
# src/template_utils.rs:305
msgid "Article title matching these words"
msgstr "Nadpis článku odpovídající těmto slovům"
msgid "Title"
msgstr "Nadpis"
# src/template_utils.rs:305
msgid "Subtitle matching these words"
msgstr "Podnadpis odpovídající těmto slovům"
msgid "Subtitle - byline"
msgstr "Podnadpis"
# src/template_utils.rs:305
msgid "Content matching these words"
msgstr "Obsah odpovídající těmto slovům"
msgid "Body content"
msgstr "Tělo článku"
# src/template_utils.rs:305
msgid "From this date"
msgstr "Od tohoto data"
# src/template_utils.rs:305
msgid "To this date"
msgstr "Do tohoto data"
# src/template_utils.rs:305
msgid "Containing these tags"
msgstr "Obsahuje tyto štítky"
msgid "Tags"
msgstr "Tagy"
# src/template_utils.rs:305
msgid "Posted on one of these instances"
msgstr "Zveřejněno na jedné z těchto instancí"
msgid "Instance domain"
msgstr "Doména instance"
# src/template_utils.rs:305
msgid "Posted by one of these authors"
msgstr "Zveřejněno na jedném z těchto autorů"
msgid "Authors"
msgstr "Autoři"
# src/template_utils.rs:305
msgid "Posted on one of these blogs"
msgstr "Zveřejněno na jedném z těchto blogů"
msgid "Blog title"
msgstr "Název blogu"
# src/template_utils.rs:305
msgid "Written in this language"
msgstr "Napsané v tomto jazyce"
msgid "Language"
msgstr "Jazyk"
# src/template_utils.rs:305
msgid "Published under this license"
msgstr "Publikováno pod touto licenci"
msgid "Article license"
msgstr "Licence článku"
msgid "Search result for \"{0}\""
msgstr "Výsledky hledání pro \"{0}\""
msgid "Search result"
msgstr "Výsledek hledání"
msgid "No result for your query"
msgstr "Žádný výsledek nenalzen pro váš dotaz"
msgid "No more results for your query"
msgstr "Žádné další výsledeky pro váše zadaní"
msgid "Edit \"{}\""
msgstr "Upravit \"{}\""
msgid "Description"
msgstr "Popis"
msgid ""
"You can upload images to your gallery, to use them as blog icons, or banners."
msgstr ""
"Můžete nahrát obrázky do své galerie, aby je šlo použít jako ikony blogu, "
"nebo bannery."
msgid "Upload images"
msgstr "Nahrát obrázky"
msgid "Blog icon"
msgstr "Ikonka blogu"
msgid "Blog banner"
msgstr "Blog banner"
msgid "Update blog"
msgstr "Aktualizovat blog"
msgid "Danger zone"
msgstr "Nebezpečná zóna"
msgid "Be very careful, any action taken here can't be reversed."
msgstr ""
"Buďte velmi opatrný/á, jakákoliv zde provedená akce nemůže být vrácena."
msgid "Permanently delete this blog"
msgstr "Trvale smazat tento blog"
msgid "{}'s icon"
msgstr ""
msgid "New article"
msgstr "Nový článek"
msgid "Edit"
msgstr "Upravit"
msgid "There's one author on this blog: "
msgid_plural "There are {0} authors on this blog: "
msgstr[0] "Tento blog má jednoho autora: "
msgstr[1] "Na tomto blogu jsou {0} autoři: "
msgstr[2] "Tento blog má {0} autorů: "
msgstr[3] "Tento blog má {0} autorů: "
msgid "No posts to see here yet."
msgstr "Ještě zde nejsou k vidění žádné příspěvky."
msgid "New Blog"
msgstr "Nový Blog"
msgid "Create a blog"
msgstr "Vytvořit blog"
msgid "Create blog"
msgstr "Vytvořit blog"
msgid "Articles tagged \"{0}\""
msgstr "Články pod štítkem \"{0}\""
msgid "There are currently no articles with such a tag"
msgstr "Zatím tu nejsou žádné články s takovým štítkem"
msgid "Written by {0}"
msgstr "Napsal/a {0}"
msgid "Are you sure?"
msgstr "Jste si jisti?"
msgid "Delete this article"
msgstr "Vymazat tento článek"
msgid "Draft"
msgstr "Koncept"
msgid "All rights reserved."
msgstr "Všechna práva vyhrazena."
msgid "This article is under the {0} license."
msgstr "Tento článek je pod {0} licencí."
msgid "Unsubscribe"
msgstr "Odhlásit se z odběru"
msgid "Subscribe"
msgstr "Přihlásit se k odběru"
msgid "One like"
msgid_plural "{0} likes"
msgstr[0] "Jedno oblíbení"
msgstr[1] "{0} oblíbili"
msgstr[2] "{0} oblíbili"
msgstr[3] "{0} oblíbili"
msgid "I don't like this anymore"
msgstr "Tohle se mi už nelíbí"
msgid "Add yours"
msgstr "Přidejte váš"
msgid "One boost"
msgid_plural "{0} boosts"
msgstr[0] "Jedno boostnoutí"
msgstr[1] "{0} boostnoutí"
msgstr[2] "{0} boostnoutí"
msgstr[3] "{0} boostnoutí"
msgid "I don't want to boost this anymore"
msgstr "Už to nechci dále boostovat"
msgid "Boost"
msgstr "Boostnout"
msgid ""
"{0}Log in{1}, or {2}use your Fediverse account{3} to interact with this "
"article"
msgstr ""
"{0}Přihlasit se{1}, nebo {2}použít váš Fediverse účet{3} k interakci s tímto "
"článkem"
msgid "Comments"
msgstr "Komentáře"
# src/template_utils.rs:217
msgid "Content warning"
msgstr "Varování o obsahu"
msgid "Your comment"
msgstr "Váš komentář"
msgid "Submit comment"
msgstr "Odeslat komentář"
msgid "No comments yet. Be the first to react!"
msgstr "Zatím bez komentáře. Buďte první, kdo zareaguje!"
msgid "Interact with {}"
msgstr "Interagujte s {}"
msgid "Log in to interact"
msgstr "Pro interakci se přihlaste"
msgid "Enter your full username to interact"
msgstr "Pro interakci zadejte své úplné uživatelské jméno"
msgid "Publish"
msgstr "Zveřejnit"
msgid "Classic editor (any changes will be lost)"
msgstr "Klasický editor (jakékoli změny budou ztraceny)"
# src/template_utils.rs:217
msgid "Subtitle"
msgstr "Podtitul"
msgid "Content"
msgstr "Obsah"
msgid ""
"You can upload media to your gallery, and then copy their Markdown code into "
"your articles to insert them."
msgstr ""
"Můžete nahrát média do své galerie, a pak zkopírovat jejich kód Markdown do "
"vašich článků, pro vložení."
msgid "Upload media"
msgstr "Nahrát média"
# src/template_utils.rs:217
msgid "Tags, separated by commas"
msgstr "Štítky, oddělené čárkami"
# src/template_utils.rs:217
msgid "License"
msgstr "Licence"
# src/template_utils.rs:225
msgid "Leave it empty to reserve all rights"
msgstr "Nechte políčko prázdné pro vyhrazení všech práv"
msgid "Illustration"
msgstr "Ilustrace"
msgid "This is a draft, don't publish it yet."
msgstr "Tohle je koncept, neveřejnit ho ještě."
msgid "Update"
msgstr "Aktualizovat"
msgid "Update, or publish"
msgstr "Aktualizovat, nebo publikovat"
msgid "Publish your post"
msgstr "Publikovat svůj příspěvek"
msgid "I'm from this instance"
msgstr "Jsem z téhle instance"
msgid "I'm from another instance"
msgstr "Jsem z jiné instance"
# src/template_utils.rs:217
msgid "Username"
msgstr "Uživatelské jméno"
# src/template_utils.rs:225
msgid "Example: user@plu.me"
msgstr "Příklad: user@plu.me"
msgid "Continue to your instance"
msgstr "Pokračujte na vaši instanci"
msgid "View all"
msgstr "Zobrazit všechny"
msgid "By {0}"
msgstr "Od {0}"
msgid "What is Plume?"
msgstr "Co je Plume?"
msgid "Plume is a decentralized blogging engine."
msgstr "Plume je decentralizovaný blogování systém."
msgid "Authors can manage multiple blogs, each as its own website."
msgstr "Autoři mohou spravovat vícero blogů, každý jako svou vlastní stránku."
msgid ""
"Articles are also visible on other Plume instances, and you can interact "
"with them directly from other platforms like Mastodon."
msgstr ""
"Články jsou viditelné také na ostatních Plume instancích, a můžete s nimi "
"narábět přímo i v rámci jiných platforem, jako je Mastodon."
msgid "Create your account"
msgstr "Vytvořit váš účet"
msgid "Read the detailed rules"
msgstr "Přečtěte si podrobná pravidla"
msgid "Respond"
msgstr "Odpovědět"
msgid "Delete this comment"
msgstr "Odstranit tento komentář"
msgid "None"
msgstr "Žádné"
msgid "No description"
msgstr "Bez popisu"
msgid "Notifications"
msgstr "Notifikace"
msgid "Plume"
msgstr "Plume"
msgid "Menu"
msgstr "Nabídka"
msgid "Dashboard"
msgstr "Nástěnka"
msgid "Log Out"
msgstr "Odhlásit se"
msgid "My account"
msgstr "Můj účet"
msgid "Log In"
msgstr "Přihlásit se"
msgid "Register"
msgstr "Vytvořit účet"
msgid "About this instance"
msgstr "O této instanci"
msgid "Source code"
msgstr "Zdrojový kód"
msgid "Matrix room"
msgstr "Matrix místnost"
msgid "Your media"
msgstr "Vaše média"
msgid "Upload"
msgstr "Nahrát"
msgid "You don't have any media yet."
msgstr "Zatím nemáte nahrané žádné média."
msgid "Content warning: {0}"
msgstr "Upozornení na obsah: {0}"
msgid "Delete"
msgstr "Smazat"
msgid "Details"
msgstr "Podrobnosti"
msgid "Media details"
msgstr "Podrobnosti média"
msgid "Go back to the gallery"
msgstr "Přejít zpět do galerie"
msgid "Markdown syntax"
msgstr "Markdown syntaxe"
msgid "Copy it into your articles, to insert this media:"
msgstr "Pro vložení tohoto média zkopírujte tento kód do vašich článků:"
msgid "Use as an avatar"
msgstr "Použít jak avatar"
msgid "Media upload"
msgstr "Nahrávaní médií"
msgid "Useful for visually impaired people, as well as licensing information"
msgstr "Užitečné pro zrakově postižené lidi a také pro informace o licencování"
msgid "Leave it empty, if none is needed"
msgstr "Ponechat prázdne, pokud žádná není potřebná"
msgid "File"
msgstr "Soubor"
msgid "Send"
msgstr "Odeslat"
msgid "{0}'s subscriptions"
msgstr "Odběry uživatele {0}"
msgid "Articles"
msgstr "Články"
msgid "Subscribers"
msgstr "Odběratelé"
msgid "Subscriptions"
msgstr "Odběry"
msgid "Your Dashboard"
msgstr "Vaše nástěnka"
msgid "Your Blogs"
msgstr "Vaše Blogy"
msgid "You don't have any blog yet. Create your own, or ask to join one."
msgstr ""
"Zatím nemáte žádný blog. Vytvořte si vlastní, nebo požádejte v nejakém o "
"členství."
msgid "Start a new blog"
msgstr "Začít nový blog"
msgid "Your Drafts"
msgstr "Váše návrhy"
msgid "Go to your gallery"
msgstr "Přejít do galerie"
msgid "Admin"
msgstr "Administrátor"
msgid "It is you"
msgstr "To jste vy"
msgid "Edit your profile"
msgstr "Upravit profil"
msgid "Open on {0}"
msgstr "Otevřít na {0}"
msgid "{0}'s subscribers"
msgstr "Odběratelé uživatele {0}"
msgid "Edit your account"
msgstr "Upravit váš účet"
msgid "Your Profile"
msgstr "Váš profil"
msgid ""
"To change your avatar, upload it to your gallery and then select from there."
msgstr ""
"Chcete-li změnit svůj avatar, nahrejte ho do své galérie a pak ho odtud "
"zvolte."
msgid "Upload an avatar"
msgstr "Nahrát avatara"
# src/template_utils.rs:217
msgid "Display name"
msgstr "Zobrazované jméno"
# src/template_utils.rs:217
msgid "Email"
msgstr "Email"
msgid "Summary"
msgstr "Souhrn"
msgid "Update account"
msgstr "Aktualizovat účet"
msgid "Be very careful, any action taken here can't be cancelled."
msgstr ""
"Buďte velmi opatrný/á, jakákoliv zde provedená akce nemůže být zrušena."
msgid "Delete your account"
msgstr "Smazat váš účet"
msgid "Sorry, but as an admin, you can't leave your own instance."
msgstr ""
"Omlouváme se, ale jako administrátor nemůžete opustit svou vlastní instanci."
msgid "Atom feed"
msgstr "Atom kanál"
msgid "Recently boosted"
msgstr "Nedávno podpořené"
msgid "Create an account"
msgstr "Vytvořit účet"
# src/template_utils.rs:217
msgid "Password confirmation"
msgstr "Potvrzení hesla"
msgid ""
"Apologies, but registrations are closed on this particular instance. You "
"can, however, find a different one."
msgstr ""
"Omlouváme se, ale registrace je uzavřena na této konkrétní instanci. Můžete "
"však najít jinou."
msgid "Follow {}"
msgstr "Následovat {}"
msgid "Login to follow"
msgstr "Pro následování se přihlášte"
msgid "Enter your full username to follow"
msgstr "Pro následovaní zadejte své úplné uživatelské jméno"
msgid "Internal server error"
msgstr "Vnitřní chyba serveru"
msgid "Something broke on our side."
msgstr "Neco se pokazilo na naší strane."
msgid "Sorry about that. If you think this is a bug, please report it."
msgstr "Omlouváme se. Pokud si myslíte, že jde o chybu, prosím nahlašte ji."
msgid "Page not found"
msgstr "Stránka nenalezena"
msgid "We couldn't find this page."
msgstr "Tu stránku jsme nemohli najít."
msgid "The link that led you here may be broken."
msgstr "Odkaz, který vás sem přivedl je asi porušen."
msgid "Invalid CSRF token"
msgstr "Neplatný CSRF token"
msgid ""
"Something is wrong with your CSRF token. Make sure cookies are enabled in "
"you browser, and try reloading this page. If you continue to see this error "
"message, please report it."
msgstr ""
"S vaším tokenem CSRF něco není v pořádku. Ujistěte se, že máte v prohlížeči "
"povolené cookies a zkuste obnovit stránku. Pokud tuto chybovou zprávu budete "
"nadále vidět, prosím nahlašte ji."
msgid "You are not authorized."
msgstr "Nemáte oprávnění."
msgid "The content you sent can't be processed."
msgstr "Obsah, který jste poslali, nelze zpracovat."
msgid "Maybe it was too long."
msgstr "Možná to bylo příliš dlouhé."

789
po/plume/cy.po Normal file
View file

@ -0,0 +1,789 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-06 15:05\n"
"Last-Translator: AnaGelez <ana@gelez.xyz>\n"
"Language-Team: Welsh\n"
"Language: cy_GB\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=6; plural=(n == 0) ? 0 : ((n == 1) ? 1 : ((n == 2) ? 2 : ((n == 3) ? 3 : ((n == 6) ? 4 : 5))));\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: cy\n"
"X-Crowdin-File: /master/po/plume/plume.pot\n"
# src/template_utils.rs:68
msgid "{0} commented on your article."
msgstr ""
# src/template_utils.rs:69
msgid "{0} is subscribed to you."
msgstr ""
# src/template_utils.rs:70
msgid "{0} liked your article."
msgstr ""
# src/template_utils.rs:71
msgid "{0} mentioned you."
msgstr ""
# src/template_utils.rs:72
msgid "{0} boosted your article."
msgstr ""
# src/template_utils.rs:108
msgid "{0}'s avatar"
msgstr ""
# src/routes/blogs.rs:70
msgid "To create a new blog, you need to be logged in"
msgstr ""
# src/routes/blogs.rs:169
msgid "You are not allowed to delete this blog."
msgstr ""
# src/routes/blogs.rs:214
msgid "You are not allowed to edit this blog."
msgstr ""
# src/routes/blogs.rs:253
msgid "You can't use this media as a blog icon."
msgstr ""
# src/routes/blogs.rs:271
msgid "You can't use this media as a blog banner."
msgstr ""
# src/routes/likes.rs:47
msgid "To like a post, you need to be logged in"
msgstr ""
# src/routes/notifications.rs:29
msgid "To see your notifications, you need to be logged in"
msgstr ""
# src/routes/posts.rs:92
msgid "This post isn't published yet."
msgstr ""
# src/routes/posts.rs:120
msgid "To write a new post, you need to be logged in"
msgstr ""
# src/routes/posts.rs:138
msgid "You are not an author of this blog."
msgstr ""
# src/routes/posts.rs:145
msgid "New post"
msgstr ""
# src/routes/posts.rs:190
msgid "Edit {0}"
msgstr ""
# src/routes/reshares.rs:47
msgid "To reshare a post, you need to be logged in"
msgstr ""
# src/routes/session.rs:181
msgid "Password reset"
msgstr ""
# src/routes/session.rs:182
msgid "Here is the link to reset your password: {0}"
msgstr ""
# src/routes/session.rs:259
msgid "Your password was successfully reset."
msgstr ""
# src/routes/session.rs:263
msgid "Sorry, but the link expired. Try again"
msgstr ""
# src/routes/user.rs:148
msgid "To access your dashboard, you need to be logged in"
msgstr ""
# src/routes/user.rs:187
msgid "To subscribe to someone, you need to be logged in"
msgstr ""
# src/routes/user.rs:287
msgid "To edit your profile, you need to be logged in"
msgstr ""
msgid "Plume"
msgstr ""
msgid "Menu"
msgstr ""
msgid "Search"
msgstr ""
msgid "Dashboard"
msgstr ""
msgid "Notifications"
msgstr ""
msgid "Log Out"
msgstr ""
msgid "My account"
msgstr ""
msgid "Log In"
msgstr ""
msgid "Register"
msgstr ""
msgid "About this instance"
msgstr ""
msgid "Source code"
msgstr ""
msgid "Matrix room"
msgstr ""
msgid "Administration"
msgstr ""
msgid "Welcome to {}"
msgstr ""
msgid "Latest articles"
msgstr ""
msgid "Your feed"
msgstr ""
msgid "Federated feed"
msgstr ""
msgid "Local feed"
msgstr ""
msgid "Administration of {0}"
msgstr ""
msgid "Instances"
msgstr ""
msgid "Configuration"
msgstr ""
msgid "Users"
msgstr ""
msgid "Unblock"
msgstr ""
msgid "Block"
msgstr ""
msgid "Ban"
msgstr ""
msgid "All the articles of the Fediverse"
msgstr ""
msgid "Articles from {}"
msgstr ""
msgid "Nothing to see here yet. Try subscribing to more people."
msgstr ""
# src/template_utils.rs:217
msgid "Name"
msgstr ""
# src/template_utils.rs:220
msgid "Optional"
msgstr ""
msgid "Allow anyone to register here"
msgstr ""
msgid "Short description - byline"
msgstr ""
msgid "Markdown syntax is supported"
msgstr ""
msgid "Long description"
msgstr ""
# src/template_utils.rs:217
msgid "Default article license"
msgstr ""
msgid "Save these settings"
msgstr ""
msgid "About {0}"
msgstr ""
msgid "Home to <em>{0}</em> users"
msgstr ""
msgid "Who wrote <em>{0}</em> articles"
msgstr ""
msgid "And are connected to <em>{0}</em> other instances"
msgstr ""
msgid "Administred by"
msgstr ""
msgid "Runs Plume {0}"
msgstr ""
msgid "Edit your account"
msgstr ""
msgid "Your Profile"
msgstr ""
msgid "To change your avatar, upload it to your gallery and then select from there."
msgstr ""
msgid "Upload an avatar"
msgstr ""
# src/template_utils.rs:217
msgid "Display name"
msgstr ""
# src/template_utils.rs:217
msgid "Email"
msgstr ""
msgid "Summary"
msgstr ""
msgid "Update account"
msgstr ""
msgid "Danger zone"
msgstr ""
msgid "Be very careful, any action taken here can't be cancelled."
msgstr ""
msgid "Delete your account"
msgstr ""
msgid "Sorry, but as an admin, you can't leave your own instance."
msgstr ""
msgid "Your Dashboard"
msgstr ""
msgid "Your Blogs"
msgstr ""
msgid "You don't have any blog yet. Create your own, or ask to join one."
msgstr ""
msgid "Start a new blog"
msgstr ""
msgid "Your Drafts"
msgstr ""
msgid "Your media"
msgstr ""
msgid "Go to your gallery"
msgstr ""
msgid "Create your account"
msgstr ""
msgid "Create an account"
msgstr ""
# src/template_utils.rs:217
msgid "Username"
msgstr ""
# src/template_utils.rs:217
msgid "Password"
msgstr ""
# src/template_utils.rs:217
msgid "Password confirmation"
msgstr ""
msgid "Apologies, but registrations are closed on this particular instance. You can, however, find a different one."
msgstr ""
msgid "Articles"
msgstr ""
msgid "Subscribers"
msgstr ""
msgid "Subscriptions"
msgstr ""
msgid "Atom feed"
msgstr ""
msgid "Recently boosted"
msgstr ""
msgid "Admin"
msgstr ""
msgid "It is you"
msgstr ""
msgid "Edit your profile"
msgstr ""
msgid "Open on {0}"
msgstr ""
msgid "Unsubscribe"
msgstr ""
msgid "Subscribe"
msgstr ""
msgid "{0}'s subscriptions'"
msgstr ""
msgid "{0}'s subscribers"
msgstr ""
msgid "Respond"
msgstr ""
msgid "Are you sure?"
msgstr ""
msgid "Delete this comment"
msgstr ""
msgid "What is Plume?"
msgstr ""
msgid "Plume is a decentralized blogging engine."
msgstr ""
msgid "Authors can manage various blogs, each as an unique website."
msgstr ""
msgid "Articles are also visible on other Plume instances, and you can interact with them directly from other platforms like Mastodon."
msgstr ""
msgid "Home to <em>{0}</em> people"
msgstr ""
msgid "Read the detailed rules"
msgstr ""
msgid "None"
msgstr ""
msgid "No description"
msgstr ""
msgid "View all"
msgstr ""
msgid "By {0}"
msgstr ""
msgid "Draft"
msgstr ""
msgid "Your query"
msgstr ""
msgid "Advanced search"
msgstr ""
# src/template_utils.rs:305
msgid "Article title matching these words"
msgstr ""
msgid "Title"
msgstr ""
# src/template_utils.rs:305
msgid "Subtitle matching these words"
msgstr ""
msgid "Subtitle - byline"
msgstr ""
# src/template_utils.rs:305
msgid "Content matching these words"
msgstr ""
msgid "Body content"
msgstr ""
# src/template_utils.rs:305
msgid "From this date"
msgstr ""
# src/template_utils.rs:305
msgid "To this date"
msgstr ""
# src/template_utils.rs:305
msgid "Containing these tags"
msgstr ""
msgid "Tags"
msgstr ""
# src/template_utils.rs:305
msgid "Posted on one of these instances"
msgstr ""
msgid "Instance domain"
msgstr ""
# src/template_utils.rs:305
msgid "Posted by one of these authors"
msgstr ""
msgid "Authors"
msgstr ""
# src/template_utils.rs:305
msgid "Posted on one of these blogs"
msgstr ""
msgid "Blog title"
msgstr ""
# src/template_utils.rs:305
msgid "Written in this language"
msgstr ""
msgid "Language"
msgstr ""
# src/template_utils.rs:305
msgid "Published under this license"
msgstr ""
msgid "Article license"
msgstr ""
msgid "Search result for \"{0}\""
msgstr ""
msgid "Search result"
msgstr ""
msgid "No result for your query"
msgstr ""
msgid "No more results for your query"
msgstr ""
msgid "Reset your password"
msgstr ""
# src/template_utils.rs:217
msgid "New password"
msgstr ""
# src/template_utils.rs:217
msgid "Confirmation"
msgstr ""
msgid "Update password"
msgstr ""
msgid "Check your inbox!"
msgstr ""
msgid "We sent a mail to the address you gave us, with a link to reset your password."
msgstr ""
# src/template_utils.rs:217
msgid "E-mail"
msgstr ""
msgid "Send password reset link"
msgstr ""
msgid "Log in"
msgstr ""
# src/template_utils.rs:217
msgid "Username, or email"
msgstr ""
msgid "Publish"
msgstr ""
msgid "Classic editor (any changes will be lost)"
msgstr ""
# src/template_utils.rs:217
msgid "Subtitle"
msgstr ""
msgid "Content"
msgstr ""
msgid "You can upload media to your gallery, and then copy their Markdown code into your articles to insert them."
msgstr ""
msgid "Upload media"
msgstr ""
# src/template_utils.rs:217
msgid "Tags, separated by commas"
msgstr ""
# src/template_utils.rs:217
msgid "License"
msgstr ""
# src/template_utils.rs:225
msgid "Leave it empty to reserve all rights"
msgstr ""
msgid "Illustration"
msgstr ""
msgid "This is a draft, don't publish it yet."
msgstr ""
msgid "Update"
msgstr ""
msgid "Update, or publish"
msgstr ""
msgid "Publish your post"
msgstr ""
msgid "Written by {0}"
msgstr ""
msgid "Edit"
msgstr ""
msgid "Delete this article"
msgstr ""
msgid "All rights reserved."
msgstr ""
msgid "This article is under the {0} license."
msgstr ""
msgid "One like"
msgid_plural "{0} likes"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
msgid "I don't like this anymore"
msgstr ""
msgid "Add yours"
msgstr ""
msgid "One boost"
msgid_plural "{0} boost"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
msgid "I don't want to boost this anymore"
msgstr ""
msgid "Boost"
msgstr ""
msgid "Log in, or use your Fediverse account to interact with this article"
msgstr ""
msgid "Comments"
msgstr ""
# src/template_utils.rs:217
msgid "Content warning"
msgstr ""
msgid "Your comment"
msgstr ""
msgid "Submit comment"
msgstr ""
msgid "No comments yet. Be the first to react!"
msgstr ""
msgid "Invalid CSRF token"
msgstr ""
msgid "Something is wrong with your CSRF token. Make sure cookies are enabled in you browser, and try reloading this page. If you continue to see this error message, please report it."
msgstr ""
msgid "Page not found"
msgstr ""
msgid "We couldn't find this page."
msgstr ""
msgid "The link that led you here may be broken."
msgstr ""
msgid "The content you sent can't be processed."
msgstr ""
msgid "Maybe it was too long."
msgstr ""
msgid "You are not authorized."
msgstr ""
msgid "Internal server error"
msgstr ""
msgid "Something broke on our side."
msgstr ""
msgid "Sorry about that. If you think this is a bug, please report it."
msgstr ""
msgid "Edit \"{}\""
msgstr ""
msgid "Description"
msgstr ""
msgid "You can upload images to your gallery, to use them as blog icons, or banners."
msgstr ""
msgid "Upload images"
msgstr ""
msgid "Blog icon"
msgstr ""
msgid "Blog banner"
msgstr ""
msgid "Update blog"
msgstr ""
msgid "Be very careful, any action taken here can't be reversed."
msgstr ""
msgid "Permanently delete this blog"
msgstr ""
msgid "New Blog"
msgstr ""
msgid "Create a blog"
msgstr ""
msgid "Create blog"
msgstr ""
msgid "{}'s icon"
msgstr ""
msgid "New article"
msgstr ""
msgid "There's one author on this blog: "
msgid_plural "There are {0} authors on this blog: "
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
msgid "No posts to see here yet."
msgstr ""
msgid "Articles tagged \"{0}\""
msgstr ""
msgid "There are currently no articles with such a tag"
msgstr ""
msgid "Upload"
msgstr ""
msgid "You don't have any media yet."
msgstr ""
msgid "Content warning: {0}"
msgstr ""
msgid "Delete"
msgstr ""
msgid "Details"
msgstr ""
msgid "Media upload"
msgstr ""
msgid "Useful for visually impaired people, as well as licensing information"
msgstr ""
msgid "Leave it empty, if none is needed"
msgstr ""
msgid "File"
msgstr ""
msgid "Send"
msgstr ""
msgid "Media details"
msgstr ""
msgid "Go back to the gallery"
msgstr ""
msgid "Markdown syntax"
msgstr ""
msgid "Copy it into your articles, to insert this media:"
msgstr ""
msgid "Use as an avatar"
msgstr ""
msgid "Log in to boost"
msgstr ""
msgid "Log in to like"
msgstr ""

807
po/plume/da.po Normal file
View file

@ -0,0 +1,807 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 20:49\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Danish\n"
"Language: da_DK\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: da\n"
"X-Crowdin-File: /master/po/plume/plume.pot\n"
# src/template_utils.rs:68
msgid "{0} commented on your article."
msgstr ""
# src/template_utils.rs:69
msgid "{0} is subscribed to you."
msgstr ""
# src/template_utils.rs:70
msgid "{0} liked your article."
msgstr ""
# src/template_utils.rs:71
msgid "{0} mentioned you."
msgstr ""
# src/template_utils.rs:72
msgid "{0} boosted your article."
msgstr ""
# src/template_utils.rs:108
msgid "{0}'s avatar"
msgstr ""
# src/routes/blogs.rs:70
msgid "To create a new blog, you need to be logged in"
msgstr ""
# src/routes/blogs.rs:109
msgid "A blog with the same name already exists."
msgstr ""
# src/routes/blogs.rs:172
msgid "You are not allowed to delete this blog."
msgstr ""
# src/routes/blogs.rs:217
msgid "You are not allowed to edit this blog."
msgstr ""
# src/routes/blogs.rs:262
msgid "You can't use this media as a blog icon."
msgstr ""
# src/routes/blogs.rs:280
msgid "You can't use this media as a blog banner."
msgstr ""
# src/routes/likes.rs:51
msgid "To like a post, you need to be logged in"
msgstr ""
# src/routes/notifications.rs:29
msgid "To see your notifications, you need to be logged in"
msgstr ""
# src/routes/posts.rs:93
msgid "This post isn't published yet."
msgstr ""
# src/routes/posts.rs:122
msgid "To write a new post, you need to be logged in"
msgstr ""
# src/routes/posts.rs:140
msgid "You are not an author of this blog."
msgstr ""
# src/routes/posts.rs:147
msgid "New post"
msgstr ""
# src/routes/posts.rs:192
msgid "Edit {0}"
msgstr ""
# src/routes/posts.rs:630
msgid "Couldn't obtain enough information about your account. Please make sure your username is correct."
msgstr ""
# src/routes/reshares.rs:51
msgid "To reshare a post, you need to be logged in"
msgstr ""
# src/routes/session.rs:181
msgid "Password reset"
msgstr ""
# src/routes/session.rs:182
msgid "Here is the link to reset your password: {0}"
msgstr ""
# src/routes/session.rs:259
msgid "Your password was successfully reset."
msgstr ""
# src/routes/session.rs:263
msgid "Sorry, but the link expired. Try again"
msgstr ""
# src/routes/user.rs:136
msgid "To access your dashboard, you need to be logged in"
msgstr ""
# src/routes/user.rs:244
msgid "To subscribe to someone, you need to be logged in"
msgstr ""
# src/routes/user.rs:344
msgid "To edit your profile, you need to be logged in"
msgstr ""
msgid "Reset your password"
msgstr ""
# src/template_utils.rs:217
msgid "E-mail"
msgstr ""
# src/template_utils.rs:220
msgid "Optional"
msgstr ""
msgid "Send password reset link"
msgstr ""
msgid "Check your inbox!"
msgstr ""
msgid "We sent a mail to the address you gave us, with a link to reset your password."
msgstr ""
msgid "Log in"
msgstr ""
# src/template_utils.rs:217
msgid "Username, or email"
msgstr ""
# src/template_utils.rs:217
msgid "Password"
msgstr ""
# src/template_utils.rs:217
msgid "New password"
msgstr ""
# src/template_utils.rs:217
msgid "Confirmation"
msgstr ""
msgid "Update password"
msgstr ""
msgid "Administration of {0}"
msgstr ""
msgid "Instances"
msgstr ""
msgid "Configuration"
msgstr ""
msgid "Users"
msgstr ""
msgid "Unblock"
msgstr ""
msgid "Block"
msgstr ""
msgid "About {0}"
msgstr ""
msgid "Home to <em>{0}</em> people"
msgstr ""
msgid "Who wrote <em>{0}</em> articles"
msgstr ""
msgid "And are connected to <em>{0}</em> other instances"
msgstr ""
msgid "Administred by"
msgstr ""
msgid "Runs Plume {0}"
msgstr ""
msgid "All the articles of the Fediverse"
msgstr ""
msgid "Latest articles"
msgstr ""
msgid "Your feed"
msgstr ""
msgid "Federated feed"
msgstr ""
msgid "Local feed"
msgstr ""
msgid "Welcome to {}"
msgstr ""
msgid "Articles from {}"
msgstr ""
msgid "Ban"
msgstr ""
msgid "Nothing to see here yet. Try subscribing to more people."
msgstr ""
msgid "Administration"
msgstr ""
# src/template_utils.rs:217
msgid "Name"
msgstr ""
msgid "Allow anyone to register here"
msgstr ""
msgid "Short description"
msgstr ""
msgid "Markdown syntax is supported"
msgstr ""
msgid "Long description"
msgstr ""
# src/template_utils.rs:217
msgid "Default article license"
msgstr ""
msgid "Save these settings"
msgstr ""
msgid "Search"
msgstr ""
msgid "Your query"
msgstr ""
msgid "Advanced search"
msgstr ""
# src/template_utils.rs:305
msgid "Article title matching these words"
msgstr ""
msgid "Title"
msgstr ""
# src/template_utils.rs:305
msgid "Subtitle matching these words"
msgstr ""
msgid "Subtitle - byline"
msgstr ""
# src/template_utils.rs:305
msgid "Content matching these words"
msgstr ""
msgid "Body content"
msgstr ""
# src/template_utils.rs:305
msgid "From this date"
msgstr ""
# src/template_utils.rs:305
msgid "To this date"
msgstr ""
# src/template_utils.rs:305
msgid "Containing these tags"
msgstr ""
msgid "Tags"
msgstr ""
# src/template_utils.rs:305
msgid "Posted on one of these instances"
msgstr ""
msgid "Instance domain"
msgstr ""
# src/template_utils.rs:305
msgid "Posted by one of these authors"
msgstr ""
msgid "Authors"
msgstr ""
# src/template_utils.rs:305
msgid "Posted on one of these blogs"
msgstr ""
msgid "Blog title"
msgstr ""
# src/template_utils.rs:305
msgid "Written in this language"
msgstr ""
msgid "Language"
msgstr ""
# src/template_utils.rs:305
msgid "Published under this license"
msgstr ""
msgid "Article license"
msgstr ""
msgid "Search result for \"{0}\""
msgstr ""
msgid "Search result"
msgstr ""
msgid "No result for your query"
msgstr ""
msgid "No more results for your query"
msgstr ""
msgid "Edit \"{}\""
msgstr ""
msgid "Description"
msgstr ""
msgid "You can upload images to your gallery, to use them as blog icons, or banners."
msgstr ""
msgid "Upload images"
msgstr ""
msgid "Blog icon"
msgstr ""
msgid "Blog banner"
msgstr ""
msgid "Update blog"
msgstr ""
msgid "Danger zone"
msgstr ""
msgid "Be very careful, any action taken here can't be reversed."
msgstr ""
msgid "Permanently delete this blog"
msgstr ""
msgid "{}'s icon"
msgstr ""
msgid "New article"
msgstr ""
msgid "Edit"
msgstr ""
msgid "There's one author on this blog: "
msgid_plural "There are {0} authors on this blog: "
msgstr[0] ""
msgstr[1] ""
msgid "No posts to see here yet."
msgstr ""
msgid "New Blog"
msgstr ""
msgid "Create a blog"
msgstr ""
msgid "Create blog"
msgstr ""
msgid "Articles tagged \"{0}\""
msgstr ""
msgid "There are currently no articles with such a tag"
msgstr ""
msgid "Written by {0}"
msgstr ""
msgid "Are you sure?"
msgstr ""
msgid "Delete this article"
msgstr ""
msgid "Draft"
msgstr ""
msgid "All rights reserved."
msgstr ""
msgid "This article is under the {0} license."
msgstr ""
msgid "Unsubscribe"
msgstr ""
msgid "Subscribe"
msgstr ""
msgid "One like"
msgid_plural "{0} likes"
msgstr[0] ""
msgstr[1] ""
msgid "I don't like this anymore"
msgstr ""
msgid "Add yours"
msgstr ""
msgid "One boost"
msgid_plural "{0} boosts"
msgstr[0] ""
msgstr[1] ""
msgid "I don't want to boost this anymore"
msgstr ""
msgid "Boost"
msgstr ""
msgid "{0}Log in{1}, or {2}use your Fediverse account{3} to interact with this article"
msgstr ""
msgid "Comments"
msgstr ""
# src/template_utils.rs:217
msgid "Content warning"
msgstr ""
msgid "Your comment"
msgstr ""
msgid "Submit comment"
msgstr ""
msgid "No comments yet. Be the first to react!"
msgstr ""
msgid "Interact with {}"
msgstr ""
msgid "Log in to interact"
msgstr ""
msgid "Enter your full username to interact"
msgstr ""
msgid "Publish"
msgstr ""
msgid "Classic editor (any changes will be lost)"
msgstr ""
# src/template_utils.rs:217
msgid "Subtitle"
msgstr ""
msgid "Content"
msgstr ""
msgid "You can upload media to your gallery, and then copy their Markdown code into your articles to insert them."
msgstr ""
msgid "Upload media"
msgstr ""
# src/template_utils.rs:217
msgid "Tags, separated by commas"
msgstr ""
# src/template_utils.rs:217
msgid "License"
msgstr ""
# src/template_utils.rs:225
msgid "Leave it empty to reserve all rights"
msgstr ""
msgid "Illustration"
msgstr ""
msgid "This is a draft, don't publish it yet."
msgstr ""
msgid "Update"
msgstr ""
msgid "Update, or publish"
msgstr ""
msgid "Publish your post"
msgstr ""
msgid "I'm from this instance"
msgstr ""
msgid "I'm from another instance"
msgstr ""
# src/template_utils.rs:217
msgid "Username"
msgstr ""
# src/template_utils.rs:225
msgid "Example: user@plu.me"
msgstr ""
msgid "Continue to your instance"
msgstr ""
msgid "View all"
msgstr ""
msgid "By {0}"
msgstr ""
msgid "What is Plume?"
msgstr ""
msgid "Plume is a decentralized blogging engine."
msgstr ""
msgid "Authors can manage multiple blogs, each as its own website."
msgstr ""
msgid "Articles are also visible on other Plume instances, and you can interact with them directly from other platforms like Mastodon."
msgstr ""
msgid "Create your account"
msgstr ""
msgid "Read the detailed rules"
msgstr ""
msgid "Respond"
msgstr ""
msgid "Delete this comment"
msgstr ""
msgid "None"
msgstr ""
msgid "No description"
msgstr ""
msgid "Notifications"
msgstr ""
msgid "Plume"
msgstr ""
msgid "Menu"
msgstr ""
msgid "Dashboard"
msgstr ""
msgid "Log Out"
msgstr ""
msgid "My account"
msgstr ""
msgid "Log In"
msgstr ""
msgid "Register"
msgstr ""
msgid "About this instance"
msgstr ""
msgid "Source code"
msgstr ""
msgid "Matrix room"
msgstr ""
msgid "Your media"
msgstr ""
msgid "Upload"
msgstr ""
msgid "You don't have any media yet."
msgstr ""
msgid "Content warning: {0}"
msgstr ""
msgid "Delete"
msgstr ""
msgid "Details"
msgstr ""
msgid "Media details"
msgstr ""
msgid "Go back to the gallery"
msgstr ""
msgid "Markdown syntax"
msgstr ""
msgid "Copy it into your articles, to insert this media:"
msgstr ""
msgid "Use as an avatar"
msgstr ""
msgid "Media upload"
msgstr ""
msgid "Useful for visually impaired people, as well as licensing information"
msgstr ""
msgid "Leave it empty, if none is needed"
msgstr ""
msgid "File"
msgstr ""
msgid "Send"
msgstr ""
msgid "{0}'s subscriptions"
msgstr ""
msgid "Articles"
msgstr ""
msgid "Subscribers"
msgstr ""
msgid "Subscriptions"
msgstr ""
msgid "Your Dashboard"
msgstr ""
msgid "Your Blogs"
msgstr ""
msgid "You don't have any blog yet. Create your own, or ask to join one."
msgstr ""
msgid "Start a new blog"
msgstr ""
msgid "Your Drafts"
msgstr ""
msgid "Go to your gallery"
msgstr ""
msgid "Admin"
msgstr ""
msgid "It is you"
msgstr ""
msgid "Edit your profile"
msgstr ""
msgid "Open on {0}"
msgstr ""
msgid "{0}'s subscribers"
msgstr ""
msgid "Edit your account"
msgstr ""
msgid "Your Profile"
msgstr ""
msgid "To change your avatar, upload it to your gallery and then select from there."
msgstr ""
msgid "Upload an avatar"
msgstr ""
# src/template_utils.rs:217
msgid "Display name"
msgstr ""
# src/template_utils.rs:217
msgid "Email"
msgstr ""
msgid "Summary"
msgstr ""
msgid "Update account"
msgstr ""
msgid "Be very careful, any action taken here can't be cancelled."
msgstr ""
msgid "Delete your account"
msgstr ""
msgid "Sorry, but as an admin, you can't leave your own instance."
msgstr ""
msgid "Atom feed"
msgstr ""
msgid "Recently boosted"
msgstr ""
msgid "Create an account"
msgstr ""
# src/template_utils.rs:217
msgid "Password confirmation"
msgstr ""
msgid "Apologies, but registrations are closed on this particular instance. You can, however, find a different one."
msgstr ""
msgid "Follow {}"
msgstr ""
msgid "Login to follow"
msgstr ""
msgid "Enter your full username to follow"
msgstr ""
msgid "Internal server error"
msgstr ""
msgid "Something broke on our side."
msgstr ""
msgid "Sorry about that. If you think this is a bug, please report it."
msgstr ""
msgid "Page not found"
msgstr ""
msgid "We couldn't find this page."
msgstr ""
msgid "The link that led you here may be broken."
msgstr ""
msgid "Invalid CSRF token"
msgstr ""
msgid "Something is wrong with your CSRF token. Make sure cookies are enabled in you browser, and try reloading this page. If you continue to see this error message, please report it."
msgstr ""
msgid "You are not authorized."
msgstr ""
msgid "The content you sent can't be processed."
msgstr ""
msgid "Maybe it was too long."
msgstr ""

File diff suppressed because it is too large Load diff

807
po/plume/el.po Normal file
View file

@ -0,0 +1,807 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 20:49\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Greek\n"
"Language: el_GR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: el\n"
"X-Crowdin-File: /master/po/plume/plume.pot\n"
# src/template_utils.rs:68
msgid "{0} commented on your article."
msgstr ""
# src/template_utils.rs:69
msgid "{0} is subscribed to you."
msgstr ""
# src/template_utils.rs:70
msgid "{0} liked your article."
msgstr ""
# src/template_utils.rs:71
msgid "{0} mentioned you."
msgstr ""
# src/template_utils.rs:72
msgid "{0} boosted your article."
msgstr ""
# src/template_utils.rs:108
msgid "{0}'s avatar"
msgstr ""
# src/routes/blogs.rs:70
msgid "To create a new blog, you need to be logged in"
msgstr ""
# src/routes/blogs.rs:109
msgid "A blog with the same name already exists."
msgstr ""
# src/routes/blogs.rs:172
msgid "You are not allowed to delete this blog."
msgstr ""
# src/routes/blogs.rs:217
msgid "You are not allowed to edit this blog."
msgstr ""
# src/routes/blogs.rs:262
msgid "You can't use this media as a blog icon."
msgstr ""
# src/routes/blogs.rs:280
msgid "You can't use this media as a blog banner."
msgstr ""
# src/routes/likes.rs:51
msgid "To like a post, you need to be logged in"
msgstr ""
# src/routes/notifications.rs:29
msgid "To see your notifications, you need to be logged in"
msgstr ""
# src/routes/posts.rs:93
msgid "This post isn't published yet."
msgstr ""
# src/routes/posts.rs:122
msgid "To write a new post, you need to be logged in"
msgstr ""
# src/routes/posts.rs:140
msgid "You are not an author of this blog."
msgstr ""
# src/routes/posts.rs:147
msgid "New post"
msgstr ""
# src/routes/posts.rs:192
msgid "Edit {0}"
msgstr ""
# src/routes/posts.rs:630
msgid "Couldn't obtain enough information about your account. Please make sure your username is correct."
msgstr ""
# src/routes/reshares.rs:51
msgid "To reshare a post, you need to be logged in"
msgstr ""
# src/routes/session.rs:181
msgid "Password reset"
msgstr ""
# src/routes/session.rs:182
msgid "Here is the link to reset your password: {0}"
msgstr ""
# src/routes/session.rs:259
msgid "Your password was successfully reset."
msgstr ""
# src/routes/session.rs:263
msgid "Sorry, but the link expired. Try again"
msgstr ""
# src/routes/user.rs:136
msgid "To access your dashboard, you need to be logged in"
msgstr ""
# src/routes/user.rs:244
msgid "To subscribe to someone, you need to be logged in"
msgstr ""
# src/routes/user.rs:344
msgid "To edit your profile, you need to be logged in"
msgstr ""
msgid "Reset your password"
msgstr ""
# src/template_utils.rs:217
msgid "E-mail"
msgstr ""
# src/template_utils.rs:220
msgid "Optional"
msgstr ""
msgid "Send password reset link"
msgstr ""
msgid "Check your inbox!"
msgstr ""
msgid "We sent a mail to the address you gave us, with a link to reset your password."
msgstr ""
msgid "Log in"
msgstr ""
# src/template_utils.rs:217
msgid "Username, or email"
msgstr ""
# src/template_utils.rs:217
msgid "Password"
msgstr ""
# src/template_utils.rs:217
msgid "New password"
msgstr ""
# src/template_utils.rs:217
msgid "Confirmation"
msgstr ""
msgid "Update password"
msgstr ""
msgid "Administration of {0}"
msgstr ""
msgid "Instances"
msgstr ""
msgid "Configuration"
msgstr ""
msgid "Users"
msgstr ""
msgid "Unblock"
msgstr ""
msgid "Block"
msgstr ""
msgid "About {0}"
msgstr ""
msgid "Home to <em>{0}</em> people"
msgstr ""
msgid "Who wrote <em>{0}</em> articles"
msgstr ""
msgid "And are connected to <em>{0}</em> other instances"
msgstr ""
msgid "Administred by"
msgstr ""
msgid "Runs Plume {0}"
msgstr ""
msgid "All the articles of the Fediverse"
msgstr ""
msgid "Latest articles"
msgstr ""
msgid "Your feed"
msgstr ""
msgid "Federated feed"
msgstr ""
msgid "Local feed"
msgstr ""
msgid "Welcome to {}"
msgstr ""
msgid "Articles from {}"
msgstr ""
msgid "Ban"
msgstr ""
msgid "Nothing to see here yet. Try subscribing to more people."
msgstr ""
msgid "Administration"
msgstr ""
# src/template_utils.rs:217
msgid "Name"
msgstr ""
msgid "Allow anyone to register here"
msgstr ""
msgid "Short description"
msgstr ""
msgid "Markdown syntax is supported"
msgstr ""
msgid "Long description"
msgstr ""
# src/template_utils.rs:217
msgid "Default article license"
msgstr ""
msgid "Save these settings"
msgstr ""
msgid "Search"
msgstr ""
msgid "Your query"
msgstr ""
msgid "Advanced search"
msgstr ""
# src/template_utils.rs:305
msgid "Article title matching these words"
msgstr ""
msgid "Title"
msgstr ""
# src/template_utils.rs:305
msgid "Subtitle matching these words"
msgstr ""
msgid "Subtitle - byline"
msgstr ""
# src/template_utils.rs:305
msgid "Content matching these words"
msgstr ""
msgid "Body content"
msgstr ""
# src/template_utils.rs:305
msgid "From this date"
msgstr ""
# src/template_utils.rs:305
msgid "To this date"
msgstr ""
# src/template_utils.rs:305
msgid "Containing these tags"
msgstr ""
msgid "Tags"
msgstr ""
# src/template_utils.rs:305
msgid "Posted on one of these instances"
msgstr ""
msgid "Instance domain"
msgstr ""
# src/template_utils.rs:305
msgid "Posted by one of these authors"
msgstr ""
msgid "Authors"
msgstr ""
# src/template_utils.rs:305
msgid "Posted on one of these blogs"
msgstr ""
msgid "Blog title"
msgstr ""
# src/template_utils.rs:305
msgid "Written in this language"
msgstr ""
msgid "Language"
msgstr ""
# src/template_utils.rs:305
msgid "Published under this license"
msgstr ""
msgid "Article license"
msgstr ""
msgid "Search result for \"{0}\""
msgstr ""
msgid "Search result"
msgstr ""
msgid "No result for your query"
msgstr ""
msgid "No more results for your query"
msgstr ""
msgid "Edit \"{}\""
msgstr ""
msgid "Description"
msgstr ""
msgid "You can upload images to your gallery, to use them as blog icons, or banners."
msgstr ""
msgid "Upload images"
msgstr ""
msgid "Blog icon"
msgstr ""
msgid "Blog banner"
msgstr ""
msgid "Update blog"
msgstr ""
msgid "Danger zone"
msgstr ""
msgid "Be very careful, any action taken here can't be reversed."
msgstr ""
msgid "Permanently delete this blog"
msgstr ""
msgid "{}'s icon"
msgstr ""
msgid "New article"
msgstr ""
msgid "Edit"
msgstr ""
msgid "There's one author on this blog: "
msgid_plural "There are {0} authors on this blog: "
msgstr[0] ""
msgstr[1] ""
msgid "No posts to see here yet."
msgstr ""
msgid "New Blog"
msgstr ""
msgid "Create a blog"
msgstr ""
msgid "Create blog"
msgstr ""
msgid "Articles tagged \"{0}\""
msgstr ""
msgid "There are currently no articles with such a tag"
msgstr ""
msgid "Written by {0}"
msgstr ""
msgid "Are you sure?"
msgstr ""
msgid "Delete this article"
msgstr ""
msgid "Draft"
msgstr ""
msgid "All rights reserved."
msgstr ""
msgid "This article is under the {0} license."
msgstr ""
msgid "Unsubscribe"
msgstr ""
msgid "Subscribe"
msgstr ""
msgid "One like"
msgid_plural "{0} likes"
msgstr[0] ""
msgstr[1] ""
msgid "I don't like this anymore"
msgstr ""
msgid "Add yours"
msgstr ""
msgid "One boost"
msgid_plural "{0} boosts"
msgstr[0] ""
msgstr[1] ""
msgid "I don't want to boost this anymore"
msgstr ""
msgid "Boost"
msgstr ""
msgid "{0}Log in{1}, or {2}use your Fediverse account{3} to interact with this article"
msgstr ""
msgid "Comments"
msgstr ""
# src/template_utils.rs:217
msgid "Content warning"
msgstr ""
msgid "Your comment"
msgstr ""
msgid "Submit comment"
msgstr ""
msgid "No comments yet. Be the first to react!"
msgstr ""
msgid "Interact with {}"
msgstr ""
msgid "Log in to interact"
msgstr ""
msgid "Enter your full username to interact"
msgstr ""
msgid "Publish"
msgstr ""
msgid "Classic editor (any changes will be lost)"
msgstr ""
# src/template_utils.rs:217
msgid "Subtitle"
msgstr ""
msgid "Content"
msgstr ""
msgid "You can upload media to your gallery, and then copy their Markdown code into your articles to insert them."
msgstr ""
msgid "Upload media"
msgstr ""
# src/template_utils.rs:217
msgid "Tags, separated by commas"
msgstr ""
# src/template_utils.rs:217
msgid "License"
msgstr ""
# src/template_utils.rs:225
msgid "Leave it empty to reserve all rights"
msgstr ""
msgid "Illustration"
msgstr ""
msgid "This is a draft, don't publish it yet."
msgstr ""
msgid "Update"
msgstr ""
msgid "Update, or publish"
msgstr ""
msgid "Publish your post"
msgstr ""
msgid "I'm from this instance"
msgstr ""
msgid "I'm from another instance"
msgstr ""
# src/template_utils.rs:217
msgid "Username"
msgstr ""
# src/template_utils.rs:225
msgid "Example: user@plu.me"
msgstr ""
msgid "Continue to your instance"
msgstr ""
msgid "View all"
msgstr ""
msgid "By {0}"
msgstr ""
msgid "What is Plume?"
msgstr ""
msgid "Plume is a decentralized blogging engine."
msgstr ""
msgid "Authors can manage multiple blogs, each as its own website."
msgstr ""
msgid "Articles are also visible on other Plume instances, and you can interact with them directly from other platforms like Mastodon."
msgstr ""
msgid "Create your account"
msgstr ""
msgid "Read the detailed rules"
msgstr ""
msgid "Respond"
msgstr ""
msgid "Delete this comment"
msgstr ""
msgid "None"
msgstr ""
msgid "No description"
msgstr ""
msgid "Notifications"
msgstr ""
msgid "Plume"
msgstr ""
msgid "Menu"
msgstr ""
msgid "Dashboard"
msgstr ""
msgid "Log Out"
msgstr ""
msgid "My account"
msgstr ""
msgid "Log In"
msgstr ""
msgid "Register"
msgstr ""
msgid "About this instance"
msgstr ""
msgid "Source code"
msgstr ""
msgid "Matrix room"
msgstr ""
msgid "Your media"
msgstr ""
msgid "Upload"
msgstr ""
msgid "You don't have any media yet."
msgstr ""
msgid "Content warning: {0}"
msgstr ""
msgid "Delete"
msgstr ""
msgid "Details"
msgstr ""
msgid "Media details"
msgstr ""
msgid "Go back to the gallery"
msgstr ""
msgid "Markdown syntax"
msgstr ""
msgid "Copy it into your articles, to insert this media:"
msgstr ""
msgid "Use as an avatar"
msgstr ""
msgid "Media upload"
msgstr ""
msgid "Useful for visually impaired people, as well as licensing information"
msgstr ""
msgid "Leave it empty, if none is needed"
msgstr ""
msgid "File"
msgstr ""
msgid "Send"
msgstr ""
msgid "{0}'s subscriptions"
msgstr ""
msgid "Articles"
msgstr ""
msgid "Subscribers"
msgstr ""
msgid "Subscriptions"
msgstr ""
msgid "Your Dashboard"
msgstr ""
msgid "Your Blogs"
msgstr ""
msgid "You don't have any blog yet. Create your own, or ask to join one."
msgstr ""
msgid "Start a new blog"
msgstr ""
msgid "Your Drafts"
msgstr ""
msgid "Go to your gallery"
msgstr ""
msgid "Admin"
msgstr ""
msgid "It is you"
msgstr ""
msgid "Edit your profile"
msgstr ""
msgid "Open on {0}"
msgstr ""
msgid "{0}'s subscribers"
msgstr ""
msgid "Edit your account"
msgstr ""
msgid "Your Profile"
msgstr ""
msgid "To change your avatar, upload it to your gallery and then select from there."
msgstr ""
msgid "Upload an avatar"
msgstr ""
# src/template_utils.rs:217
msgid "Display name"
msgstr ""
# src/template_utils.rs:217
msgid "Email"
msgstr ""
msgid "Summary"
msgstr ""
msgid "Update account"
msgstr ""
msgid "Be very careful, any action taken here can't be cancelled."
msgstr ""
msgid "Delete your account"
msgstr ""
msgid "Sorry, but as an admin, you can't leave your own instance."
msgstr ""
msgid "Atom feed"
msgstr ""
msgid "Recently boosted"
msgstr ""
msgid "Create an account"
msgstr ""
# src/template_utils.rs:217
msgid "Password confirmation"
msgstr ""
msgid "Apologies, but registrations are closed on this particular instance. You can, however, find a different one."
msgstr ""
msgid "Follow {}"
msgstr ""
msgid "Login to follow"
msgstr ""
msgid "Enter your full username to follow"
msgstr ""
msgid "Internal server error"
msgstr ""
msgid "Something broke on our side."
msgstr ""
msgid "Sorry about that. If you think this is a bug, please report it."
msgstr ""
msgid "Page not found"
msgstr ""
msgid "We couldn't find this page."
msgstr ""
msgid "The link that led you here may be broken."
msgstr ""
msgid "Invalid CSRF token"
msgstr ""
msgid "Something is wrong with your CSRF token. Make sure cookies are enabled in you browser, and try reloading this page. If you continue to see this error message, please report it."
msgstr ""
msgid "You are not authorized."
msgstr ""
msgid "The content you sent can't be processed."
msgstr ""
msgid "Maybe it was too long."
msgstr ""

File diff suppressed because it is too large Load diff

823
po/plume/eo.po Normal file
View file

@ -0,0 +1,823 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 20:49\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Esperanto\n"
"Language: eo_UY\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: eo\n"
"X-Crowdin-File: /master/po/plume/plume.pot\n"
# src/template_utils.rs:68
msgid "{0} commented on your article."
msgstr ""
# src/template_utils.rs:69
msgid "{0} is subscribed to you."
msgstr ""
# src/template_utils.rs:70
msgid "{0} liked your article."
msgstr ""
# src/template_utils.rs:71
msgid "{0} mentioned you."
msgstr ""
# src/template_utils.rs:72
msgid "{0} boosted your article."
msgstr ""
# src/template_utils.rs:108
msgid "{0}'s avatar"
msgstr ""
# src/routes/blogs.rs:70
msgid "To create a new blog, you need to be logged in"
msgstr ""
# src/routes/blogs.rs:109
msgid "A blog with the same name already exists."
msgstr ""
# src/routes/blogs.rs:172
msgid "You are not allowed to delete this blog."
msgstr ""
# src/routes/blogs.rs:217
msgid "You are not allowed to edit this blog."
msgstr "Vi ne estas permesita redakti ĉi tiun blogon."
# src/routes/blogs.rs:262
msgid "You can't use this media as a blog icon."
msgstr ""
# src/routes/blogs.rs:280
msgid "You can't use this media as a blog banner."
msgstr ""
# src/routes/likes.rs:51
msgid "To like a post, you need to be logged in"
msgstr ""
# src/routes/notifications.rs:29
msgid "To see your notifications, you need to be logged in"
msgstr ""
# src/routes/posts.rs:93
msgid "This post isn't published yet."
msgstr "Ĉi tiu skribaĵo ankoraŭ ne estas eldonita."
# src/routes/posts.rs:122
msgid "To write a new post, you need to be logged in"
msgstr "Skribi novan skribaĵo, vi bezonas ensaluti vin"
# src/routes/posts.rs:140
msgid "You are not an author of this blog."
msgstr "Vi ne estas la verkisto de ĉi tiu blogo."
# src/routes/posts.rs:147
msgid "New post"
msgstr "Nova skribaĵo"
# src/routes/posts.rs:192
msgid "Edit {0}"
msgstr ""
# src/routes/posts.rs:630
msgid ""
"Couldn't obtain enough information about your account. Please make sure your "
"username is correct."
msgstr ""
# src/routes/reshares.rs:51
msgid "To reshare a post, you need to be logged in"
msgstr ""
# src/routes/session.rs:181
msgid "Password reset"
msgstr ""
# src/routes/session.rs:182
msgid "Here is the link to reset your password: {0}"
msgstr ""
# src/routes/session.rs:259
msgid "Your password was successfully reset."
msgstr ""
# src/routes/session.rs:263
msgid "Sorry, but the link expired. Try again"
msgstr ""
# src/routes/user.rs:136
msgid "To access your dashboard, you need to be logged in"
msgstr ""
# src/routes/user.rs:244
msgid "To subscribe to someone, you need to be logged in"
msgstr ""
# src/routes/user.rs:344
msgid "To edit your profile, you need to be logged in"
msgstr ""
msgid "Reset your password"
msgstr ""
# src/template_utils.rs:217
msgid "E-mail"
msgstr ""
# src/template_utils.rs:220
msgid "Optional"
msgstr ""
msgid "Send password reset link"
msgstr ""
msgid "Check your inbox!"
msgstr ""
msgid ""
"We sent a mail to the address you gave us, with a link to reset your "
"password."
msgstr ""
msgid "Log in"
msgstr "Ensaluti"
# src/template_utils.rs:217
msgid "Username, or email"
msgstr ""
# src/template_utils.rs:217
msgid "Password"
msgstr "Pasvorto"
# src/template_utils.rs:217
msgid "New password"
msgstr ""
# src/template_utils.rs:217
msgid "Confirmation"
msgstr ""
msgid "Update password"
msgstr ""
msgid "Administration of {0}"
msgstr ""
msgid "Instances"
msgstr ""
msgid "Configuration"
msgstr ""
msgid "Users"
msgstr ""
msgid "Unblock"
msgstr ""
msgid "Block"
msgstr ""
msgid "About {0}"
msgstr ""
msgid "Home to <em>{0}</em> people"
msgstr ""
msgid "Who wrote <em>{0}</em> articles"
msgstr ""
msgid "And are connected to <em>{0}</em> other instances"
msgstr ""
msgid "Administred by"
msgstr ""
msgid "Runs Plume {0}"
msgstr ""
msgid "All the articles of the Fediverse"
msgstr ""
msgid "Latest articles"
msgstr ""
msgid "Your feed"
msgstr ""
msgid "Federated feed"
msgstr ""
msgid "Local feed"
msgstr ""
msgid "Welcome to {}"
msgstr ""
msgid "Articles from {}"
msgstr ""
msgid "Ban"
msgstr ""
msgid "Nothing to see here yet. Try subscribing to more people."
msgstr ""
msgid "Administration"
msgstr ""
# src/template_utils.rs:217
msgid "Name"
msgstr ""
msgid "Allow anyone to register here"
msgstr ""
msgid "Short description"
msgstr ""
msgid "Markdown syntax is supported"
msgstr ""
msgid "Long description"
msgstr ""
# src/template_utils.rs:217
msgid "Default article license"
msgstr ""
msgid "Save these settings"
msgstr ""
msgid "Search"
msgstr "Serĉi"
msgid "Your query"
msgstr ""
msgid "Advanced search"
msgstr ""
# src/template_utils.rs:305
msgid "Article title matching these words"
msgstr ""
msgid "Title"
msgstr ""
# src/template_utils.rs:305
msgid "Subtitle matching these words"
msgstr ""
msgid "Subtitle - byline"
msgstr ""
# src/template_utils.rs:305
msgid "Content matching these words"
msgstr ""
msgid "Body content"
msgstr ""
# src/template_utils.rs:305
msgid "From this date"
msgstr ""
# src/template_utils.rs:305
msgid "To this date"
msgstr ""
# src/template_utils.rs:305
msgid "Containing these tags"
msgstr ""
msgid "Tags"
msgstr ""
# src/template_utils.rs:305
msgid "Posted on one of these instances"
msgstr ""
msgid "Instance domain"
msgstr ""
# src/template_utils.rs:305
msgid "Posted by one of these authors"
msgstr ""
msgid "Authors"
msgstr "Verkistoj"
# src/template_utils.rs:305
msgid "Posted on one of these blogs"
msgstr ""
msgid "Blog title"
msgstr "Blogtitolo"
# src/template_utils.rs:305
msgid "Written in this language"
msgstr ""
msgid "Language"
msgstr "Lingvo"
# src/template_utils.rs:305
msgid "Published under this license"
msgstr "Eldonita sub ĉi tiu permesilo"
msgid "Article license"
msgstr "Artikola permesilo"
msgid "Search result for \"{0}\""
msgstr ""
msgid "Search result"
msgstr ""
msgid "No result for your query"
msgstr ""
msgid "No more results for your query"
msgstr ""
msgid "Edit \"{}\""
msgstr ""
msgid "Description"
msgstr ""
msgid ""
"You can upload images to your gallery, to use them as blog icons, or banners."
msgstr ""
msgid "Upload images"
msgstr ""
msgid "Blog icon"
msgstr ""
msgid "Blog banner"
msgstr ""
msgid "Update blog"
msgstr ""
msgid "Danger zone"
msgstr ""
msgid "Be very careful, any action taken here can't be reversed."
msgstr ""
msgid "Permanently delete this blog"
msgstr ""
msgid "{}'s icon"
msgstr ""
msgid "New article"
msgstr ""
msgid "Edit"
msgstr "Redakti"
msgid "There's one author on this blog: "
msgid_plural "There are {0} authors on this blog: "
msgstr[0] ""
msgstr[1] ""
msgid "No posts to see here yet."
msgstr ""
msgid "New Blog"
msgstr ""
msgid "Create a blog"
msgstr ""
msgid "Create blog"
msgstr "Krei blogon"
msgid "Articles tagged \"{0}\""
msgstr ""
msgid "There are currently no articles with such a tag"
msgstr ""
msgid "Written by {0}"
msgstr ""
msgid "Are you sure?"
msgstr ""
msgid "Delete this article"
msgstr ""
msgid "Draft"
msgstr ""
msgid "All rights reserved."
msgstr ""
msgid "This article is under the {0} license."
msgstr ""
msgid "Unsubscribe"
msgstr "Malaboni"
msgid "Subscribe"
msgstr "Aboni"
msgid "One like"
msgid_plural "{0} likes"
msgstr[0] ""
msgstr[1] ""
msgid "I don't like this anymore"
msgstr ""
msgid "Add yours"
msgstr ""
msgid "One boost"
msgid_plural "{0} boosts"
msgstr[0] ""
msgstr[1] ""
msgid "I don't want to boost this anymore"
msgstr ""
msgid "Boost"
msgstr ""
msgid ""
"{0}Log in{1}, or {2}use your Fediverse account{3} to interact with this "
"article"
msgstr ""
msgid "Comments"
msgstr ""
# src/template_utils.rs:217
msgid "Content warning"
msgstr ""
msgid "Your comment"
msgstr ""
msgid "Submit comment"
msgstr ""
msgid "No comments yet. Be the first to react!"
msgstr ""
msgid "Interact with {}"
msgstr ""
msgid "Log in to interact"
msgstr ""
msgid "Enter your full username to interact"
msgstr ""
msgid "Publish"
msgstr "Eldoni"
msgid "Classic editor (any changes will be lost)"
msgstr ""
# src/template_utils.rs:217
msgid "Subtitle"
msgstr ""
msgid "Content"
msgstr ""
msgid ""
"You can upload media to your gallery, and then copy their Markdown code into "
"your articles to insert them."
msgstr ""
msgid "Upload media"
msgstr ""
# src/template_utils.rs:217
msgid "Tags, separated by commas"
msgstr ""
# src/template_utils.rs:217
msgid "License"
msgstr ""
# src/template_utils.rs:225
msgid "Leave it empty to reserve all rights"
msgstr ""
msgid "Illustration"
msgstr ""
msgid "This is a draft, don't publish it yet."
msgstr ""
msgid "Update"
msgstr ""
msgid "Update, or publish"
msgstr ""
msgid "Publish your post"
msgstr ""
msgid "I'm from this instance"
msgstr ""
msgid "I'm from another instance"
msgstr ""
# src/template_utils.rs:217
msgid "Username"
msgstr "Uzantnomo"
# src/template_utils.rs:225
msgid "Example: user@plu.me"
msgstr ""
msgid "Continue to your instance"
msgstr ""
msgid "View all"
msgstr ""
msgid "By {0}"
msgstr ""
msgid "What is Plume?"
msgstr ""
msgid "Plume is a decentralized blogging engine."
msgstr ""
msgid "Authors can manage multiple blogs, each as its own website."
msgstr ""
msgid ""
"Articles are also visible on other Plume instances, and you can interact "
"with them directly from other platforms like Mastodon."
msgstr ""
msgid "Create your account"
msgstr ""
msgid "Read the detailed rules"
msgstr ""
msgid "Respond"
msgstr "Respondi"
msgid "Delete this comment"
msgstr ""
msgid "None"
msgstr ""
msgid "No description"
msgstr ""
msgid "Notifications"
msgstr ""
msgid "Plume"
msgstr ""
msgid "Menu"
msgstr ""
msgid "Dashboard"
msgstr ""
msgid "Log Out"
msgstr "Elsaluti"
msgid "My account"
msgstr "Mia konto"
msgid "Log In"
msgstr "Ensaluti"
msgid "Register"
msgstr ""
msgid "About this instance"
msgstr ""
msgid "Source code"
msgstr ""
msgid "Matrix room"
msgstr ""
msgid "Your media"
msgstr ""
msgid "Upload"
msgstr ""
msgid "You don't have any media yet."
msgstr ""
msgid "Content warning: {0}"
msgstr ""
msgid "Delete"
msgstr ""
msgid "Details"
msgstr ""
msgid "Media details"
msgstr ""
msgid "Go back to the gallery"
msgstr ""
msgid "Markdown syntax"
msgstr ""
msgid "Copy it into your articles, to insert this media:"
msgstr ""
msgid "Use as an avatar"
msgstr ""
msgid "Media upload"
msgstr ""
msgid "Useful for visually impaired people, as well as licensing information"
msgstr ""
msgid "Leave it empty, if none is needed"
msgstr ""
msgid "File"
msgstr ""
msgid "Send"
msgstr "Sendi"
msgid "{0}'s subscriptions"
msgstr ""
msgid "Articles"
msgstr ""
msgid "Subscribers"
msgstr ""
msgid "Subscriptions"
msgstr ""
msgid "Your Dashboard"
msgstr ""
msgid "Your Blogs"
msgstr "Viaj Blogoj"
msgid "You don't have any blog yet. Create your own, or ask to join one."
msgstr ""
msgid "Start a new blog"
msgstr "Ekigi novan blogon"
msgid "Your Drafts"
msgstr ""
msgid "Go to your gallery"
msgstr ""
msgid "Admin"
msgstr "Administristo"
msgid "It is you"
msgstr "Ĝi estas vi"
msgid "Edit your profile"
msgstr "Redakti vian profilon"
msgid "Open on {0}"
msgstr "Malfermi en {0}"
msgid "{0}'s subscribers"
msgstr ""
msgid "Edit your account"
msgstr ""
msgid "Your Profile"
msgstr "Via profilo"
msgid ""
"To change your avatar, upload it to your gallery and then select from there."
msgstr ""
msgid "Upload an avatar"
msgstr ""
# src/template_utils.rs:217
msgid "Display name"
msgstr ""
# src/template_utils.rs:217
msgid "Email"
msgstr "Retpoŝtadreso"
msgid "Summary"
msgstr ""
msgid "Update account"
msgstr ""
msgid "Be very careful, any action taken here can't be cancelled."
msgstr ""
msgid "Delete your account"
msgstr ""
msgid "Sorry, but as an admin, you can't leave your own instance."
msgstr ""
msgid "Atom feed"
msgstr ""
msgid "Recently boosted"
msgstr ""
msgid "Create an account"
msgstr ""
# src/template_utils.rs:217
msgid "Password confirmation"
msgstr ""
msgid ""
"Apologies, but registrations are closed on this particular instance. You "
"can, however, find a different one."
msgstr ""
msgid "Follow {}"
msgstr ""
msgid "Login to follow"
msgstr ""
msgid "Enter your full username to follow"
msgstr ""
msgid "Internal server error"
msgstr ""
msgid "Something broke on our side."
msgstr ""
msgid "Sorry about that. If you think this is a bug, please report it."
msgstr ""
msgid "Page not found"
msgstr ""
msgid "We couldn't find this page."
msgstr ""
msgid "The link that led you here may be broken."
msgstr ""
msgid "Invalid CSRF token"
msgstr ""
msgid ""
"Something is wrong with your CSRF token. Make sure cookies are enabled in "
"you browser, and try reloading this page. If you continue to see this error "
"message, please report it."
msgstr ""
msgid "You are not authorized."
msgstr ""
msgid "The content you sent can't be processed."
msgstr ""
msgid "Maybe it was too long."
msgstr "Eble ĝi estis tro longa."

File diff suppressed because it is too large Load diff

807
po/plume/fa.po Normal file
View file

@ -0,0 +1,807 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-18 06:16\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Persian\n"
"Language: fa_IR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: fa\n"
"X-Crowdin-File: /master/po/plume/plume.pot\n"
# src/template_utils.rs:68
msgid "{0} commented on your article."
msgstr ""
# src/template_utils.rs:69
msgid "{0} is subscribed to you."
msgstr ""
# src/template_utils.rs:70
msgid "{0} liked your article."
msgstr ""
# src/template_utils.rs:71
msgid "{0} mentioned you."
msgstr ""
# src/template_utils.rs:72
msgid "{0} boosted your article."
msgstr ""
# src/template_utils.rs:108
msgid "{0}'s avatar"
msgstr ""
# src/routes/blogs.rs:70
msgid "To create a new blog, you need to be logged in"
msgstr ""
# src/routes/blogs.rs:109
msgid "A blog with the same name already exists."
msgstr ""
# src/routes/blogs.rs:172
msgid "You are not allowed to delete this blog."
msgstr ""
# src/routes/blogs.rs:217
msgid "You are not allowed to edit this blog."
msgstr ""
# src/routes/blogs.rs:262
msgid "You can't use this media as a blog icon."
msgstr ""
# src/routes/blogs.rs:280
msgid "You can't use this media as a blog banner."
msgstr ""
# src/routes/likes.rs:51
msgid "To like a post, you need to be logged in"
msgstr ""
# src/routes/notifications.rs:29
msgid "To see your notifications, you need to be logged in"
msgstr ""
# src/routes/posts.rs:93
msgid "This post isn't published yet."
msgstr ""
# src/routes/posts.rs:122
msgid "To write a new post, you need to be logged in"
msgstr ""
# src/routes/posts.rs:140
msgid "You are not an author of this blog."
msgstr ""
# src/routes/posts.rs:147
msgid "New post"
msgstr ""
# src/routes/posts.rs:192
msgid "Edit {0}"
msgstr ""
# src/routes/posts.rs:630
msgid "Couldn't obtain enough information about your account. Please make sure your username is correct."
msgstr ""
# src/routes/reshares.rs:51
msgid "To reshare a post, you need to be logged in"
msgstr ""
# src/routes/session.rs:181
msgid "Password reset"
msgstr ""
# src/routes/session.rs:182
msgid "Here is the link to reset your password: {0}"
msgstr ""
# src/routes/session.rs:259
msgid "Your password was successfully reset."
msgstr ""
# src/routes/session.rs:263
msgid "Sorry, but the link expired. Try again"
msgstr ""
# src/routes/user.rs:136
msgid "To access your dashboard, you need to be logged in"
msgstr ""
# src/routes/user.rs:244
msgid "To subscribe to someone, you need to be logged in"
msgstr ""
# src/routes/user.rs:344
msgid "To edit your profile, you need to be logged in"
msgstr ""
msgid "Reset your password"
msgstr ""
# src/template_utils.rs:217
msgid "E-mail"
msgstr ""
# src/template_utils.rs:220
msgid "Optional"
msgstr ""
msgid "Send password reset link"
msgstr ""
msgid "Check your inbox!"
msgstr ""
msgid "We sent a mail to the address you gave us, with a link to reset your password."
msgstr ""
msgid "Log in"
msgstr ""
# src/template_utils.rs:217
msgid "Username, or email"
msgstr ""
# src/template_utils.rs:217
msgid "Password"
msgstr ""
# src/template_utils.rs:217
msgid "New password"
msgstr ""
# src/template_utils.rs:217
msgid "Confirmation"
msgstr ""
msgid "Update password"
msgstr ""
msgid "Administration of {0}"
msgstr ""
msgid "Instances"
msgstr ""
msgid "Configuration"
msgstr ""
msgid "Users"
msgstr ""
msgid "Unblock"
msgstr ""
msgid "Block"
msgstr ""
msgid "About {0}"
msgstr ""
msgid "Home to <em>{0}</em> people"
msgstr ""
msgid "Who wrote <em>{0}</em> articles"
msgstr ""
msgid "And are connected to <em>{0}</em> other instances"
msgstr ""
msgid "Administred by"
msgstr ""
msgid "Runs Plume {0}"
msgstr ""
msgid "All the articles of the Fediverse"
msgstr ""
msgid "Latest articles"
msgstr ""
msgid "Your feed"
msgstr ""
msgid "Federated feed"
msgstr ""
msgid "Local feed"
msgstr ""
msgid "Welcome to {}"
msgstr ""
msgid "Articles from {}"
msgstr ""
msgid "Ban"
msgstr ""
msgid "Nothing to see here yet. Try subscribing to more people."
msgstr ""
msgid "Administration"
msgstr ""
# src/template_utils.rs:217
msgid "Name"
msgstr ""
msgid "Allow anyone to register here"
msgstr ""
msgid "Short description"
msgstr ""
msgid "Markdown syntax is supported"
msgstr ""
msgid "Long description"
msgstr ""
# src/template_utils.rs:217
msgid "Default article license"
msgstr ""
msgid "Save these settings"
msgstr ""
msgid "Search"
msgstr ""
msgid "Your query"
msgstr ""
msgid "Advanced search"
msgstr ""
# src/template_utils.rs:305
msgid "Article title matching these words"
msgstr ""
msgid "Title"
msgstr ""
# src/template_utils.rs:305
msgid "Subtitle matching these words"
msgstr ""
msgid "Subtitle - byline"
msgstr ""
# src/template_utils.rs:305
msgid "Content matching these words"
msgstr ""
msgid "Body content"
msgstr ""
# src/template_utils.rs:305
msgid "From this date"
msgstr ""
# src/template_utils.rs:305
msgid "To this date"
msgstr ""
# src/template_utils.rs:305
msgid "Containing these tags"
msgstr ""
msgid "Tags"
msgstr ""
# src/template_utils.rs:305
msgid "Posted on one of these instances"
msgstr ""
msgid "Instance domain"
msgstr ""
# src/template_utils.rs:305
msgid "Posted by one of these authors"
msgstr ""
msgid "Authors"
msgstr ""
# src/template_utils.rs:305
msgid "Posted on one of these blogs"
msgstr ""
msgid "Blog title"
msgstr ""
# src/template_utils.rs:305
msgid "Written in this language"
msgstr ""
msgid "Language"
msgstr ""
# src/template_utils.rs:305
msgid "Published under this license"
msgstr ""
msgid "Article license"
msgstr ""
msgid "Search result for \"{0}\""
msgstr ""
msgid "Search result"
msgstr ""
msgid "No result for your query"
msgstr ""
msgid "No more results for your query"
msgstr ""
msgid "Edit \"{}\""
msgstr ""
msgid "Description"
msgstr ""
msgid "You can upload images to your gallery, to use them as blog icons, or banners."
msgstr ""
msgid "Upload images"
msgstr ""
msgid "Blog icon"
msgstr ""
msgid "Blog banner"
msgstr ""
msgid "Update blog"
msgstr ""
msgid "Danger zone"
msgstr ""
msgid "Be very careful, any action taken here can't be reversed."
msgstr ""
msgid "Permanently delete this blog"
msgstr ""
msgid "{}'s icon"
msgstr ""
msgid "New article"
msgstr ""
msgid "Edit"
msgstr ""
msgid "There's one author on this blog: "
msgid_plural "There are {0} authors on this blog: "
msgstr[0] ""
msgstr[1] ""
msgid "No posts to see here yet."
msgstr ""
msgid "New Blog"
msgstr ""
msgid "Create a blog"
msgstr ""
msgid "Create blog"
msgstr ""
msgid "Articles tagged \"{0}\""
msgstr ""
msgid "There are currently no articles with such a tag"
msgstr ""
msgid "Written by {0}"
msgstr ""
msgid "Are you sure?"
msgstr ""
msgid "Delete this article"
msgstr ""
msgid "Draft"
msgstr ""
msgid "All rights reserved."
msgstr ""
msgid "This article is under the {0} license."
msgstr ""
msgid "Unsubscribe"
msgstr ""
msgid "Subscribe"
msgstr ""
msgid "One like"
msgid_plural "{0} likes"
msgstr[0] ""
msgstr[1] ""
msgid "I don't like this anymore"
msgstr ""
msgid "Add yours"
msgstr ""
msgid "One boost"
msgid_plural "{0} boosts"
msgstr[0] ""
msgstr[1] ""
msgid "I don't want to boost this anymore"
msgstr ""
msgid "Boost"
msgstr ""
msgid "{0}Log in{1}, or {2}use your Fediverse account{3} to interact with this article"
msgstr ""
msgid "Comments"
msgstr ""
# src/template_utils.rs:217
msgid "Content warning"
msgstr ""
msgid "Your comment"
msgstr ""
msgid "Submit comment"
msgstr ""
msgid "No comments yet. Be the first to react!"
msgstr ""
msgid "Interact with {}"
msgstr ""
msgid "Log in to interact"
msgstr ""
msgid "Enter your full username to interact"
msgstr ""
msgid "Publish"
msgstr ""
msgid "Classic editor (any changes will be lost)"
msgstr ""
# src/template_utils.rs:217
msgid "Subtitle"
msgstr ""
msgid "Content"
msgstr ""
msgid "You can upload media to your gallery, and then copy their Markdown code into your articles to insert them."
msgstr ""
msgid "Upload media"
msgstr ""
# src/template_utils.rs:217
msgid "Tags, separated by commas"
msgstr ""
# src/template_utils.rs:217
msgid "License"
msgstr ""
# src/template_utils.rs:225
msgid "Leave it empty to reserve all rights"
msgstr ""
msgid "Illustration"
msgstr ""
msgid "This is a draft, don't publish it yet."
msgstr ""
msgid "Update"
msgstr ""
msgid "Update, or publish"
msgstr ""
msgid "Publish your post"
msgstr ""
msgid "I'm from this instance"
msgstr ""
msgid "I'm from another instance"
msgstr ""
# src/template_utils.rs:217
msgid "Username"
msgstr ""
# src/template_utils.rs:225
msgid "Example: user@plu.me"
msgstr ""
msgid "Continue to your instance"
msgstr ""
msgid "View all"
msgstr ""
msgid "By {0}"
msgstr ""
msgid "What is Plume?"
msgstr ""
msgid "Plume is a decentralized blogging engine."
msgstr ""
msgid "Authors can manage multiple blogs, each as its own website."
msgstr ""
msgid "Articles are also visible on other Plume instances, and you can interact with them directly from other platforms like Mastodon."
msgstr ""
msgid "Create your account"
msgstr ""
msgid "Read the detailed rules"
msgstr ""
msgid "Respond"
msgstr ""
msgid "Delete this comment"
msgstr ""
msgid "None"
msgstr ""
msgid "No description"
msgstr ""
msgid "Notifications"
msgstr ""
msgid "Plume"
msgstr ""
msgid "Menu"
msgstr ""
msgid "Dashboard"
msgstr ""
msgid "Log Out"
msgstr ""
msgid "My account"
msgstr ""
msgid "Log In"
msgstr ""
msgid "Register"
msgstr ""
msgid "About this instance"
msgstr ""
msgid "Source code"
msgstr ""
msgid "Matrix room"
msgstr ""
msgid "Your media"
msgstr ""
msgid "Upload"
msgstr ""
msgid "You don't have any media yet."
msgstr ""
msgid "Content warning: {0}"
msgstr ""
msgid "Delete"
msgstr ""
msgid "Details"
msgstr ""
msgid "Media details"
msgstr ""
msgid "Go back to the gallery"
msgstr ""
msgid "Markdown syntax"
msgstr ""
msgid "Copy it into your articles, to insert this media:"
msgstr ""
msgid "Use as an avatar"
msgstr ""
msgid "Media upload"
msgstr ""
msgid "Useful for visually impaired people, as well as licensing information"
msgstr ""
msgid "Leave it empty, if none is needed"
msgstr ""
msgid "File"
msgstr ""
msgid "Send"
msgstr ""
msgid "{0}'s subscriptions"
msgstr ""
msgid "Articles"
msgstr ""
msgid "Subscribers"
msgstr ""
msgid "Subscriptions"
msgstr ""
msgid "Your Dashboard"
msgstr ""
msgid "Your Blogs"
msgstr ""
msgid "You don't have any blog yet. Create your own, or ask to join one."
msgstr ""
msgid "Start a new blog"
msgstr ""
msgid "Your Drafts"
msgstr ""
msgid "Go to your gallery"
msgstr ""
msgid "Admin"
msgstr ""
msgid "It is you"
msgstr ""
msgid "Edit your profile"
msgstr ""
msgid "Open on {0}"
msgstr ""
msgid "{0}'s subscribers"
msgstr ""
msgid "Edit your account"
msgstr ""
msgid "Your Profile"
msgstr ""
msgid "To change your avatar, upload it to your gallery and then select from there."
msgstr ""
msgid "Upload an avatar"
msgstr ""
# src/template_utils.rs:217
msgid "Display name"
msgstr ""
# src/template_utils.rs:217
msgid "Email"
msgstr ""
msgid "Summary"
msgstr ""
msgid "Update account"
msgstr ""
msgid "Be very careful, any action taken here can't be cancelled."
msgstr ""
msgid "Delete your account"
msgstr ""
msgid "Sorry, but as an admin, you can't leave your own instance."
msgstr ""
msgid "Atom feed"
msgstr ""
msgid "Recently boosted"
msgstr ""
msgid "Create an account"
msgstr ""
# src/template_utils.rs:217
msgid "Password confirmation"
msgstr ""
msgid "Apologies, but registrations are closed on this particular instance. You can, however, find a different one."
msgstr ""
msgid "Follow {}"
msgstr ""
msgid "Login to follow"
msgstr ""
msgid "Enter your full username to follow"
msgstr ""
msgid "Internal server error"
msgstr ""
msgid "Something broke on our side."
msgstr ""
msgid "Sorry about that. If you think this is a bug, please report it."
msgstr ""
msgid "Page not found"
msgstr ""
msgid "We couldn't find this page."
msgstr ""
msgid "The link that led you here may be broken."
msgstr ""
msgid "Invalid CSRF token"
msgstr ""
msgid "Something is wrong with your CSRF token. Make sure cookies are enabled in you browser, and try reloading this page. If you continue to see this error message, please report it."
msgstr ""
msgid "You are not authorized."
msgstr ""
msgid "The content you sent can't be processed."
msgstr ""
msgid "Maybe it was too long."
msgstr ""

807
po/plume/fi.po Normal file
View file

@ -0,0 +1,807 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 20:49\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Finnish\n"
"Language: fi_FI\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: fi\n"
"X-Crowdin-File: /master/po/plume/plume.pot\n"
# src/template_utils.rs:68
msgid "{0} commented on your article."
msgstr ""
# src/template_utils.rs:69
msgid "{0} is subscribed to you."
msgstr ""
# src/template_utils.rs:70
msgid "{0} liked your article."
msgstr ""
# src/template_utils.rs:71
msgid "{0} mentioned you."
msgstr ""
# src/template_utils.rs:72
msgid "{0} boosted your article."
msgstr ""
# src/template_utils.rs:108
msgid "{0}'s avatar"
msgstr ""
# src/routes/blogs.rs:70
msgid "To create a new blog, you need to be logged in"
msgstr ""
# src/routes/blogs.rs:109
msgid "A blog with the same name already exists."
msgstr ""
# src/routes/blogs.rs:172
msgid "You are not allowed to delete this blog."
msgstr ""
# src/routes/blogs.rs:217
msgid "You are not allowed to edit this blog."
msgstr ""
# src/routes/blogs.rs:262
msgid "You can't use this media as a blog icon."
msgstr ""
# src/routes/blogs.rs:280
msgid "You can't use this media as a blog banner."
msgstr ""
# src/routes/likes.rs:51
msgid "To like a post, you need to be logged in"
msgstr ""
# src/routes/notifications.rs:29
msgid "To see your notifications, you need to be logged in"
msgstr ""
# src/routes/posts.rs:93
msgid "This post isn't published yet."
msgstr ""
# src/routes/posts.rs:122
msgid "To write a new post, you need to be logged in"
msgstr ""
# src/routes/posts.rs:140
msgid "You are not an author of this blog."
msgstr ""
# src/routes/posts.rs:147
msgid "New post"
msgstr ""
# src/routes/posts.rs:192
msgid "Edit {0}"
msgstr ""
# src/routes/posts.rs:630
msgid "Couldn't obtain enough information about your account. Please make sure your username is correct."
msgstr ""
# src/routes/reshares.rs:51
msgid "To reshare a post, you need to be logged in"
msgstr ""
# src/routes/session.rs:181
msgid "Password reset"
msgstr ""
# src/routes/session.rs:182
msgid "Here is the link to reset your password: {0}"
msgstr ""
# src/routes/session.rs:259
msgid "Your password was successfully reset."
msgstr ""
# src/routes/session.rs:263
msgid "Sorry, but the link expired. Try again"
msgstr ""
# src/routes/user.rs:136
msgid "To access your dashboard, you need to be logged in"
msgstr ""
# src/routes/user.rs:244
msgid "To subscribe to someone, you need to be logged in"
msgstr ""
# src/routes/user.rs:344
msgid "To edit your profile, you need to be logged in"
msgstr ""
msgid "Reset your password"
msgstr ""
# src/template_utils.rs:217
msgid "E-mail"
msgstr ""
# src/template_utils.rs:220
msgid "Optional"
msgstr ""
msgid "Send password reset link"
msgstr ""
msgid "Check your inbox!"
msgstr ""
msgid "We sent a mail to the address you gave us, with a link to reset your password."
msgstr ""
msgid "Log in"
msgstr ""
# src/template_utils.rs:217
msgid "Username, or email"
msgstr ""
# src/template_utils.rs:217
msgid "Password"
msgstr ""
# src/template_utils.rs:217
msgid "New password"
msgstr ""
# src/template_utils.rs:217
msgid "Confirmation"
msgstr ""
msgid "Update password"
msgstr ""
msgid "Administration of {0}"
msgstr ""
msgid "Instances"
msgstr ""
msgid "Configuration"
msgstr ""
msgid "Users"
msgstr ""
msgid "Unblock"
msgstr ""
msgid "Block"
msgstr ""
msgid "About {0}"
msgstr ""
msgid "Home to <em>{0}</em> people"
msgstr ""
msgid "Who wrote <em>{0}</em> articles"
msgstr ""
msgid "And are connected to <em>{0}</em> other instances"
msgstr ""
msgid "Administred by"
msgstr ""
msgid "Runs Plume {0}"
msgstr ""
msgid "All the articles of the Fediverse"
msgstr ""
msgid "Latest articles"
msgstr ""
msgid "Your feed"
msgstr ""
msgid "Federated feed"
msgstr ""
msgid "Local feed"
msgstr ""
msgid "Welcome to {}"
msgstr ""
msgid "Articles from {}"
msgstr ""
msgid "Ban"
msgstr ""
msgid "Nothing to see here yet. Try subscribing to more people."
msgstr ""
msgid "Administration"
msgstr ""
# src/template_utils.rs:217
msgid "Name"
msgstr ""
msgid "Allow anyone to register here"
msgstr ""
msgid "Short description"
msgstr ""
msgid "Markdown syntax is supported"
msgstr ""
msgid "Long description"
msgstr ""
# src/template_utils.rs:217
msgid "Default article license"
msgstr ""
msgid "Save these settings"
msgstr ""
msgid "Search"
msgstr ""
msgid "Your query"
msgstr ""
msgid "Advanced search"
msgstr ""
# src/template_utils.rs:305
msgid "Article title matching these words"
msgstr ""
msgid "Title"
msgstr ""
# src/template_utils.rs:305
msgid "Subtitle matching these words"
msgstr ""
msgid "Subtitle - byline"
msgstr ""
# src/template_utils.rs:305
msgid "Content matching these words"
msgstr ""
msgid "Body content"
msgstr ""
# src/template_utils.rs:305
msgid "From this date"
msgstr ""
# src/template_utils.rs:305
msgid "To this date"
msgstr ""
# src/template_utils.rs:305
msgid "Containing these tags"
msgstr ""
msgid "Tags"
msgstr ""
# src/template_utils.rs:305
msgid "Posted on one of these instances"
msgstr ""
msgid "Instance domain"
msgstr ""
# src/template_utils.rs:305
msgid "Posted by one of these authors"
msgstr ""
msgid "Authors"
msgstr ""
# src/template_utils.rs:305
msgid "Posted on one of these blogs"
msgstr ""
msgid "Blog title"
msgstr ""
# src/template_utils.rs:305
msgid "Written in this language"
msgstr ""
msgid "Language"
msgstr ""
# src/template_utils.rs:305
msgid "Published under this license"
msgstr ""
msgid "Article license"
msgstr ""
msgid "Search result for \"{0}\""
msgstr ""
msgid "Search result"
msgstr ""
msgid "No result for your query"
msgstr ""
msgid "No more results for your query"
msgstr ""
msgid "Edit \"{}\""
msgstr ""
msgid "Description"
msgstr ""
msgid "You can upload images to your gallery, to use them as blog icons, or banners."
msgstr ""
msgid "Upload images"
msgstr ""
msgid "Blog icon"
msgstr ""
msgid "Blog banner"
msgstr ""
msgid "Update blog"
msgstr ""
msgid "Danger zone"
msgstr ""
msgid "Be very careful, any action taken here can't be reversed."
msgstr ""
msgid "Permanently delete this blog"
msgstr ""
msgid "{}'s icon"
msgstr ""
msgid "New article"
msgstr ""
msgid "Edit"
msgstr ""
msgid "There's one author on this blog: "
msgid_plural "There are {0} authors on this blog: "
msgstr[0] ""
msgstr[1] ""
msgid "No posts to see here yet."
msgstr ""
msgid "New Blog"
msgstr ""
msgid "Create a blog"
msgstr ""
msgid "Create blog"
msgstr ""
msgid "Articles tagged \"{0}\""
msgstr ""
msgid "There are currently no articles with such a tag"
msgstr ""
msgid "Written by {0}"
msgstr ""
msgid "Are you sure?"
msgstr ""
msgid "Delete this article"
msgstr ""
msgid "Draft"
msgstr ""
msgid "All rights reserved."
msgstr ""
msgid "This article is under the {0} license."
msgstr ""
msgid "Unsubscribe"
msgstr ""
msgid "Subscribe"
msgstr ""
msgid "One like"
msgid_plural "{0} likes"
msgstr[0] ""
msgstr[1] ""
msgid "I don't like this anymore"
msgstr ""
msgid "Add yours"
msgstr ""
msgid "One boost"
msgid_plural "{0} boosts"
msgstr[0] ""
msgstr[1] ""
msgid "I don't want to boost this anymore"
msgstr ""
msgid "Boost"
msgstr ""
msgid "{0}Log in{1}, or {2}use your Fediverse account{3} to interact with this article"
msgstr ""
msgid "Comments"
msgstr ""
# src/template_utils.rs:217
msgid "Content warning"
msgstr ""
msgid "Your comment"
msgstr ""
msgid "Submit comment"
msgstr ""
msgid "No comments yet. Be the first to react!"
msgstr ""
msgid "Interact with {}"
msgstr ""
msgid "Log in to interact"
msgstr ""
msgid "Enter your full username to interact"
msgstr ""
msgid "Publish"
msgstr ""
msgid "Classic editor (any changes will be lost)"
msgstr ""
# src/template_utils.rs:217
msgid "Subtitle"
msgstr ""
msgid "Content"
msgstr ""
msgid "You can upload media to your gallery, and then copy their Markdown code into your articles to insert them."
msgstr ""
msgid "Upload media"
msgstr ""
# src/template_utils.rs:217
msgid "Tags, separated by commas"
msgstr ""
# src/template_utils.rs:217
msgid "License"
msgstr ""
# src/template_utils.rs:225
msgid "Leave it empty to reserve all rights"
msgstr ""
msgid "Illustration"
msgstr ""
msgid "This is a draft, don't publish it yet."
msgstr ""
msgid "Update"
msgstr ""
msgid "Update, or publish"
msgstr ""
msgid "Publish your post"
msgstr ""
msgid "I'm from this instance"
msgstr ""
msgid "I'm from another instance"
msgstr ""
# src/template_utils.rs:217
msgid "Username"
msgstr ""
# src/template_utils.rs:225
msgid "Example: user@plu.me"
msgstr ""
msgid "Continue to your instance"
msgstr ""
msgid "View all"
msgstr ""
msgid "By {0}"
msgstr ""
msgid "What is Plume?"
msgstr ""
msgid "Plume is a decentralized blogging engine."
msgstr ""
msgid "Authors can manage multiple blogs, each as its own website."
msgstr ""
msgid "Articles are also visible on other Plume instances, and you can interact with them directly from other platforms like Mastodon."
msgstr ""
msgid "Create your account"
msgstr ""
msgid "Read the detailed rules"
msgstr ""
msgid "Respond"
msgstr ""
msgid "Delete this comment"
msgstr ""
msgid "None"
msgstr ""
msgid "No description"
msgstr ""
msgid "Notifications"
msgstr ""
msgid "Plume"
msgstr ""
msgid "Menu"
msgstr ""
msgid "Dashboard"
msgstr ""
msgid "Log Out"
msgstr ""
msgid "My account"
msgstr ""
msgid "Log In"
msgstr ""
msgid "Register"
msgstr ""
msgid "About this instance"
msgstr ""
msgid "Source code"
msgstr ""
msgid "Matrix room"
msgstr ""
msgid "Your media"
msgstr ""
msgid "Upload"
msgstr ""
msgid "You don't have any media yet."
msgstr ""
msgid "Content warning: {0}"
msgstr ""
msgid "Delete"
msgstr ""
msgid "Details"
msgstr ""
msgid "Media details"
msgstr ""
msgid "Go back to the gallery"
msgstr ""
msgid "Markdown syntax"
msgstr ""
msgid "Copy it into your articles, to insert this media:"
msgstr ""
msgid "Use as an avatar"
msgstr ""
msgid "Media upload"
msgstr ""
msgid "Useful for visually impaired people, as well as licensing information"
msgstr ""
msgid "Leave it empty, if none is needed"
msgstr ""
msgid "File"
msgstr ""
msgid "Send"
msgstr ""
msgid "{0}'s subscriptions"
msgstr ""
msgid "Articles"
msgstr ""
msgid "Subscribers"
msgstr ""
msgid "Subscriptions"
msgstr ""
msgid "Your Dashboard"
msgstr ""
msgid "Your Blogs"
msgstr ""
msgid "You don't have any blog yet. Create your own, or ask to join one."
msgstr ""
msgid "Start a new blog"
msgstr ""
msgid "Your Drafts"
msgstr ""
msgid "Go to your gallery"
msgstr ""
msgid "Admin"
msgstr ""
msgid "It is you"
msgstr ""
msgid "Edit your profile"
msgstr ""
msgid "Open on {0}"
msgstr ""
msgid "{0}'s subscribers"
msgstr ""
msgid "Edit your account"
msgstr ""
msgid "Your Profile"
msgstr ""
msgid "To change your avatar, upload it to your gallery and then select from there."
msgstr ""
msgid "Upload an avatar"
msgstr ""
# src/template_utils.rs:217
msgid "Display name"
msgstr ""
# src/template_utils.rs:217
msgid "Email"
msgstr ""
msgid "Summary"
msgstr ""
msgid "Update account"
msgstr ""
msgid "Be very careful, any action taken here can't be cancelled."
msgstr ""
msgid "Delete your account"
msgstr ""
msgid "Sorry, but as an admin, you can't leave your own instance."
msgstr ""
msgid "Atom feed"
msgstr ""
msgid "Recently boosted"
msgstr ""
msgid "Create an account"
msgstr ""
# src/template_utils.rs:217
msgid "Password confirmation"
msgstr ""
msgid "Apologies, but registrations are closed on this particular instance. You can, however, find a different one."
msgstr ""
msgid "Follow {}"
msgstr ""
msgid "Login to follow"
msgstr ""
msgid "Enter your full username to follow"
msgstr ""
msgid "Internal server error"
msgstr ""
msgid "Something broke on our side."
msgstr ""
msgid "Sorry about that. If you think this is a bug, please report it."
msgstr ""
msgid "Page not found"
msgstr ""
msgid "We couldn't find this page."
msgstr ""
msgid "The link that led you here may be broken."
msgstr ""
msgid "Invalid CSRF token"
msgstr ""
msgid "Something is wrong with your CSRF token. Make sure cookies are enabled in you browser, and try reloading this page. If you continue to see this error message, please report it."
msgstr ""
msgid "You are not authorized."
msgstr ""
msgid "The content you sent can't be processed."
msgstr ""
msgid "Maybe it was too long."
msgstr ""

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

813
po/plume/he.po Normal file
View file

@ -0,0 +1,813 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 20:49\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Hebrew\n"
"Language: he_IL\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3;\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: he\n"
"X-Crowdin-File: /master/po/plume/plume.pot\n"
# src/template_utils.rs:68
msgid "{0} commented on your article."
msgstr ""
# src/template_utils.rs:69
msgid "{0} is subscribed to you."
msgstr ""
# src/template_utils.rs:70
msgid "{0} liked your article."
msgstr ""
# src/template_utils.rs:71
msgid "{0} mentioned you."
msgstr ""
# src/template_utils.rs:72
msgid "{0} boosted your article."
msgstr ""
# src/template_utils.rs:108
msgid "{0}'s avatar"
msgstr ""
# src/routes/blogs.rs:70
msgid "To create a new blog, you need to be logged in"
msgstr ""
# src/routes/blogs.rs:109
msgid "A blog with the same name already exists."
msgstr ""
# src/routes/blogs.rs:172
msgid "You are not allowed to delete this blog."
msgstr ""
# src/routes/blogs.rs:217
msgid "You are not allowed to edit this blog."
msgstr ""
# src/routes/blogs.rs:262
msgid "You can't use this media as a blog icon."
msgstr ""
# src/routes/blogs.rs:280
msgid "You can't use this media as a blog banner."
msgstr ""
# src/routes/likes.rs:51
msgid "To like a post, you need to be logged in"
msgstr ""
# src/routes/notifications.rs:29
msgid "To see your notifications, you need to be logged in"
msgstr ""
# src/routes/posts.rs:93
msgid "This post isn't published yet."
msgstr ""
# src/routes/posts.rs:122
msgid "To write a new post, you need to be logged in"
msgstr ""
# src/routes/posts.rs:140
msgid "You are not an author of this blog."
msgstr ""
# src/routes/posts.rs:147
msgid "New post"
msgstr ""
# src/routes/posts.rs:192
msgid "Edit {0}"
msgstr ""
# src/routes/posts.rs:630
msgid "Couldn't obtain enough information about your account. Please make sure your username is correct."
msgstr ""
# src/routes/reshares.rs:51
msgid "To reshare a post, you need to be logged in"
msgstr ""
# src/routes/session.rs:181
msgid "Password reset"
msgstr ""
# src/routes/session.rs:182
msgid "Here is the link to reset your password: {0}"
msgstr ""
# src/routes/session.rs:259
msgid "Your password was successfully reset."
msgstr ""
# src/routes/session.rs:263
msgid "Sorry, but the link expired. Try again"
msgstr ""
# src/routes/user.rs:136
msgid "To access your dashboard, you need to be logged in"
msgstr ""
# src/routes/user.rs:244
msgid "To subscribe to someone, you need to be logged in"
msgstr ""
# src/routes/user.rs:344
msgid "To edit your profile, you need to be logged in"
msgstr ""
msgid "Reset your password"
msgstr ""
# src/template_utils.rs:217
msgid "E-mail"
msgstr ""
# src/template_utils.rs:220
msgid "Optional"
msgstr ""
msgid "Send password reset link"
msgstr ""
msgid "Check your inbox!"
msgstr ""
msgid "We sent a mail to the address you gave us, with a link to reset your password."
msgstr ""
msgid "Log in"
msgstr ""
# src/template_utils.rs:217
msgid "Username, or email"
msgstr ""
# src/template_utils.rs:217
msgid "Password"
msgstr ""
# src/template_utils.rs:217
msgid "New password"
msgstr ""
# src/template_utils.rs:217
msgid "Confirmation"
msgstr ""
msgid "Update password"
msgstr ""
msgid "Administration of {0}"
msgstr ""
msgid "Instances"
msgstr ""
msgid "Configuration"
msgstr ""
msgid "Users"
msgstr ""
msgid "Unblock"
msgstr ""
msgid "Block"
msgstr ""
msgid "About {0}"
msgstr ""
msgid "Home to <em>{0}</em> people"
msgstr ""
msgid "Who wrote <em>{0}</em> articles"
msgstr ""
msgid "And are connected to <em>{0}</em> other instances"
msgstr ""
msgid "Administred by"
msgstr ""
msgid "Runs Plume {0}"
msgstr ""
msgid "All the articles of the Fediverse"
msgstr ""
msgid "Latest articles"
msgstr ""
msgid "Your feed"
msgstr ""
msgid "Federated feed"
msgstr ""
msgid "Local feed"
msgstr ""
msgid "Welcome to {}"
msgstr ""
msgid "Articles from {}"
msgstr ""
msgid "Ban"
msgstr ""
msgid "Nothing to see here yet. Try subscribing to more people."
msgstr ""
msgid "Administration"
msgstr ""
# src/template_utils.rs:217
msgid "Name"
msgstr ""
msgid "Allow anyone to register here"
msgstr ""
msgid "Short description"
msgstr ""
msgid "Markdown syntax is supported"
msgstr ""
msgid "Long description"
msgstr ""
# src/template_utils.rs:217
msgid "Default article license"
msgstr ""
msgid "Save these settings"
msgstr ""
msgid "Search"
msgstr ""
msgid "Your query"
msgstr ""
msgid "Advanced search"
msgstr ""
# src/template_utils.rs:305
msgid "Article title matching these words"
msgstr ""
msgid "Title"
msgstr ""
# src/template_utils.rs:305
msgid "Subtitle matching these words"
msgstr ""
msgid "Subtitle - byline"
msgstr ""
# src/template_utils.rs:305
msgid "Content matching these words"
msgstr ""
msgid "Body content"
msgstr ""
# src/template_utils.rs:305
msgid "From this date"
msgstr ""
# src/template_utils.rs:305
msgid "To this date"
msgstr ""
# src/template_utils.rs:305
msgid "Containing these tags"
msgstr ""
msgid "Tags"
msgstr ""
# src/template_utils.rs:305
msgid "Posted on one of these instances"
msgstr ""
msgid "Instance domain"
msgstr ""
# src/template_utils.rs:305
msgid "Posted by one of these authors"
msgstr ""
msgid "Authors"
msgstr ""
# src/template_utils.rs:305
msgid "Posted on one of these blogs"
msgstr ""
msgid "Blog title"
msgstr ""
# src/template_utils.rs:305
msgid "Written in this language"
msgstr ""
msgid "Language"
msgstr ""
# src/template_utils.rs:305
msgid "Published under this license"
msgstr ""
msgid "Article license"
msgstr ""
msgid "Search result for \"{0}\""
msgstr ""
msgid "Search result"
msgstr ""
msgid "No result for your query"
msgstr ""
msgid "No more results for your query"
msgstr ""
msgid "Edit \"{}\""
msgstr ""
msgid "Description"
msgstr ""
msgid "You can upload images to your gallery, to use them as blog icons, or banners."
msgstr ""
msgid "Upload images"
msgstr ""
msgid "Blog icon"
msgstr ""
msgid "Blog banner"
msgstr ""
msgid "Update blog"
msgstr ""
msgid "Danger zone"
msgstr ""
msgid "Be very careful, any action taken here can't be reversed."
msgstr ""
msgid "Permanently delete this blog"
msgstr ""
msgid "{}'s icon"
msgstr ""
msgid "New article"
msgstr ""
msgid "Edit"
msgstr ""
msgid "There's one author on this blog: "
msgid_plural "There are {0} authors on this blog: "
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
msgid "No posts to see here yet."
msgstr ""
msgid "New Blog"
msgstr ""
msgid "Create a blog"
msgstr ""
msgid "Create blog"
msgstr ""
msgid "Articles tagged \"{0}\""
msgstr ""
msgid "There are currently no articles with such a tag"
msgstr ""
msgid "Written by {0}"
msgstr ""
msgid "Are you sure?"
msgstr ""
msgid "Delete this article"
msgstr ""
msgid "Draft"
msgstr ""
msgid "All rights reserved."
msgstr ""
msgid "This article is under the {0} license."
msgstr ""
msgid "Unsubscribe"
msgstr ""
msgid "Subscribe"
msgstr ""
msgid "One like"
msgid_plural "{0} likes"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
msgid "I don't like this anymore"
msgstr ""
msgid "Add yours"
msgstr ""
msgid "One boost"
msgid_plural "{0} boosts"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
msgid "I don't want to boost this anymore"
msgstr ""
msgid "Boost"
msgstr ""
msgid "{0}Log in{1}, or {2}use your Fediverse account{3} to interact with this article"
msgstr ""
msgid "Comments"
msgstr ""
# src/template_utils.rs:217
msgid "Content warning"
msgstr ""
msgid "Your comment"
msgstr ""
msgid "Submit comment"
msgstr ""
msgid "No comments yet. Be the first to react!"
msgstr ""
msgid "Interact with {}"
msgstr ""
msgid "Log in to interact"
msgstr ""
msgid "Enter your full username to interact"
msgstr ""
msgid "Publish"
msgstr ""
msgid "Classic editor (any changes will be lost)"
msgstr ""
# src/template_utils.rs:217
msgid "Subtitle"
msgstr ""
msgid "Content"
msgstr ""
msgid "You can upload media to your gallery, and then copy their Markdown code into your articles to insert them."
msgstr ""
msgid "Upload media"
msgstr ""
# src/template_utils.rs:217
msgid "Tags, separated by commas"
msgstr ""
# src/template_utils.rs:217
msgid "License"
msgstr ""
# src/template_utils.rs:225
msgid "Leave it empty to reserve all rights"
msgstr ""
msgid "Illustration"
msgstr ""
msgid "This is a draft, don't publish it yet."
msgstr ""
msgid "Update"
msgstr ""
msgid "Update, or publish"
msgstr ""
msgid "Publish your post"
msgstr ""
msgid "I'm from this instance"
msgstr ""
msgid "I'm from another instance"
msgstr ""
# src/template_utils.rs:217
msgid "Username"
msgstr ""
# src/template_utils.rs:225
msgid "Example: user@plu.me"
msgstr ""
msgid "Continue to your instance"
msgstr ""
msgid "View all"
msgstr ""
msgid "By {0}"
msgstr ""
msgid "What is Plume?"
msgstr ""
msgid "Plume is a decentralized blogging engine."
msgstr ""
msgid "Authors can manage multiple blogs, each as its own website."
msgstr ""
msgid "Articles are also visible on other Plume instances, and you can interact with them directly from other platforms like Mastodon."
msgstr ""
msgid "Create your account"
msgstr ""
msgid "Read the detailed rules"
msgstr ""
msgid "Respond"
msgstr ""
msgid "Delete this comment"
msgstr ""
msgid "None"
msgstr ""
msgid "No description"
msgstr ""
msgid "Notifications"
msgstr ""
msgid "Plume"
msgstr ""
msgid "Menu"
msgstr ""
msgid "Dashboard"
msgstr ""
msgid "Log Out"
msgstr ""
msgid "My account"
msgstr ""
msgid "Log In"
msgstr ""
msgid "Register"
msgstr ""
msgid "About this instance"
msgstr ""
msgid "Source code"
msgstr ""
msgid "Matrix room"
msgstr ""
msgid "Your media"
msgstr ""
msgid "Upload"
msgstr ""
msgid "You don't have any media yet."
msgstr ""
msgid "Content warning: {0}"
msgstr ""
msgid "Delete"
msgstr ""
msgid "Details"
msgstr ""
msgid "Media details"
msgstr ""
msgid "Go back to the gallery"
msgstr ""
msgid "Markdown syntax"
msgstr ""
msgid "Copy it into your articles, to insert this media:"
msgstr ""
msgid "Use as an avatar"
msgstr ""
msgid "Media upload"
msgstr ""
msgid "Useful for visually impaired people, as well as licensing information"
msgstr ""
msgid "Leave it empty, if none is needed"
msgstr ""
msgid "File"
msgstr ""
msgid "Send"
msgstr ""
msgid "{0}'s subscriptions"
msgstr ""
msgid "Articles"
msgstr ""
msgid "Subscribers"
msgstr ""
msgid "Subscriptions"
msgstr ""
msgid "Your Dashboard"
msgstr ""
msgid "Your Blogs"
msgstr ""
msgid "You don't have any blog yet. Create your own, or ask to join one."
msgstr ""
msgid "Start a new blog"
msgstr ""
msgid "Your Drafts"
msgstr ""
msgid "Go to your gallery"
msgstr ""
msgid "Admin"
msgstr ""
msgid "It is you"
msgstr ""
msgid "Edit your profile"
msgstr ""
msgid "Open on {0}"
msgstr ""
msgid "{0}'s subscribers"
msgstr ""
msgid "Edit your account"
msgstr ""
msgid "Your Profile"
msgstr ""
msgid "To change your avatar, upload it to your gallery and then select from there."
msgstr ""
msgid "Upload an avatar"
msgstr ""
# src/template_utils.rs:217
msgid "Display name"
msgstr ""
# src/template_utils.rs:217
msgid "Email"
msgstr ""
msgid "Summary"
msgstr ""
msgid "Update account"
msgstr ""
msgid "Be very careful, any action taken here can't be cancelled."
msgstr ""
msgid "Delete your account"
msgstr ""
msgid "Sorry, but as an admin, you can't leave your own instance."
msgstr ""
msgid "Atom feed"
msgstr ""
msgid "Recently boosted"
msgstr ""
msgid "Create an account"
msgstr ""
# src/template_utils.rs:217
msgid "Password confirmation"
msgstr ""
msgid "Apologies, but registrations are closed on this particular instance. You can, however, find a different one."
msgstr ""
msgid "Follow {}"
msgstr ""
msgid "Login to follow"
msgstr ""
msgid "Enter your full username to follow"
msgstr ""
msgid "Internal server error"
msgstr ""
msgid "Something broke on our side."
msgstr ""
msgid "Sorry about that. If you think this is a bug, please report it."
msgstr ""
msgid "Page not found"
msgstr ""
msgid "We couldn't find this page."
msgstr ""
msgid "The link that led you here may be broken."
msgstr ""
msgid "Invalid CSRF token"
msgstr ""
msgid "Something is wrong with your CSRF token. Make sure cookies are enabled in you browser, and try reloading this page. If you continue to see this error message, please report it."
msgstr ""
msgid "You are not authorized."
msgstr ""
msgid "The content you sent can't be processed."
msgstr ""
msgid "Maybe it was too long."
msgstr ""

826
po/plume/hi.po Normal file
View file

@ -0,0 +1,826 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-18 11:41\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Hindi\n"
"Language: hi_IN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: hi\n"
"X-Crowdin-File: /master/po/plume/plume.pot\n"
# src/template_utils.rs:68
msgid "{0} commented on your article."
msgstr "{0} ने आपके लेख पे कॉमेंट किया है"
# src/template_utils.rs:69
msgid "{0} is subscribed to you."
msgstr "{0} ने आपको सब्सक्राइब किया है"
# src/template_utils.rs:70
msgid "{0} liked your article."
msgstr "{0} ने आपके लेख को लाइक किया"
# src/template_utils.rs:71
msgid "{0} mentioned you."
msgstr "{0} ने आपको मेंशन किया"
# src/template_utils.rs:72
msgid "{0} boosted your article."
msgstr "{0} ने आपके आर्टिकल को बूस्ट किया"
# src/template_utils.rs:108
msgid "{0}'s avatar"
msgstr "{0} का avtar"
# src/routes/blogs.rs:70
msgid "To create a new blog, you need to be logged in"
msgstr "नया ब्लॉग बनाने के लिए आपको लोग इन करना होगा"
# src/routes/blogs.rs:109
msgid "A blog with the same name already exists."
msgstr "ये नाम से पहले ही एक ब्लॉग है"
# src/routes/blogs.rs:172
msgid "You are not allowed to delete this blog."
msgstr "आपको ये ब्लॉग डिलीट करने की अनुमति नहीं है"
# src/routes/blogs.rs:217
msgid "You are not allowed to edit this blog."
msgstr "आपको ये ब्लॉग में बदलाव करने की अनुमति नहीं है"
# src/routes/blogs.rs:262
msgid "You can't use this media as a blog icon."
msgstr "इस फोटो को ब्लॉग आइकॉन के लिए इस्तेमाल नहीं कर सकते"
# src/routes/blogs.rs:280
msgid "You can't use this media as a blog banner."
msgstr "इस media को blog banner के लिए इस्तेमाल नहीं कर सकते"
# src/routes/likes.rs:51
msgid "To like a post, you need to be logged in"
msgstr "Post को like करने के लिए आपको log in करना होगा"
# src/routes/notifications.rs:29
msgid "To see your notifications, you need to be logged in"
msgstr "Notifications देखने के लिए आपको log in करना होगा"
# src/routes/posts.rs:93
msgid "This post isn't published yet."
msgstr "इस post को publish नहीं किया गया है"
# src/routes/posts.rs:122
msgid "To write a new post, you need to be logged in"
msgstr "नया post लिखने के लिए आपको log in करना होगा"
# src/routes/posts.rs:140
msgid "You are not an author of this blog."
msgstr "आप इस blog के लेखक नहीं हैं"
# src/routes/posts.rs:147
msgid "New post"
msgstr "नया post"
# src/routes/posts.rs:192
msgid "Edit {0}"
msgstr "Edit करें {0}"
# src/routes/posts.rs:630
msgid ""
"Couldn't obtain enough information about your account. Please make sure your "
"username is correct."
msgstr ""
"आपके अकाउंट के बारे में पर्याप्त जानकारी नहीं मिल पायी. कृपया जांच करें की आपका यूजरनाम "
"सही है."
# src/routes/reshares.rs:51
msgid "To reshare a post, you need to be logged in"
msgstr "Post reshare करने के लिए आपको log in करना होगा"
# src/routes/session.rs:181
msgid "Password reset"
msgstr "पासवर्ड रीसेट करें"
# src/routes/session.rs:182
msgid "Here is the link to reset your password: {0}"
msgstr "आपका पासवर्ड रिसेट करने का लिंक: {0}"
# src/routes/session.rs:259
msgid "Your password was successfully reset."
msgstr "आपका पासवर्ड रिसेट कर दिया गया है"
# src/routes/session.rs:263
msgid "Sorry, but the link expired. Try again"
msgstr "क्षमा करें, लेकिन लिंक इस्तेमाल करने की अवधि समाप्त हो चुकी है. फिर कोशिश करें"
# src/routes/user.rs:136
msgid "To access your dashboard, you need to be logged in"
msgstr "डैशबोर्ड पर जाने के लिए, लोग इन करें"
# src/routes/user.rs:244
msgid "To subscribe to someone, you need to be logged in"
msgstr "सब्सक्राइब करने के लिए, लोग इन करें"
# src/routes/user.rs:344
msgid "To edit your profile, you need to be logged in"
msgstr "प्रोफाइल में बदलाव करने के लिए, लोग इन करें"
msgid "Reset your password"
msgstr "पासवर्ड रिसेट करें"
# src/template_utils.rs:217
msgid "E-mail"
msgstr "इ-मेल"
# src/template_utils.rs:220
msgid "Optional"
msgstr "वैकल्पिक"
msgid "Send password reset link"
msgstr "पासवर्ड रिसेट करने के लिए लिंक भेजें"
msgid "Check your inbox!"
msgstr "आपका इनबॉक्स चेक करें"
msgid ""
"We sent a mail to the address you gave us, with a link to reset your "
"password."
msgstr "हमने आपके दिए गए इ-मेल पे पासवर्ड रिसेट लिंक भेज दिया है."
msgid "Log in"
msgstr "लौग इन"
# src/template_utils.rs:217
msgid "Username, or email"
msgstr "यूजरनेम या इ-मेल"
# src/template_utils.rs:217
msgid "Password"
msgstr "पासवर्ड"
# src/template_utils.rs:217
msgid "New password"
msgstr "नया पासवर्ड"
# src/template_utils.rs:217
msgid "Confirmation"
msgstr "पुष्टीकरण"
msgid "Update password"
msgstr "पासवर्ड अपडेट करें"
msgid "Administration of {0}"
msgstr "{0} का संचालन"
msgid "Instances"
msgstr "इन्सटेंस"
msgid "Configuration"
msgstr "कॉन्फ़िगरेशन"
msgid "Users"
msgstr "उसेर्स"
msgid "Unblock"
msgstr "अनब्लॉक करें"
msgid "Block"
msgstr "ब्लॉक करें"
msgid "About {0}"
msgstr "{0} के बारे में"
msgid "Home to <em>{0}</em> people"
msgstr "यहाँ <em>{0}</em> यूज़र्स हैं"
msgid "Who wrote <em>{0}</em> articles"
msgstr "जिन्होनें <em>{0}</em> आर्टिकल्स लिखे हैं"
msgid "And are connected to <em>{0}</em> other instances"
msgstr "और <em>{0}</em> इन्सटेंसेस से जुड़े हैं"
msgid "Administred by"
msgstr "द्वारा संचालित"
msgid "Runs Plume {0}"
msgstr "Plume {0} का इस्तेमाल कर रहे हैं"
msgid "All the articles of the Fediverse"
msgstr "फेडिवेर्से के सारे आर्टिकल्स"
msgid "Latest articles"
msgstr "नवीनतम लेख"
msgid "Your feed"
msgstr "आपकी फीड"
msgid "Federated feed"
msgstr "फ़ेडरेटेड फीड"
msgid "Local feed"
msgstr "लोकल फीड"
msgid "Welcome to {}"
msgstr "{} में स्वागत"
msgid "Articles from {}"
msgstr "{} के आर्टिकल्स"
msgid "Ban"
msgstr "बन करें"
msgid "Nothing to see here yet. Try subscribing to more people."
msgstr "कंटेंट देखने के लिए अन्य लोगों को सब्सक्राइब करें"
msgid "Administration"
msgstr "संचालन"
# src/template_utils.rs:217
msgid "Name"
msgstr "नाम"
msgid "Allow anyone to register here"
msgstr "किसी को भी रजिस्टर करने की अनुमति दें"
msgid "Short description"
msgstr "संक्षिप्त वर्णन"
msgid "Markdown syntax is supported"
msgstr "मार्कडौं सिंटेक्स उपलब्ध है"
msgid "Long description"
msgstr "दीर्घ वर्णन"
# src/template_utils.rs:217
msgid "Default article license"
msgstr "डिफ़ॉल्ट आलेख लायसेंस"
msgid "Save these settings"
msgstr "इन सेटिंग्स को सेव करें"
msgid "Search"
msgstr "ढूंढें"
msgid "Your query"
msgstr "आपके प्रश्न"
msgid "Advanced search"
msgstr "एडवांस्ड सर्च"
# src/template_utils.rs:305
msgid "Article title matching these words"
msgstr "सर्च से मैच करने वाले लेख शीर्षक"
msgid "Title"
msgstr "शीर्षक"
# src/template_utils.rs:305
msgid "Subtitle matching these words"
msgstr "सर्च से मैच करने वाले लेख उपशीर्षक"
msgid "Subtitle - byline"
msgstr "उपशीर्षक-byline"
# src/template_utils.rs:305
msgid "Content matching these words"
msgstr "इन शब्दों से मैच करने वाला कंटेंट"
msgid "Body content"
msgstr "बॉडी कंटेंट"
# src/template_utils.rs:305
msgid "From this date"
msgstr "इस तारीख से"
# src/template_utils.rs:305
msgid "To this date"
msgstr "इस तारीख तक"
# src/template_utils.rs:305
msgid "Containing these tags"
msgstr "इन टैग्स से युक्त"
msgid "Tags"
msgstr "टैग्स"
# src/template_utils.rs:305
msgid "Posted on one of these instances"
msgstr "इन इन्सटेंसेस में पोस्ट किया गया"
msgid "Instance domain"
msgstr "इंस्टैंस डोमेन"
# src/template_utils.rs:305
msgid "Posted by one of these authors"
msgstr "इन लेखकों द्वारा पोस्ट किये गए आर्टिकल्स"
msgid "Authors"
msgstr "लेखक"
# src/template_utils.rs:305
msgid "Posted on one of these blogs"
msgstr "इन ब्लोग्स में से एक ब्लॉग पर पोस्ट किया गया"
msgid "Blog title"
msgstr "ब्लॉग टाइटल"
# src/template_utils.rs:305
msgid "Written in this language"
msgstr "इन भाषाओँ में लिखे गए"
msgid "Language"
msgstr "भाषा"
# src/template_utils.rs:305
msgid "Published under this license"
msgstr "इस लिसेंसे के साथ पब्लिश किया गया"
msgid "Article license"
msgstr "आर्टिकल लाइसेंस"
msgid "Search result for \"{0}\""
msgstr "{0} के लिए सर्च रिजल्ट"
msgid "Search result"
msgstr "सर्च रिजल्ट"
msgid "No result for your query"
msgstr "आपकी जांच के लिए रिजल्ट"
msgid "No more results for your query"
msgstr "आपकी जांच के लिए और रिजल्ट्स नहीं है"
msgid "Edit \"{}\""
msgstr "{0} में बदलाव करें"
msgid "Description"
msgstr "वर्णन"
msgid ""
"You can upload images to your gallery, to use them as blog icons, or banners."
msgstr "आप गैलरी में फोटो दाल कर, उनका ब्लॉग आइकॉन या बैनर के लिए उपयोग कर सकते हैं"
msgid "Upload images"
msgstr "फोटो अपलोड करें"
msgid "Blog icon"
msgstr "ब्लॉग आइकॉन"
msgid "Blog banner"
msgstr "ब्लॉग बैनर"
msgid "Update blog"
msgstr "ब्लॉग अपडेट करें"
msgid "Danger zone"
msgstr "खतरे का क्षेत्र"
msgid "Be very careful, any action taken here can't be reversed."
msgstr "सावधानी रखें, यहाँ पे कोई भी किया गया कार्य कैंसिल नहीं किया जा सकता"
msgid "Permanently delete this blog"
msgstr "इस ब्लॉग को स्थाई रूप से हटाएं"
msgid "{}'s icon"
msgstr "{} का आइकॉन"
msgid "New article"
msgstr "नया लेख"
msgid "Edit"
msgstr ""
msgid "There's one author on this blog: "
msgid_plural "There are {0} authors on this blog: "
msgstr[0] ""
msgstr[1] ""
msgid "No posts to see here yet."
msgstr ""
msgid "New Blog"
msgstr ""
msgid "Create a blog"
msgstr ""
msgid "Create blog"
msgstr ""
msgid "Articles tagged \"{0}\""
msgstr ""
msgid "There are currently no articles with such a tag"
msgstr ""
msgid "Written by {0}"
msgstr ""
msgid "Are you sure?"
msgstr ""
msgid "Delete this article"
msgstr ""
msgid "Draft"
msgstr ""
msgid "All rights reserved."
msgstr ""
msgid "This article is under the {0} license."
msgstr ""
msgid "Unsubscribe"
msgstr ""
msgid "Subscribe"
msgstr ""
msgid "One like"
msgid_plural "{0} likes"
msgstr[0] ""
msgstr[1] ""
msgid "I don't like this anymore"
msgstr ""
msgid "Add yours"
msgstr ""
msgid "One boost"
msgid_plural "{0} boosts"
msgstr[0] ""
msgstr[1] ""
msgid "I don't want to boost this anymore"
msgstr ""
msgid "Boost"
msgstr ""
msgid ""
"{0}Log in{1}, or {2}use your Fediverse account{3} to interact with this "
"article"
msgstr ""
msgid "Comments"
msgstr ""
# src/template_utils.rs:217
msgid "Content warning"
msgstr ""
msgid "Your comment"
msgstr ""
msgid "Submit comment"
msgstr ""
msgid "No comments yet. Be the first to react!"
msgstr ""
msgid "Interact with {}"
msgstr ""
msgid "Log in to interact"
msgstr ""
msgid "Enter your full username to interact"
msgstr ""
msgid "Publish"
msgstr ""
msgid "Classic editor (any changes will be lost)"
msgstr ""
# src/template_utils.rs:217
msgid "Subtitle"
msgstr ""
msgid "Content"
msgstr ""
msgid ""
"You can upload media to your gallery, and then copy their Markdown code into "
"your articles to insert them."
msgstr ""
msgid "Upload media"
msgstr ""
# src/template_utils.rs:217
msgid "Tags, separated by commas"
msgstr ""
# src/template_utils.rs:217
msgid "License"
msgstr ""
# src/template_utils.rs:225
msgid "Leave it empty to reserve all rights"
msgstr ""
msgid "Illustration"
msgstr ""
msgid "This is a draft, don't publish it yet."
msgstr ""
msgid "Update"
msgstr "अपडेट"
msgid "Update, or publish"
msgstr "अपडेट या पब्लिश"
msgid "Publish your post"
msgstr ""
#, fuzzy
msgid "I'm from this instance"
msgstr "इंस्टैंस के बारे में जानकारी"
msgid "I'm from another instance"
msgstr ""
# src/template_utils.rs:217
msgid "Username"
msgstr ""
# src/template_utils.rs:225
msgid "Example: user@plu.me"
msgstr ""
msgid "Continue to your instance"
msgstr ""
msgid "View all"
msgstr ""
msgid "By {0}"
msgstr ""
msgid "What is Plume?"
msgstr ""
msgid "Plume is a decentralized blogging engine."
msgstr ""
msgid "Authors can manage multiple blogs, each as its own website."
msgstr ""
msgid ""
"Articles are also visible on other Plume instances, and you can interact "
"with them directly from other platforms like Mastodon."
msgstr ""
msgid "Create your account"
msgstr "अपना अकाउंट बनाएं"
msgid "Read the detailed rules"
msgstr ""
msgid "Respond"
msgstr ""
msgid "Delete this comment"
msgstr ""
msgid "None"
msgstr ""
msgid "No description"
msgstr ""
msgid "Notifications"
msgstr "सूचनाएँ"
msgid "Plume"
msgstr "प्लूम"
msgid "Menu"
msgstr "मेंन्यू"
msgid "Dashboard"
msgstr "डैशबोर्ड"
msgid "Log Out"
msgstr "लॉग आउट"
msgid "My account"
msgstr "मेरा अकाउंट"
msgid "Log In"
msgstr "लॉग इन करें"
msgid "Register"
msgstr "अकाउंट रजिस्टर करें"
msgid "About this instance"
msgstr "इंस्टैंस के बारे में जानकारी"
msgid "Source code"
msgstr "सोर्स कोड"
msgid "Matrix room"
msgstr "मैट्रिक्स रूम"
msgid "Your media"
msgstr "आपकी मीडिया"
msgid "Upload"
msgstr ""
msgid "You don't have any media yet."
msgstr ""
msgid "Content warning: {0}"
msgstr ""
msgid "Delete"
msgstr ""
msgid "Details"
msgstr ""
msgid "Media details"
msgstr ""
msgid "Go back to the gallery"
msgstr ""
msgid "Markdown syntax"
msgstr ""
msgid "Copy it into your articles, to insert this media:"
msgstr ""
msgid "Use as an avatar"
msgstr ""
msgid "Media upload"
msgstr ""
msgid "Useful for visually impaired people, as well as licensing information"
msgstr ""
msgid "Leave it empty, if none is needed"
msgstr ""
msgid "File"
msgstr ""
msgid "Send"
msgstr ""
msgid "{0}'s subscriptions"
msgstr ""
msgid "Articles"
msgstr ""
msgid "Subscribers"
msgstr ""
msgid "Subscriptions"
msgstr ""
msgid "Your Dashboard"
msgstr "आपका डैशबोर्ड"
msgid "Your Blogs"
msgstr "आपके ब्लोग्स"
msgid "You don't have any blog yet. Create your own, or ask to join one."
msgstr "आपके कोई ब्लोग्स नहीं हैं. आप स्वयं ब्लॉग बना सकते हैं या किसी और ब्लॉग से जुड़ सकते हैं"
msgid "Start a new blog"
msgstr "नया ब्लॉग बनाएं"
msgid "Your Drafts"
msgstr "आपके ड्राफ्ट्स"
msgid "Go to your gallery"
msgstr "गैलरी में जाएँ"
msgid "Admin"
msgstr ""
msgid "It is you"
msgstr ""
msgid "Edit your profile"
msgstr ""
msgid "Open on {0}"
msgstr ""
msgid "{0}'s subscribers"
msgstr ""
msgid "Edit your account"
msgstr "अपने अकाउंट में बदलाव करें"
msgid "Your Profile"
msgstr "आपकी प्रोफाइल"
msgid ""
"To change your avatar, upload it to your gallery and then select from there."
msgstr ""
msgid "Upload an avatar"
msgstr ""
# src/template_utils.rs:217
msgid "Display name"
msgstr ""
# src/template_utils.rs:217
msgid "Email"
msgstr "ईमेल"
msgid "Summary"
msgstr "सारांश"
msgid "Update account"
msgstr "अकाउंट अपडेट करें"
msgid "Be very careful, any action taken here can't be cancelled."
msgstr "सावधानी रखें, यहाँ पे कोई भी किया गया कार्य कैंसिल नहीं किया जा सकता"
msgid "Delete your account"
msgstr "खाता रद्द करें"
msgid "Sorry, but as an admin, you can't leave your own instance."
msgstr "माफ़ करें, एडमिन होने की वजह से, आप अपना इंस्टैंस नहीं छोड़ सकते"
msgid "Atom feed"
msgstr ""
msgid "Recently boosted"
msgstr ""
msgid "Create an account"
msgstr ""
# src/template_utils.rs:217
msgid "Password confirmation"
msgstr ""
msgid ""
"Apologies, but registrations are closed on this particular instance. You "
"can, however, find a different one."
msgstr ""
msgid "Follow {}"
msgstr ""
msgid "Login to follow"
msgstr ""
msgid "Enter your full username to follow"
msgstr ""
msgid "Internal server error"
msgstr ""
msgid "Something broke on our side."
msgstr ""
msgid "Sorry about that. If you think this is a bug, please report it."
msgstr ""
msgid "Page not found"
msgstr ""
msgid "We couldn't find this page."
msgstr ""
msgid "The link that led you here may be broken."
msgstr ""
msgid "Invalid CSRF token"
msgstr ""
msgid ""
"Something is wrong with your CSRF token. Make sure cookies are enabled in "
"you browser, and try reloading this page. If you continue to see this error "
"message, please report it."
msgstr ""
msgid "You are not authorized."
msgstr ""
msgid "The content you sent can't be processed."
msgstr ""
msgid "Maybe it was too long."
msgstr ""

827
po/plume/hr.po Normal file
View file

@ -0,0 +1,827 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 20:49\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Croatian\n"
"Language: hr_HR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: hr\n"
"X-Crowdin-File: /master/po/plume/plume.pot\n"
# src/template_utils.rs:68
msgid "{0} commented on your article."
msgstr "{0} komentira na vaš članak."
# src/template_utils.rs:69
msgid "{0} is subscribed to you."
msgstr ""
# src/template_utils.rs:70
msgid "{0} liked your article."
msgstr "{0} se svidio vaš članak."
# src/template_utils.rs:71
msgid "{0} mentioned you."
msgstr ""
# src/template_utils.rs:72
msgid "{0} boosted your article."
msgstr ""
# src/template_utils.rs:108
msgid "{0}'s avatar"
msgstr ""
# src/routes/blogs.rs:70
msgid "To create a new blog, you need to be logged in"
msgstr ""
# src/routes/blogs.rs:109
msgid "A blog with the same name already exists."
msgstr ""
# src/routes/blogs.rs:172
msgid "You are not allowed to delete this blog."
msgstr ""
# src/routes/blogs.rs:217
msgid "You are not allowed to edit this blog."
msgstr ""
# src/routes/blogs.rs:262
msgid "You can't use this media as a blog icon."
msgstr ""
# src/routes/blogs.rs:280
msgid "You can't use this media as a blog banner."
msgstr ""
# src/routes/likes.rs:51
msgid "To like a post, you need to be logged in"
msgstr ""
# src/routes/notifications.rs:29
msgid "To see your notifications, you need to be logged in"
msgstr ""
# src/routes/posts.rs:93
msgid "This post isn't published yet."
msgstr "Ovaj post još nije objavljen."
# src/routes/posts.rs:122
msgid "To write a new post, you need to be logged in"
msgstr ""
# src/routes/posts.rs:140
msgid "You are not an author of this blog."
msgstr "Ti ne autor ovog bloga."
# src/routes/posts.rs:147
msgid "New post"
msgstr "Novi članak"
# src/routes/posts.rs:192
msgid "Edit {0}"
msgstr "Uredi {0}"
# src/routes/posts.rs:630
msgid ""
"Couldn't obtain enough information about your account. Please make sure your "
"username is correct."
msgstr ""
# src/routes/reshares.rs:51
msgid "To reshare a post, you need to be logged in"
msgstr ""
# src/routes/session.rs:181
msgid "Password reset"
msgstr "Poništavanje zaporke"
# src/routes/session.rs:182
msgid "Here is the link to reset your password: {0}"
msgstr ""
# src/routes/session.rs:259
msgid "Your password was successfully reset."
msgstr ""
# src/routes/session.rs:263
msgid "Sorry, but the link expired. Try again"
msgstr ""
# src/routes/user.rs:136
msgid "To access your dashboard, you need to be logged in"
msgstr ""
# src/routes/user.rs:244
msgid "To subscribe to someone, you need to be logged in"
msgstr ""
# src/routes/user.rs:344
msgid "To edit your profile, you need to be logged in"
msgstr ""
msgid "Reset your password"
msgstr ""
# src/template_utils.rs:217
msgid "E-mail"
msgstr ""
# src/template_utils.rs:220
msgid "Optional"
msgstr ""
msgid "Send password reset link"
msgstr ""
msgid "Check your inbox!"
msgstr ""
msgid ""
"We sent a mail to the address you gave us, with a link to reset your "
"password."
msgstr ""
msgid "Log in"
msgstr ""
# src/template_utils.rs:217
msgid "Username, or email"
msgstr ""
# src/template_utils.rs:217
msgid "Password"
msgstr ""
# src/template_utils.rs:217
msgid "New password"
msgstr ""
# src/template_utils.rs:217
msgid "Confirmation"
msgstr ""
msgid "Update password"
msgstr ""
msgid "Administration of {0}"
msgstr "Administracija od {0}"
msgid "Instances"
msgstr ""
msgid "Configuration"
msgstr "Konfiguracija"
msgid "Users"
msgstr "Korisnici"
msgid "Unblock"
msgstr "Odblokiraj"
msgid "Block"
msgstr "Blokirati"
msgid "About {0}"
msgstr "O {0}"
msgid "Home to <em>{0}</em> people"
msgstr ""
msgid "Who wrote <em>{0}</em> articles"
msgstr ""
msgid "And are connected to <em>{0}</em> other instances"
msgstr ""
msgid "Administred by"
msgstr ""
msgid "Runs Plume {0}"
msgstr ""
msgid "All the articles of the Fediverse"
msgstr ""
msgid "Latest articles"
msgstr "Najnoviji članci"
msgid "Your feed"
msgstr ""
msgid "Federated feed"
msgstr "Federalni kanala"
msgid "Local feed"
msgstr "Lokalnog kanala"
msgid "Welcome to {}"
msgstr "Dobrodošli u {0}"
msgid "Articles from {}"
msgstr "Članci iz {}"
msgid "Ban"
msgstr "Zabraniti"
msgid "Nothing to see here yet. Try subscribing to more people."
msgstr ""
msgid "Administration"
msgstr "Administracija"
# src/template_utils.rs:217
msgid "Name"
msgstr ""
msgid "Allow anyone to register here"
msgstr ""
msgid "Short description"
msgstr "Kratki opis"
msgid "Markdown syntax is supported"
msgstr "Markdown sintaksa je podržana"
msgid "Long description"
msgstr "Dugi opis"
# src/template_utils.rs:217
msgid "Default article license"
msgstr ""
msgid "Save these settings"
msgstr ""
msgid "Search"
msgstr "Traži"
msgid "Your query"
msgstr ""
msgid "Advanced search"
msgstr ""
# src/template_utils.rs:305
msgid "Article title matching these words"
msgstr ""
msgid "Title"
msgstr ""
# src/template_utils.rs:305
msgid "Subtitle matching these words"
msgstr ""
msgid "Subtitle - byline"
msgstr ""
# src/template_utils.rs:305
msgid "Content matching these words"
msgstr ""
msgid "Body content"
msgstr ""
# src/template_utils.rs:305
msgid "From this date"
msgstr ""
# src/template_utils.rs:305
msgid "To this date"
msgstr ""
# src/template_utils.rs:305
msgid "Containing these tags"
msgstr ""
msgid "Tags"
msgstr ""
# src/template_utils.rs:305
msgid "Posted on one of these instances"
msgstr ""
msgid "Instance domain"
msgstr ""
# src/template_utils.rs:305
msgid "Posted by one of these authors"
msgstr ""
msgid "Authors"
msgstr ""
# src/template_utils.rs:305
msgid "Posted on one of these blogs"
msgstr ""
msgid "Blog title"
msgstr ""
# src/template_utils.rs:305
msgid "Written in this language"
msgstr ""
msgid "Language"
msgstr ""
# src/template_utils.rs:305
msgid "Published under this license"
msgstr ""
msgid "Article license"
msgstr ""
msgid "Search result for \"{0}\""
msgstr ""
msgid "Search result"
msgstr ""
msgid "No result for your query"
msgstr ""
msgid "No more results for your query"
msgstr ""
msgid "Edit \"{}\""
msgstr ""
msgid "Description"
msgstr ""
msgid ""
"You can upload images to your gallery, to use them as blog icons, or banners."
msgstr ""
msgid "Upload images"
msgstr ""
msgid "Blog icon"
msgstr ""
msgid "Blog banner"
msgstr ""
msgid "Update blog"
msgstr ""
msgid "Danger zone"
msgstr "Opasna zona"
msgid "Be very careful, any action taken here can't be reversed."
msgstr ""
msgid "Permanently delete this blog"
msgstr ""
msgid "{}'s icon"
msgstr ""
msgid "New article"
msgstr ""
msgid "Edit"
msgstr ""
msgid "There's one author on this blog: "
msgid_plural "There are {0} authors on this blog: "
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgid "No posts to see here yet."
msgstr ""
msgid "New Blog"
msgstr ""
msgid "Create a blog"
msgstr ""
msgid "Create blog"
msgstr ""
msgid "Articles tagged \"{0}\""
msgstr ""
msgid "There are currently no articles with such a tag"
msgstr ""
msgid "Written by {0}"
msgstr ""
msgid "Are you sure?"
msgstr ""
msgid "Delete this article"
msgstr ""
msgid "Draft"
msgstr ""
msgid "All rights reserved."
msgstr ""
msgid "This article is under the {0} license."
msgstr ""
msgid "Unsubscribe"
msgstr ""
msgid "Subscribe"
msgstr ""
msgid "One like"
msgid_plural "{0} likes"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgid "I don't like this anymore"
msgstr ""
msgid "Add yours"
msgstr ""
msgid "One boost"
msgid_plural "{0} boosts"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgid "I don't want to boost this anymore"
msgstr ""
msgid "Boost"
msgstr ""
msgid ""
"{0}Log in{1}, or {2}use your Fediverse account{3} to interact with this "
"article"
msgstr ""
msgid "Comments"
msgstr ""
# src/template_utils.rs:217
msgid "Content warning"
msgstr ""
msgid "Your comment"
msgstr ""
msgid "Submit comment"
msgstr ""
msgid "No comments yet. Be the first to react!"
msgstr ""
msgid "Interact with {}"
msgstr ""
msgid "Log in to interact"
msgstr ""
msgid "Enter your full username to interact"
msgstr ""
msgid "Publish"
msgstr ""
msgid "Classic editor (any changes will be lost)"
msgstr ""
# src/template_utils.rs:217
msgid "Subtitle"
msgstr ""
msgid "Content"
msgstr ""
msgid ""
"You can upload media to your gallery, and then copy their Markdown code into "
"your articles to insert them."
msgstr ""
msgid "Upload media"
msgstr ""
# src/template_utils.rs:217
msgid "Tags, separated by commas"
msgstr ""
# src/template_utils.rs:217
msgid "License"
msgstr ""
# src/template_utils.rs:225
msgid "Leave it empty to reserve all rights"
msgstr ""
msgid "Illustration"
msgstr ""
msgid "This is a draft, don't publish it yet."
msgstr ""
msgid "Update"
msgstr ""
msgid "Update, or publish"
msgstr ""
msgid "Publish your post"
msgstr ""
msgid "I'm from this instance"
msgstr ""
msgid "I'm from another instance"
msgstr ""
# src/template_utils.rs:217
msgid "Username"
msgstr ""
# src/template_utils.rs:225
msgid "Example: user@plu.me"
msgstr ""
msgid "Continue to your instance"
msgstr ""
msgid "View all"
msgstr ""
msgid "By {0}"
msgstr ""
msgid "What is Plume?"
msgstr ""
msgid "Plume is a decentralized blogging engine."
msgstr ""
msgid "Authors can manage multiple blogs, each as its own website."
msgstr ""
msgid ""
"Articles are also visible on other Plume instances, and you can interact "
"with them directly from other platforms like Mastodon."
msgstr ""
msgid "Create your account"
msgstr ""
msgid "Read the detailed rules"
msgstr ""
msgid "Respond"
msgstr ""
msgid "Delete this comment"
msgstr ""
msgid "None"
msgstr ""
msgid "No description"
msgstr ""
msgid "Notifications"
msgstr "Obavijesti"
msgid "Plume"
msgstr "Plume"
msgid "Menu"
msgstr "Izbornik"
msgid "Dashboard"
msgstr "Upravljačka ploča"
msgid "Log Out"
msgstr "Odjaviti se"
msgid "My account"
msgstr "Moj račun"
msgid "Log In"
msgstr "Prijaviti se"
msgid "Register"
msgstr "Registrirajte se"
msgid "About this instance"
msgstr ""
msgid "Source code"
msgstr "Izvorni kod"
msgid "Matrix room"
msgstr ""
msgid "Your media"
msgstr ""
msgid "Upload"
msgstr ""
msgid "You don't have any media yet."
msgstr ""
msgid "Content warning: {0}"
msgstr ""
msgid "Delete"
msgstr ""
msgid "Details"
msgstr ""
msgid "Media details"
msgstr ""
msgid "Go back to the gallery"
msgstr ""
msgid "Markdown syntax"
msgstr ""
msgid "Copy it into your articles, to insert this media:"
msgstr ""
msgid "Use as an avatar"
msgstr ""
msgid "Media upload"
msgstr ""
msgid "Useful for visually impaired people, as well as licensing information"
msgstr ""
msgid "Leave it empty, if none is needed"
msgstr ""
msgid "File"
msgstr ""
msgid "Send"
msgstr ""
msgid "{0}'s subscriptions"
msgstr ""
msgid "Articles"
msgstr "Članci"
msgid "Subscribers"
msgstr ""
msgid "Subscriptions"
msgstr ""
msgid "Your Dashboard"
msgstr ""
msgid "Your Blogs"
msgstr ""
msgid "You don't have any blog yet. Create your own, or ask to join one."
msgstr ""
msgid "Start a new blog"
msgstr ""
msgid "Your Drafts"
msgstr ""
msgid "Go to your gallery"
msgstr ""
msgid "Admin"
msgstr ""
msgid "It is you"
msgstr ""
msgid "Edit your profile"
msgstr ""
msgid "Open on {0}"
msgstr ""
msgid "{0}'s subscribers"
msgstr ""
msgid "Edit your account"
msgstr "Uredite svoj račun"
msgid "Your Profile"
msgstr "Tvoj Profil"
msgid ""
"To change your avatar, upload it to your gallery and then select from there."
msgstr ""
msgid "Upload an avatar"
msgstr ""
# src/template_utils.rs:217
msgid "Display name"
msgstr ""
# src/template_utils.rs:217
msgid "Email"
msgstr "E-pošta"
msgid "Summary"
msgstr "Sažetak"
msgid "Update account"
msgstr "Ažuriraj račun"
msgid "Be very careful, any action taken here can't be cancelled."
msgstr ""
msgid "Delete your account"
msgstr "Izbrišite svoj račun"
msgid "Sorry, but as an admin, you can't leave your own instance."
msgstr ""
msgid "Atom feed"
msgstr ""
msgid "Recently boosted"
msgstr ""
msgid "Create an account"
msgstr ""
# src/template_utils.rs:217
msgid "Password confirmation"
msgstr ""
msgid ""
"Apologies, but registrations are closed on this particular instance. You "
"can, however, find a different one."
msgstr ""
msgid "Follow {}"
msgstr ""
msgid "Login to follow"
msgstr ""
msgid "Enter your full username to follow"
msgstr ""
msgid "Internal server error"
msgstr ""
msgid "Something broke on our side."
msgstr ""
msgid "Sorry about that. If you think this is a bug, please report it."
msgstr ""
msgid "Page not found"
msgstr ""
msgid "We couldn't find this page."
msgstr ""
msgid "The link that led you here may be broken."
msgstr ""
msgid "Invalid CSRF token"
msgstr ""
msgid ""
"Something is wrong with your CSRF token. Make sure cookies are enabled in "
"you browser, and try reloading this page. If you continue to see this error "
"message, please report it."
msgstr ""
msgid "You are not authorized."
msgstr ""
msgid "The content you sent can't be processed."
msgstr ""
msgid "Maybe it was too long."
msgstr ""

807
po/plume/hu.po Normal file
View file

@ -0,0 +1,807 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 20:49\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Hungarian\n"
"Language: hu_HU\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: hu\n"
"X-Crowdin-File: /master/po/plume/plume.pot\n"
# src/template_utils.rs:68
msgid "{0} commented on your article."
msgstr ""
# src/template_utils.rs:69
msgid "{0} is subscribed to you."
msgstr ""
# src/template_utils.rs:70
msgid "{0} liked your article."
msgstr ""
# src/template_utils.rs:71
msgid "{0} mentioned you."
msgstr ""
# src/template_utils.rs:72
msgid "{0} boosted your article."
msgstr ""
# src/template_utils.rs:108
msgid "{0}'s avatar"
msgstr ""
# src/routes/blogs.rs:70
msgid "To create a new blog, you need to be logged in"
msgstr ""
# src/routes/blogs.rs:109
msgid "A blog with the same name already exists."
msgstr ""
# src/routes/blogs.rs:172
msgid "You are not allowed to delete this blog."
msgstr ""
# src/routes/blogs.rs:217
msgid "You are not allowed to edit this blog."
msgstr ""
# src/routes/blogs.rs:262
msgid "You can't use this media as a blog icon."
msgstr ""
# src/routes/blogs.rs:280
msgid "You can't use this media as a blog banner."
msgstr ""
# src/routes/likes.rs:51
msgid "To like a post, you need to be logged in"
msgstr ""
# src/routes/notifications.rs:29
msgid "To see your notifications, you need to be logged in"
msgstr ""
# src/routes/posts.rs:93
msgid "This post isn't published yet."
msgstr ""
# src/routes/posts.rs:122
msgid "To write a new post, you need to be logged in"
msgstr ""
# src/routes/posts.rs:140
msgid "You are not an author of this blog."
msgstr ""
# src/routes/posts.rs:147
msgid "New post"
msgstr ""
# src/routes/posts.rs:192
msgid "Edit {0}"
msgstr ""
# src/routes/posts.rs:630
msgid "Couldn't obtain enough information about your account. Please make sure your username is correct."
msgstr ""
# src/routes/reshares.rs:51
msgid "To reshare a post, you need to be logged in"
msgstr ""
# src/routes/session.rs:181
msgid "Password reset"
msgstr ""
# src/routes/session.rs:182
msgid "Here is the link to reset your password: {0}"
msgstr ""
# src/routes/session.rs:259
msgid "Your password was successfully reset."
msgstr ""
# src/routes/session.rs:263
msgid "Sorry, but the link expired. Try again"
msgstr ""
# src/routes/user.rs:136
msgid "To access your dashboard, you need to be logged in"
msgstr ""
# src/routes/user.rs:244
msgid "To subscribe to someone, you need to be logged in"
msgstr ""
# src/routes/user.rs:344
msgid "To edit your profile, you need to be logged in"
msgstr ""
msgid "Reset your password"
msgstr ""
# src/template_utils.rs:217
msgid "E-mail"
msgstr ""
# src/template_utils.rs:220
msgid "Optional"
msgstr ""
msgid "Send password reset link"
msgstr ""
msgid "Check your inbox!"
msgstr ""
msgid "We sent a mail to the address you gave us, with a link to reset your password."
msgstr ""
msgid "Log in"
msgstr ""
# src/template_utils.rs:217
msgid "Username, or email"
msgstr ""
# src/template_utils.rs:217
msgid "Password"
msgstr ""
# src/template_utils.rs:217
msgid "New password"
msgstr ""
# src/template_utils.rs:217
msgid "Confirmation"
msgstr ""
msgid "Update password"
msgstr ""
msgid "Administration of {0}"
msgstr ""
msgid "Instances"
msgstr ""
msgid "Configuration"
msgstr ""
msgid "Users"
msgstr ""
msgid "Unblock"
msgstr ""
msgid "Block"
msgstr ""
msgid "About {0}"
msgstr ""
msgid "Home to <em>{0}</em> people"
msgstr ""
msgid "Who wrote <em>{0}</em> articles"
msgstr ""
msgid "And are connected to <em>{0}</em> other instances"
msgstr ""
msgid "Administred by"
msgstr ""
msgid "Runs Plume {0}"
msgstr ""
msgid "All the articles of the Fediverse"
msgstr ""
msgid "Latest articles"
msgstr ""
msgid "Your feed"
msgstr ""
msgid "Federated feed"
msgstr ""
msgid "Local feed"
msgstr ""
msgid "Welcome to {}"
msgstr ""
msgid "Articles from {}"
msgstr ""
msgid "Ban"
msgstr ""
msgid "Nothing to see here yet. Try subscribing to more people."
msgstr ""
msgid "Administration"
msgstr ""
# src/template_utils.rs:217
msgid "Name"
msgstr ""
msgid "Allow anyone to register here"
msgstr ""
msgid "Short description"
msgstr ""
msgid "Markdown syntax is supported"
msgstr ""
msgid "Long description"
msgstr ""
# src/template_utils.rs:217
msgid "Default article license"
msgstr ""
msgid "Save these settings"
msgstr ""
msgid "Search"
msgstr ""
msgid "Your query"
msgstr ""
msgid "Advanced search"
msgstr ""
# src/template_utils.rs:305
msgid "Article title matching these words"
msgstr ""
msgid "Title"
msgstr ""
# src/template_utils.rs:305
msgid "Subtitle matching these words"
msgstr ""
msgid "Subtitle - byline"
msgstr ""
# src/template_utils.rs:305
msgid "Content matching these words"
msgstr ""
msgid "Body content"
msgstr ""
# src/template_utils.rs:305
msgid "From this date"
msgstr ""
# src/template_utils.rs:305
msgid "To this date"
msgstr ""
# src/template_utils.rs:305
msgid "Containing these tags"
msgstr ""
msgid "Tags"
msgstr ""
# src/template_utils.rs:305
msgid "Posted on one of these instances"
msgstr ""
msgid "Instance domain"
msgstr ""
# src/template_utils.rs:305
msgid "Posted by one of these authors"
msgstr ""
msgid "Authors"
msgstr ""
# src/template_utils.rs:305
msgid "Posted on one of these blogs"
msgstr ""
msgid "Blog title"
msgstr ""
# src/template_utils.rs:305
msgid "Written in this language"
msgstr ""
msgid "Language"
msgstr ""
# src/template_utils.rs:305
msgid "Published under this license"
msgstr ""
msgid "Article license"
msgstr ""
msgid "Search result for \"{0}\""
msgstr ""
msgid "Search result"
msgstr ""
msgid "No result for your query"
msgstr ""
msgid "No more results for your query"
msgstr ""
msgid "Edit \"{}\""
msgstr ""
msgid "Description"
msgstr ""
msgid "You can upload images to your gallery, to use them as blog icons, or banners."
msgstr ""
msgid "Upload images"
msgstr ""
msgid "Blog icon"
msgstr ""
msgid "Blog banner"
msgstr ""
msgid "Update blog"
msgstr ""
msgid "Danger zone"
msgstr ""
msgid "Be very careful, any action taken here can't be reversed."
msgstr ""
msgid "Permanently delete this blog"
msgstr ""
msgid "{}'s icon"
msgstr ""
msgid "New article"
msgstr ""
msgid "Edit"
msgstr ""
msgid "There's one author on this blog: "
msgid_plural "There are {0} authors on this blog: "
msgstr[0] ""
msgstr[1] ""
msgid "No posts to see here yet."
msgstr ""
msgid "New Blog"
msgstr ""
msgid "Create a blog"
msgstr ""
msgid "Create blog"
msgstr ""
msgid "Articles tagged \"{0}\""
msgstr ""
msgid "There are currently no articles with such a tag"
msgstr ""
msgid "Written by {0}"
msgstr ""
msgid "Are you sure?"
msgstr ""
msgid "Delete this article"
msgstr ""
msgid "Draft"
msgstr ""
msgid "All rights reserved."
msgstr ""
msgid "This article is under the {0} license."
msgstr ""
msgid "Unsubscribe"
msgstr ""
msgid "Subscribe"
msgstr ""
msgid "One like"
msgid_plural "{0} likes"
msgstr[0] ""
msgstr[1] ""
msgid "I don't like this anymore"
msgstr ""
msgid "Add yours"
msgstr ""
msgid "One boost"
msgid_plural "{0} boosts"
msgstr[0] ""
msgstr[1] ""
msgid "I don't want to boost this anymore"
msgstr ""
msgid "Boost"
msgstr ""
msgid "{0}Log in{1}, or {2}use your Fediverse account{3} to interact with this article"
msgstr ""
msgid "Comments"
msgstr ""
# src/template_utils.rs:217
msgid "Content warning"
msgstr ""
msgid "Your comment"
msgstr ""
msgid "Submit comment"
msgstr ""
msgid "No comments yet. Be the first to react!"
msgstr ""
msgid "Interact with {}"
msgstr ""
msgid "Log in to interact"
msgstr ""
msgid "Enter your full username to interact"
msgstr ""
msgid "Publish"
msgstr ""
msgid "Classic editor (any changes will be lost)"
msgstr ""
# src/template_utils.rs:217
msgid "Subtitle"
msgstr ""
msgid "Content"
msgstr ""
msgid "You can upload media to your gallery, and then copy their Markdown code into your articles to insert them."
msgstr ""
msgid "Upload media"
msgstr ""
# src/template_utils.rs:217
msgid "Tags, separated by commas"
msgstr ""
# src/template_utils.rs:217
msgid "License"
msgstr ""
# src/template_utils.rs:225
msgid "Leave it empty to reserve all rights"
msgstr ""
msgid "Illustration"
msgstr ""
msgid "This is a draft, don't publish it yet."
msgstr ""
msgid "Update"
msgstr ""
msgid "Update, or publish"
msgstr ""
msgid "Publish your post"
msgstr ""
msgid "I'm from this instance"
msgstr ""
msgid "I'm from another instance"
msgstr ""
# src/template_utils.rs:217
msgid "Username"
msgstr ""
# src/template_utils.rs:225
msgid "Example: user@plu.me"
msgstr ""
msgid "Continue to your instance"
msgstr ""
msgid "View all"
msgstr ""
msgid "By {0}"
msgstr ""
msgid "What is Plume?"
msgstr ""
msgid "Plume is a decentralized blogging engine."
msgstr ""
msgid "Authors can manage multiple blogs, each as its own website."
msgstr ""
msgid "Articles are also visible on other Plume instances, and you can interact with them directly from other platforms like Mastodon."
msgstr ""
msgid "Create your account"
msgstr ""
msgid "Read the detailed rules"
msgstr ""
msgid "Respond"
msgstr ""
msgid "Delete this comment"
msgstr ""
msgid "None"
msgstr ""
msgid "No description"
msgstr ""
msgid "Notifications"
msgstr ""
msgid "Plume"
msgstr ""
msgid "Menu"
msgstr ""
msgid "Dashboard"
msgstr ""
msgid "Log Out"
msgstr ""
msgid "My account"
msgstr ""
msgid "Log In"
msgstr ""
msgid "Register"
msgstr ""
msgid "About this instance"
msgstr ""
msgid "Source code"
msgstr ""
msgid "Matrix room"
msgstr ""
msgid "Your media"
msgstr ""
msgid "Upload"
msgstr ""
msgid "You don't have any media yet."
msgstr ""
msgid "Content warning: {0}"
msgstr ""
msgid "Delete"
msgstr ""
msgid "Details"
msgstr ""
msgid "Media details"
msgstr ""
msgid "Go back to the gallery"
msgstr ""
msgid "Markdown syntax"
msgstr ""
msgid "Copy it into your articles, to insert this media:"
msgstr ""
msgid "Use as an avatar"
msgstr ""
msgid "Media upload"
msgstr ""
msgid "Useful for visually impaired people, as well as licensing information"
msgstr ""
msgid "Leave it empty, if none is needed"
msgstr ""
msgid "File"
msgstr ""
msgid "Send"
msgstr ""
msgid "{0}'s subscriptions"
msgstr ""
msgid "Articles"
msgstr ""
msgid "Subscribers"
msgstr ""
msgid "Subscriptions"
msgstr ""
msgid "Your Dashboard"
msgstr ""
msgid "Your Blogs"
msgstr ""
msgid "You don't have any blog yet. Create your own, or ask to join one."
msgstr ""
msgid "Start a new blog"
msgstr ""
msgid "Your Drafts"
msgstr ""
msgid "Go to your gallery"
msgstr ""
msgid "Admin"
msgstr ""
msgid "It is you"
msgstr ""
msgid "Edit your profile"
msgstr ""
msgid "Open on {0}"
msgstr ""
msgid "{0}'s subscribers"
msgstr ""
msgid "Edit your account"
msgstr ""
msgid "Your Profile"
msgstr ""
msgid "To change your avatar, upload it to your gallery and then select from there."
msgstr ""
msgid "Upload an avatar"
msgstr ""
# src/template_utils.rs:217
msgid "Display name"
msgstr ""
# src/template_utils.rs:217
msgid "Email"
msgstr ""
msgid "Summary"
msgstr ""
msgid "Update account"
msgstr ""
msgid "Be very careful, any action taken here can't be cancelled."
msgstr ""
msgid "Delete your account"
msgstr ""
msgid "Sorry, but as an admin, you can't leave your own instance."
msgstr ""
msgid "Atom feed"
msgstr ""
msgid "Recently boosted"
msgstr ""
msgid "Create an account"
msgstr ""
# src/template_utils.rs:217
msgid "Password confirmation"
msgstr ""
msgid "Apologies, but registrations are closed on this particular instance. You can, however, find a different one."
msgstr ""
msgid "Follow {}"
msgstr ""
msgid "Login to follow"
msgstr ""
msgid "Enter your full username to follow"
msgstr ""
msgid "Internal server error"
msgstr ""
msgid "Something broke on our side."
msgstr ""
msgid "Sorry about that. If you think this is a bug, please report it."
msgstr ""
msgid "Page not found"
msgstr ""
msgid "We couldn't find this page."
msgstr ""
msgid "The link that led you here may be broken."
msgstr ""
msgid "Invalid CSRF token"
msgstr ""
msgid "Something is wrong with your CSRF token. Make sure cookies are enabled in you browser, and try reloading this page. If you continue to see this error message, please report it."
msgstr ""
msgid "You are not authorized."
msgstr ""
msgid "The content you sent can't be processed."
msgstr ""
msgid "Maybe it was too long."
msgstr ""

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

804
po/plume/ko.po Normal file
View file

@ -0,0 +1,804 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-18 06:16\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Korean\n"
"Language: ko_KR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: ko\n"
"X-Crowdin-File: /master/po/plume/plume.pot\n"
# src/template_utils.rs:68
msgid "{0} commented on your article."
msgstr ""
# src/template_utils.rs:69
msgid "{0} is subscribed to you."
msgstr ""
# src/template_utils.rs:70
msgid "{0} liked your article."
msgstr ""
# src/template_utils.rs:71
msgid "{0} mentioned you."
msgstr ""
# src/template_utils.rs:72
msgid "{0} boosted your article."
msgstr ""
# src/template_utils.rs:108
msgid "{0}'s avatar"
msgstr ""
# src/routes/blogs.rs:70
msgid "To create a new blog, you need to be logged in"
msgstr ""
# src/routes/blogs.rs:109
msgid "A blog with the same name already exists."
msgstr ""
# src/routes/blogs.rs:172
msgid "You are not allowed to delete this blog."
msgstr ""
# src/routes/blogs.rs:217
msgid "You are not allowed to edit this blog."
msgstr ""
# src/routes/blogs.rs:262
msgid "You can't use this media as a blog icon."
msgstr ""
# src/routes/blogs.rs:280
msgid "You can't use this media as a blog banner."
msgstr ""
# src/routes/likes.rs:51
msgid "To like a post, you need to be logged in"
msgstr ""
# src/routes/notifications.rs:29
msgid "To see your notifications, you need to be logged in"
msgstr ""
# src/routes/posts.rs:93
msgid "This post isn't published yet."
msgstr ""
# src/routes/posts.rs:122
msgid "To write a new post, you need to be logged in"
msgstr ""
# src/routes/posts.rs:140
msgid "You are not an author of this blog."
msgstr ""
# src/routes/posts.rs:147
msgid "New post"
msgstr ""
# src/routes/posts.rs:192
msgid "Edit {0}"
msgstr ""
# src/routes/posts.rs:630
msgid "Couldn't obtain enough information about your account. Please make sure your username is correct."
msgstr ""
# src/routes/reshares.rs:51
msgid "To reshare a post, you need to be logged in"
msgstr ""
# src/routes/session.rs:181
msgid "Password reset"
msgstr ""
# src/routes/session.rs:182
msgid "Here is the link to reset your password: {0}"
msgstr ""
# src/routes/session.rs:259
msgid "Your password was successfully reset."
msgstr ""
# src/routes/session.rs:263
msgid "Sorry, but the link expired. Try again"
msgstr ""
# src/routes/user.rs:136
msgid "To access your dashboard, you need to be logged in"
msgstr ""
# src/routes/user.rs:244
msgid "To subscribe to someone, you need to be logged in"
msgstr ""
# src/routes/user.rs:344
msgid "To edit your profile, you need to be logged in"
msgstr ""
msgid "Reset your password"
msgstr ""
# src/template_utils.rs:217
msgid "E-mail"
msgstr ""
# src/template_utils.rs:220
msgid "Optional"
msgstr ""
msgid "Send password reset link"
msgstr ""
msgid "Check your inbox!"
msgstr ""
msgid "We sent a mail to the address you gave us, with a link to reset your password."
msgstr ""
msgid "Log in"
msgstr ""
# src/template_utils.rs:217
msgid "Username, or email"
msgstr ""
# src/template_utils.rs:217
msgid "Password"
msgstr ""
# src/template_utils.rs:217
msgid "New password"
msgstr ""
# src/template_utils.rs:217
msgid "Confirmation"
msgstr ""
msgid "Update password"
msgstr ""
msgid "Administration of {0}"
msgstr ""
msgid "Instances"
msgstr ""
msgid "Configuration"
msgstr ""
msgid "Users"
msgstr ""
msgid "Unblock"
msgstr ""
msgid "Block"
msgstr ""
msgid "About {0}"
msgstr ""
msgid "Home to <em>{0}</em> people"
msgstr ""
msgid "Who wrote <em>{0}</em> articles"
msgstr ""
msgid "And are connected to <em>{0}</em> other instances"
msgstr ""
msgid "Administred by"
msgstr ""
msgid "Runs Plume {0}"
msgstr ""
msgid "All the articles of the Fediverse"
msgstr ""
msgid "Latest articles"
msgstr ""
msgid "Your feed"
msgstr ""
msgid "Federated feed"
msgstr ""
msgid "Local feed"
msgstr ""
msgid "Welcome to {}"
msgstr ""
msgid "Articles from {}"
msgstr ""
msgid "Ban"
msgstr ""
msgid "Nothing to see here yet. Try subscribing to more people."
msgstr ""
msgid "Administration"
msgstr ""
# src/template_utils.rs:217
msgid "Name"
msgstr ""
msgid "Allow anyone to register here"
msgstr ""
msgid "Short description"
msgstr ""
msgid "Markdown syntax is supported"
msgstr ""
msgid "Long description"
msgstr ""
# src/template_utils.rs:217
msgid "Default article license"
msgstr ""
msgid "Save these settings"
msgstr ""
msgid "Search"
msgstr ""
msgid "Your query"
msgstr ""
msgid "Advanced search"
msgstr ""
# src/template_utils.rs:305
msgid "Article title matching these words"
msgstr ""
msgid "Title"
msgstr ""
# src/template_utils.rs:305
msgid "Subtitle matching these words"
msgstr ""
msgid "Subtitle - byline"
msgstr ""
# src/template_utils.rs:305
msgid "Content matching these words"
msgstr ""
msgid "Body content"
msgstr ""
# src/template_utils.rs:305
msgid "From this date"
msgstr ""
# src/template_utils.rs:305
msgid "To this date"
msgstr ""
# src/template_utils.rs:305
msgid "Containing these tags"
msgstr ""
msgid "Tags"
msgstr ""
# src/template_utils.rs:305
msgid "Posted on one of these instances"
msgstr ""
msgid "Instance domain"
msgstr ""
# src/template_utils.rs:305
msgid "Posted by one of these authors"
msgstr ""
msgid "Authors"
msgstr ""
# src/template_utils.rs:305
msgid "Posted on one of these blogs"
msgstr ""
msgid "Blog title"
msgstr ""
# src/template_utils.rs:305
msgid "Written in this language"
msgstr ""
msgid "Language"
msgstr ""
# src/template_utils.rs:305
msgid "Published under this license"
msgstr ""
msgid "Article license"
msgstr ""
msgid "Search result for \"{0}\""
msgstr ""
msgid "Search result"
msgstr ""
msgid "No result for your query"
msgstr ""
msgid "No more results for your query"
msgstr ""
msgid "Edit \"{}\""
msgstr ""
msgid "Description"
msgstr ""
msgid "You can upload images to your gallery, to use them as blog icons, or banners."
msgstr ""
msgid "Upload images"
msgstr ""
msgid "Blog icon"
msgstr ""
msgid "Blog banner"
msgstr ""
msgid "Update blog"
msgstr ""
msgid "Danger zone"
msgstr ""
msgid "Be very careful, any action taken here can't be reversed."
msgstr ""
msgid "Permanently delete this blog"
msgstr ""
msgid "{}'s icon"
msgstr ""
msgid "New article"
msgstr ""
msgid "Edit"
msgstr ""
msgid "There's one author on this blog: "
msgid_plural "There are {0} authors on this blog: "
msgstr[0] ""
msgid "No posts to see here yet."
msgstr ""
msgid "New Blog"
msgstr ""
msgid "Create a blog"
msgstr ""
msgid "Create blog"
msgstr ""
msgid "Articles tagged \"{0}\""
msgstr ""
msgid "There are currently no articles with such a tag"
msgstr ""
msgid "Written by {0}"
msgstr ""
msgid "Are you sure?"
msgstr ""
msgid "Delete this article"
msgstr ""
msgid "Draft"
msgstr ""
msgid "All rights reserved."
msgstr ""
msgid "This article is under the {0} license."
msgstr ""
msgid "Unsubscribe"
msgstr ""
msgid "Subscribe"
msgstr ""
msgid "One like"
msgid_plural "{0} likes"
msgstr[0] ""
msgid "I don't like this anymore"
msgstr ""
msgid "Add yours"
msgstr ""
msgid "One boost"
msgid_plural "{0} boosts"
msgstr[0] ""
msgid "I don't want to boost this anymore"
msgstr ""
msgid "Boost"
msgstr ""
msgid "{0}Log in{1}, or {2}use your Fediverse account{3} to interact with this article"
msgstr ""
msgid "Comments"
msgstr ""
# src/template_utils.rs:217
msgid "Content warning"
msgstr ""
msgid "Your comment"
msgstr ""
msgid "Submit comment"
msgstr ""
msgid "No comments yet. Be the first to react!"
msgstr ""
msgid "Interact with {}"
msgstr ""
msgid "Log in to interact"
msgstr ""
msgid "Enter your full username to interact"
msgstr ""
msgid "Publish"
msgstr ""
msgid "Classic editor (any changes will be lost)"
msgstr ""
# src/template_utils.rs:217
msgid "Subtitle"
msgstr ""
msgid "Content"
msgstr ""
msgid "You can upload media to your gallery, and then copy their Markdown code into your articles to insert them."
msgstr ""
msgid "Upload media"
msgstr ""
# src/template_utils.rs:217
msgid "Tags, separated by commas"
msgstr ""
# src/template_utils.rs:217
msgid "License"
msgstr ""
# src/template_utils.rs:225
msgid "Leave it empty to reserve all rights"
msgstr ""
msgid "Illustration"
msgstr ""
msgid "This is a draft, don't publish it yet."
msgstr ""
msgid "Update"
msgstr ""
msgid "Update, or publish"
msgstr ""
msgid "Publish your post"
msgstr ""
msgid "I'm from this instance"
msgstr ""
msgid "I'm from another instance"
msgstr ""
# src/template_utils.rs:217
msgid "Username"
msgstr ""
# src/template_utils.rs:225
msgid "Example: user@plu.me"
msgstr ""
msgid "Continue to your instance"
msgstr ""
msgid "View all"
msgstr ""
msgid "By {0}"
msgstr ""
msgid "What is Plume?"
msgstr ""
msgid "Plume is a decentralized blogging engine."
msgstr ""
msgid "Authors can manage multiple blogs, each as its own website."
msgstr ""
msgid "Articles are also visible on other Plume instances, and you can interact with them directly from other platforms like Mastodon."
msgstr ""
msgid "Create your account"
msgstr ""
msgid "Read the detailed rules"
msgstr ""
msgid "Respond"
msgstr ""
msgid "Delete this comment"
msgstr ""
msgid "None"
msgstr ""
msgid "No description"
msgstr ""
msgid "Notifications"
msgstr ""
msgid "Plume"
msgstr ""
msgid "Menu"
msgstr ""
msgid "Dashboard"
msgstr ""
msgid "Log Out"
msgstr ""
msgid "My account"
msgstr ""
msgid "Log In"
msgstr ""
msgid "Register"
msgstr ""
msgid "About this instance"
msgstr ""
msgid "Source code"
msgstr ""
msgid "Matrix room"
msgstr ""
msgid "Your media"
msgstr ""
msgid "Upload"
msgstr ""
msgid "You don't have any media yet."
msgstr ""
msgid "Content warning: {0}"
msgstr ""
msgid "Delete"
msgstr ""
msgid "Details"
msgstr ""
msgid "Media details"
msgstr ""
msgid "Go back to the gallery"
msgstr ""
msgid "Markdown syntax"
msgstr ""
msgid "Copy it into your articles, to insert this media:"
msgstr ""
msgid "Use as an avatar"
msgstr ""
msgid "Media upload"
msgstr ""
msgid "Useful for visually impaired people, as well as licensing information"
msgstr ""
msgid "Leave it empty, if none is needed"
msgstr ""
msgid "File"
msgstr ""
msgid "Send"
msgstr ""
msgid "{0}'s subscriptions"
msgstr ""
msgid "Articles"
msgstr ""
msgid "Subscribers"
msgstr ""
msgid "Subscriptions"
msgstr ""
msgid "Your Dashboard"
msgstr ""
msgid "Your Blogs"
msgstr ""
msgid "You don't have any blog yet. Create your own, or ask to join one."
msgstr ""
msgid "Start a new blog"
msgstr ""
msgid "Your Drafts"
msgstr ""
msgid "Go to your gallery"
msgstr ""
msgid "Admin"
msgstr ""
msgid "It is you"
msgstr ""
msgid "Edit your profile"
msgstr ""
msgid "Open on {0}"
msgstr ""
msgid "{0}'s subscribers"
msgstr ""
msgid "Edit your account"
msgstr ""
msgid "Your Profile"
msgstr ""
msgid "To change your avatar, upload it to your gallery and then select from there."
msgstr ""
msgid "Upload an avatar"
msgstr ""
# src/template_utils.rs:217
msgid "Display name"
msgstr ""
# src/template_utils.rs:217
msgid "Email"
msgstr ""
msgid "Summary"
msgstr ""
msgid "Update account"
msgstr ""
msgid "Be very careful, any action taken here can't be cancelled."
msgstr ""
msgid "Delete your account"
msgstr ""
msgid "Sorry, but as an admin, you can't leave your own instance."
msgstr ""
msgid "Atom feed"
msgstr ""
msgid "Recently boosted"
msgstr ""
msgid "Create an account"
msgstr ""
# src/template_utils.rs:217
msgid "Password confirmation"
msgstr ""
msgid "Apologies, but registrations are closed on this particular instance. You can, however, find a different one."
msgstr ""
msgid "Follow {}"
msgstr ""
msgid "Login to follow"
msgstr ""
msgid "Enter your full username to follow"
msgstr ""
msgid "Internal server error"
msgstr ""
msgid "Something broke on our side."
msgstr ""
msgid "Sorry about that. If you think this is a bug, please report it."
msgstr ""
msgid "Page not found"
msgstr ""
msgid "We couldn't find this page."
msgstr ""
msgid "The link that led you here may be broken."
msgstr ""
msgid "Invalid CSRF token"
msgstr ""
msgid "Something is wrong with your CSRF token. Make sure cookies are enabled in you browser, and try reloading this page. If you continue to see this error message, please report it."
msgstr ""
msgid "You are not authorized."
msgstr ""
msgid "The content you sent can't be processed."
msgstr ""
msgid "Maybe it was too long."
msgstr ""

File diff suppressed because it is too large Load diff

807
po/plume/nl.po Normal file
View file

@ -0,0 +1,807 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-17 20:49\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Dutch\n"
"Language: nl_NL\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: nl\n"
"X-Crowdin-File: /master/po/plume/plume.pot\n"
# src/template_utils.rs:68
msgid "{0} commented on your article."
msgstr ""
# src/template_utils.rs:69
msgid "{0} is subscribed to you."
msgstr ""
# src/template_utils.rs:70
msgid "{0} liked your article."
msgstr ""
# src/template_utils.rs:71
msgid "{0} mentioned you."
msgstr ""
# src/template_utils.rs:72
msgid "{0} boosted your article."
msgstr ""
# src/template_utils.rs:108
msgid "{0}'s avatar"
msgstr ""
# src/routes/blogs.rs:70
msgid "To create a new blog, you need to be logged in"
msgstr ""
# src/routes/blogs.rs:109
msgid "A blog with the same name already exists."
msgstr ""
# src/routes/blogs.rs:172
msgid "You are not allowed to delete this blog."
msgstr ""
# src/routes/blogs.rs:217
msgid "You are not allowed to edit this blog."
msgstr ""
# src/routes/blogs.rs:262
msgid "You can't use this media as a blog icon."
msgstr ""
# src/routes/blogs.rs:280
msgid "You can't use this media as a blog banner."
msgstr ""
# src/routes/likes.rs:51
msgid "To like a post, you need to be logged in"
msgstr ""
# src/routes/notifications.rs:29
msgid "To see your notifications, you need to be logged in"
msgstr ""
# src/routes/posts.rs:93
msgid "This post isn't published yet."
msgstr ""
# src/routes/posts.rs:122
msgid "To write a new post, you need to be logged in"
msgstr ""
# src/routes/posts.rs:140
msgid "You are not an author of this blog."
msgstr ""
# src/routes/posts.rs:147
msgid "New post"
msgstr ""
# src/routes/posts.rs:192
msgid "Edit {0}"
msgstr ""
# src/routes/posts.rs:630
msgid "Couldn't obtain enough information about your account. Please make sure your username is correct."
msgstr ""
# src/routes/reshares.rs:51
msgid "To reshare a post, you need to be logged in"
msgstr ""
# src/routes/session.rs:181
msgid "Password reset"
msgstr ""
# src/routes/session.rs:182
msgid "Here is the link to reset your password: {0}"
msgstr ""
# src/routes/session.rs:259
msgid "Your password was successfully reset."
msgstr ""
# src/routes/session.rs:263
msgid "Sorry, but the link expired. Try again"
msgstr ""
# src/routes/user.rs:136
msgid "To access your dashboard, you need to be logged in"
msgstr ""
# src/routes/user.rs:244
msgid "To subscribe to someone, you need to be logged in"
msgstr ""
# src/routes/user.rs:344
msgid "To edit your profile, you need to be logged in"
msgstr ""
msgid "Reset your password"
msgstr ""
# src/template_utils.rs:217
msgid "E-mail"
msgstr ""
# src/template_utils.rs:220
msgid "Optional"
msgstr ""
msgid "Send password reset link"
msgstr ""
msgid "Check your inbox!"
msgstr ""
msgid "We sent a mail to the address you gave us, with a link to reset your password."
msgstr ""
msgid "Log in"
msgstr ""
# src/template_utils.rs:217
msgid "Username, or email"
msgstr ""
# src/template_utils.rs:217
msgid "Password"
msgstr ""
# src/template_utils.rs:217
msgid "New password"
msgstr ""
# src/template_utils.rs:217
msgid "Confirmation"
msgstr ""
msgid "Update password"
msgstr ""
msgid "Administration of {0}"
msgstr ""
msgid "Instances"
msgstr ""
msgid "Configuration"
msgstr ""
msgid "Users"
msgstr ""
msgid "Unblock"
msgstr ""
msgid "Block"
msgstr ""
msgid "About {0}"
msgstr ""
msgid "Home to <em>{0}</em> people"
msgstr ""
msgid "Who wrote <em>{0}</em> articles"
msgstr ""
msgid "And are connected to <em>{0}</em> other instances"
msgstr ""
msgid "Administred by"
msgstr ""
msgid "Runs Plume {0}"
msgstr ""
msgid "All the articles of the Fediverse"
msgstr ""
msgid "Latest articles"
msgstr ""
msgid "Your feed"
msgstr ""
msgid "Federated feed"
msgstr ""
msgid "Local feed"
msgstr ""
msgid "Welcome to {}"
msgstr ""
msgid "Articles from {}"
msgstr ""
msgid "Ban"
msgstr ""
msgid "Nothing to see here yet. Try subscribing to more people."
msgstr ""
msgid "Administration"
msgstr ""
# src/template_utils.rs:217
msgid "Name"
msgstr ""
msgid "Allow anyone to register here"
msgstr ""
msgid "Short description"
msgstr ""
msgid "Markdown syntax is supported"
msgstr ""
msgid "Long description"
msgstr ""
# src/template_utils.rs:217
msgid "Default article license"
msgstr ""
msgid "Save these settings"
msgstr ""
msgid "Search"
msgstr ""
msgid "Your query"
msgstr ""
msgid "Advanced search"
msgstr ""
# src/template_utils.rs:305
msgid "Article title matching these words"
msgstr ""
msgid "Title"
msgstr ""
# src/template_utils.rs:305
msgid "Subtitle matching these words"
msgstr ""
msgid "Subtitle - byline"
msgstr ""
# src/template_utils.rs:305
msgid "Content matching these words"
msgstr ""
msgid "Body content"
msgstr ""
# src/template_utils.rs:305
msgid "From this date"
msgstr ""
# src/template_utils.rs:305
msgid "To this date"
msgstr ""
# src/template_utils.rs:305
msgid "Containing these tags"
msgstr ""
msgid "Tags"
msgstr ""
# src/template_utils.rs:305
msgid "Posted on one of these instances"
msgstr ""
msgid "Instance domain"
msgstr ""
# src/template_utils.rs:305
msgid "Posted by one of these authors"
msgstr ""
msgid "Authors"
msgstr ""
# src/template_utils.rs:305
msgid "Posted on one of these blogs"
msgstr ""
msgid "Blog title"
msgstr ""
# src/template_utils.rs:305
msgid "Written in this language"
msgstr ""
msgid "Language"
msgstr ""
# src/template_utils.rs:305
msgid "Published under this license"
msgstr ""
msgid "Article license"
msgstr ""
msgid "Search result for \"{0}\""
msgstr ""
msgid "Search result"
msgstr ""
msgid "No result for your query"
msgstr ""
msgid "No more results for your query"
msgstr ""
msgid "Edit \"{}\""
msgstr ""
msgid "Description"
msgstr ""
msgid "You can upload images to your gallery, to use them as blog icons, or banners."
msgstr ""
msgid "Upload images"
msgstr ""
msgid "Blog icon"
msgstr ""
msgid "Blog banner"
msgstr ""
msgid "Update blog"
msgstr ""
msgid "Danger zone"
msgstr ""
msgid "Be very careful, any action taken here can't be reversed."
msgstr ""
msgid "Permanently delete this blog"
msgstr ""
msgid "{}'s icon"
msgstr ""
msgid "New article"
msgstr ""
msgid "Edit"
msgstr ""
msgid "There's one author on this blog: "
msgid_plural "There are {0} authors on this blog: "
msgstr[0] ""
msgstr[1] ""
msgid "No posts to see here yet."
msgstr ""
msgid "New Blog"
msgstr ""
msgid "Create a blog"
msgstr ""
msgid "Create blog"
msgstr ""
msgid "Articles tagged \"{0}\""
msgstr ""
msgid "There are currently no articles with such a tag"
msgstr ""
msgid "Written by {0}"
msgstr ""
msgid "Are you sure?"
msgstr ""
msgid "Delete this article"
msgstr ""
msgid "Draft"
msgstr ""
msgid "All rights reserved."
msgstr ""
msgid "This article is under the {0} license."
msgstr ""
msgid "Unsubscribe"
msgstr ""
msgid "Subscribe"
msgstr ""
msgid "One like"
msgid_plural "{0} likes"
msgstr[0] ""
msgstr[1] ""
msgid "I don't like this anymore"
msgstr ""
msgid "Add yours"
msgstr ""
msgid "One boost"
msgid_plural "{0} boosts"
msgstr[0] ""
msgstr[1] ""
msgid "I don't want to boost this anymore"
msgstr ""
msgid "Boost"
msgstr ""
msgid "{0}Log in{1}, or {2}use your Fediverse account{3} to interact with this article"
msgstr ""
msgid "Comments"
msgstr ""
# src/template_utils.rs:217
msgid "Content warning"
msgstr ""
msgid "Your comment"
msgstr ""
msgid "Submit comment"
msgstr ""
msgid "No comments yet. Be the first to react!"
msgstr ""
msgid "Interact with {}"
msgstr ""
msgid "Log in to interact"
msgstr ""
msgid "Enter your full username to interact"
msgstr ""
msgid "Publish"
msgstr ""
msgid "Classic editor (any changes will be lost)"
msgstr ""
# src/template_utils.rs:217
msgid "Subtitle"
msgstr ""
msgid "Content"
msgstr ""
msgid "You can upload media to your gallery, and then copy their Markdown code into your articles to insert them."
msgstr ""
msgid "Upload media"
msgstr ""
# src/template_utils.rs:217
msgid "Tags, separated by commas"
msgstr ""
# src/template_utils.rs:217
msgid "License"
msgstr ""
# src/template_utils.rs:225
msgid "Leave it empty to reserve all rights"
msgstr ""
msgid "Illustration"
msgstr ""
msgid "This is a draft, don't publish it yet."
msgstr ""
msgid "Update"
msgstr ""
msgid "Update, or publish"
msgstr ""
msgid "Publish your post"
msgstr ""
msgid "I'm from this instance"
msgstr ""
msgid "I'm from another instance"
msgstr ""
# src/template_utils.rs:217
msgid "Username"
msgstr ""
# src/template_utils.rs:225
msgid "Example: user@plu.me"
msgstr ""
msgid "Continue to your instance"
msgstr ""
msgid "View all"
msgstr ""
msgid "By {0}"
msgstr ""
msgid "What is Plume?"
msgstr ""
msgid "Plume is a decentralized blogging engine."
msgstr ""
msgid "Authors can manage multiple blogs, each as its own website."
msgstr ""
msgid "Articles are also visible on other Plume instances, and you can interact with them directly from other platforms like Mastodon."
msgstr ""
msgid "Create your account"
msgstr ""
msgid "Read the detailed rules"
msgstr ""
msgid "Respond"
msgstr ""
msgid "Delete this comment"
msgstr ""
msgid "None"
msgstr ""
msgid "No description"
msgstr ""
msgid "Notifications"
msgstr ""
msgid "Plume"
msgstr ""
msgid "Menu"
msgstr ""
msgid "Dashboard"
msgstr ""
msgid "Log Out"
msgstr ""
msgid "My account"
msgstr ""
msgid "Log In"
msgstr ""
msgid "Register"
msgstr ""
msgid "About this instance"
msgstr ""
msgid "Source code"
msgstr ""
msgid "Matrix room"
msgstr ""
msgid "Your media"
msgstr ""
msgid "Upload"
msgstr ""
msgid "You don't have any media yet."
msgstr ""
msgid "Content warning: {0}"
msgstr ""
msgid "Delete"
msgstr ""
msgid "Details"
msgstr ""
msgid "Media details"
msgstr ""
msgid "Go back to the gallery"
msgstr ""
msgid "Markdown syntax"
msgstr ""
msgid "Copy it into your articles, to insert this media:"
msgstr ""
msgid "Use as an avatar"
msgstr ""
msgid "Media upload"
msgstr ""
msgid "Useful for visually impaired people, as well as licensing information"
msgstr ""
msgid "Leave it empty, if none is needed"
msgstr ""
msgid "File"
msgstr ""
msgid "Send"
msgstr ""
msgid "{0}'s subscriptions"
msgstr ""
msgid "Articles"
msgstr ""
msgid "Subscribers"
msgstr ""
msgid "Subscriptions"
msgstr ""
msgid "Your Dashboard"
msgstr ""
msgid "Your Blogs"
msgstr ""
msgid "You don't have any blog yet. Create your own, or ask to join one."
msgstr ""
msgid "Start a new blog"
msgstr ""
msgid "Your Drafts"
msgstr ""
msgid "Go to your gallery"
msgstr ""
msgid "Admin"
msgstr ""
msgid "It is you"
msgstr ""
msgid "Edit your profile"
msgstr ""
msgid "Open on {0}"
msgstr ""
msgid "{0}'s subscribers"
msgstr ""
msgid "Edit your account"
msgstr ""
msgid "Your Profile"
msgstr ""
msgid "To change your avatar, upload it to your gallery and then select from there."
msgstr ""
msgid "Upload an avatar"
msgstr ""
# src/template_utils.rs:217
msgid "Display name"
msgstr ""
# src/template_utils.rs:217
msgid "Email"
msgstr ""
msgid "Summary"
msgstr ""
msgid "Update account"
msgstr ""
msgid "Be very careful, any action taken here can't be cancelled."
msgstr ""
msgid "Delete your account"
msgstr ""
msgid "Sorry, but as an admin, you can't leave your own instance."
msgstr ""
msgid "Atom feed"
msgstr ""
msgid "Recently boosted"
msgstr ""
msgid "Create an account"
msgstr ""
# src/template_utils.rs:217
msgid "Password confirmation"
msgstr ""
msgid "Apologies, but registrations are closed on this particular instance. You can, however, find a different one."
msgstr ""
msgid "Follow {}"
msgstr ""
msgid "Login to follow"
msgstr ""
msgid "Enter your full username to follow"
msgstr ""
msgid "Internal server error"
msgstr ""
msgid "Something broke on our side."
msgstr ""
msgid "Sorry about that. If you think this is a bug, please report it."
msgstr ""
msgid "Page not found"
msgstr ""
msgid "We couldn't find this page."
msgstr ""
msgid "The link that led you here may be broken."
msgstr ""
msgid "Invalid CSRF token"
msgstr ""
msgid "Something is wrong with your CSRF token. Make sure cookies are enabled in you browser, and try reloading this page. If you continue to see this error message, please report it."
msgstr ""
msgid "You are not authorized."
msgstr ""
msgid "The content you sent can't be processed."
msgstr ""
msgid "Maybe it was too long."
msgstr ""

807
po/plume/no.po Normal file
View file

@ -0,0 +1,807 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-18 06:16\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Norwegian\n"
"Language: no_NO\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: no\n"
"X-Crowdin-File: /master/po/plume/plume.pot\n"
# src/template_utils.rs:68
msgid "{0} commented on your article."
msgstr ""
# src/template_utils.rs:69
msgid "{0} is subscribed to you."
msgstr ""
# src/template_utils.rs:70
msgid "{0} liked your article."
msgstr ""
# src/template_utils.rs:71
msgid "{0} mentioned you."
msgstr ""
# src/template_utils.rs:72
msgid "{0} boosted your article."
msgstr ""
# src/template_utils.rs:108
msgid "{0}'s avatar"
msgstr ""
# src/routes/blogs.rs:70
msgid "To create a new blog, you need to be logged in"
msgstr ""
# src/routes/blogs.rs:109
msgid "A blog with the same name already exists."
msgstr ""
# src/routes/blogs.rs:172
msgid "You are not allowed to delete this blog."
msgstr ""
# src/routes/blogs.rs:217
msgid "You are not allowed to edit this blog."
msgstr ""
# src/routes/blogs.rs:262
msgid "You can't use this media as a blog icon."
msgstr ""
# src/routes/blogs.rs:280
msgid "You can't use this media as a blog banner."
msgstr ""
# src/routes/likes.rs:51
msgid "To like a post, you need to be logged in"
msgstr ""
# src/routes/notifications.rs:29
msgid "To see your notifications, you need to be logged in"
msgstr ""
# src/routes/posts.rs:93
msgid "This post isn't published yet."
msgstr ""
# src/routes/posts.rs:122
msgid "To write a new post, you need to be logged in"
msgstr ""
# src/routes/posts.rs:140
msgid "You are not an author of this blog."
msgstr ""
# src/routes/posts.rs:147
msgid "New post"
msgstr ""
# src/routes/posts.rs:192
msgid "Edit {0}"
msgstr ""
# src/routes/posts.rs:630
msgid "Couldn't obtain enough information about your account. Please make sure your username is correct."
msgstr ""
# src/routes/reshares.rs:51
msgid "To reshare a post, you need to be logged in"
msgstr ""
# src/routes/session.rs:181
msgid "Password reset"
msgstr ""
# src/routes/session.rs:182
msgid "Here is the link to reset your password: {0}"
msgstr ""
# src/routes/session.rs:259
msgid "Your password was successfully reset."
msgstr ""
# src/routes/session.rs:263
msgid "Sorry, but the link expired. Try again"
msgstr ""
# src/routes/user.rs:136
msgid "To access your dashboard, you need to be logged in"
msgstr ""
# src/routes/user.rs:244
msgid "To subscribe to someone, you need to be logged in"
msgstr ""
# src/routes/user.rs:344
msgid "To edit your profile, you need to be logged in"
msgstr ""
msgid "Reset your password"
msgstr ""
# src/template_utils.rs:217
msgid "E-mail"
msgstr ""
# src/template_utils.rs:220
msgid "Optional"
msgstr ""
msgid "Send password reset link"
msgstr ""
msgid "Check your inbox!"
msgstr ""
msgid "We sent a mail to the address you gave us, with a link to reset your password."
msgstr ""
msgid "Log in"
msgstr ""
# src/template_utils.rs:217
msgid "Username, or email"
msgstr ""
# src/template_utils.rs:217
msgid "Password"
msgstr ""
# src/template_utils.rs:217
msgid "New password"
msgstr ""
# src/template_utils.rs:217
msgid "Confirmation"
msgstr ""
msgid "Update password"
msgstr ""
msgid "Administration of {0}"
msgstr ""
msgid "Instances"
msgstr ""
msgid "Configuration"
msgstr ""
msgid "Users"
msgstr ""
msgid "Unblock"
msgstr ""
msgid "Block"
msgstr ""
msgid "About {0}"
msgstr ""
msgid "Home to <em>{0}</em> people"
msgstr ""
msgid "Who wrote <em>{0}</em> articles"
msgstr ""
msgid "And are connected to <em>{0}</em> other instances"
msgstr ""
msgid "Administred by"
msgstr ""
msgid "Runs Plume {0}"
msgstr ""
msgid "All the articles of the Fediverse"
msgstr ""
msgid "Latest articles"
msgstr ""
msgid "Your feed"
msgstr ""
msgid "Federated feed"
msgstr ""
msgid "Local feed"
msgstr ""
msgid "Welcome to {}"
msgstr ""
msgid "Articles from {}"
msgstr ""
msgid "Ban"
msgstr ""
msgid "Nothing to see here yet. Try subscribing to more people."
msgstr ""
msgid "Administration"
msgstr ""
# src/template_utils.rs:217
msgid "Name"
msgstr ""
msgid "Allow anyone to register here"
msgstr ""
msgid "Short description"
msgstr ""
msgid "Markdown syntax is supported"
msgstr ""
msgid "Long description"
msgstr ""
# src/template_utils.rs:217
msgid "Default article license"
msgstr ""
msgid "Save these settings"
msgstr ""
msgid "Search"
msgstr ""
msgid "Your query"
msgstr ""
msgid "Advanced search"
msgstr ""
# src/template_utils.rs:305
msgid "Article title matching these words"
msgstr ""
msgid "Title"
msgstr ""
# src/template_utils.rs:305
msgid "Subtitle matching these words"
msgstr ""
msgid "Subtitle - byline"
msgstr ""
# src/template_utils.rs:305
msgid "Content matching these words"
msgstr ""
msgid "Body content"
msgstr ""
# src/template_utils.rs:305
msgid "From this date"
msgstr ""
# src/template_utils.rs:305
msgid "To this date"
msgstr ""
# src/template_utils.rs:305
msgid "Containing these tags"
msgstr ""
msgid "Tags"
msgstr ""
# src/template_utils.rs:305
msgid "Posted on one of these instances"
msgstr ""
msgid "Instance domain"
msgstr ""
# src/template_utils.rs:305
msgid "Posted by one of these authors"
msgstr ""
msgid "Authors"
msgstr ""
# src/template_utils.rs:305
msgid "Posted on one of these blogs"
msgstr ""
msgid "Blog title"
msgstr ""
# src/template_utils.rs:305
msgid "Written in this language"
msgstr ""
msgid "Language"
msgstr ""
# src/template_utils.rs:305
msgid "Published under this license"
msgstr ""
msgid "Article license"
msgstr ""
msgid "Search result for \"{0}\""
msgstr ""
msgid "Search result"
msgstr ""
msgid "No result for your query"
msgstr ""
msgid "No more results for your query"
msgstr ""
msgid "Edit \"{}\""
msgstr ""
msgid "Description"
msgstr ""
msgid "You can upload images to your gallery, to use them as blog icons, or banners."
msgstr ""
msgid "Upload images"
msgstr ""
msgid "Blog icon"
msgstr ""
msgid "Blog banner"
msgstr ""
msgid "Update blog"
msgstr ""
msgid "Danger zone"
msgstr ""
msgid "Be very careful, any action taken here can't be reversed."
msgstr ""
msgid "Permanently delete this blog"
msgstr ""
msgid "{}'s icon"
msgstr ""
msgid "New article"
msgstr ""
msgid "Edit"
msgstr ""
msgid "There's one author on this blog: "
msgid_plural "There are {0} authors on this blog: "
msgstr[0] ""
msgstr[1] ""
msgid "No posts to see here yet."
msgstr ""
msgid "New Blog"
msgstr ""
msgid "Create a blog"
msgstr ""
msgid "Create blog"
msgstr ""
msgid "Articles tagged \"{0}\""
msgstr ""
msgid "There are currently no articles with such a tag"
msgstr ""
msgid "Written by {0}"
msgstr ""
msgid "Are you sure?"
msgstr ""
msgid "Delete this article"
msgstr ""
msgid "Draft"
msgstr ""
msgid "All rights reserved."
msgstr ""
msgid "This article is under the {0} license."
msgstr ""
msgid "Unsubscribe"
msgstr ""
msgid "Subscribe"
msgstr ""
msgid "One like"
msgid_plural "{0} likes"
msgstr[0] ""
msgstr[1] ""
msgid "I don't like this anymore"
msgstr ""
msgid "Add yours"
msgstr ""
msgid "One boost"
msgid_plural "{0} boosts"
msgstr[0] ""
msgstr[1] ""
msgid "I don't want to boost this anymore"
msgstr ""
msgid "Boost"
msgstr ""
msgid "{0}Log in{1}, or {2}use your Fediverse account{3} to interact with this article"
msgstr ""
msgid "Comments"
msgstr ""
# src/template_utils.rs:217
msgid "Content warning"
msgstr ""
msgid "Your comment"
msgstr ""
msgid "Submit comment"
msgstr ""
msgid "No comments yet. Be the first to react!"
msgstr ""
msgid "Interact with {}"
msgstr ""
msgid "Log in to interact"
msgstr ""
msgid "Enter your full username to interact"
msgstr ""
msgid "Publish"
msgstr ""
msgid "Classic editor (any changes will be lost)"
msgstr ""
# src/template_utils.rs:217
msgid "Subtitle"
msgstr ""
msgid "Content"
msgstr ""
msgid "You can upload media to your gallery, and then copy their Markdown code into your articles to insert them."
msgstr ""
msgid "Upload media"
msgstr ""
# src/template_utils.rs:217
msgid "Tags, separated by commas"
msgstr ""
# src/template_utils.rs:217
msgid "License"
msgstr ""
# src/template_utils.rs:225
msgid "Leave it empty to reserve all rights"
msgstr ""
msgid "Illustration"
msgstr ""
msgid "This is a draft, don't publish it yet."
msgstr ""
msgid "Update"
msgstr ""
msgid "Update, or publish"
msgstr ""
msgid "Publish your post"
msgstr ""
msgid "I'm from this instance"
msgstr ""
msgid "I'm from another instance"
msgstr ""
# src/template_utils.rs:217
msgid "Username"
msgstr ""
# src/template_utils.rs:225
msgid "Example: user@plu.me"
msgstr ""
msgid "Continue to your instance"
msgstr ""
msgid "View all"
msgstr ""
msgid "By {0}"
msgstr ""
msgid "What is Plume?"
msgstr ""
msgid "Plume is a decentralized blogging engine."
msgstr ""
msgid "Authors can manage multiple blogs, each as its own website."
msgstr ""
msgid "Articles are also visible on other Plume instances, and you can interact with them directly from other platforms like Mastodon."
msgstr ""
msgid "Create your account"
msgstr ""
msgid "Read the detailed rules"
msgstr ""
msgid "Respond"
msgstr ""
msgid "Delete this comment"
msgstr ""
msgid "None"
msgstr ""
msgid "No description"
msgstr ""
msgid "Notifications"
msgstr ""
msgid "Plume"
msgstr ""
msgid "Menu"
msgstr ""
msgid "Dashboard"
msgstr ""
msgid "Log Out"
msgstr ""
msgid "My account"
msgstr ""
msgid "Log In"
msgstr ""
msgid "Register"
msgstr ""
msgid "About this instance"
msgstr ""
msgid "Source code"
msgstr ""
msgid "Matrix room"
msgstr ""
msgid "Your media"
msgstr ""
msgid "Upload"
msgstr ""
msgid "You don't have any media yet."
msgstr ""
msgid "Content warning: {0}"
msgstr ""
msgid "Delete"
msgstr ""
msgid "Details"
msgstr ""
msgid "Media details"
msgstr ""
msgid "Go back to the gallery"
msgstr ""
msgid "Markdown syntax"
msgstr ""
msgid "Copy it into your articles, to insert this media:"
msgstr ""
msgid "Use as an avatar"
msgstr ""
msgid "Media upload"
msgstr ""
msgid "Useful for visually impaired people, as well as licensing information"
msgstr ""
msgid "Leave it empty, if none is needed"
msgstr ""
msgid "File"
msgstr ""
msgid "Send"
msgstr ""
msgid "{0}'s subscriptions"
msgstr ""
msgid "Articles"
msgstr ""
msgid "Subscribers"
msgstr ""
msgid "Subscriptions"
msgstr ""
msgid "Your Dashboard"
msgstr ""
msgid "Your Blogs"
msgstr ""
msgid "You don't have any blog yet. Create your own, or ask to join one."
msgstr ""
msgid "Start a new blog"
msgstr ""
msgid "Your Drafts"
msgstr ""
msgid "Go to your gallery"
msgstr ""
msgid "Admin"
msgstr ""
msgid "It is you"
msgstr ""
msgid "Edit your profile"
msgstr ""
msgid "Open on {0}"
msgstr ""
msgid "{0}'s subscribers"
msgstr ""
msgid "Edit your account"
msgstr ""
msgid "Your Profile"
msgstr ""
msgid "To change your avatar, upload it to your gallery and then select from there."
msgstr ""
msgid "Upload an avatar"
msgstr ""
# src/template_utils.rs:217
msgid "Display name"
msgstr ""
# src/template_utils.rs:217
msgid "Email"
msgstr ""
msgid "Summary"
msgstr ""
msgid "Update account"
msgstr ""
msgid "Be very careful, any action taken here can't be cancelled."
msgstr ""
msgid "Delete your account"
msgstr ""
msgid "Sorry, but as an admin, you can't leave your own instance."
msgstr ""
msgid "Atom feed"
msgstr ""
msgid "Recently boosted"
msgstr ""
msgid "Create an account"
msgstr ""
# src/template_utils.rs:217
msgid "Password confirmation"
msgstr ""
msgid "Apologies, but registrations are closed on this particular instance. You can, however, find a different one."
msgstr ""
msgid "Follow {}"
msgstr ""
msgid "Login to follow"
msgstr ""
msgid "Enter your full username to follow"
msgstr ""
msgid "Internal server error"
msgstr ""
msgid "Something broke on our side."
msgstr ""
msgid "Sorry about that. If you think this is a bug, please report it."
msgstr ""
msgid "Page not found"
msgstr ""
msgid "We couldn't find this page."
msgstr ""
msgid "The link that led you here may be broken."
msgstr ""
msgid "Invalid CSRF token"
msgstr ""
msgid "Something is wrong with your CSRF token. Make sure cookies are enabled in you browser, and try reloading this page. If you continue to see this error message, please report it."
msgstr ""
msgid "You are not authorized."
msgstr ""
msgid "The content you sent can't be processed."
msgstr ""
msgid "Maybe it was too long."
msgstr ""

File diff suppressed because it is too large Load diff

View file

@ -40,23 +40,27 @@ msgstr ""
msgid "To create a new blog, you need to be logged in"
msgstr ""
# src/routes/blogs.rs:169
# src/routes/blogs.rs:109
msgid "A blog with the same name already exists."
msgstr ""
# src/routes/blogs.rs:172
msgid "You are not allowed to delete this blog."
msgstr ""
# src/routes/blogs.rs:214
# src/routes/blogs.rs:217
msgid "You are not allowed to edit this blog."
msgstr ""
# src/routes/blogs.rs:253
# src/routes/blogs.rs:262
msgid "You can't use this media as a blog icon."
msgstr ""
# src/routes/blogs.rs:271
# src/routes/blogs.rs:280
msgid "You can't use this media as a blog banner."
msgstr ""
# src/routes/likes.rs:47
# src/routes/likes.rs:51
msgid "To like a post, you need to be logged in"
msgstr ""
@ -64,27 +68,31 @@ msgstr ""
msgid "To see your notifications, you need to be logged in"
msgstr ""
# src/routes/posts.rs:92
# src/routes/posts.rs:93
msgid "This post isn't published yet."
msgstr ""
# src/routes/posts.rs:120
# src/routes/posts.rs:122
msgid "To write a new post, you need to be logged in"
msgstr ""
# src/routes/posts.rs:138
# src/routes/posts.rs:140
msgid "You are not an author of this blog."
msgstr ""
# src/routes/posts.rs:145
# src/routes/posts.rs:147
msgid "New post"
msgstr ""
# src/routes/posts.rs:190
# src/routes/posts.rs:192
msgid "Edit {0}"
msgstr ""
# src/routes/reshares.rs:47
# src/routes/posts.rs:630
msgid "Couldn't obtain enough information about your account. Please make sure your username is correct."
msgstr ""
# src/routes/reshares.rs:51
msgid "To reshare a post, you need to be logged in"
msgstr ""
@ -104,70 +112,58 @@ msgstr ""
msgid "Sorry, but the link expired. Try again"
msgstr ""
# src/routes/user.rs:148
# src/routes/user.rs:136
msgid "To access your dashboard, you need to be logged in"
msgstr ""
# src/routes/user.rs:187
# src/routes/user.rs:244
msgid "To subscribe to someone, you need to be logged in"
msgstr ""
# src/routes/user.rs:287
# src/routes/user.rs:344
msgid "To edit your profile, you need to be logged in"
msgstr ""
msgid "Plume"
msgid "Reset your password"
msgstr ""
msgid "Menu"
# src/template_utils.rs:217
msgid "E-mail"
msgstr ""
msgid "Search"
# src/template_utils.rs:220
msgid "Optional"
msgstr ""
msgid "Dashboard"
msgid "Send password reset link"
msgstr ""
msgid "Notifications"
msgid "Check your inbox!"
msgstr ""
msgid "Log Out"
msgid "We sent a mail to the address you gave us, with a link to reset your password."
msgstr ""
msgid "My account"
msgid "Log in"
msgstr ""
msgid "Log In"
# src/template_utils.rs:217
msgid "Username, or email"
msgstr ""
msgid "Register"
# src/template_utils.rs:217
msgid "Password"
msgstr ""
msgid "About this instance"
# src/template_utils.rs:217
msgid "New password"
msgstr ""
msgid "Source code"
# src/template_utils.rs:217
msgid "Confirmation"
msgstr ""
msgid "Matrix room"
msgstr ""
msgid "Administration"
msgstr ""
msgid "Welcome to {}"
msgstr ""
msgid "Latest articles"
msgstr ""
msgid "Your feed"
msgstr ""
msgid "Federated feed"
msgstr ""
msgid "Local feed"
msgid "Update password"
msgstr ""
msgid "Administration of {0}"
@ -188,30 +184,62 @@ msgstr ""
msgid "Block"
msgstr ""
msgid "Ban"
msgid "About {0}"
msgstr ""
msgid "Home to <em>{0}</em> people"
msgstr ""
msgid "Who wrote <em>{0}</em> articles"
msgstr ""
msgid "And are connected to <em>{0}</em> other instances"
msgstr ""
msgid "Administred by"
msgstr ""
msgid "Runs Plume {0}"
msgstr ""
msgid "All the articles of the Fediverse"
msgstr ""
msgid "Latest articles"
msgstr ""
msgid "Your feed"
msgstr ""
msgid "Federated feed"
msgstr ""
msgid "Local feed"
msgstr ""
msgid "Welcome to {}"
msgstr ""
msgid "Articles from {}"
msgstr ""
msgid "Ban"
msgstr ""
msgid "Nothing to see here yet. Try subscribing to more people."
msgstr ""
msgid "Administration"
msgstr ""
# src/template_utils.rs:217
msgid "Name"
msgstr ""
# src/template_utils.rs:220
msgid "Optional"
msgstr ""
msgid "Allow anyone to register here"
msgstr ""
msgid "Short description - byline"
msgid "Short description"
msgstr ""
msgid "Markdown syntax is supported"
@ -227,183 +255,7 @@ msgstr ""
msgid "Save these settings"
msgstr ""
msgid "About {0}"
msgstr ""
msgid "Home to <em>{0}</em> users"
msgstr ""
msgid "Who wrote <em>{0}</em> articles"
msgstr ""
msgid "And are connected to <em>{0}</em> other instances"
msgstr ""
msgid "Administred by"
msgstr ""
msgid "Runs Plume {0}"
msgstr ""
msgid "Edit your account"
msgstr ""
msgid "Your Profile"
msgstr ""
msgid "To change your avatar, upload it to your gallery and then select from there."
msgstr ""
msgid "Upload an avatar"
msgstr ""
# src/template_utils.rs:217
msgid "Display name"
msgstr ""
# src/template_utils.rs:217
msgid "Email"
msgstr ""
msgid "Summary"
msgstr ""
msgid "Update account"
msgstr ""
msgid "Danger zone"
msgstr ""
msgid "Be very careful, any action taken here can't be cancelled."
msgstr ""
msgid "Delete your account"
msgstr ""
msgid "Sorry, but as an admin, you can't leave your own instance."
msgstr ""
msgid "Your Dashboard"
msgstr ""
msgid "Your Blogs"
msgstr ""
msgid "You don't have any blog yet. Create your own, or ask to join one."
msgstr ""
msgid "Start a new blog"
msgstr ""
msgid "Your Drafts"
msgstr ""
msgid "Your media"
msgstr ""
msgid "Go to your gallery"
msgstr ""
msgid "Create your account"
msgstr ""
msgid "Create an account"
msgstr ""
# src/template_utils.rs:217
msgid "Username"
msgstr ""
# src/template_utils.rs:217
msgid "Password"
msgstr ""
# src/template_utils.rs:217
msgid "Password confirmation"
msgstr ""
msgid "Apologies, but registrations are closed on this particular instance. You can, however, find a different one."
msgstr ""
msgid "Articles"
msgstr ""
msgid "Subscribers"
msgstr ""
msgid "Subscriptions"
msgstr ""
msgid "Atom feed"
msgstr ""
msgid "Recently boosted"
msgstr ""
msgid "Admin"
msgstr ""
msgid "It is you"
msgstr ""
msgid "Edit your profile"
msgstr ""
msgid "Open on {0}"
msgstr ""
msgid "Unsubscribe"
msgstr ""
msgid "Subscribe"
msgstr ""
msgid "{0}'s subscriptions'"
msgstr ""
msgid "{0}'s subscribers"
msgstr ""
msgid "Respond"
msgstr ""
msgid "Are you sure?"
msgstr ""
msgid "Delete this comment"
msgstr ""
msgid "What is Plume?"
msgstr ""
msgid "Plume is a decentralized blogging engine."
msgstr ""
msgid "Authors can manage various blogs, each as an unique website."
msgstr ""
msgid "Articles are also visible on other Plume instances, and you can interact with them directly from other platforms like Mastodon."
msgstr ""
msgid "Home to <em>{0}</em> people"
msgstr ""
msgid "Read the detailed rules"
msgstr ""
msgid "None"
msgstr ""
msgid "No description"
msgstr ""
msgid "View all"
msgstr ""
msgid "By {0}"
msgstr ""
msgid "Draft"
msgid "Search"
msgstr ""
msgid "Your query"
@ -495,38 +347,137 @@ msgstr ""
msgid "No more results for your query"
msgstr ""
msgid "Reset your password"
msgid "Edit \"{}\""
msgstr ""
msgid "Description"
msgstr ""
msgid "You can upload images to your gallery, to use them as blog icons, or banners."
msgstr ""
msgid "Upload images"
msgstr ""
msgid "Blog icon"
msgstr ""
msgid "Blog banner"
msgstr ""
msgid "Update blog"
msgstr ""
msgid "Danger zone"
msgstr ""
msgid "Be very careful, any action taken here can't be reversed."
msgstr ""
msgid "Permanently delete this blog"
msgstr ""
msgid "{}'s icon"
msgstr ""
msgid "New article"
msgstr ""
msgid "Edit"
msgstr ""
msgid "There's one author on this blog: "
msgid_plural "There are {0} authors on this blog: "
msgstr[0] ""
msgid "No posts to see here yet."
msgstr ""
msgid "New Blog"
msgstr ""
msgid "Create a blog"
msgstr ""
msgid "Create blog"
msgstr ""
msgid "Articles tagged \"{0}\""
msgstr ""
msgid "There are currently no articles with such a tag"
msgstr ""
msgid "Written by {0}"
msgstr ""
msgid "Are you sure?"
msgstr ""
msgid "Delete this article"
msgstr ""
msgid "Draft"
msgstr ""
msgid "All rights reserved."
msgstr ""
msgid "This article is under the {0} license."
msgstr ""
msgid "Unsubscribe"
msgstr ""
msgid "Subscribe"
msgstr ""
msgid "One like"
msgid_plural "{0} likes"
msgstr[0] ""
msgid "I don't like this anymore"
msgstr ""
msgid "Add yours"
msgstr ""
msgid "One boost"
msgid_plural "{0} boosts"
msgstr[0] ""
msgid "I don't want to boost this anymore"
msgstr ""
msgid "Boost"
msgstr ""
msgid "{0}Log in{1}, or {2}use your Fediverse account{3} to interact with this article"
msgstr ""
msgid "Comments"
msgstr ""
# src/template_utils.rs:217
msgid "New password"
msgid "Content warning"
msgstr ""
# src/template_utils.rs:217
msgid "Confirmation"
msgid "Your comment"
msgstr ""
msgid "Update password"
msgid "Submit comment"
msgstr ""
msgid "Check your inbox!"
msgid "No comments yet. Be the first to react!"
msgstr ""
msgid "We sent a mail to the address you gave us, with a link to reset your password."
msgid "Interact with {}"
msgstr ""
# src/template_utils.rs:217
msgid "E-mail"
msgid "Log in to interact"
msgstr ""
msgid "Send password reset link"
msgstr ""
msgid "Log in"
msgstr ""
# src/template_utils.rs:217
msgid "Username, or email"
msgid "Enter your full username to interact"
msgstr ""
msgid "Publish"
@ -575,146 +526,93 @@ msgstr ""
msgid "Publish your post"
msgstr ""
msgid "Written by {0}"
msgid "I'm from this instance"
msgstr ""
msgid "Edit"
msgstr ""
msgid "Delete this article"
msgstr ""
msgid "All rights reserved."
msgstr ""
msgid "This article is under the {0} license."
msgstr ""
msgid "One like"
msgid_plural "{0} likes"
msgstr[0] ""
msgid "I don't like this anymore"
msgstr ""
msgid "Add yours"
msgstr ""
msgid "One boost"
msgid_plural "{0} boost"
msgstr[0] ""
msgid "I don't want to boost this anymore"
msgstr ""
msgid "Boost"
msgstr ""
msgid "Log in, or use your Fediverse account to interact with this article"
msgstr ""
msgid "Comments"
msgid "I'm from another instance"
msgstr ""
# src/template_utils.rs:217
msgid "Content warning"
msgid "Username"
msgstr ""
msgid "Your comment"
# src/template_utils.rs:225
msgid "Example: user@plu.me"
msgstr ""
msgid "Submit comment"
msgid "Continue to your instance"
msgstr ""
msgid "No comments yet. Be the first to react!"
msgid "View all"
msgstr ""
msgid "Invalid CSRF token"
msgid "By {0}"
msgstr ""
msgid "Something is wrong with your CSRF token. Make sure cookies are enabled in you browser, and try reloading this page. If you continue to see this error message, please report it."
msgid "What is Plume?"
msgstr ""
msgid "Page not found"
msgid "Plume is a decentralized blogging engine."
msgstr ""
msgid "We couldn't find this page."
msgid "Authors can manage multiple blogs, each as its own website."
msgstr ""
msgid "The link that led you here may be broken."
msgid "Articles are also visible on other Plume instances, and you can interact with them directly from other platforms like Mastodon."
msgstr ""
msgid "The content you sent can't be processed."
msgid "Create your account"
msgstr ""
msgid "Maybe it was too long."
msgid "Read the detailed rules"
msgstr ""
msgid "You are not authorized."
msgid "Respond"
msgstr ""
msgid "Internal server error"
msgid "Delete this comment"
msgstr ""
msgid "Something broke on our side."
msgid "None"
msgstr ""
msgid "Sorry about that. If you think this is a bug, please report it."
msgid "No description"
msgstr ""
msgid "Edit \"{}\""
msgid "Notifications"
msgstr ""
msgid "Description"
msgid "Plume"
msgstr ""
msgid "You can upload images to your gallery, to use them as blog icons, or banners."
msgid "Menu"
msgstr ""
msgid "Upload images"
msgid "Dashboard"
msgstr ""
msgid "Blog icon"
msgid "Log Out"
msgstr ""
msgid "Blog banner"
msgid "My account"
msgstr ""
msgid "Update blog"
msgid "Log In"
msgstr ""
msgid "Be very careful, any action taken here can't be reversed."
msgid "Register"
msgstr ""
msgid "Permanently delete this blog"
msgid "About this instance"
msgstr ""
msgid "New Blog"
msgid "Source code"
msgstr ""
msgid "Create a blog"
msgid "Matrix room"
msgstr ""
msgid "Create blog"
msgstr ""
msgid "{}'s icon"
msgstr ""
msgid "New article"
msgstr ""
msgid "There's one author on this blog: "
msgid_plural "There are {0} authors on this blog: "
msgstr[0] ""
msgid "No posts to see here yet."
msgstr ""
msgid "Articles tagged \"{0}\""
msgstr ""
msgid "There are currently no articles with such a tag"
msgid "Your media"
msgstr ""
msgid "Upload"
@ -732,21 +630,6 @@ msgstr ""
msgid "Details"
msgstr ""
msgid "Media upload"
msgstr ""
msgid "Useful for visually impaired people, as well as licensing information"
msgstr ""
msgid "Leave it empty, if none is needed"
msgstr ""
msgid "File"
msgstr ""
msgid "Send"
msgstr ""
msgid "Media details"
msgstr ""
@ -762,8 +645,155 @@ msgstr ""
msgid "Use as an avatar"
msgstr ""
msgid "Log in to boost"
msgid "Media upload"
msgstr ""
msgid "Log in to like"
msgid "Useful for visually impaired people, as well as licensing information"
msgstr ""
msgid "Leave it empty, if none is needed"
msgstr ""
msgid "File"
msgstr ""
msgid "Send"
msgstr ""
msgid "{0}'s subscriptions"
msgstr ""
msgid "Articles"
msgstr ""
msgid "Subscribers"
msgstr ""
msgid "Subscriptions"
msgstr ""
msgid "Your Dashboard"
msgstr ""
msgid "Your Blogs"
msgstr ""
msgid "You don't have any blog yet. Create your own, or ask to join one."
msgstr ""
msgid "Start a new blog"
msgstr ""
msgid "Your Drafts"
msgstr ""
msgid "Go to your gallery"
msgstr ""
msgid "Admin"
msgstr ""
msgid "It is you"
msgstr ""
msgid "Edit your profile"
msgstr ""
msgid "Open on {0}"
msgstr ""
msgid "{0}'s subscribers"
msgstr ""
msgid "Edit your account"
msgstr ""
msgid "Your Profile"
msgstr ""
msgid "To change your avatar, upload it to your gallery and then select from there."
msgstr ""
msgid "Upload an avatar"
msgstr ""
# src/template_utils.rs:217
msgid "Display name"
msgstr ""
# src/template_utils.rs:217
msgid "Email"
msgstr ""
msgid "Summary"
msgstr ""
msgid "Update account"
msgstr ""
msgid "Be very careful, any action taken here can't be cancelled."
msgstr ""
msgid "Delete your account"
msgstr ""
msgid "Sorry, but as an admin, you can't leave your own instance."
msgstr ""
msgid "Atom feed"
msgstr ""
msgid "Recently boosted"
msgstr ""
msgid "Create an account"
msgstr ""
# src/template_utils.rs:217
msgid "Password confirmation"
msgstr ""
msgid "Apologies, but registrations are closed on this particular instance. You can, however, find a different one."
msgstr ""
msgid "Follow {}"
msgstr ""
msgid "Login to follow"
msgstr ""
msgid "Enter your full username to follow"
msgstr ""
msgid "Internal server error"
msgstr ""
msgid "Something broke on our side."
msgstr ""
msgid "Sorry about that. If you think this is a bug, please report it."
msgstr ""
msgid "Page not found"
msgstr ""
msgid "We couldn't find this page."
msgstr ""
msgid "The link that led you here may be broken."
msgstr ""
msgid "Invalid CSRF token"
msgstr ""
msgid "Something is wrong with your CSRF token. Make sure cookies are enabled in you browser, and try reloading this page. If you continue to see this error message, please report it."
msgstr ""
msgid "You are not authorized."
msgstr ""
msgid "The content you sent can't be processed."
msgstr ""
msgid "Maybe it was too long."
msgstr ""

File diff suppressed because it is too large Load diff

828
po/plume/ro.po Normal file
View file

@ -0,0 +1,828 @@
msgid ""
msgstr ""
"Project-Id-Version: plume\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-06-15 16:33-0700\n"
"PO-Revision-Date: 2019-04-18 06:16\n"
"Last-Translator: Ana Gelez (AnaGelez)\n"
"Language-Team: Romanian\n"
"Language: ro_RO\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : (n==0 || (n%100>0 && n"
"%100<20)) ? 1 : 2);\n"
"X-Generator: crowdin.com\n"
"X-Crowdin-Project: plume\n"
"X-Crowdin-Language: ro\n"
"X-Crowdin-File: /master/po/plume/plume.pot\n"
# src/template_utils.rs:68
msgid "{0} commented on your article."
msgstr "{0} a comentat pe articolul tău."
# src/template_utils.rs:69
msgid "{0} is subscribed to you."
msgstr "{0} este abonat la tine."
# src/template_utils.rs:70
msgid "{0} liked your article."
msgstr "{0} i-a plăcut articolul tău."
# src/template_utils.rs:71
msgid "{0} mentioned you."
msgstr "{0} te-a menționat."
# src/template_utils.rs:72
msgid "{0} boosted your article."
msgstr "{0} impulsionat articolul tău."
# src/template_utils.rs:108
msgid "{0}'s avatar"
msgstr "Avatarul lui {0}"
# src/routes/blogs.rs:70
msgid "To create a new blog, you need to be logged in"
msgstr "Pentru a crea un nou blog, trebuie sa fii logat"
# src/routes/blogs.rs:109
msgid "A blog with the same name already exists."
msgstr ""
# src/routes/blogs.rs:172
msgid "You are not allowed to delete this blog."
msgstr "Nu aveți permisiunea de a șterge acest blog."
# src/routes/blogs.rs:217
msgid "You are not allowed to edit this blog."
msgstr ""
# src/routes/blogs.rs:262
msgid "You can't use this media as a blog icon."
msgstr ""
# src/routes/blogs.rs:280
msgid "You can't use this media as a blog banner."
msgstr ""
# src/routes/likes.rs:51
msgid "To like a post, you need to be logged in"
msgstr ""
# src/routes/notifications.rs:29
msgid "To see your notifications, you need to be logged in"
msgstr ""
# src/routes/posts.rs:93
msgid "This post isn't published yet."
msgstr "Acest post nu a fost publicată încă."
# src/routes/posts.rs:122
msgid "To write a new post, you need to be logged in"
msgstr "Pentru a scrie un post nou, trebuie să fii logat"
# src/routes/posts.rs:140
msgid "You are not an author of this blog."
msgstr ""
# src/routes/posts.rs:147
msgid "New post"
msgstr "Postare nouă"
# src/routes/posts.rs:192
msgid "Edit {0}"
msgstr "Editare {0}"
# src/routes/posts.rs:630
msgid ""
"Couldn't obtain enough information about your account. Please make sure your "
"username is correct."
msgstr ""
# src/routes/reshares.rs:51
msgid "To reshare a post, you need to be logged in"
msgstr "Pentru a redistribui un post, trebuie să fii logat"
# src/routes/session.rs:181
msgid "Password reset"
msgstr "Resetare parolă"
# src/routes/session.rs:182
msgid "Here is the link to reset your password: {0}"
msgstr ""
# src/routes/session.rs:259
msgid "Your password was successfully reset."
msgstr "Parola dumneavoastră a fost resetată cu succes."
# src/routes/session.rs:263
msgid "Sorry, but the link expired. Try again"
msgstr ""
# src/routes/user.rs:136
msgid "To access your dashboard, you need to be logged in"
msgstr ""
# src/routes/user.rs:244
msgid "To subscribe to someone, you need to be logged in"
msgstr ""
# src/routes/user.rs:344
msgid "To edit your profile, you need to be logged in"
msgstr ""
msgid "Reset your password"
msgstr ""
# src/template_utils.rs:217
msgid "E-mail"
msgstr ""
# src/template_utils.rs:220
msgid "Optional"
msgstr "Opţional"
msgid "Send password reset link"
msgstr ""
msgid "Check your inbox!"
msgstr ""
msgid ""
"We sent a mail to the address you gave us, with a link to reset your "
"password."
msgstr ""
msgid "Log in"
msgstr ""
# src/template_utils.rs:217
msgid "Username, or email"
msgstr ""
# src/template_utils.rs:217
msgid "Password"
msgstr "Parolă"
# src/template_utils.rs:217
msgid "New password"
msgstr ""
# src/template_utils.rs:217
msgid "Confirmation"
msgstr ""
msgid "Update password"
msgstr ""
msgid "Administration of {0}"
msgstr ""
msgid "Instances"
msgstr "Instanțe"
msgid "Configuration"
msgstr "Configurare"
msgid "Users"
msgstr "Utilizatori"
msgid "Unblock"
msgstr "Deblochează"
msgid "Block"
msgstr "Bloc"
msgid "About {0}"
msgstr ""
msgid "Home to <em>{0}</em> people"
msgstr ""
msgid "Who wrote <em>{0}</em> articles"
msgstr ""
msgid "And are connected to <em>{0}</em> other instances"
msgstr ""
msgid "Administred by"
msgstr ""
msgid "Runs Plume {0}"
msgstr ""
msgid "All the articles of the Fediverse"
msgstr "Toate articolele Fediverse"
msgid "Latest articles"
msgstr "Ultimele articole"
msgid "Your feed"
msgstr ""
msgid "Federated feed"
msgstr ""
msgid "Local feed"
msgstr ""
msgid "Welcome to {}"
msgstr ""
msgid "Articles from {}"
msgstr "Articolele de la {}"
msgid "Ban"
msgstr "Interzice"
msgid "Nothing to see here yet. Try subscribing to more people."
msgstr ""
msgid "Administration"
msgstr "Administrație"
# src/template_utils.rs:217
msgid "Name"
msgstr "Nume"
msgid "Allow anyone to register here"
msgstr ""
msgid "Short description"
msgstr ""
msgid "Markdown syntax is supported"
msgstr ""
msgid "Long description"
msgstr ""
# src/template_utils.rs:217
msgid "Default article license"
msgstr ""
msgid "Save these settings"
msgstr ""
msgid "Search"
msgstr "Caută"
msgid "Your query"
msgstr ""
msgid "Advanced search"
msgstr ""
# src/template_utils.rs:305
msgid "Article title matching these words"
msgstr ""
msgid "Title"
msgstr "Titlu"
# src/template_utils.rs:305
msgid "Subtitle matching these words"
msgstr ""
msgid "Subtitle - byline"
msgstr ""
# src/template_utils.rs:305
msgid "Content matching these words"
msgstr ""
msgid "Body content"
msgstr "Conţinut de corp"
# src/template_utils.rs:305
msgid "From this date"
msgstr ""
# src/template_utils.rs:305
msgid "To this date"
msgstr "La această dată"
# src/template_utils.rs:305
msgid "Containing these tags"
msgstr ""
msgid "Tags"
msgstr "Etichete"
# src/template_utils.rs:305
msgid "Posted on one of these instances"
msgstr ""
msgid "Instance domain"
msgstr ""
# src/template_utils.rs:305
msgid "Posted by one of these authors"
msgstr ""
msgid "Authors"
msgstr "Autori"
# src/template_utils.rs:305
msgid "Posted on one of these blogs"
msgstr "Postat pe unul dintre aceste bloguri"
msgid "Blog title"
msgstr ""
# src/template_utils.rs:305
msgid "Written in this language"
msgstr "Scris în această limbă"
msgid "Language"
msgstr ""
# src/template_utils.rs:305
msgid "Published under this license"
msgstr ""
msgid "Article license"
msgstr ""
msgid "Search result for \"{0}\""
msgstr ""
msgid "Search result"
msgstr ""
msgid "No result for your query"
msgstr ""
msgid "No more results for your query"
msgstr ""
msgid "Edit \"{}\""
msgstr ""
msgid "Description"
msgstr ""
msgid ""
"You can upload images to your gallery, to use them as blog icons, or banners."
msgstr ""
msgid "Upload images"
msgstr ""
msgid "Blog icon"
msgstr ""
msgid "Blog banner"
msgstr ""
msgid "Update blog"
msgstr ""
msgid "Danger zone"
msgstr ""
msgid "Be very careful, any action taken here can't be reversed."
msgstr ""
msgid "Permanently delete this blog"
msgstr ""
msgid "{}'s icon"
msgstr ""
msgid "New article"
msgstr ""
msgid "Edit"
msgstr "Editare"
msgid "There's one author on this blog: "
msgid_plural "There are {0} authors on this blog: "
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgid "No posts to see here yet."
msgstr ""
msgid "New Blog"
msgstr ""
msgid "Create a blog"
msgstr ""
msgid "Create blog"
msgstr ""
msgid "Articles tagged \"{0}\""
msgstr ""
msgid "There are currently no articles with such a tag"
msgstr ""
msgid "Written by {0}"
msgstr ""
msgid "Are you sure?"
msgstr "Sînteți sigur?"
msgid "Delete this article"
msgstr ""
msgid "Draft"
msgstr "Ciornă"
msgid "All rights reserved."
msgstr ""
msgid "This article is under the {0} license."
msgstr ""
msgid "Unsubscribe"
msgstr "Dezabonare"
msgid "Subscribe"
msgstr "Abonare"
msgid "One like"
msgid_plural "{0} likes"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgid "I don't like this anymore"
msgstr ""
msgid "Add yours"
msgstr ""
msgid "One boost"
msgid_plural "{0} boosts"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgid "I don't want to boost this anymore"
msgstr ""
msgid "Boost"
msgstr "Boost"
msgid ""
"{0}Log in{1}, or {2}use your Fediverse account{3} to interact with this "
"article"
msgstr ""
msgid "Comments"
msgstr ""
# src/template_utils.rs:217
msgid "Content warning"
msgstr ""
msgid "Your comment"
msgstr "Comentariul tău"
msgid "Submit comment"
msgstr ""
msgid "No comments yet. Be the first to react!"
msgstr ""
msgid "Interact with {}"
msgstr ""
msgid "Log in to interact"
msgstr ""
msgid "Enter your full username to interact"
msgstr ""
msgid "Publish"
msgstr ""
msgid "Classic editor (any changes will be lost)"
msgstr ""
# src/template_utils.rs:217
msgid "Subtitle"
msgstr ""
msgid "Content"
msgstr ""
msgid ""
"You can upload media to your gallery, and then copy their Markdown code into "
"your articles to insert them."
msgstr ""
msgid "Upload media"
msgstr ""
# src/template_utils.rs:217
msgid "Tags, separated by commas"
msgstr ""
# src/template_utils.rs:217
msgid "License"
msgstr ""
# src/template_utils.rs:225
msgid "Leave it empty to reserve all rights"
msgstr ""
msgid "Illustration"
msgstr "Ilustraţie"
msgid "This is a draft, don't publish it yet."
msgstr ""
msgid "Update"
msgstr "Actualizare"
msgid "Update, or publish"
msgstr ""
msgid "Publish your post"
msgstr ""
#, fuzzy
msgid "I'm from this instance"
msgstr "Despre această instanță"
msgid "I'm from another instance"
msgstr ""
# src/template_utils.rs:217
msgid "Username"
msgstr "Nume utilizator"
# src/template_utils.rs:225
msgid "Example: user@plu.me"
msgstr ""
msgid "Continue to your instance"
msgstr ""
msgid "View all"
msgstr ""
msgid "By {0}"
msgstr ""
msgid "What is Plume?"
msgstr "Ce este Plume?"
msgid "Plume is a decentralized blogging engine."
msgstr ""
msgid "Authors can manage multiple blogs, each as its own website."
msgstr ""
msgid ""
"Articles are also visible on other Plume instances, and you can interact "
"with them directly from other platforms like Mastodon."
msgstr ""
msgid "Create your account"
msgstr ""
msgid "Read the detailed rules"
msgstr ""
msgid "Respond"
msgstr "Răspuns"
msgid "Delete this comment"
msgstr "Şterge comentariul"
msgid "None"
msgstr ""
msgid "No description"
msgstr ""
msgid "Notifications"
msgstr "Notificări"
msgid "Plume"
msgstr "Plume"
msgid "Menu"
msgstr "Meniu"
msgid "Dashboard"
msgstr "Tablou de bord"
msgid "Log Out"
msgstr "Deconectare"
msgid "My account"
msgstr "Contul meu"
msgid "Log In"
msgstr "Autentificare"
msgid "Register"
msgstr "Înregistrare"
msgid "About this instance"
msgstr "Despre această instanță"
msgid "Source code"
msgstr "Cod sursă"
msgid "Matrix room"
msgstr ""
msgid "Your media"
msgstr ""
msgid "Upload"
msgstr ""
msgid "You don't have any media yet."
msgstr ""
msgid "Content warning: {0}"
msgstr ""
msgid "Delete"
msgstr ""
msgid "Details"
msgstr ""
msgid "Media details"
msgstr ""
msgid "Go back to the gallery"
msgstr ""
msgid "Markdown syntax"
msgstr ""
msgid "Copy it into your articles, to insert this media:"
msgstr ""
msgid "Use as an avatar"
msgstr ""
msgid "Media upload"
msgstr ""
msgid "Useful for visually impaired people, as well as licensing information"
msgstr ""
msgid "Leave it empty, if none is needed"
msgstr ""
msgid "File"
msgstr ""
msgid "Send"
msgstr ""
msgid "{0}'s subscriptions"
msgstr ""
msgid "Articles"
msgstr "Articole"
msgid "Subscribers"
msgstr "Abonaţi"
msgid "Subscriptions"
msgstr "Abonamente"
msgid "Your Dashboard"
msgstr ""
msgid "Your Blogs"
msgstr ""
msgid "You don't have any blog yet. Create your own, or ask to join one."
msgstr ""
msgid "Start a new blog"
msgstr ""
msgid "Your Drafts"
msgstr ""
msgid "Go to your gallery"
msgstr ""
msgid "Admin"
msgstr "Admin"
msgid "It is you"
msgstr ""
msgid "Edit your profile"
msgstr "Editează-ți profilul"
msgid "Open on {0}"
msgstr "Deschide la {0}"
msgid "{0}'s subscribers"
msgstr ""
msgid "Edit your account"
msgstr ""
msgid "Your Profile"
msgstr ""
msgid ""
"To change your avatar, upload it to your gallery and then select from there."
msgstr ""
msgid "Upload an avatar"
msgstr ""
# src/template_utils.rs:217
msgid "Display name"
msgstr ""
# src/template_utils.rs:217
msgid "Email"
msgstr "Email"
msgid "Summary"
msgstr ""
msgid "Update account"
msgstr ""
msgid "Be very careful, any action taken here can't be cancelled."
msgstr ""
msgid "Delete your account"
msgstr ""
msgid "Sorry, but as an admin, you can't leave your own instance."
msgstr ""
msgid "Atom feed"
msgstr ""
msgid "Recently boosted"
msgstr ""
msgid "Create an account"
msgstr ""
# src/template_utils.rs:217
msgid "Password confirmation"
msgstr "Confirmarea parolei"
msgid ""
"Apologies, but registrations are closed on this particular instance. You "
"can, however, find a different one."
msgstr ""
msgid "Follow {}"
msgstr ""
msgid "Login to follow"
msgstr ""
msgid "Enter your full username to follow"
msgstr ""
msgid "Internal server error"
msgstr ""
msgid "Something broke on our side."
msgstr ""
msgid "Sorry about that. If you think this is a bug, please report it."
msgstr ""
msgid "Page not found"
msgstr ""
msgid "We couldn't find this page."
msgstr ""
msgid "The link that led you here may be broken."
msgstr ""
msgid "Invalid CSRF token"
msgstr ""
msgid ""
"Something is wrong with your CSRF token. Make sure cookies are enabled in "
"you browser, and try reloading this page. If you continue to see this error "
"message, please report it."
msgstr ""
msgid "You are not authorized."
msgstr ""
msgid "The content you sent can't be processed."
msgstr ""
msgid "Maybe it was too long."
msgstr ""

File diff suppressed because it is too large Load diff

Some files were not shown because too many files have changed in this diff Show more