Merge branch 'master' into federation

This commit is contained in:
Felix Ableitner 2020-06-09 14:01:26 +02:00
commit 0f1a8ec928
57 changed files with 1151 additions and 476 deletions

13
README.md vendored
View file

@ -34,7 +34,7 @@
Front Page|Post Front Page|Post
---|--- ---|---
![main screen](https://i.imgur.com/kZSRcRu.png)|![chat screen](https://i.imgur.com/4XghNh6.png) ![main screen](https://raw.githubusercontent.com/LemmyNet/lemmy/master/docs/img/main_screen.png)|![chat screen](https://raw.githubusercontent.com/LemmyNet/lemmy/master/docs/img/chat_screen.png)
[Lemmy](https://github.com/LemmyNet/lemmy) is similar to sites like [Reddit](https://reddit.com), [Lobste.rs](https://lobste.rs), [Raddle](https://raddle.me), or [Hacker News](https://news.ycombinator.com/): you subscribe to forums you're interested in, post links and discussions, then vote, and comment on them. Behind the scenes, it is very different; anyone can easily run a server, and all these servers are federated (think email), and connected to the same universe, called the [Fediverse](https://en.wikipedia.org/wiki/Fediverse). [Lemmy](https://github.com/LemmyNet/lemmy) is similar to sites like [Reddit](https://reddit.com), [Lobste.rs](https://lobste.rs), [Raddle](https://raddle.me), or [Hacker News](https://news.ycombinator.com/): you subscribe to forums you're interested in, post links and discussions, then vote, and comment on them. Behind the scenes, it is very different; anyone can easily run a server, and all these servers are federated (think email), and connected to the same universe, called the [Fediverse](https://en.wikipedia.org/wiki/Fediverse).
@ -44,7 +44,7 @@ The overall goal is to create an easily self-hostable, decentralized alternative
Each lemmy server can set its own moderation policy; appointing site-wide admins, and community moderators to keep out the trolls, and foster a healthy, non-toxic environment where all can feel comfortable contributing. Each lemmy server can set its own moderation policy; appointing site-wide admins, and community moderators to keep out the trolls, and foster a healthy, non-toxic environment where all can feel comfortable contributing.
*Note: Federation is still in active development* *Note: Federation is still in active development and the WebSocket, as well as, HTTP API are currently unstable*
### Why's it called Lemmy? ### Why's it called Lemmy?
@ -131,10 +131,13 @@ If you want to help with translating, take a look at [Weblate](https://weblate.y
## Contact ## Contact
- [Mastodon](https://mastodon.social/@LemmyDev) - [![Mastodon Follow](https://img.shields.io/mastodon/follow/810572?domain=https%3A%2F%2Fmastodon.social&style=social)](https://mastodon.social/@LemmyDev) - [Mastodon](https://mastodon.social/@LemmyDev)
- [Matrix](https://riot.im/app/#/room/#rust-reddit-fediverse:matrix.org) - [![Matrix](https://img.shields.io/matrix/rust-reddit-fediverse:matrix.org.svg?label=matrix-chat)](https://riot.im/app/#/room/#rust-reddit-fediverse:matrix.org) - [Matrix](https://riot.im/app/#/room/#rust-reddit-fediverse:matrix.org)
## Code Mirrors
- [GitHub](https://github.com/LemmyNet/lemmy) - [GitHub](https://github.com/LemmyNet/lemmy)
- [Gitea](https://yerbamate.dev/dessalines/lemmy) - [Gitea](https://yerbamate.dev/LemmyNet/lemmy)
- [GitLab](https://gitlab.com/dessalines/lemmy) - [GitLab](https://gitlab.com/dessalines/lemmy)
## Credits ## Credits

2
ansible/VERSION vendored
View file

@ -1 +1 @@
v0.6.51 v0.6.71

View file

@ -26,7 +26,7 @@ services:
restart: always restart: always
pictshare: pictshare:
image: shtripok/pictshare:latest image: hascheksolutions/pictshare:latest
ports: ports:
- "127.0.0.1:8537:80" - "127.0.0.1:8537:80"
volumes: volumes:

View file

@ -36,7 +36,7 @@ server {
# It might be nice to compress JSON, but leaving that out to protect against potential # It might be nice to compress JSON, but leaving that out to protect against potential
# compression+encryption information leak attacks like BREACH. # compression+encryption information leak attacks like BREACH.
gzip on; gzip on;
gzip_types text/css application/javascript; gzip_types text/css application/javascript image/svg+xml;
gzip_vary on; gzip_vary on;
# Only connect to this site via HTTPS for the two years # Only connect to this site via HTTPS for the two years

View file

@ -28,7 +28,7 @@ services:
- iframely - iframely
pictshare: pictshare:
image: shtripok/pictshare:latest image: hascheksolutions/pictshare:latest
ports: ports:
- "127.0.0.1:8537:80" - "127.0.0.1:8537:80"
volumes: volumes:

4
docker/lemmy.hjson vendored
View file

@ -23,9 +23,6 @@
jwt_secret: "changeme" jwt_secret: "changeme"
# The dir for the front end # The dir for the front end
front_end_dir: "/app/dist" front_end_dir: "/app/dist"
# whether to enable activitypub federation. this feature is in alpha, do not enable in production, as might
# cause problems like remote instances fetching and permanently storing bad data.
federation_enabled: false
# rate limits for various user actions, by user ip # rate limits for various user actions, by user ip
rate_limit: { rate_limit: {
# maximum number of messages created in interval # maximum number of messages created in interval
@ -60,6 +57,7 @@
# smtp_password: "" # smtp_password: ""
# # address to send emails from, eg "info@your-instance.com" # # address to send emails from, eg "info@your-instance.com"
# smtp_from_address: "" # smtp_from_address: ""
# use_tls: true
# } # }
} }

View file

@ -1,4 +1,4 @@
version: '3.3' version: '2.2'
services: services:
postgres: postgres:
@ -12,7 +12,7 @@ services:
restart: always restart: always
lemmy: lemmy:
image: dessalines/lemmy:v0.6.51 image: dessalines/lemmy:v0.6.71
ports: ports:
- "127.0.0.1:8536:8536" - "127.0.0.1:8536:8536"
restart: always restart: always
@ -26,12 +26,13 @@ services:
- iframely - iframely
pictshare: pictshare:
image: shtripok/pictshare:latest image: hascheksolutions/pictshare:latest
ports: ports:
- "127.0.0.1:8537:80" - "127.0.0.1:8537:80"
volumes: volumes:
- ./volumes/pictshare:/usr/share/nginx/html/data - ./volumes/pictshare:/usr/share/nginx/html/data
restart: always restart: always
mem_limit: 100m
iframely: iframely:
image: dogbin/iframely:latest image: dogbin/iframely:latest
@ -40,3 +41,4 @@ services:
volumes: volumes:
- ./iframely.config.local.js:/iframely/config.local.js:ro - ./iframely.config.local.js:/iframely/config.local.js:ro
restart: always restart: always
mem_limit: 100m

BIN
docs/img/chat_screen.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

BIN
docs/img/main_screen.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

BIN
docs/img/rank_algorithm.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

2
docs/src/about.md vendored
View file

@ -2,7 +2,7 @@
Front Page|Post Front Page|Post
---|--- ---|---
![main screen](https://i.imgur.com/kZSRcRu.png)|![chat screen](https://i.imgur.com/4XghNh6.png) ![main screen](https://raw.githubusercontent.com/LemmyNet/lemmy/master/docs/img/main_screen.png)|![chat screen](https://raw.githubusercontent.com/LemmyNet/lemmy/master/docs/img/chat_screen.png)
[Lemmy](https://github.com/LemmyNet/lemmy) is similar to sites like [Reddit](https://reddit.com), [Lobste.rs](https://lobste.rs), [Raddle](https://raddle.me), or [Hacker News](https://news.ycombinator.com/): you subscribe to forums you're interested in, post links and discussions, then vote, and comment on them. Behind the scenes, it is very different; anyone can easily run a server, and all these servers are federated (think email), and connected to the same universe, called the [Fediverse](https://en.wikipedia.org/wiki/Fediverse). [Lemmy](https://github.com/LemmyNet/lemmy) is similar to sites like [Reddit](https://reddit.com), [Lobste.rs](https://lobste.rs), [Raddle](https://raddle.me), or [Hacker News](https://news.ycombinator.com/): you subscribe to forums you're interested in, post links and discussions, then vote, and comment on them. Behind the scenes, it is very different; anyone can easily run a server, and all these servers are federated (think email), and connected to the same universe, called the [Fediverse](https://en.wikipedia.org/wiki/Fediverse).

View file

@ -26,4 +26,4 @@ Gravity = Decay gravity, 1.8 is default
A plot of rank over 24 hours, of scores of 1, 5, 10, 100, 1000, with a scale factor of 10k. A plot of rank over 24 hours, of scores of 1, 5, 10, 100, 1000, with a scale factor of 10k.
![](https://i.imgur.com/w8oBLlL.png) ![](https://raw.githubusercontent.com/LemmyNet/lemmy/master/docs/img/rank_algorithm.png)

View file

@ -10,12 +10,13 @@ cd /lemmy
wget https://raw.githubusercontent.com/dessalines/lemmy/master/docker/prod/docker-compose.yml wget https://raw.githubusercontent.com/dessalines/lemmy/master/docker/prod/docker-compose.yml
wget https://raw.githubusercontent.com/dessalines/lemmy/master/docker/lemmy.hjson wget https://raw.githubusercontent.com/dessalines/lemmy/master/docker/lemmy.hjson
wget https://raw.githubusercontent.com/dessalines/lemmy/master/docker/iframely.config.local.js wget https://raw.githubusercontent.com/dessalines/lemmy/master/docker/iframely.config.local.js
docker-compose up -d
``` ```
After this, have a look at the [config file](administration_configuration.md) named `lemmy.hjson`, and adjust it, in particular the hostname. After this, have a look at the [config file](administration_configuration.md) named `lemmy.hjson`, and adjust it, in particular the hostname, and possibly the db password. Then run:
To make Lemmy available outside the server, you need to setup a reverse proxy, like Nginx. [A sample nginx config](/ansible/templates/nginx.conf), could be setup with: `docker-compose up -d`
To make Lemmy available outside the server, you need to setup a reverse proxy, like Nginx. [A sample nginx config](https://raw.githubusercontent.com/dessalines/lemmy/master/ansible/templates/nginx.conf), could be setup with:
```bash ```bash
wget https://raw.githubusercontent.com/dessalines/lemmy/master/ansible/templates/nginx.conf wget https://raw.githubusercontent.com/dessalines/lemmy/master/ansible/templates/nginx.conf

View file

@ -5,12 +5,12 @@
If you don't have a local clone of the Lemmy repo yet, just run the following command: If you don't have a local clone of the Lemmy repo yet, just run the following command:
```bash ```bash
git clone https://yerbamate.dev/LemmyNet/lemmy.git -b federation git clone https://github.com/LemmyNet/lemmy -b federation
``` ```
If you already have the Lemmy repo cloned, you need to add a new remote: If you already have the Lemmy repo cloned, you need to add a new remote:
```bash ```bash
git remote add federation https://yerbamate.dev/LemmyNet/lemmy.git git remote add federation https://github.com/LemmyNet/lemmy
git checkout federation git checkout federation
git pull federation federation git pull federation federation
``` ```

View file

@ -1,6 +1,6 @@
# Lemmy API # Lemmy API
*Note: this may lag behind the actual API endpoints [here](../server/src/api).* *Note: this may lag behind the actual API endpoints [here](../server/src/api). The API should be considered unstable and may change any time.*
<!-- toc --> <!-- toc -->

63
install.sh vendored
View file

@ -1,4 +1,4 @@
#!/bin/bash #!/bin/sh
set -e set -e
# Set the database variable to the default first. # Set the database variable to the default first.
@ -10,25 +10,55 @@ export LEMMY_DATABASE_URL=postgres://lemmy:password@localhost:5432/lemmy
export JWT_SECRET=changeme export JWT_SECRET=changeme
export HOSTNAME=rrr export HOSTNAME=rrr
# Optionally initialize the database yes_no_prompt_invalid() {
init_db_valid=0 echo "Invalid input. Please enter either \"y\" or \"n\"." 1>&2
init_db_final=0 }
while [ "$init_db_valid" == 0 ]
do ask_to_init_db() {
init_db_valid=0
init_db_final=0
while [ "$init_db_valid" == 0 ]
do
read -p "Initialize database (y/n)? " init_db read -p "Initialize database (y/n)? " init_db
case "${init_db,,}" in case "$init_db" in
y|yes ) init_db_valid=1; init_db_final=1;; [yY]* ) init_db_valid=1; init_db_final=1;;
n|no ) init_db_valid=1; init_db_final=0;; [nN]* ) init_db_valid=1; init_db_final=0;;
* ) echo "Invalid input" 1>&2;; * ) yes_no_prompt_invalid;;
esac esac
echo echo
done done
if [ "$init_db_final" = 1 ] if [ "$init_db_final" = 1 ]
then then
source ./server/db-init.sh source ./server/db-init.sh
read -n 1 -s -r -p "Press ANY KEY to continue execution of this script, press CTRL+C to quit..." read -n 1 -s -r -p "Press ANY KEY to continue execution of this script, press CTRL+C to quit..."
echo echo
fi fi
}
ask_to_auto_reload() {
auto_reload_valid=0
auto_reload_final=0
while [ "$auto_reload_valid" == 0 ]
do
echo "Automagically reload the project when source files are changed?"
echo "ONLY ENABLE THIS FOR DEVELOPMENT!"
read -p "(y/n) " auto_reload
case "$auto_reload" in
[yY]* ) auto_reload_valid=1; auto_reload_final=1;;
[nN]* ) auto_reload_valid=1; auto_reload_final=0;;
* ) yes_no_prompt_invalid;;
esac
echo
done
if [ "$auto_reload_final" = 1 ]
then
cd ui && yarn start
cd server && cargo watch -x run
fi
}
# Optionally initialize the database
ask_to_init_db
# Build the web client # Build the web client
cd ui cd ui
@ -39,6 +69,5 @@ yarn build
cd ../server cd ../server
RUST_LOG=debug cargo run RUST_LOG=debug cargo run
# For live coding, where both the front and back end, automagically reload on any save, do: # For live coding, where both the front and back end, automagically reload on any save
# cd ui && yarn start ask_to_auto_reload
# cd server && cargo watch -x run

8
server/Cargo.toml vendored
View file

@ -1,7 +1,7 @@
[package] [package]
name = "lemmy_server" name = "lemmy_server"
version = "0.0.1" version = "0.0.1"
authors = ["Dessalines <happydooby@gmail.com>"] authors = ["Dessalines <tyhou13@gmx.com>"]
edition = "2018" edition = "2018"
[dependencies] [dependencies]
@ -13,8 +13,8 @@ activitystreams-new = { git = "https://git.asonix.dog/asonix/activitystreams-ske
activitystreams-ext = { git = "https://git.asonix.dog/asonix/activitystreams-ext" } activitystreams-ext = { git = "https://git.asonix.dog/asonix/activitystreams-ext" }
bcrypt = "0.8.0" bcrypt = "0.8.0"
chrono = { version = "0.4.7", features = ["serde"] } chrono = { version = "0.4.7", features = ["serde"] }
failure = "0.1.8"
serde_json = { version = "1.0.48", features = ["preserve_order"]} serde_json = { version = "1.0.48", features = ["preserve_order"]}
failure = "0.1.8"
serde = { version = "1.0.105", features = ["derive"] } serde = { version = "1.0.105", features = ["derive"] }
actix = "0.9.0" actix = "0.9.0"
actix-web = "2.0.0" actix-web = "2.0.0"
@ -29,8 +29,8 @@ strum_macros = "0.18.0"
jsonwebtoken = "7.0.1" jsonwebtoken = "7.0.1"
regex = "1.3.5" regex = "1.3.5"
lazy_static = "1.3.0" lazy_static = "1.3.0"
lettre = "0.9.2" lettre = "0.9.3"
lettre_email = "0.9.2" lettre_email = "0.9.4"
sha2 = "0.8.1" sha2 = "0.8.1"
rss = "1.9.0" rss = "1.9.0"
htmlescape = "0.3.1" htmlescape = "0.3.1"

81
server/db-init.sh vendored
View file

@ -1,15 +1,73 @@
#!/bin/bash #!/bin/sh
# Default configurations
username=lemmy username=lemmy
dbname=lemmy dbname=lemmy
port=5432 port=5432
password="" yes_no_prompt_invalid() {
password_confirm="" echo "Invalid input. Please enter either \"y\" or \"n\"." 1>&2
password_valid=0 }
while [ "$password_valid" == 0 ] print_config() {
do echo " database name: $dbname"
echo " username: $username"
echo " port: $port"
}
ask_for_db_config() {
echo "The default database configuration is:"
print_config
echo
default_config_final=0
default_config_valid=0
while [ "$default_config_valid" == 0 ]
do
read -p "Use this configuration (y/n)? " default_config
case "$default_config" in
[yY]* ) default_config_valid=1; default_config_final=1;;
[nN]* ) default_config_valid=1; default_config_final=0;;
* ) yes_no_prompt_invalid;;
esac
echo
done
if [ "$default_config_final" == 0 ]
then
config_ok_final=0
while [ "$config_ok_final" == 0 ]
do
read -p "Database name: " dbname
read -p "Username: " username
read -p "Port: " port
#echo
#echo "The database configuration is:"
#print_config
#echo
config_ok_valid=0
while [ "$config_ok_valid" == 0 ]
do
read -p "Use this configuration (y/n)? " config_ok
case "$config_ok" in
[yY]* ) config_ok_valid=1; config_ok_final=1;;
[nN]* ) config_ok_valid=1; config_ok_final=0;;
* ) yes_no_prompt_invalid;;
esac
echo
done
done
fi
}
ask_for_password() {
password=""
password_confirm=""
password_valid=0
while [ "$password_valid" == 0 ]
do
read -p "Enter database password: " -s password read -p "Enter database password: " -s password
echo echo
@ -33,11 +91,16 @@ do
# Set the password_valid variable to break out of the loop # Set the password_valid variable to break out of the loop
password_valid=1 password_valid=1
done done
}
ask_for_db_config
ask_for_password
psql -c "CREATE USER $username WITH PASSWORD '$password' SUPERUSER;" -U postgres psql -c "CREATE USER $username WITH PASSWORD '$password' SUPERUSER;" -U postgres
psql -c 'CREATE DATABASE $dbname WITH OWNER $username;' -U postgres psql -c "CREATE DATABASE $dbname WITH OWNER $username;" -U postgres
export LEMMY_DATABASE_URL=postgres://$username:$password@localhost:$port/$dbname export LEMMY_DATABASE_URL=postgres://$username:$password@localhost:$port/$dbname
echo $LEMMY_DATABASE_URL echo "The database URL is $LEMMY_DATABASE_URL"

View file

@ -30,6 +30,7 @@ use crate::{
SortType, SortType,
}, },
generate_random_string, generate_random_string,
is_valid_username,
naive_from_unix, naive_from_unix,
naive_now, naive_now,
remove_slurs, remove_slurs,
@ -314,6 +315,9 @@ impl Perform for Oper<Register> {
} }
let user_keypair = generate_actor_keypair()?; let user_keypair = generate_actor_keypair()?;
if !is_valid_username(&data.username) {
return Err(APIError::err("invalid_username").into());
}
// Register the new user // Register the new user
let user_form = UserForm { let user_form = UserForm {

View file

@ -85,6 +85,20 @@ pub fn is_email_regex(test: &str) -> bool {
EMAIL_REGEX.is_match(test) EMAIL_REGEX.is_match(test)
} }
pub fn is_image_content_type(test: &str) -> Result<(), failure::Error> {
if isahc::get(test)?
.headers()
.get("Content-Type")
.ok_or_else(|| format_err!("No Content-Type header"))?
.to_str()?
.starts_with("image/")
{
Ok(())
} else {
Err(format_err!("Not an image type."))
}
}
pub fn remove_slurs(test: &str) -> String { pub fn remove_slurs(test: &str) -> String {
SLUR_REGEX.replace_all(test, "*removed*").to_string() SLUR_REGEX.replace_all(test, "*removed*").to_string()
} }
@ -178,6 +192,8 @@ pub struct PictshareResponse {
} }
pub fn fetch_pictshare(image_url: &str) -> Result<PictshareResponse, failure::Error> { pub fn fetch_pictshare(image_url: &str) -> Result<PictshareResponse, failure::Error> {
is_image_content_type(image_url)?;
let fetch_url = format!( let fetch_url = format!(
"http://pictshare/api/geturl.php?url={}", "http://pictshare/api/geturl.php?url={}",
utf8_percent_encode(image_url, NON_ALPHANUMERIC) utf8_percent_encode(image_url, NON_ALPHANUMERIC)
@ -195,16 +211,16 @@ fn fetch_iframely_and_pictshare_data(
Option<String>, Option<String>,
Option<String>, Option<String>,
) { ) {
match &url {
Some(url) => {
// Fetch iframely data // Fetch iframely data
let (iframely_title, iframely_description, iframely_thumbnail_url, iframely_html) = match url { let (iframely_title, iframely_description, iframely_thumbnail_url, iframely_html) =
Some(url) => match fetch_iframely(&url) { match fetch_iframely(url) {
Ok(res) => (res.title, res.description, res.thumbnail_url, res.html), Ok(res) => (res.title, res.description, res.thumbnail_url, res.html),
Err(e) => { Err(e) => {
error!("iframely err: {}", e); error!("iframely err: {}", e);
(None, None, None, None) (None, None, None, None)
} }
},
None => (None, None, None, None),
}; };
// Fetch pictshare thumbnail // Fetch pictshare thumbnail
@ -216,7 +232,14 @@ fn fetch_iframely_and_pictshare_data(
None None
} }
}, },
None => None, // Try to generate a small thumbnail if iframely is not supported
None => match fetch_pictshare(&url) {
Ok(res) => Some(res.url),
Err(e) => {
error!("pictshare err: {}", e);
None
}
},
}; };
( (
@ -225,6 +248,9 @@ fn fetch_iframely_and_pictshare_data(
iframely_html, iframely_html,
pictshare_thumbnail, pictshare_thumbnail,
) )
}
None => (None, None, None, None),
}
} }
pub fn markdown_to_html(text: &str) -> String { pub fn markdown_to_html(text: &str) -> String {
@ -268,10 +294,16 @@ pub fn scrape_text_for_mentions(text: &str) -> Vec<MentionData> {
out.into_iter().unique().collect() out.into_iter().unique().collect()
} }
pub fn is_valid_username(name: &str) -> bool {
VALID_USERNAME_REGEX.is_match(name)
}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use crate::{ use crate::{
is_email_regex, is_email_regex,
is_image_content_type,
is_valid_username,
remove_slurs, remove_slurs,
scrape_text_for_mentions, scrape_text_for_mentions,
slur_check, slur_check,
@ -288,12 +320,30 @@ mod tests {
assert_eq!(mentions[1].domain, "lemmy_alpha:8540".to_string()); assert_eq!(mentions[1].domain, "lemmy_alpha:8540".to_string());
} }
#[test]
fn test_image() {
assert!(is_image_content_type("https://1734811051.rsc.cdn77.org/data/images/full/365645/as-virus-kills-navajos-in-their-homes-tribal-women-provide-lifeline.jpg?w=600?w=650").is_ok());
assert!(is_image_content_type(
"https://twitter.com/BenjaminNorton/status/1259922424272957440?s=20"
)
.is_err());
}
#[test] #[test]
fn test_email() { fn test_email() {
assert!(is_email_regex("gush@gmail.com")); assert!(is_email_regex("gush@gmail.com"));
assert!(!is_email_regex("nada_neutho")); assert!(!is_email_regex("nada_neutho"));
} }
#[test]
fn test_valid_register_username() {
assert!(is_valid_username("Hello_98"));
assert!(is_valid_username("ten"));
assert!(!is_valid_username("Hello-98"));
assert!(!is_valid_username("a"));
assert!(!is_valid_username(""));
}
#[test] #[test]
fn test_slur_filter() { fn test_slur_filter() {
let test = let test =
@ -351,4 +401,5 @@ lazy_static! {
// TODO keep this old one, it didn't work with port well tho // TODO keep this old one, it didn't work with port well tho
// static ref WEBFINGER_USER_REGEX: Regex = Regex::new(r"@(?P<name>[\w.]+)@(?P<domain>[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+)").unwrap(); // static ref WEBFINGER_USER_REGEX: Regex = Regex::new(r"@(?P<name>[\w.]+)@(?P<domain>[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+)").unwrap();
static ref WEBFINGER_USER_REGEX: Regex = Regex::new(r"@(?P<name>[\w.]+)@(?P<domain>[a-zA-Z0-9._:-]+)").unwrap(); static ref WEBFINGER_USER_REGEX: Regex = Regex::new(r"@(?P<name>[\w.]+)@(?P<domain>[a-zA-Z0-9._:-]+)").unwrap();
static ref VALID_USERNAME_REGEX: Regex = Regex::new(r"^[a-zA-Z0-9_]{3,20}$").unwrap();
} }

View file

@ -1,14 +1,24 @@
extern crate lemmy_server; extern crate lemmy_server;
#[macro_use] #[macro_use]
extern crate diesel_migrations; extern crate diesel_migrations;
#[macro_use]
pub extern crate lazy_static;
use crate::lemmy_server::actix_web::dev::Service;
use actix::prelude::*; use actix::prelude::*;
use actix_web::*; use actix_web::{
body::Body,
dev::{ServiceRequest, ServiceResponse},
http::{
header::{CACHE_CONTROL, CONTENT_TYPE},
HeaderValue,
},
*,
};
use diesel::{ use diesel::{
r2d2::{ConnectionManager, Pool}, r2d2::{ConnectionManager, Pool},
PgConnection, PgConnection,
}; };
use failure::Error;
use lemmy_server::{ use lemmy_server::{
db::code_migrations::run_advanced_migrations, db::code_migrations::run_advanced_migrations,
rate_limit::{rate_limiter::RateLimiter, RateLimit}, rate_limit::{rate_limiter::RateLimiter, RateLimit},
@ -16,13 +26,22 @@ use lemmy_server::{
settings::Settings, settings::Settings,
websocket::server::*, websocket::server::*,
}; };
use std::sync::Arc; use regex::Regex;
use std::{io, sync::Arc};
use tokio::sync::Mutex; use tokio::sync::Mutex;
lazy_static! {
static ref CACHE_CONTROL_REGEX: Regex =
Regex::new("^((text|image)/.+|application/javascript)$").unwrap();
// static ref CACHE_CONTROL_VALUE: String = format!("public, max-age={}", 365 * 24 * 60 * 60);
// Test out 1 hour here, this is breaking some things
static ref CACHE_CONTROL_VALUE: String = format!("public, max-age={}", 60 * 60);
}
embed_migrations!(); embed_migrations!();
#[actix_rt::main] #[actix_rt::main]
async fn main() -> Result<(), Error> { async fn main() -> io::Result<()> {
env_logger::init(); env_logger::init();
let settings = Settings::get(); let settings = Settings::get();
@ -52,11 +71,11 @@ async fn main() -> Result<(), Error> {
); );
// Create Http server with websocket support // Create Http server with websocket support
Ok(
HttpServer::new(move || { HttpServer::new(move || {
let settings = Settings::get(); let settings = Settings::get();
let rate_limiter = rate_limiter.clone(); let rate_limiter = rate_limiter.clone();
App::new() App::new()
.wrap_fn(add_cache_headers)
.wrap(middleware::Logger::default()) .wrap(middleware::Logger::default())
.data(pool.clone()) .data(pool.clone())
.data(server.clone()) .data(server.clone())
@ -79,6 +98,25 @@ async fn main() -> Result<(), Error> {
}) })
.bind((settings.bind, settings.port))? .bind((settings.bind, settings.port))?
.run() .run()
.await?, .await
) }
fn add_cache_headers<S>(
req: ServiceRequest,
srv: &mut S,
) -> impl Future<Output = Result<ServiceResponse, Error>>
where
S: Service<Request = ServiceRequest, Response = ServiceResponse<Body>, Error = Error>,
{
let fut = srv.call(req);
async move {
let mut res = fut.await?;
if let Some(content_type) = res.headers().get(CONTENT_TYPE) {
if CACHE_CONTROL_REGEX.is_match(content_type.to_str().unwrap()) {
let header_val = HeaderValue::from_static(&CACHE_CONTROL_VALUE);
res.headers_mut().insert(CACHE_CONTROL, header_val);
}
}
Ok(res)
}
} }

View file

@ -130,7 +130,7 @@ impl StreamHandler<Result<ws::Message, ws::ProtocolError>> for WSSession {
} }
actix::fut::ready(()) actix::fut::ready(())
}) })
.wait(ctx); .spawn(ctx);
} }
ws::Message::Binary(_bin) => info!("Unexpected binary"), ws::Message::Binary(_bin) => info!("Unexpected binary"),
ws::Message::Close(_) => { ws::Message::Close(_) => {

View file

@ -1 +1 @@
pub const VERSION: &str = "v0.6.51"; pub const VERSION: &str = "v0.6.71";

View file

@ -128,10 +128,7 @@ blockquote {
.new-comments { .new-comments {
max-height: 50vh; max-height: 50vh;
overflow: hidden; overflow-x: hidden;
}
.new-comments:hover {
overflow-y: auto; overflow-y: auto;
} }

View file

@ -709,19 +709,15 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
get linkBtn() { get linkBtn() {
let node = this.props.node; let node = this.props.node;
return ( return (
<button className="btn btn-link btn-animate">
<Link <Link
class="text-muted" class="btn btn-link btn-animate text-muted"
to={`/post/${node.comment.post_id}/comment/${node.comment.id}`} to={`/post/${node.comment.post_id}/comment/${node.comment.id}`}
title={ title={this.props.showContext ? i18n.t('show_context') : i18n.t('link')}
this.props.showContext ? i18n.t('show_context') : i18n.t('link')
}
> >
<svg class="icon icon-inline"> <svg class="icon icon-inline">
<use xlinkHref="#icon-link"></use> <use xlinkHref="#icon-link"></use>
</svg> </svg>
</Link> </Link>
</button>
); );
} }

View file

@ -187,6 +187,7 @@ export class Login extends Component<any, State> {
type="password" type="password"
id="register-password" id="register-password"
value={this.state.registerForm.password} value={this.state.registerForm.password}
autoComplete="new-password"
onInput={linkEvent(this, this.handleRegisterPasswordChange)} onInput={linkEvent(this, this.handleRegisterPasswordChange)}
class="form-control" class="form-control"
required required
@ -206,6 +207,7 @@ export class Login extends Component<any, State> {
type="password" type="password"
id="register-verify-password" id="register-verify-password"
value={this.state.registerForm.password_verify} value={this.state.registerForm.password_verify}
autoComplete="new-password"
onInput={linkEvent(this, this.handleRegisterPasswordVerifyChange)} onInput={linkEvent(this, this.handleRegisterPasswordVerifyChange)}
class="form-control" class="form-control"
required required

View file

@ -288,9 +288,11 @@ export class Main extends Component<any, MainState> {
</ul> </ul>
)} )}
<ul class="my-2 list-inline"> <ul class="my-2 list-inline">
{/*
<li className="list-inline-item badge badge-secondary"> <li className="list-inline-item badge badge-secondary">
{i18n.t('number_online', { count: this.state.siteRes.online })} {i18n.t('number_online', { count: this.state.siteRes.online })}
</li> </li>
*/}
<li className="list-inline-item badge badge-secondary"> <li className="list-inline-item badge badge-secondary">
{i18n.t('number_of_users', { {i18n.t('number_of_users', {
count: this.state.siteRes.site.number_of_users, count: this.state.siteRes.site.number_of_users,

View file

@ -331,6 +331,7 @@ export class PostForm extends Component<PostFormProps, PostFormState> {
value={this.state.postForm.community_id} value={this.state.postForm.community_id}
onInput={linkEvent(this, this.handlePostCommunityChange)} onInput={linkEvent(this, this.handlePostCommunityChange)}
> >
<option>{i18n.t('select_a_community')}</option>
{this.state.communities.map(community => ( {this.state.communities.map(community => (
<option value={community.id}> <option value={community.id}>
{community.local {community.local
@ -362,7 +363,11 @@ export class PostForm extends Component<PostFormProps, PostFormState> {
)} )}
<div class="form-group row"> <div class="form-group row">
<div class="col-sm-10"> <div class="col-sm-10">
<button type="submit" class="btn btn-secondary mr-2"> <button
disabled={!this.state.postForm.community_id}
type="submit"
class="btn btn-secondary mr-2"
>
{this.state.loading ? ( {this.state.loading ? (
<svg class="icon icon-spinner spin"> <svg class="icon icon-spinner spin">
<use xlinkHref="#icon-spinner"></use> <use xlinkHref="#icon-spinner"></use>
@ -568,7 +573,7 @@ export class PostForm extends Component<PostFormProps, PostFormState> {
).id; ).id;
this.state.postForm.community_id = foundCommunityId; this.state.postForm.community_id = foundCommunityId;
} else { } else {
this.state.postForm.community_id = data.communities[0].id; // By default, the null valued 'Select a Community'
} }
this.setState(this.state); this.setState(this.state);
@ -578,6 +583,7 @@ export class PostForm extends Component<PostFormProps, PostFormState> {
let selector = new Selectr(selectId, { nativeDropdown: false }); let selector = new Selectr(selectId, { nativeDropdown: false });
selector.on('selectr.select', option => { selector.on('selectr.select', option => {
this.state.postForm.community_id = Number(option.value); this.state.postForm.community_id = Number(option.value);
this.setState(this.state);
}); });
} }
} else if (res.op == UserOperation.CreatePost) { } else if (res.op == UserOperation.CreatePost) {

View file

@ -165,6 +165,8 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
if (isImage(post.url)) { if (isImage(post.url)) {
if (post.url.includes('pictshare')) { if (post.url.includes('pictshare')) {
return pictshareImage(post.url, thumbnail); return pictshareImage(post.url, thumbnail);
} else if (post.thumbnail_url) {
return pictshareImage(post.thumbnail_url, thumbnail);
} else { } else {
return post.url; return post.url;
} }

View file

@ -40,7 +40,6 @@ import {
setupTippy, setupTippy,
} from '../utils'; } from '../utils';
import { PostListing } from './post-listing'; import { PostListing } from './post-listing';
import { PostListings } from './post-listings';
import { Sidebar } from './sidebar'; import { Sidebar } from './sidebar';
import { CommentForm } from './comment-form'; import { CommentForm } from './comment-form';
import { CommentNodes } from './comment-nodes'; import { CommentNodes } from './comment-nodes';
@ -183,14 +182,6 @@ export class Post extends Component<any, PostState> {
moderators={this.state.moderators} moderators={this.state.moderators}
admins={this.state.admins} admins={this.state.admins}
/> />
{this.state.crossPosts.length > 0 && (
<>
<div class="my-1 text-muted small font-weight-bold">
{i18n.t('cross_posts')}
</div>
<PostListings showCommunity posts={this.state.crossPosts} />
</>
)}
<div className="mb-2" /> <div className="mb-2" />
<CommentForm <CommentForm
postId={this.state.post.id} postId={this.state.post.id}
@ -466,6 +457,9 @@ export class Post extends Component<any, PostState> {
this.state.crossPosts = data.posts.filter( this.state.crossPosts = data.posts.filter(
p => p.id != Number(this.props.match.params.id) p => p.id != Number(this.props.match.params.id)
); );
if (this.state.crossPosts.length) {
this.state.post.duplicates = this.state.crossPosts;
}
this.setState(this.state); this.setState(this.state);
} else if (res.op == UserOperation.TransferSite) { } else if (res.op == UserOperation.TransferSite) {
let data = res.data as GetSiteResponse; let data = res.data as GetSiteResponse;

View file

@ -163,38 +163,12 @@ export class PrivateMessageForm extends Component<
)} )}
/> />
)} )}
<ul class="float-right list-inline mb-1 text-muted font-weight-bold">
<li class="list-inline-item">
<span
onClick={linkEvent(this, this.handleShowDisclaimer)}
class="pointer"
data-tippy-content={i18n.t('disclaimer')}
>
<svg class={`icon icon-inline`}>
<use xlinkHref="#icon-alert-triangle"></use>
</svg>
</span>
</li>
<li class="list-inline-item">
<a
href={markdownHelpUrl}
target="_blank"
class="text-muted"
title={i18n.t('formatting_help')}
>
<svg class="icon icon-inline">
<use xlinkHref="#icon-help-circle"></use>
</svg>
</a>
</li>
</ul>
</div> </div>
</div> </div>
{this.state.showDisclaimer && ( {this.state.showDisclaimer && (
<div class="form-group row"> <div class="form-group row">
<div class="col-sm-10"> <div class="offset-sm-2 col-sm-10">
<div class="alert alert-danger" role="alert"> <div class="alert alert-danger" role="alert">
<T i18nKey="private_message_disclaimer"> <T i18nKey="private_message_disclaimer">
# #
@ -211,7 +185,7 @@ export class PrivateMessageForm extends Component<
</div> </div>
)} )}
<div class="form-group row"> <div class="form-group row">
<div class="col-sm-10"> <div class="offset-sm-2 col-sm-10">
<button type="submit" class="btn btn-secondary mr-2"> <button type="submit" class="btn btn-secondary mr-2">
{this.state.loading ? ( {this.state.loading ? (
<svg class="icon icon-spinner spin"> <svg class="icon icon-spinner spin">
@ -242,6 +216,31 @@ export class PrivateMessageForm extends Component<
{i18n.t('cancel')} {i18n.t('cancel')}
</button> </button>
)} )}
<ul class="d-inline-block float-right list-inline mb-1 text-muted font-weight-bold">
<li class="list-inline-item">
<span
onClick={linkEvent(this, this.handleShowDisclaimer)}
class="pointer"
data-tippy-content={i18n.t('disclaimer')}
>
<svg class={`icon icon-inline`}>
<use xlinkHref="#icon-alert-triangle"></use>
</svg>
</span>
</li>
<li class="list-inline-item">
<a
href={markdownHelpUrl}
target="_blank"
class="text-muted"
title={i18n.t('formatting_help')}
>
<svg class="icon icon-inline">
<use xlinkHref="#icon-help-circle"></use>
</svg>
</a>
</li>
</ul>
</div> </div>
</div> </div>
</form> </form>

View file

@ -173,9 +173,11 @@ export class Sidebar extends Component<SidebarProps, SidebarState> {
</form> </form>
)} )}
<ul class="my-1 list-inline"> <ul class="my-1 list-inline">
{/*
<li className="list-inline-item badge badge-secondary"> <li className="list-inline-item badge badge-secondary">
{i18n.t('number_online', { count: this.props.online })} {i18n.t('number_online', { count: this.props.online })}
</li> </li>
*/}
<li className="list-inline-item badge badge-secondary"> <li className="list-inline-item badge badge-secondary">
{i18n.t('number_of_subscribers', { {i18n.t('number_of_subscribers', {
count: community.number_of_subscribers, count: community.number_of_subscribers,

View file

@ -4,14 +4,25 @@ import { i18n } from '../i18next';
import { T } from 'inferno-i18next'; import { T } from 'inferno-i18next';
import { repoUrl } from '../utils'; import { repoUrl } from '../utils';
interface SilverUser {
name: string;
link: string;
}
let general = [ let general = [
'alexx henry', 'Ernest Wiśniewski',
'Nathan J. Goode', 'HN',
'Forrest Weghorst',
'Andre Vallestero', 'Andre Vallestero',
'NotTooHighToHack', 'NotTooHighToHack',
]; ];
let highlighted = ['Oskenso Kashi', 'Alex Benishek']; let highlighted = ['Oskenso Kashi', 'Alex Benishek'];
// let silver = []; let silver: Array<SilverUser> = [
{
name: 'Redjoker',
link: 'https://iww.org',
},
];
// let gold = []; // let gold = [];
// let latinum = []; // let latinum = [];
@ -70,6 +81,18 @@ export class Sponsors extends Component<any, any> {
return ( return (
<div class="container"> <div class="container">
<h5>{i18n.t('sponsors')}</h5> <h5>{i18n.t('sponsors')}</h5>
<p>{i18n.t('silver_sponsors')}</p>
<div class="row card-columns">
{silver.map(s => (
<div class="card col-12 col-md-2">
<div>
<a href={s.link} target="_blank">
💎 {s.name}
</a>
</div>
</div>
))}
</div>
<p>{i18n.t('general_sponsors')}</p> <p>{i18n.t('general_sponsors')}</p>
<div class="row card-columns"> <div class="row card-columns">
{highlighted.map(s => ( {highlighted.map(s => (

View file

@ -614,6 +614,7 @@ export class User extends Component<any, UserState> {
id="user-password" id="user-password"
class="form-control" class="form-control"
value={this.state.userSettingsForm.new_password} value={this.state.userSettingsForm.new_password}
autoComplete="new-password"
onInput={linkEvent( onInput={linkEvent(
this, this,
this.handleUserSettingsNewPasswordChange this.handleUserSettingsNewPasswordChange
@ -634,6 +635,7 @@ export class User extends Component<any, UserState> {
id="user-verify-password" id="user-verify-password"
class="form-control" class="form-control"
value={this.state.userSettingsForm.new_password_verify} value={this.state.userSettingsForm.new_password_verify}
autoComplete="new-password"
onInput={linkEvent( onInput={linkEvent(
this, this,
this.handleUserSettingsNewPasswordVerifyChange this.handleUserSettingsNewPasswordVerifyChange
@ -654,6 +656,7 @@ export class User extends Component<any, UserState> {
id="user-old-password" id="user-old-password"
class="form-control" class="form-control"
value={this.state.userSettingsForm.old_password} value={this.state.userSettingsForm.old_password}
autoComplete="new-password"
onInput={linkEvent( onInput={linkEvent(
this, this,
this.handleUserSettingsOldPasswordChange this.handleUserSettingsOldPasswordChange
@ -750,6 +753,7 @@ export class User extends Component<any, UserState> {
<input <input
type="password" type="password"
value={this.state.deleteAccountForm.password} value={this.state.deleteAccountForm.password}
autoComplete="new-password"
onInput={linkEvent( onInput={linkEvent(
this, this,
this.handleDeleteAccountPasswordChange this.handleDeleteAccountPasswordChange

18
ui/src/i18next.ts vendored
View file

@ -1,6 +1,8 @@
import i18next from 'i18next'; import i18next from 'i18next';
import { getLanguage } from './utils'; import { getLanguage } from './utils';
import { en } from './translations/en'; import { en } from './translations/en';
import { el } from './translations/el';
import { eu } from './translations/eu';
import { eo } from './translations/eo'; import { eo } from './translations/eo';
import { es } from './translations/es'; import { es } from './translations/es';
import { de } from './translations/de'; import { de } from './translations/de';
@ -13,14 +15,25 @@ import { it } from './translations/it';
import { fi } from './translations/fi'; import { fi } from './translations/fi';
import { ca } from './translations/ca'; import { ca } from './translations/ca';
import { fa } from './translations/fa'; import { fa } from './translations/fa';
import { hi } from './translations/hi';
import { pl } from './translations/pl';
import { pt_BR } from './translations/pt_BR'; import { pt_BR } from './translations/pt_BR';
import { ja } from './translations/ja'; import { ja } from './translations/ja';
import { ka } from './translations/ka';
import { gl } from './translations/gl';
import { tr } from './translations/tr';
import { hu } from './translations/hu';
import { uk } from './translations/uk';
// https://github.com/nimbusec-oss/inferno-i18next/blob/master/tests/T.test.js#L66 // https://github.com/nimbusec-oss/inferno-i18next/blob/master/tests/T.test.js#L66
const resources = { const resources = {
en, en,
el,
eu,
eo, eo,
es, es,
ka,
hi,
de, de,
zh, zh,
fr, fr,
@ -31,8 +44,13 @@ const resources = {
fi, fi,
ca, ca,
fa, fa,
pl,
pt_BR, pt_BR,
ja, ja,
gl,
tr,
hu,
uk,
}; };
function format(value: any, format: any, lng: any): any { function format(value: any, format: any, lng: any): any {

72
ui/src/utils.ts vendored
View file

@ -1,4 +1,6 @@
import 'moment/locale/es'; import 'moment/locale/es';
import 'moment/locale/el';
import 'moment/locale/eu';
import 'moment/locale/eo'; import 'moment/locale/eo';
import 'moment/locale/de'; import 'moment/locale/de';
import 'moment/locale/zh-cn'; import 'moment/locale/zh-cn';
@ -10,9 +12,15 @@ import 'moment/locale/it';
import 'moment/locale/fi'; import 'moment/locale/fi';
import 'moment/locale/ca'; import 'moment/locale/ca';
import 'moment/locale/fa'; import 'moment/locale/fa';
import 'moment/locale/pl';
import 'moment/locale/pt-br'; import 'moment/locale/pt-br';
import 'moment/locale/ja'; import 'moment/locale/ja';
import 'moment/locale/ka'; import 'moment/locale/ka';
import 'moment/locale/hi';
import 'moment/locale/gl';
import 'moment/locale/tr';
import 'moment/locale/hu';
import 'moment/locale/uk';
import { import {
UserOperation, UserOperation,
@ -58,17 +66,25 @@ export const mentionDropdownFetchLimit = 10;
export const languages = [ export const languages = [
{ code: 'ca', name: 'Català' }, { code: 'ca', name: 'Català' },
{ code: 'en', name: 'English' }, { code: 'en', name: 'English' },
{ code: 'el', name: 'Ελληνικά' },
{ code: 'eu', name: 'Euskara' },
{ code: 'eo', name: 'Esperanto' }, { code: 'eo', name: 'Esperanto' },
{ code: 'es', name: 'Español' }, { code: 'es', name: 'Español' },
{ code: 'de', name: 'Deutsch' }, { code: 'de', name: 'Deutsch' },
{ code: 'gl', name: 'Galego' },
{ code: 'hu', name: 'Magyar Nyelv' },
{ code: 'ka', name: 'ქართული ენა' }, { code: 'ka', name: 'ქართული ენა' },
{ code: 'hi', name: 'मानक हिन्दी' },
{ code: 'fa', name: 'فارسی' }, { code: 'fa', name: 'فارسی' },
{ code: 'ja', name: '日本語' }, { code: 'ja', name: '日本語' },
{ code: 'pl', name: 'Polski' },
{ code: 'pt_BR', name: 'Português Brasileiro' }, { code: 'pt_BR', name: 'Português Brasileiro' },
{ code: 'zh', name: '中文' }, { code: 'zh', name: '中文' },
{ code: 'fi', name: 'Suomi' }, { code: 'fi', name: 'Suomi' },
{ code: 'fr', name: 'Français' }, { code: 'fr', name: 'Français' },
{ code: 'sv', name: 'Svenska' }, { code: 'sv', name: 'Svenska' },
{ code: 'tr', name: 'Türkçe' },
{ code: 'uk', name: 'українська мова' },
{ code: 'ru', name: 'Русский' }, { code: 'ru', name: 'Русский' },
{ code: 'nl', name: 'Nederlands' }, { code: 'nl', name: 'Nederlands' },
{ code: 'it', name: 'Italiano' }, { code: 'it', name: 'Italiano' },
@ -208,7 +224,7 @@ export function isMod(modIds: Array<number>, creator_id: number): boolean {
} }
const imageRegex = new RegExp( const imageRegex = new RegExp(
/(http)?s?:?(\/\/[^"']*\.(?:jpg|jpeg|gif|png|svg))/ /(http)?s?:?(\/\/[^"']*\.(?:jpg|jpeg|gif|png|svg|webp))/
); );
const videoRegex = new RegExp(`(http)?s?:?(\/\/[^"']*\.(?:mp4))`); const videoRegex = new RegExp(`(http)?s?:?(\/\/[^"']*\.(?:mp4))`);
@ -360,12 +376,28 @@ export function getMomentLanguage(): string {
lang = 'ca'; lang = 'ca';
} else if (lang.startsWith('fa')) { } else if (lang.startsWith('fa')) {
lang = 'fa'; lang = 'fa';
} else if (lang.startsWith('pl')) {
lang = 'pl';
} else if (lang.startsWith('pt')) { } else if (lang.startsWith('pt')) {
lang = 'pt-br'; lang = 'pt-br';
} else if (lang.startsWith('ja')) { } else if (lang.startsWith('ja')) {
lang = 'ja'; lang = 'ja';
} else if (lang.startsWith('ka')) { } else if (lang.startsWith('ka')) {
lang = 'ka'; lang = 'ka';
} else if (lang.startsWith('hi')) {
lang = 'hi';
} else if (lang.startsWith('el')) {
lang = 'el';
} else if (lang.startsWith('eu')) {
lang = 'eu';
} else if (lang.startsWith('gl')) {
lang = 'gl';
} else if (lang.startsWith('tr')) {
lang = 'tr';
} else if (lang.startsWith('hu')) {
lang = 'hu';
} else if (lang.startsWith('uk')) {
lang = 'uk';
} else { } else {
lang = 'en'; lang = 'en';
} }
@ -382,17 +414,22 @@ export function setTheme(theme: string = 'darkly') {
} }
// Load the theme dynamically // Load the theme dynamically
if (!document.getElementById(theme)) { let cssLoc = `/static/assets/css/themes/${theme}.min.css`;
loadCss(theme, cssLoc);
document.getElementById(theme).removeAttribute('disabled');
}
export function loadCss(id: string, loc: string) {
if (!document.getElementById(id)) {
var head = document.getElementsByTagName('head')[0]; var head = document.getElementsByTagName('head')[0];
var link = document.createElement('link'); var link = document.createElement('link');
link.id = theme; link.id = id;
link.rel = 'stylesheet'; link.rel = 'stylesheet';
link.type = 'text/css'; link.type = 'text/css';
link.href = `/static/assets/css/themes/${theme}.min.css`; link.href = loc;
link.media = 'all'; link.media = 'all';
head.appendChild(link); head.appendChild(link);
} }
document.getElementById(theme).removeAttribute('disabled');
} }
export function objectFlip(obj: any) { export function objectFlip(obj: any) {
@ -406,7 +443,7 @@ export function objectFlip(obj: any) {
export function pictshareAvatarThumbnail(src: string): string { export function pictshareAvatarThumbnail(src: string): string {
// sample url: http://localhost:8535/pictshare/gs7xuu.jpg // sample url: http://localhost:8535/pictshare/gs7xuu.jpg
let split = src.split('pictshare'); let split = src.split('pictshare');
let out = `${split[0]}pictshare/96${split[1]}`; let out = `${split[0]}pictshare/${canUseWebP() ? 'webp/' : ''}96${split[1]}`;
return out; return out;
} }
@ -431,7 +468,9 @@ export function pictshareImage(
hash = split[1]; hash = split[1];
} }
let out = `${root}/${thumbnail ? '192/' : ''}${hash}`; let out = `${root}/${canUseWebP() ? 'webp/' : ''}${
thumbnail ? '192/' : ''
}${hash}`;
return out; return out;
} }
@ -462,6 +501,7 @@ export function messageToastify(
text: `${body}<br />${creator}`, text: `${body}<br />${creator}`,
avatar: avatar, avatar: avatar,
backgroundColor: backgroundColor, backgroundColor: backgroundColor,
className: 'text-body',
close: true, close: true,
gravity: 'top', gravity: 'top',
position: 'right', position: 'right',
@ -864,3 +904,21 @@ export function hostname(url: string): string {
? `${cUrl.hostname}:${cUrl.port}` ? `${cUrl.hostname}:${cUrl.port}`
: `${cUrl.hostname}`; : `${cUrl.hostname}`;
} }
function canUseWebP() {
// TODO pictshare might have a webp conversion bug, try disabling this
return false;
// var elem = document.createElement('canvas');
// if (!!(elem.getContext && elem.getContext('2d'))) {
// var testString = !(window.mozInnerScreenX == null) ? 'png' : 'webp';
// // was able or not to get WebP representation
// return (
// elem.toDataURL('image/webp').startsWith('data:image/' + testString)
// );
// }
// // very old browser like IE 8, canvas not supported
// return false;
}

2
ui/src/version.ts vendored
View file

@ -1 +1 @@
export const version: string = 'v0.6.51'; export const version: string = 'v0.6.71';

View file

@ -8,7 +8,12 @@
"create_post": "إنشاء منشور", "create_post": "إنشاء منشور",
"posts": "منشورات", "posts": "منشورات",
"comments": "التعليقات", "comments": "التعليقات",
"number_of_posts": "{{count}} منشورات", "number_of_posts_0": "لا توجد منشورات",
"number_of_posts_1": "منشور واحد",
"number_of_posts_2": "منشورَيْن",
"number_of_posts_3": "{{count}} منشورات",
"number_of_posts_4": "{{count}} منشورات",
"number_of_posts_5": "{{count}} منشورات",
"related_posts": "يمكن لهذه المنشورات أن تكون ذات صلة", "related_posts": "يمكن لهذه المنشورات أن تكون ذات صلة",
"communities": "المجتمعات", "communities": "المجتمعات",
"users": "المستخدِمون", "users": "المستخدِمون",
@ -50,9 +55,24 @@
"ban_from_site": "طرده مِن الموقع", "ban_from_site": "طرده مِن الموقع",
"banned": "مطرود", "banned": "مطرود",
"save": "حفظ", "save": "حفظ",
"number_of_users": "{{count}} مستخدِمين", "number_of_users_0": "بلا مستخدمين",
"number_of_points": "{{count}} نقاط", "number_of_users_1": "مستخدم واحد",
"number_online": "{{count}} مستخدمين متّصلين", "number_of_users_2": "مستخدمَيْن",
"number_of_users_3": "{{count}} مستخدمين",
"number_of_users_4": "{{count}} مستخدمين",
"number_of_users_5": "{{count}} مستخدمين",
"number_of_points_0": "بلا نقاط",
"number_of_points_1": "نقطة واحدة",
"number_of_points_2": "نقطتَيْن",
"number_of_points_3": "{{count}} نقاط",
"number_of_points_4": "{{count}} نقاط",
"number_of_points_5": "{{count}} نقاط",
"number_online_0": "لا مستخدمين متّصلين",
"number_online_1": "مستخدم واحد متصل",
"number_online_2": "مستخدمَين متصلَيْن",
"number_online_3": "{{count}} مستخدمون متصلون",
"number_online_4": "{{count}} مستخدمون متصلون",
"number_online_5": "{{count}} مستخدمون متصلون",
"name": "الإسم", "name": "الإسم",
"title": "العنوان", "title": "العنوان",
"category": "الفئة", "category": "الفئة",
@ -114,7 +134,12 @@
"delete_account": "حذف الحساب", "delete_account": "حذف الحساب",
"create": "إنشاء", "create": "إنشاء",
"email_or_username": "عنوان البريد أو اسم المستخدم", "email_or_username": "عنوان البريد أو اسم المستخدم",
"number_of_subscribers": "{{count}} مُتابِعين", "number_of_subscribers_0": "بلا مُتابِعين",
"number_of_subscribers_1": "متابِع واحد",
"number_of_subscribers_2": "متابِعَيْن",
"number_of_subscribers_3": "{{count}} متابِعون",
"number_of_subscribers_4": "{{count}} متابِعون",
"number_of_subscribers_5": "{{count}} متابِعون",
"unsubscribe": "إلغاء الإشتراك", "unsubscribe": "إلغاء الإشتراك",
"week": "أسبوع", "week": "أسبوع",
"reply_sent": "تم إرسال الرد", "reply_sent": "تم إرسال الرد",
@ -127,7 +152,12 @@
"are_you_sure": "هل أنت متأكّد؟", "are_you_sure": "هل أنت متأكّد؟",
"logged_in": "إنّك متّصل.", "logged_in": "إنّك متّصل.",
"user_already_exists": "هذا المستخدِم موجود بالفعل.", "user_already_exists": "هذا المستخدِم موجود بالفعل.",
"number_of_communities": "{{count}} مجتمعات", "number_of_communities_0": "لا توجد مجتمعات",
"number_of_communities_1": "مجتمع واحد",
"number_of_communities_2": "مجتمعَيْن",
"number_of_communities_3": "{{count}} مجتمعات",
"number_of_communities_4": "{{count}} مجتمعات",
"number_of_communities_5": "{{count}} مجتمعات",
"subscribed": "مُتابِعون", "subscribed": "مُتابِعون",
"url": "الرابط", "url": "الرابط",
"nsfw": "محتوى حساس", "nsfw": "محتوى حساس",
@ -145,7 +175,12 @@
"support_on_patreon": "ساندنا على Patreon", "support_on_patreon": "ساندنا على Patreon",
"support_on_liberapay": "ساندنا عبر Liberapay", "support_on_liberapay": "ساندنا عبر Liberapay",
"crypto": "العملات الرقمية", "crypto": "العملات الرقمية",
"number_of_comments": "{{count}} تعليقات", "number_of_comments_0": "لا توجد تعليقات",
"number_of_comments_1": "تعليق واحد",
"number_of_comments_2": "تعليقَيْن",
"number_of_comments_3": "{{count}} تعليقات",
"number_of_comments_4": "{{count}} تعليقات",
"number_of_comments_5": "{{count}} تعليقات",
"cross_posts": "لقد تم نشر هذا الرابط كذلك على:", "cross_posts": "لقد تم نشر هذا الرابط كذلك على:",
"cross_post": "منشور نُشِر تبادليا", "cross_post": "منشور نُشِر تبادليا",
"cross_posted_to": "نشر تبادلي إلى: ", "cross_posted_to": "نشر تبادلي إلى: ",
@ -176,5 +211,13 @@
"lemmy_instance_setup": "تنصيب مثيل خادم Lemmy", "lemmy_instance_setup": "تنصيب مثيل خادم Lemmy",
"show_nsfw": "إظهار المحتوى الحساس", "show_nsfw": "إظهار المحتوى الحساس",
"sponsors": "الرعاة", "sponsors": "الرعاة",
"sponsors_of_lemmy": "رعاة مشروع Lemmy" "sponsors_of_lemmy": "رعاة مشروع Lemmy",
"inbox_for": "صندوق الواردات لـ <1>{{user}}</1>",
"show_context": "اظهر السياق",
"admin_settings": "الإعدادات الإدارية",
"site_config": "إعدادات الموقع",
"banned_users": "المستخدمون المحظورون",
"reset_password_mail_sent": "لقد أرسِلت إليك رسالة إلكترونية لتصفير كلمتك السرية.",
"upvote": "صوّت إيجابيا",
"downvote": "صوّت سلبيا"
} }

View file

@ -1,5 +1,5 @@
{ {
"post": "post", "post": "Beitrag",
"remove_post": "Beitrag löschen", "remove_post": "Beitrag löschen",
"no_posts": "Keine Beiträge.", "no_posts": "Keine Beiträge.",
"create_a_post": "Einen Beitrag anlegen", "create_a_post": "Einen Beitrag anlegen",
@ -14,16 +14,16 @@
"number_of_comments": "{{count}} Kommentar", "number_of_comments": "{{count}} Kommentar",
"number_of_comments_plural": "{{count}} Kommentare", "number_of_comments_plural": "{{count}} Kommentare",
"remove_comment": "Kommentar löschen", "remove_comment": "Kommentar löschen",
"communities": "Communities", "communities": "Communitys",
"users": "Benutzer", "users": "Benutzer",
"create_a_community": "Eine Gemeinschaft anlegen", "create_a_community": "Eine Community anlegen",
"create_community": "Gemeinschaft anlegen", "create_community": "Community erstellen",
"remove_community": "Gemeinschaft entfernen", "remove_community": "Community entfernen",
"subscribed_to_communities": "Abonnierte <1>communities</1>", "subscribed_to_communities": "Abonnierte <1>Communitys</1>",
"trending_communities": "Trending <1>communities</1>", "trending_communities": "Populäre <1>Communitys</1>",
"list_of_communities": "Liste von communities", "list_of_communities": "Liste von Communitys",
"number_of_communities": "{{count}} Community", "number_of_communities": "{{count}} Community",
"number_of_communities_plural": "{{count}} Communities", "number_of_communities_plural": "{{count}} Communitys",
"community_reqs": "Kleinbuchstaben, Großbuchstaben und keine Leerzeichen.", "community_reqs": "Kleinbuchstaben, Großbuchstaben und keine Leerzeichen.",
"edit": "editieren", "edit": "editieren",
"reply": "antworten", "reply": "antworten",
@ -44,7 +44,7 @@
"settings": "Einstellungen", "settings": "Einstellungen",
"remove_as_mod": "Als Moderator entfernen", "remove_as_mod": "Als Moderator entfernen",
"appoint_as_mod": "Zum Moderator ernennen", "appoint_as_mod": "Zum Moderator ernennen",
"modlog": "Modlog", "modlog": "Moderations-Log",
"admin": "Administrator", "admin": "Administrator",
"admins": "Administratoren", "admins": "Administratoren",
"remove_as_admin": "Als Administrator entfernen", "remove_as_admin": "Als Administrator entfernen",
@ -73,27 +73,27 @@
"username": "Benutzername", "username": "Benutzername",
"email_or_username": "E-mail oder Username", "email_or_username": "E-mail oder Username",
"number_of_users": "{{count}} Benutzer", "number_of_users": "{{count}} Benutzer",
"number_of_users_plural": "{{count}} Benutzer", "number_of_users_plural": "{{count}} Benutzer*innen",
"number_of_subscribers": "{{count}} Abonnent", "number_of_subscribers": "{{count}} Abonnent",
"number_of_subscribers_plural": "{{count}} Abonnenten", "number_of_subscribers_plural": "{{count}} Abonnent*innen",
"number_of_points": "{{count}} Punkt", "number_of_points": "{{count}} Punkt",
"number_of_points_plural": "{{count}} Punkte", "number_of_points_plural": "{{count}} Punkte",
"number_online": "{{count}} Benutzer online", "number_online": "{{count}} Benutzer online",
"number_online_plural": "{{count}} Benutzer online", "number_online_plural": "{{count}} Benutzer*innen online",
"name": "Name", "name": "Name",
"title": "Titel", "title": "Titel",
"category": "Kategorie", "category": "Kategorie",
"subscribers": "Abonnenten", "subscribers": "Abonnent*innen",
"both": "Beide", "both": "Beide",
"saved": "Gespeichert", "saved": "Gespeichert",
"unsubscribe": "Abbestellen", "unsubscribe": "Deabonnieren",
"subscribe": "Abonnieren", "subscribe": "Abonnieren",
"subscribed": "Abonniert", "subscribed": "Abonniert",
"prev": "Zurück", "prev": "Zurück",
"next": "Weiter", "next": "Weiter",
"sidebar": "Seitenleiste", "sidebar": "Seitenleiste",
"sort_type": "Sortieren nach", "sort_type": "Sortieren nach",
"hot": "Hot", "hot": "Heiß",
"new": "Neu", "new": "Neu",
"top_day": "Top täglich", "top_day": "Top täglich",
"week": "Woche", "week": "Woche",
@ -115,14 +115,14 @@
"view": "Ansicht", "view": "Ansicht",
"logout": "Ausloggen", "logout": "Ausloggen",
"login_sign_up": "Einloggen / Registrieren", "login_sign_up": "Einloggen / Registrieren",
"notifications_error": "Desktop-Benachrichtigungen sind in deinem browser nicht verfügbar. Versuche Firefox oder Chrome.", "notifications_error": "Desktop-Benachrichtigungen sind in Ihrem Browser nicht verfügbar. Versuchen Sie es mit Firefox oder Chrome.",
"unread_messages": "Ungelesene Nachrichten", "unread_messages": "Ungelesene Nachrichten",
"password": "Passwort", "password": "Passwort",
"verify_password": "Passwort überprüfen", "verify_password": "Passwort überprüfen",
"forgot_password": "Passwort vergessen", "forgot_password": "Passwort vergessen",
"reset_password_mail_sent": "Eine E-Mail wurde geschickt, um dein Passwort zurückzusetzen.", "reset_password_mail_sent": "Eine E-Mail wurde geschickt, um Ihr Passwort zurückzusetzen.",
"password_change": "Passwort geändert", "password_change": "Passwort ändern",
"new_password": "neues Passwort", "new_password": "Neues Passwort",
"no_email_setup": "Dieser Server hat E-Mails nicht korrekt eingerichtet.", "no_email_setup": "Dieser Server hat E-Mails nicht korrekt eingerichtet.",
"login": "Einloggen", "login": "Einloggen",
"sign_up": "Registrieren", "sign_up": "Registrieren",
@ -134,15 +134,15 @@
"url": "URL", "url": "URL",
"body": "Text", "body": "Text",
"copy_suggested_title": "Vorgeschlagenen Titel übernehmen: {{title}}", "copy_suggested_title": "Vorgeschlagenen Titel übernehmen: {{title}}",
"community": "Gemeinschaft", "community": "Community",
"expand_here": "hier erweitern", "expand_here": "hier erweitern",
"subscribe_to_communities": "Abonniere ein paar <1>communities</1>.", "subscribe_to_communities": "Abonniere einige <1>Communitys</1>.",
"chat": "Chat", "chat": "Chat",
"recent_comments": "Neueste Kommentare", "recent_comments": "Neueste Kommentare",
"no_results": "Keine Ergebnisse.", "no_results": "Keine Ergebnisse.",
"setup": "Einrichten", "setup": "Einrichten",
"lemmy_instance_setup": "Lemmy Instanz Einrichten", "lemmy_instance_setup": "Lemmy-Instanz einrichten",
"setup_admin": "Seiten Administrator konfigurieren", "setup_admin": "Seiten-Administrator konfigurieren",
"your_site": "deine Seite", "your_site": "deine Seite",
"modified": "verändert", "modified": "verändert",
"nsfw": "NSFW", "nsfw": "NSFW",
@ -161,8 +161,8 @@
"code": "Code", "code": "Code",
"joined": "beigetreten", "joined": "beigetreten",
"by": "von", "by": "von",
"to": "bis", "to": "in",
"transfer_community": "Gemeinschaft übertragen", "transfer_community": "Community übertragen",
"transfer_site": "Transferseite", "transfer_site": "Transferseite",
"are_you_sure": "Bist du sicher?", "are_you_sure": "Bist du sicher?",
"yes": "Ja", "yes": "Ja",
@ -170,7 +170,7 @@
"powered_by": "Bereitgestellt durch", "powered_by": "Bereitgestellt durch",
"landing_0": "Lemmy ist ein <1>Link-Aggregator</1> / Reddit Alternative im <2>Fediverse</2>.<3></3>Es ist selbst-hostbar, hat live-updates von Kommentar-threads und ist winzig (<4>~80kB</4>). Federation in das ActivityPub Netzwerk ist geplant. <5></5>Dies ist eine <6>sehr frühe Beta Version</6>, und viele Features funktionieren zurzeit nicht richtig oder fehlen. <7></7>Schlage neue Features vor oder melde Bugs <8>hier.</8><9></9>Gebaut mit <10>Rust</10>, <11>Actix</11>, <12>Inferno</12>, <13>Typescript</13>.", "landing_0": "Lemmy ist ein <1>Link-Aggregator</1> / Reddit Alternative im <2>Fediverse</2>.<3></3>Es ist selbst-hostbar, hat live-updates von Kommentar-threads und ist winzig (<4>~80kB</4>). Federation in das ActivityPub Netzwerk ist geplant. <5></5>Dies ist eine <6>sehr frühe Beta Version</6>, und viele Features funktionieren zurzeit nicht richtig oder fehlen. <7></7>Schlage neue Features vor oder melde Bugs <8>hier.</8><9></9>Gebaut mit <10>Rust</10>, <11>Actix</11>, <12>Inferno</12>, <13>Typescript</13>.",
"not_logged_in": "Nicht eingeloggt.", "not_logged_in": "Nicht eingeloggt.",
"community_ban": "Du wurdest von dieser Gemeinschaft gebannt.", "community_ban": "Du wurdest von dieser Community gebannt.",
"site_ban": "Du wurdest von dieser Seite gebannt", "site_ban": "Du wurdest von dieser Seite gebannt",
"couldnt_create_comment": "Konnte Kommentar nicht anlegen.", "couldnt_create_comment": "Konnte Kommentar nicht anlegen.",
"couldnt_like_comment": "Konnte nicht liken.", "couldnt_like_comment": "Konnte nicht liken.",
@ -178,18 +178,18 @@
"couldnt_save_comment": "Konnte Kommentar nicht speichern.", "couldnt_save_comment": "Konnte Kommentar nicht speichern.",
"no_comment_edit_allowed": "Keine Erlaubnis Kommentar zu editieren.", "no_comment_edit_allowed": "Keine Erlaubnis Kommentar zu editieren.",
"no_post_edit_allowed": "Keine Erlaubnis Beitrag zu editieren.", "no_post_edit_allowed": "Keine Erlaubnis Beitrag zu editieren.",
"no_community_edit_allowed": "Keine Erlaubnis Gemeinschaft zu editieren.", "no_community_edit_allowed": "Keine Erlaubnis, die Community zu editieren.",
"couldnt_find_community": "Konnte Gemeinschaft nicht finden.", "couldnt_find_community": "Konnte Community nicht finden.",
"couldnt_update_community": "Konnte Gemeinschaft nicht aktualisieren.", "couldnt_update_community": "Konnte die Community nicht aktualisieren.",
"community_already_exists": "Gemeinschaft existiert bereits.", "community_already_exists": "Die Community existiert bereits.",
"community_moderator_already_exists": "Gemeinschaft Moderator existiert bereits.", "community_moderator_already_exists": "Community-Moderator*in existiert bereits.",
"community_follower_already_exists": "Gemeinschaft Follower existiert bereits.", "community_follower_already_exists": "Community-Abonennt*in existiert bereits.",
"community_user_already_banned": "Gemeinschaft Nutzer schon gebannt.", "community_user_already_banned": "Der*die Community-Benutzer*in ist schon gebannt.",
"couldnt_create_post": "Konnte Beitrag nicht anlegen.", "couldnt_create_post": "Konnte Beitrag nicht anlegen.",
"couldnt_like_post": "Konnte Beitrag nicht liken.", "couldnt_like_post": "Konnte Beitrag nicht liken.",
"couldnt_find_post": "Konnte Beitrag nicht finden.", "couldnt_find_post": "Konnte Beitrag nicht finden.",
"couldnt_get_posts": "Konnte Beiträge nicht holen.", "couldnt_get_posts": "Konnte Beiträge nicht holen",
"couldnt_update_post": "Konnte Beitrag nicht aktualisieren.", "couldnt_update_post": "Konnte Beitrag nicht aktualisieren",
"couldnt_save_post": "Konnte Beitrag nicht speichern.", "couldnt_save_post": "Konnte Beitrag nicht speichern.",
"no_slurs": "Keine Beleidigungen.", "no_slurs": "Keine Beleidigungen.",
"not_an_admin": "Kein Administrator.", "not_an_admin": "Kein Administrator.",
@ -200,9 +200,9 @@
"passwords_dont_match": "Passwörter stimmen nicht überein.", "passwords_dont_match": "Passwörter stimmen nicht überein.",
"admin_already_created": "Entschuldigung, es gibt schon einen Administrator.", "admin_already_created": "Entschuldigung, es gibt schon einen Administrator.",
"user_already_exists": "Nutzer existiert bereits.", "user_already_exists": "Nutzer existiert bereits.",
"couldnt_update_user": "Konnte Nutzer nicht aktualisieren", "couldnt_update_user": "Konnte Nutzer nicht aktualisieren.",
"system_err_login": "Systemfehler. Versuche dich aus- und wieder einzuloggen.", "system_err_login": "Systemfehler. Versuche dich aus- und wieder einzuloggen.",
"cross_posted_to": "Crossposted auf: ", "cross_posted_to": "Crossgeposted auf: ",
"create_private_message": "Privatnachricht erstellen", "create_private_message": "Privatnachricht erstellen",
"send_secure_message": "Sichere Nachricht absenden", "send_secure_message": "Sichere Nachricht absenden",
"send_message": "Nachricht absenden", "send_message": "Nachricht absenden",
@ -223,10 +223,10 @@
"open_registration": "Registrierung öffnen", "open_registration": "Registrierung öffnen",
"registration_closed": "Registrierung geschlossen", "registration_closed": "Registrierung geschlossen",
"enable_nsfw": "NSFW Erlauben", "enable_nsfw": "NSFW Erlauben",
"donate_to_lemmy": "Lemmy spenden", "donate_to_lemmy": "An Lemmy spenden",
"donate": "Spenden", "donate": "Spenden",
"from": "von", "from": "von",
"logged_in": "Eingeloggt", "logged_in": "Eingeloggt.",
"couldnt_get_comments": "Konnte Kommentare nicht laden.", "couldnt_get_comments": "Konnte Kommentare nicht laden.",
"post_title_too_long": "Posttitel zu lang.", "post_title_too_long": "Posttitel zu lang.",
"email_already_exists": "Email existiert bereits.", "email_already_exists": "Email existiert bereits.",
@ -235,5 +235,21 @@
"couldnt_update_private_message": "Konnte Privatnachricht nicht aktualisieren.", "couldnt_update_private_message": "Konnte Privatnachricht nicht aktualisieren.",
"time": "Zeit", "time": "Zeit",
"action": "Aktion", "action": "Aktion",
"more": "mehr" "more": "mehr",
"admin_settings": "Admin-Einstellungen",
"sorting_help": "Sortierhilfe",
"banned_users": "Gebannte Benutzer",
"show_context": "Kontext anzeigen",
"block_leaving": "Sind Sie sicher, dass Sie gehen wollen?",
"site_config": "Website-Konfiguration",
"support_on_open_collective": "Auf OpenCollective unterstützen",
"site_saved": "Seite gespeichert.",
"emoji_picker": "Emoji-Tastatur",
"silver_sponsors": "Silbersponsoren sind die, die $40 zu Lemmy beitragen.",
"upvote": "Hochstimmen",
"downvote": "Runterstimmen",
"number_of_upvotes": "{{count}} Stimme",
"number_of_upvotes_plural": "{{count}} Stimmen",
"number_of_downvotes": "{{count}} Gegenstimme",
"number_of_downvotes_plural": "{{count}} Gegenstimmen"
} }

1
ui/translations/el.json vendored Normal file
View file

@ -0,0 +1 @@
{}

View file

@ -18,6 +18,7 @@
"communities": "Communities", "communities": "Communities",
"users": "Users", "users": "Users",
"create_a_community": "Create a community", "create_a_community": "Create a community",
"select_a_community": "Select a community",
"create_community": "Create Community", "create_community": "Create Community",
"remove_community": "Remove Community", "remove_community": "Remove Community",
"subscribed_to_communities": "Subscribed to <1>communities</1>", "subscribed_to_communities": "Subscribed to <1>communities</1>",
@ -63,14 +64,14 @@
"remove_as_admin": "remove as admin", "remove_as_admin": "remove as admin",
"appoint_as_admin": "appoint as admin", "appoint_as_admin": "appoint as admin",
"remove": "remove", "remove": "remove",
"removed": "removed", "removed": "removed by mod",
"locked": "locked", "locked": "locked",
"stickied": "stickied", "stickied": "stickied",
"reason": "Reason", "reason": "Reason",
"mark_as_read": "mark as read", "mark_as_read": "mark as read",
"mark_as_unread": "mark as unread", "mark_as_unread": "mark as unread",
"delete": "delete", "delete": "delete",
"deleted": "deleted", "deleted": "deleted by creator",
"delete_account": "Delete Account", "delete_account": "Delete Account",
"delete_account_confirm": "delete_account_confirm":
"Warning: this will permanently delete all your data. Enter your password to confirm.", "Warning: this will permanently delete all your data. Enter your password to confirm.",
@ -187,7 +188,7 @@
"sponsors": "Sponsors", "sponsors": "Sponsors",
"sponsors_of_lemmy": "Sponsors of Lemmy", "sponsors_of_lemmy": "Sponsors of Lemmy",
"sponsor_message": "sponsor_message":
"Lemmy is free, <1>open-source</1> software, meaning no advertising, monetizing, or venture capital, ever. Your donations directly support full-time development of the project. Thank you to the following people:", "Lemmy is free, <1>open-source</1> software, with no advertising, monetizing, or venture capital, ever. Your donations directly support full-time development of the project. Thank you to the following people:",
"support_on_patreon": "Support on Patreon", "support_on_patreon": "Support on Patreon",
"support_on_liberapay": "Support on Liberapay", "support_on_liberapay": "Support on Liberapay",
"support_on_open_collective": "Support on OpenCollective", "support_on_open_collective": "Support on OpenCollective",
@ -195,6 +196,8 @@
"donate": "Donate", "donate": "Donate",
"general_sponsors": "general_sponsors":
"General Sponsors are those that pledged $10 to $39 to Lemmy.", "General Sponsors are those that pledged $10 to $39 to Lemmy.",
"silver_sponsors":
"Silver Sponsors are those that pledged $40 to Lemmy.",
"crypto": "Crypto", "crypto": "Crypto",
"bitcoin": "Bitcoin", "bitcoin": "Bitcoin",
"ethereum": "Ethereum", "ethereum": "Ethereum",
@ -246,6 +249,7 @@
"Couldn't find that username or email.", "Couldn't find that username or email.",
"password_incorrect": "Password incorrect.", "password_incorrect": "Password incorrect.",
"passwords_dont_match": "Passwords do not match.", "passwords_dont_match": "Passwords do not match.",
"invalid_username": "Invalid username.",
"admin_already_created": "Sorry, there's already an admin.", "admin_already_created": "Sorry, there's already an admin.",
"user_already_exists": "User already exists.", "user_already_exists": "User already exists.",
"email_already_exists": "Email already exists.", "email_already_exists": "Email already exists.",

View file

@ -175,7 +175,7 @@
"donate_to_lemmy": "Donar a Lemmy", "donate_to_lemmy": "Donar a Lemmy",
"donate": "Donar", "donate": "Donar",
"general_sponsors": "Los Patrocinadores Generales son aquellos que señaron entre $10 y $39 a Lemmy.", "general_sponsors": "Los Patrocinadores Generales son aquellos que señaron entre $10 y $39 a Lemmy.",
"crypto": "Crypto", "crypto": "Cripto",
"bitcoin": "Bitcoin", "bitcoin": "Bitcoin",
"ethereum": "Ethereum", "ethereum": "Ethereum",
"monero": "Monero", "monero": "Monero",
@ -233,7 +233,7 @@
"time": "Tiempo", "time": "Tiempo",
"action": "Acción", "action": "Acción",
"more": "más", "more": "más",
"cross_posted_to": "publicado también en:", "cross_posted_to": "publicado también en: ",
"sorting_help": "ayuda del orden", "sorting_help": "ayuda del orden",
"upvote": "Voto Positivo", "upvote": "Voto Positivo",
"number_of_upvotes": "{{count}} Voto Positivo", "number_of_upvotes": "{{count}} Voto Positivo",
@ -244,5 +244,12 @@
"couldnt_get_comments": "No se pudo obtener los comentarios.", "couldnt_get_comments": "No se pudo obtener los comentarios.",
"post_title_too_long": "El título de la publicación es muy largo.", "post_title_too_long": "El título de la publicación es muy largo.",
"block_leaving": "¿Está seguro de que desea salir?", "block_leaving": "¿Está seguro de que desea salir?",
"show_context": "Mostrar contexto" "show_context": "Mostrar contexto",
"silver_sponsors": "Sponsors Plata son los que han dado $40 a Lemmy.",
"site_config": "Configuración del Sitio",
"banned_users": "Usuarios Baneados",
"support_on_open_collective": "Dona en OpenCollective",
"site_saved": "Sitio Guardado.",
"emoji_picker": "Emoji Picker",
"admin_settings": "Panel de Administración"
} }

67
ui/translations/eu.json vendored Normal file
View file

@ -0,0 +1,67 @@
{
"post": "Argitaratu",
"remove_post": "Argitalpena Ezabatu",
"no_posts": "Argitalpenik gabe.",
"create_a_post": "Argitalpen bat sortu",
"number_of_posts": "Argitalpen {{count}}",
"number_of_posts_plural": "{{count}} Argitalpen",
"users": "Erabiltzaileak",
"send_message": "Mezua Bidali",
"message": "Mezu",
"edit": "Editatu",
"reply": "Erantzun",
"more": "gehiago",
"upload_image": "Irudia igo",
"link": "esteka",
"remove": "ezabatu",
"mark_as_unread": "irakurri gabea",
"delete": "ezabatu",
"delete_account": "Kontua Ezabatu",
"ban": "kaleratu",
"ban_from_site": "Lekutik kaleratu",
"unban": "onartu",
"save": "gorde",
"create": "sortu",
"creator": "sortzaile",
"username": "Erabiltzailea",
"name": "Izena",
"title": "Izenburua",
"both": "Biak",
"saved": "Gordeta",
"week": "Aste",
"month": "Hilabete",
"year": "Urte",
"all": "Dena",
"api": "API",
"unread": "Irakurri gabe",
"replies": "Erantzunak",
"search": "Bilatu",
"sign_up": "Kontua Sortu",
"messages": "Mezuak",
"password": "Pasahitza",
"password_change": "Pasahitza Aldatu",
"new_password": "Pasahitz Berria",
"email": "Posta elektronikoa",
"language": "Hizkuntza",
"url": "URL",
"chat": "Txat",
"your_site": "zure lekua",
"nsfw": "NSFW",
"block_leaving": "Ziur ahal zaude atera nahi duzula?",
"bitcoin": "Bitcoin",
"ethereum": "Ethereum",
"monero": "Monero",
"yes": "bai",
"no": "ez",
"couldnt_find_post": "Ezinezkoa argitalpena aurkitzea.",
"couldnt_save_post": "Ezinezkoa argitalpena gordetzea.",
"site_already_exists": "Lekua jada existitzen da.",
"action": "Ekintza",
"time": "Denbora",
"number_of_points": "Puntu {{count}}",
"number_of_points_plural": "{{count}} Puntu",
"number_of_users": "Erabiltzaile {{count}}",
"number_of_users_plural": "{{count}} Erabiltzaile",
"number_of_subscribers": "Jarraitzaile {{count}}",
"number_of_subscribers_plural": "{{count}} Jarraitzaile"
}

View file

@ -1,16 +1,18 @@
{ {
"post": "viesti", "post": "viesti",
"remove_post": "Poista viesti", "remove_post": "Poista viesti",
"no_posts": "Ei viestjä.", "no_posts": "Ei viestejä.",
"create_a_post": "Luo viesti", "create_a_post": "Luo viesti",
"create_post": "Luo viesti", "create_post": "Luo viesti",
"number_of_posts": "{{count}} viestiä", "number_of_posts": "{{count}} viesti",
"number_of_posts_plural": "{{count}} viestiä",
"posts": "Viestit", "posts": "Viestit",
"related_posts": "Nämä viestit voivat liittyä toisiinsa", "related_posts": "Nämä viestit voivat liittyä toisiinsa",
"cross_posts": "Tämä linkki on jaettu:", "cross_posts": "Tämä linkki on jaettu:",
"cross_post": "jaa ristiin", "cross_post": "jaa ristiin",
"comments": "Kommentit", "comments": "Kommentit",
"number_of_comments": "{{count}} kommenttia", "number_of_comments": "{{count}} kommentti",
"number_of_comments_plural": "{{count}} kommenttia",
"remove_comment": "Poista kommentti", "remove_comment": "Poista kommentti",
"communities": "Yhteisöt", "communities": "Yhteisöt",
"users": "Käyttäjät", "users": "Käyttäjät",
@ -20,9 +22,9 @@
"subscribed_to_communities": "Tilatut <1>yhteisöt</1>", "subscribed_to_communities": "Tilatut <1>yhteisöt</1>",
"trending_communities": "Nousevat <1>yhteisöt</1>", "trending_communities": "Nousevat <1>yhteisöt</1>",
"list_of_communities": "Lista yhteisöistä", "list_of_communities": "Lista yhteisöistä",
"number_of_communities": "{{count}} yhteisöä", "number_of_communities": "{{count}} yhteisö",
"community_reqs": "number_of_communities_plural": "{{count}} yhteisöä",
"pienillä kirjaimilla, alleviivauksella, eikä välilyöntejä.", "community_reqs": "pienillä kirjaimilla, alleviivauksella, eikä välilyöntejä.",
"create_private_message": "Luo yksityisviesti", "create_private_message": "Luo yksityisviesti",
"send_secure_message": "Lähetä suojattu viesti", "send_secure_message": "Lähetä suojattu viesti",
"send_message": "Lähetä viesti", "send_message": "Lähetä viesti",
@ -50,7 +52,7 @@
"remove_as_mod": "Poista moderaattorina", "remove_as_mod": "Poista moderaattorina",
"appoint_as_mod": "Nimitä moderaattoriksi", "appoint_as_mod": "Nimitä moderaattoriksi",
"modlog": "Moderoinnin loki", "modlog": "Moderoinnin loki",
"admin": "Ylläpitäjä", "admin": "ylläpitäjä",
"admins": "ylläpitäjät", "admins": "ylläpitäjät",
"remove_as_admin": "poista ylläpitäjänä", "remove_as_admin": "poista ylläpitäjänä",
"appoint_as_admin": "nimitä ylläpitäjäksi", "appoint_as_admin": "nimitä ylläpitäjäksi",
@ -62,10 +64,9 @@
"mark_as_read": "merkitse luetuksi", "mark_as_read": "merkitse luetuksi",
"mark_as_unread": "merkitse lukemattomaksi", "mark_as_unread": "merkitse lukemattomaksi",
"delete": "poista", "delete": "poista",
"deleted": "deleted", "deleted": "poistettu",
"delete_account": "Poista tili", "delete_account": "Poista tili",
"delete_account_confirm": "delete_account_confirm": "Varoitus: tämä poistaa pysyvästi kaiken datasi. Anna salasanasi varmistukseksi.",
"Varoitus: tämä poistaa pysyvästi kaiken datasi. Anna salasanasi varmistukseksi.",
"restore": "palauta", "restore": "palauta",
"ban": "porttikielto", "ban": "porttikielto",
"ban_from_site": "aseta porttikielto sivulle", "ban_from_site": "aseta porttikielto sivulle",
@ -78,12 +79,16 @@
"creator": "luoja", "creator": "luoja",
"username": "Käyttäjänimi", "username": "Käyttäjänimi",
"email_or_username": "Sähköposti tai käyttäjätunnus", "email_or_username": "Sähköposti tai käyttäjätunnus",
"number_of_users": "{{count}} käyttäjää", "number_of_users": "{{count}} käyttäjä",
"number_of_subscribers": "{{count}} tilaajaa", "number_of_users_plural": "{{count}} käyttäjää",
"number_of_points": "{{count}} pistettä", "number_of_subscribers": "{{count}} tilaaja",
"number_online": "{{count}} käyttäjää aktiivisena", "number_of_subscribers_plural": "{{count}} tilaajaa",
"number_of_points": "{{count}} piste",
"number_of_points_plural": "{{count}} pistettä",
"number_online": "{{count}} käyttäjä aktiivisena",
"number_online_plural": "{{count}} käyttäjää aktiivisena",
"name": "Nimi", "name": "Nimi",
"title": "Kuvaus", "title": "Otsikko",
"category": "Luokka", "category": "Luokka",
"subscribers": "Tilaajat", "subscribers": "Tilaajat",
"both": "Molemmat", "both": "Molemmat",
@ -121,8 +126,7 @@
"login_sign_up": "Kirjaudu sisään / Rekisteröidy", "login_sign_up": "Kirjaudu sisään / Rekisteröidy",
"login": "Kirjaudu sisään", "login": "Kirjaudu sisään",
"sign_up": "Rekisteröidy", "sign_up": "Rekisteröidy",
"notifications_error": "notifications_error": "Työpöydän ilmoitukset eivät ole saatavilla selaimellesi. Yritä Firefoxia tai Chromea.",
"Työpöydän ilmoitukset eivät ole saatavilla selaimellesi. Yritä Firefoxia tai Chromea.",
"unread_messages": "Lukemattomat viestit", "unread_messages": "Lukemattomat viestit",
"messages": "Viestit", "messages": "Viestit",
"password": "Salasana", "password": "Salasana",
@ -134,9 +138,8 @@
"new_password": "Uusi salasana", "new_password": "Uusi salasana",
"no_email_setup": "Tämä palvelin ei ole asettanut sähköpostia oikein.", "no_email_setup": "Tämä palvelin ei ole asettanut sähköpostia oikein.",
"email": "Sähköposti", "email": "Sähköposti",
"matrix_user_id": " Matrix-käyttäjä", "matrix_user_id": "Matrix-käyttäjä",
"private_message_disclaimer": "private_message_disclaimer": "Varoitus: Yksityisviestit Lemmyssä eivät ole turvallisia. Luo tili <1>Riot.im</1> -palveluun turvallista viestintää varten.",
"Varoitus: Yksityisviestit Lemmyssä eivät ole turvallisia. Luo tili <1>Riot.im</1> -palveluun turvallista viestintää varten.",
"send_notifications_to_email": "Lähetä ilmoitukset sähköpostiin", "send_notifications_to_email": "Lähetä ilmoitukset sähköpostiin",
"optional": "Valinnainen", "optional": "Valinnainen",
"expires": "Umpeutuu", "expires": "Umpeutuu",
@ -148,7 +151,7 @@
"registration_closed": "Rekisteröityminen suljettu", "registration_closed": "Rekisteröityminen suljettu",
"enable_nsfw": "Salli NSFW", "enable_nsfw": "Salli NSFW",
"url": "URL", "url": "URL",
"body": "Body", "body": "Sisältö",
"copy_suggested_title": "kopioi ehdotettu otsikko: {{title}}", "copy_suggested_title": "kopioi ehdotettu otsikko: {{title}}",
"community": "Yhteisö", "community": "Yhteisö",
"expand_here": "Laajenna tässä", "expand_here": "Laajenna tässä",
@ -166,14 +169,12 @@
"theme": "Teema", "theme": "Teema",
"sponsors": "Sponsorit", "sponsors": "Sponsorit",
"sponsors_of_lemmy": "Lemmy-sponsorit", "sponsors_of_lemmy": "Lemmy-sponsorit",
"sponsor_message": "sponsor_message": "Lemmy on vapaa, <1>avoimen lähdekoodin</1> -ohjelmisto, eli mainontaa, rahantekemistä, tai pääomasijoitusta täällä ei tule ikinä olemaan. Lahjoituksesi tukevat suoraan projektin täysipäiväistä kehitystä. Kiitokset seuraaville ihmisille:",
"Lemmy on vapaa, <1>avoimen lähdekoodin</1> -ohjelmisto, eli mainontaa, rahantekemistä, tai pääomasijoitusta täällä ei tule ikinä olemaan. Lahjoituksesi tukevat suoraan projektin täysipäiväistä kehitystä. Kiitokset seuraaville ihmisille:",
"support_on_patreon": "Tue Patreonissa", "support_on_patreon": "Tue Patreonissa",
"donate_to_lemmy": "Lahjoita Lemmylle", "donate_to_lemmy": "Lahjoita Lemmylle",
"donate": "Lahjoita", "donate": "Lahjoita",
"general_sponsors": "general_sponsors": "Yleisiä sponsoreja ovat he, jotka lupaavat 10-39 dollaria Lemmylle.",
"Yleisiä sponsoreja ovat he, jotka lupaavat 10-39 dollaria Lemmylle.", "crypto": "Krypto",
"crypto": "Crypto",
"bitcoin": "Bitcoin", "bitcoin": "Bitcoin",
"ethereum": "Ethereum", "ethereum": "Ethereum",
"monero": "Monero", "monero": "Monero",
@ -188,8 +189,7 @@
"yes": "kyllä", "yes": "kyllä",
"no": "ei", "no": "ei",
"powered_by": "Vauhdittajana", "powered_by": "Vauhdittajana",
"landing_0": "landing_0": "Lemmy on <1>linkinkerääjä</1> / Reddit-vaihtoehto, tarkoitettu toimimaan <2>fediversessä</2>.<3></3>Sitä voi isännöidä itse, siinä on tosiaikaisesti päivittyvät kommenttiketjut, ja se on pieni (<4>~80 kilotavua</4>). Federointi ActivityPub-verkkoon on suunnittelun alla. <5></5>Tämä on <6>hyvin varhainen betaversio</6>, ja monet ominaisuudet ovat toistaiseksi rikki tai poissa. <7></7>Ehdota uusia ominaisuuksia tai raportoi bugeja <8>tänne.</8><9></9>Tehty teknologioilla <10>Rust</10>, <11>Actix</11>, <12>Inferno</12>, <13>Typescript</13>.",
"Lemmy on <1>linkinkerääjä</1> / Reddit-vaihtoehto, tarkoitettu toimimaan <2>fediversessä</2>.<3></3>Sitä voi isännöidä itse, siinä on tosiaikaisesti päivittyvät kommenttiketjut, ja se on pieni (<4>~80 kilotavua</4>). Federointi ActivityPub-verkkoon on suunnittelun alla. <5></5>Tämä on <6>hyvin varhainen betaversio</6>, ja monet ominaisuudet ovat toistaiseksi rikki tai poissa. <7></7>Ehdota uusia ominaisuuksia tai raportoi bugeja <8>tänne.</8><9></9>Tehty teknologioilla <10>Rust</10>, <11>Actix</11>, <12>Inferno</12>, <13>Typescript</13>.",
"not_logged_in": "Ei kirjautunut sisään.", "not_logged_in": "Ei kirjautunut sisään.",
"logged_in": "Kirjautunut sisään.", "logged_in": "Kirjautunut sisään.",
"community_ban": "Sinulle on asetettu porttikielto tähän yhteisöön.", "community_ban": "Sinulle on asetettu porttikielto tähän yhteisöön.",
@ -198,9 +198,9 @@
"couldnt_like_comment": "Kommentista ei voitu tykätä.", "couldnt_like_comment": "Kommentista ei voitu tykätä.",
"couldnt_update_comment": "Kommenttia ei voitu päivittää.", "couldnt_update_comment": "Kommenttia ei voitu päivittää.",
"couldnt_save_comment": "Kommenttia ei voitu tallentaa.", "couldnt_save_comment": "Kommenttia ei voitu tallentaa.",
"no_comment_edit_allowed": "Et ole sallittu muokkaamaan kommenttia.", "no_comment_edit_allowed": "Sinulla ei ole oikeutta muokata kommenttia.",
"no_post_edit_allowed": "Et ole sallittu muokkaamaan viestiä.", "no_post_edit_allowed": "Sinulla ei ole oikeutta muokata viestiä.",
"no_community_edit_allowed": "Et ole sallittu muokkaamaan yhteisöä.", "no_community_edit_allowed": "Sinulla ei ole oikeutta muokata yhteisöä.",
"couldnt_find_community": "Yhteisöä ei voitu löytää.", "couldnt_find_community": "Yhteisöä ei voitu löytää.",
"couldnt_update_community": "Yhteisöä ei voitu päivittää.", "couldnt_update_community": "Yhteisöä ei voitu päivittää.",
"community_already_exists": "Yhteisö on jo olemassa.", "community_already_exists": "Yhteisö on jo olemassa.",
@ -217,18 +217,39 @@
"not_an_admin": "Ei ole ylläpitäjä.", "not_an_admin": "Ei ole ylläpitäjä.",
"site_already_exists": "Sivusto on jo olemassa.", "site_already_exists": "Sivusto on jo olemassa.",
"couldnt_update_site": "Sivustoa ei voitu päivittää.", "couldnt_update_site": "Sivustoa ei voitu päivittää.",
"couldnt_find_that_username_or_email": "couldnt_find_that_username_or_email": "Käyttäjänimeä tai sähköpostia ei onnistuttu löytämään.",
"Käyttäjänimeä tai sähköpostia ei onnistuttu löytämään.",
"password_incorrect": "Salasana on väärin.", "password_incorrect": "Salasana on väärin.",
"passwords_dont_match": "Salasanat eivät täsmää.", "passwords_dont_match": "Salasanat eivät täsmää.",
"admin_already_created": "Anteeksi, mutta täällä on jo ylläpitäjä.", "admin_already_created": "Anteeksi, mutta täällä on jo ylläpitäjä.",
"user_already_exists": "Käyttäjä on jo olemassa.", "user_already_exists": "Käyttäjä on jo olemassa.",
"email_already_exists": "Sähköposti on jo olemassa.", "email_already_exists": "Sähköposti on jo olemassa.",
"couldnt_update_user": "Käyttäjää ei voitu päivittää.", "couldnt_update_user": "Käyttäjää ei voitu päivittää.",
"system_err_login": "system_err_login": "Järjestelmävirhe. Yritä kirjautua ulos ja kirjautua uudestaan sisään.",
"Järjestelmävirhe. Yritä kirjautua ulos ja kirjautua uudestaan sisään.",
"couldnt_create_private_message": "Yksityisviestiä ei voitu luoda.", "couldnt_create_private_message": "Yksityisviestiä ei voitu luoda.",
"no_private_message_edit_allowed": "no_private_message_edit_allowed": "Sinulla ei ole oikeutta muokata yksityisviestiä.",
"Et ole sallittu muokkaamaan yksityisviestiä.", "couldnt_update_private_message": "Yksityisviestiä ei voitu päivittää.",
"couldnt_update_private_message": "Yksityisviestiä ei voitu päivittää." "more": "lisää",
"cross_posted_to": "ristipostattu: ",
"sorting_help": "apua lajitteluun",
"show_context": "Näytä yhteys",
"admin_settings": "Ylläpitäjän asetukset",
"site_config": "Sivun asetukset",
"banned_users": "Porttikieltoon asetetut käyttäjät",
"emoji_picker": "Emoji-valitsin",
"upvote": "Anna ylä-ääni",
"number_of_upvotes": "{{count}} ylä-ääni",
"number_of_upvotes_plural": "{{count}} ylä-ääntä",
"old": "Vanhat",
"downvote": "Anna alaääni",
"number_of_downvotes": "{{count}} alaääni",
"number_of_downvotes_plural": "{{count}} alaääntä",
"couldnt_get_comments": "Kommentteja ei voitu hakea.",
"support_on_liberapay": "Tue Liberapayssa",
"time": "Aika",
"action": "Toiminto",
"block_leaving": "Haluatko varmasti poistua?",
"silver_sponsors": "Hopeasponsoreita ovat ne, jotka lupaavat 40 dollaria Lemmylle.",
"post_title_too_long": "Viestin otsikko on liian pitkä.",
"support_on_open_collective": "Tie OpenCollectivessa",
"site_saved": "Sivu tallennettu."
} }

View file

@ -1,27 +1,30 @@
{ {
"post": "publication", "post": "publication",
"remove_post": "Supprimer la publication", "remove_post": "Supprimer la publication",
"no_posts": "Pas de publications.", "no_posts": "Aucune publication.",
"create_a_post": "Créer une publication", "create_a_post": "Créer une publication",
"create_post": "Créer la publication", "create_post": "Créer une publication",
"number_of_posts": "{{count}} Publications", "number_of_posts": "{{count}} Publication",
"number_of_posts_plural": "{{count}} Publications",
"posts": "Publications", "posts": "Publications",
"related_posts": "Ces sujets peuvent être corrélés", "related_posts": "Publications similaires",
"cross_posts": "Ce sujet a également été posté sur :", "cross_posts": "Ce lien a également été publié sur :",
"cross_post": "publication croisée", "cross_post": "publication croisée",
"cross_posted_to": "publication croisée à : ", "cross_posted_to": "publication croisée à : ",
"comments": "Commentaires", "comments": "Commentaires",
"number_of_comments": "{{count}} Commentaires", "number_of_comments": "{{count}} Commentaire",
"number_of_comments_plural": "{{count}} Commentaires",
"remove_comment": "Supprimer le commentaire", "remove_comment": "Supprimer le commentaire",
"communities": "Communautés", "communities": "Communautés",
"users": "Utilisateurs", "users": "Utilisateurs",
"create_a_community": "Créer une communauté", "create_a_community": "Créer une communauté",
"create_community": "Créer la communauté", "create_community": "Créer une communauté",
"remove_community": "Supprimer la Communauté", "remove_community": "Supprimer la Communauté",
"subscribed_to_communities": "Abonné à ces <1>communautés</1>", "subscribed_to_communities": "Abonné à ces <1>communautés</1>",
"trending_communities": "<1>Communautés</1> appréciées", "trending_communities": "<1>Communautés</1> appréciées",
"list_of_communities": "Liste des communautés", "list_of_communities": "Liste des communautés",
"number_of_communities": "{{count}} communautés", "number_of_communities": "{{count}} Communauté",
"number_of_communities_plural": "{{count}} Communautés",
"community_reqs": "en minuscule, sans espace et avec tiret du bas.", "community_reqs": "en minuscule, sans espace et avec tiret du bas.",
"create_private_message": "Créer un message privé", "create_private_message": "Créer un message privé",
"send_secure_message": "Envoyer le message sécurisé", "send_secure_message": "Envoyer le message sécurisé",
@ -75,12 +78,16 @@
"unsave": "retirer", "unsave": "retirer",
"create": "créer", "create": "créer",
"creator": "createur", "creator": "createur",
"username": "Nom d'utilisateur", "username": "Nom dutilisateur·rice",
"email_or_username": "Email ou Nom d'utilisateur", "email_or_username": "Email ou nom dutilisateur·rice",
"number_of_users": "{{count}} Utilisateurs", "number_of_users": "{{count}} Utilisateur",
"number_of_subscribers": "{{count}} Abonnés", "number_of_users_plural": "{{count}} Utilisateurs",
"number_of_points": "{{count}} Points", "number_of_subscribers": "{{count}} Abonné",
"number_online": "{{count}} Utilisateurs en ligne", "number_of_subscribers_plural": "{{count}} Abonnés",
"number_of_points": "{{count}} Point",
"number_of_points_plural": "{{count}} Points",
"number_online": "{{count}} Utilisateur en ligne",
"number_online_plural": "{{count}} Utilisateurs en ligne",
"name": "Nom", "name": "Nom",
"title": "Titre", "title": "Titre",
"category": "Catégorie", "category": "Catégorie",
@ -88,7 +95,7 @@
"both": "Les deux", "both": "Les deux",
"saved": "Sauvegardé", "saved": "Sauvegardé",
"unsubscribe": "Se désabonner", "unsubscribe": "Se désabonner",
"subscribe": "S'abonner", "subscribe": "Sabonner",
"subscribed": "Abonnés", "subscribed": "Abonnés",
"prev": "Précédent", "prev": "Précédent",
"next": "Suivant", "next": "Suivant",
@ -118,9 +125,9 @@
"overview": "Général", "overview": "Général",
"view": "Voir", "view": "Voir",
"logout": "Se déconnecter", "logout": "Se déconnecter",
"login_sign_up": "Se connecter / S'inscrire", "login_sign_up": "Se connecter / Sinscrire",
"login": "Se connecter", "login": "Se connecter",
"sign_up": "S'inscrire", "sign_up": "Sinscrire",
"notifications_error": "Les notifications de bureau ne sont pas discponibles sur votre navigateur. Essayez Firefox ou Chrome.", "notifications_error": "Les notifications de bureau ne sont pas discponibles sur votre navigateur. Essayez Firefox ou Chrome.",
"unread_messages": "Messages non-lu", "unread_messages": "Messages non-lu",
"messages": "Messages", "messages": "Messages",
@ -131,7 +138,7 @@
"reset_password_mail_sent": "Un email a été envoyé pour réinitialiser votre mot de passe.", "reset_password_mail_sent": "Un email a été envoyé pour réinitialiser votre mot de passe.",
"password_change": "Changement de mot de passe", "password_change": "Changement de mot de passe",
"new_password": "Nouveau mot de passe", "new_password": "Nouveau mot de passe",
"no_email_setup": "Ce serveur n'a pas correctement configuré la messagerie de email.", "no_email_setup": "Ce serveur na pas correctement configuré la messagerie du courrier.",
"email": "Email", "email": "Email",
"matrix_user_id": "Utilisateur Matrix", "matrix_user_id": "Utilisateur Matrix",
"private_message_disclaimer": "Attention : les messages privés dans Lemmy ne sont pas sécurisés. Veuillez créer un compte sur <1>Riot.im</1> pour pouvoir envoyer des messages sécurisés.", "private_message_disclaimer": "Attention : les messages privés dans Lemmy ne sont pas sécurisés. Veuillez créer un compte sur <1>Riot.im</1> pour pouvoir envoyer des messages sécurisés.",
@ -142,24 +149,24 @@
"browser_default": "Défaut pour le navigateur", "browser_default": "Défaut pour le navigateur",
"downvotes_disabled": "Votes négatifs désactivés", "downvotes_disabled": "Votes négatifs désactivés",
"enable_downvotes": "Votes négatifs activés", "enable_downvotes": "Votes négatifs activés",
"open_registration": "Ouvrir la regestration", "open_registration": "Ouvrir les inscriptions",
"registration_closed": "Régestration fermée", "registration_closed": "Inscriptions fermées",
"enable_nsfw": "Activer NSFW", "enable_nsfw": "Activer NSFW",
"url": "URL", "url": "URL",
"body": "Texte", "body": "Texte",
"copy_suggested_title": "copier le titre suggéré : {{title}}", "copy_suggested_title": "copier le titre suggéré : {{title}}",
"community": "Communauté", "community": "Communauté",
"expand_here": "Développer ici", "expand_here": "Développer ici",
"subscribe_to_communities": "S'abonner à quelques <1>communautés</1>.", "subscribe_to_communities": "Sabonner à quelques <1>communautés</1>.",
"chat": "Chat", "chat": "Chat",
"recent_comments": "Commentaires récents", "recent_comments": "Commentaires récents",
"no_results": "Pas de résultats.", "no_results": "Pas de résultats.",
"setup": "Installation", "setup": "Installation",
"lemmy_instance_setup": "Installation d'une instance Lemmy", "lemmy_instance_setup": "Installation dune instance Lemmy",
"setup_admin": "Créer un administrateur", "setup_admin": "Créer un administrateur",
"your_site": "votre site", "your_site": "votre site",
"modified": "modifié", "modified": "modifié",
"nsfw": "Pas sûr pour le travail", "nsfw": "Pas sûr pour le travail (NSFW)",
"show_nsfw": "Afficher le contenu NSFW", "show_nsfw": "Afficher le contenu NSFW",
"theme": "Thème", "theme": "Thème",
"sponsors": "Sponsors", "sponsors": "Sponsors",
@ -185,48 +192,64 @@
"yes": "oui", "yes": "oui",
"no": "non", "no": "non",
"powered_by": "Propulsé par", "powered_by": "Propulsé par",
"landing_0": "Lemmy est un <1>aggrégateur de lien</1>, similaire à reddit et conçu pour fonctionner sur le <2>fédiverse</2>.<3></3>Il est auto-hébergeable, se met à jour en direct et est léger (<4>~80kB</4>). La fédération via Activitypub est prévue. <5></5>Lemmy est une <6>version beta très précoce</6>, et de nombreuses fonctionnalités sont manquantes ou non fonctionnelles. <7></7>Vous pouvez rapporter des bugs et suggérez de nouvelles fonctionnalités <8>ici.</8><9></9>Crée avec <10>Rust</10>, <11>Actix</11>, <12>Inferno</12>, <13>Typescript</13>.", "landing": "Lemmy est un <1>aggrégateur de liens</1>, similaire à reddit et conçu pour fonctionner sur le <2>fédiverse</2>.<3></3>Il est auto-hébergeable, se met à jour en direct et est léger (<4>~80kB</4>). La fédération via ActivityPub est prévue dans sa feuille de route. <5></5>Lemmy est une <6>version beta très précoce</6> et de nombreuses fonctionnalités sont manquantes ou non fonctionnelles. <7></7>Vous pouvez rapporter des bugs et suggérer de nouvelles fonctionnalités <8>ici.</8><9></9>Crée avec <10>Rust</10>, <11>Actix</11>, <12>Inferno</12>, <13>Typescript</13>.",
"not_logged_in": "Vous n'êtes pas connecté.", "not_logged_in": "Vous nêtes pas connecté.",
"logged_in": "Vous êtes connecté.", "logged_in": "Vous êtes connecté.",
"community_ban": "Vous avez été banni de cette communauté.", "community_ban": "Vous avez été banni de cette communauté.",
"site_ban": "Vous avez été banni du site", "site_ban": "Vous avez été banni du site",
"couldnt_create_comment": "Impossible de poster le commentaire.", "couldnt_create_comment": "Impossible de publier le commentaire.",
"couldnt_like_comment": "Impossible d'aimer le commentaire.", "couldnt_like_comment": "Impossible daimer le commentaire.",
"couldnt_update_comment": "Impossible de mettre à jour le commentaire.", "couldnt_update_comment": "Impossible de mettre à jour le commentaire.",
"couldnt_save_comment": "Impossible de sauvegarder le commentaire.", "couldnt_save_comment": "Impossible de sauvegarder le commentaire.",
"couldnt_get_comments": "Impossible de obtenir les commentaires.", "couldnt_get_comments": "Impossible de obtenir les commentaires.",
"no_comment_edit_allowed": "Vous n'êtes pas autorisé à éditer ce commentaire.", "no_comment_edit_allowed": "Vous nêtes pas autorisé à éditer ce commentaire.",
"no_post_edit_allowed": "Vous n'êtes pas autorisé à éditer sujet.", "no_post_edit_allowed": "Vous nêtes pas autorisé à éditer la publication.",
"no_community_edit_allowed": "Vous n'êtes pas autorisé à éditer cette communauté.", "no_community_edit_allowed": "Vous nêtes pas autorisé à éditer cette communauté.",
"couldnt_find_community": "Impossible de trouver cette communauté.", "couldnt_find_community": "Impossible de trouver cette communauté.",
"couldnt_update_community": "Impossible d'éditer cette communauté.", "couldnt_update_community": "Impossible déditer cette communauté.",
"community_already_exists": "Cette communauté existe déjà.", "community_already_exists": "Cette communauté existe déjà.",
"community_moderator_already_exists": "Ce membre est déjà modérateur.", "community_moderator_already_exists": "Ce membre est déjà modérateur.",
"community_follower_already_exists": "Ce membre est déjà abonné.", "community_follower_already_exists": "Ce membre est déjà abonné.",
"community_user_already_banned": "Ce membre est déjà banni.", "community_user_already_banned": "Ce membre est déjà banni.",
"couldnt_create_post": "Impossible de créer le sujet.", "couldnt_create_post": "Impossible de créer la publication.",
"post_title_too_long": "Sujet titre trop long.", "post_title_too_long": "Le titre de la publication est trop long.",
"couldnt_like_post": "Impossible d'aimer le sujet.", "couldnt_like_post": "Impossible daimer la publication.",
"couldnt_find_post": "Impossible de trouver le sujet.", "couldnt_find_post": "Impossible de trouver la publication.",
"couldnt_get_posts": "Impossible d'obtenir les sujets", "couldnt_get_posts": "Impossible dobtenir les publications",
"couldnt_update_post": "Impossible de mettre à jour le sujet", "couldnt_update_post": "Impossible de mettre à jour la publication",
"couldnt_save_post": "Impossible de sauvegarder le sujet.", "couldnt_save_post": "Impossible de sauvegarder la publication.",
"no_slurs": "Pas d'insultes.", "no_slurs": "Pas dinsultes.",
"not_an_admin": "Pas administrateur.", "not_an_admin": "Pas administrateur.",
"site_already_exists": "Le site existe déjà.", "site_already_exists": "Le site existe déjà.",
"couldnt_update_site": "Impossible de mettre à jour le site.", "couldnt_update_site": "Impossible de mettre à jour le site.",
"couldnt_find_that_username_or_email": "Impossible de trouver cet utilisateur ou cet email.", "couldnt_find_that_username_or_email": "Impossible de trouver cet·te utilisateur·rice ou cet email.",
"password_incorrect": "Mot de passe incorrect.", "password_incorrect": "Mot de passe incorrect.",
"passwords_dont_match": "Les mots de passes ne correspondent pas..", "passwords_dont_match": "Les mots de passes ne correspondent pas..",
"admin_already_created": "Désolé, il y a déjà un admin.", "admin_already_created": "Désolé, il y a déjà un admin.",
"user_already_exists": "L'utilisateur existe déjà.", "user_already_exists": "Lutilisateur·rice existe déjà.",
"email_already_exists": "Lemail existe déjà.", "email_already_exists": "Lemail existe déjà.",
"couldnt_update_user": "Impossible de mettre à jour l'utilisateur.", "couldnt_update_user": "Impossible de mettre à jour lutilisateur·rice.",
"system_err_login": "Erreur système. Essayez de vous déconneter puis de vous reconnecter.", "system_err_login": "Erreur système. Essayez de vous déconneter puis de vous reconnecter.",
"couldnt_create_private_message": "Impossible de créer un message privé.", "couldnt_create_private_message": "Impossible de créer un message privé.",
"no_private_message_edit_allowed": "Pas autorisé à modifier un message privé.", "no_private_message_edit_allowed": "Pas autorisé à modifier un message privé.",
"couldnt_update_private_message": "Impossible de modifier un message privé.", "couldnt_update_private_message": "Impossible de modifier un message privé.",
"time": "Temps", "time": "Temps",
"action": "Action", "action": "Action",
"more": "plus" "more": "plus",
"admin_settings": "Paramètres administratifs",
"site_config": "Configuration du site",
"banned_users": "Utilisateurs interdits",
"site_saved": "Site sauvegardé.",
"support_on_open_collective": "Soutien à OpenCollective",
"sorting_help": "aide au tri",
"upvote": "Aime",
"show_context": "Afficher le contexte",
"block_leaving": "Vous êtes sûr de vouloir partir ?",
"number_of_upvotes": "{{count}} votes pour",
"number_of_upvotes_plural": "{{count}} votes contre",
"number_of_downvotes": "{{count}} vote contre",
"number_of_downvotes_plural": "{{count}} votes contre",
"downvote": "Voter contre",
"emoji_picker": "Sélecteur démojis",
"silver_sponsors": "Les sponsors argent sont ceux et celles qui ont fait une donation de 40$ à Lemmy."
} }

1
ui/translations/gl.json vendored Normal file
View file

@ -0,0 +1 @@
{}

66
ui/translations/hi.json vendored Normal file
View file

@ -0,0 +1,66 @@
{
"create_a_post": "पोस्ट बनाएँ",
"create_post": "पोस्ट बनाएँ",
"posts": "पोस्ट",
"unlock": "ताला खोलें",
"avatar": "अवतार",
"upload_image": "फ़ोटो अपलोड करें",
"comments": "टिप्पणी (कमेंट )",
"remove_comment": "टिप्पणी हटाएँ (कमेंट हटाएँ)",
"upload_avatar": "अवतार अपलोड करें",
"post": "पोस्ट",
"remove_post": "पोस्ट हटाएँ",
"number_of_posts": "{{count}} पोस्ट",
"number_of_posts_plural": "{{count}} पोस्ट्स",
"cross_posts": "यह लिंक अन्य स्थान पर भी पोस्ट किया गया हैं :",
"related_posts": "यह पोस्ट्स संबंधित हो सकते हैं |",
"number_of_comments": "{{ count }} टिप्पणी (कमेंट )",
"number_of_comments_plural": "{{ count }} टिप्पणियाँ (कोम्मेंट्स )",
"communities": "सामुदायिक",
"users": "उपयोगकर्ता",
"create_a_community": "समुदाय बनाएँ",
"create_community": "समुदाय बनाएँ",
"remove_community": "समुदाय हटाएँ",
"list_of_communities": "समुदायों की सूची",
"create_private_message": "निजी संदेश बनाएँ",
"send_secure_message": "सुरक्षित संदेश भेजें",
"send_message": "संदेश भेजें",
"message": "संदेश",
"edit": "संपादित करें ( एडिट करें )",
"reply": "जवाब दें",
"more": "और भी",
"cancel": "रद्द करें",
"preview": "पूर्वावलोकन करें",
"show_avatars": "अवतार दिखाएँ",
"show_context": "संदर्भ दिखाएँ",
"community": "समुदाय",
"number_of_communities": "{{count}} समुदाय",
"number_of_communities_plural": "{{count}} समुदाय",
"community_reqs": "छोटे अक्षर, अंडरस्कोर, और कोई रिक्त स्थान नहीं |",
"forgot_password": "पासवर्ड भूल गए",
"no_posts": "कोई पोस्ट नहीं |",
"community_already_exists": "यह समुदाय पहले स मौजूद है |",
"couldnt_create_comment": "टिप्पणी (कमेंट) नहीं बना पाईं |",
"couldnt_find_community": "समुदायों नहीं ढूंढ़ पाएं |",
"couldnt_find_post": "पोस्ट नहीं ढूंढ़ पाएं |",
"trending_communities": "अभी प्रचलित <1>समुदाय</1>",
"formatting_help": "स्वरूपण सहायता",
"view_source": "स्रोत देखें",
"lock": "बंद करें",
"link": "लिंक",
"mods": "मध्यस्थों",
"settings": "समायोजन (सेटिंग्स)",
"site_config": "साइड कॉन्फ़िगरेशन",
"appoint_as_mod": "मध्यथ के रूप में नियुक्त करें",
"admin": "प्रशासक",
"remove": "हटाएँ",
"removed": "हटाए गए",
"locked": "बंद",
"reason": "कारण",
"mod": "मध्यस्थ",
"admin_settings": "प्रशासक समायोजन (सेटिंग्स)",
"remove_as_mod": "मध्यथ के स्थान से हटाएँ",
"admins": "प्रशासकों",
"remove_as_admin": "प्रशासक के स्थान से हटाएँ",
"appoint_as_admin": "प्रशासक के रूप में नियुक्त करें"
}

1
ui/translations/hu.json vendored Normal file
View file

@ -0,0 +1 @@
{}

View file

@ -1,26 +1,29 @@
{ {
"post": "post", "post": "pubblica",
"remove_post": "Rimuovi Post", "remove_post": "Elimina la pubblicazione",
"no_posts": "Nessun Post.", "no_posts": "Nessuna pubblicazione.",
"create_a_post": "Crea un post", "create_a_post": "Crea una pubblicazione",
"create_post": "Crea Post", "create_post": "Crea una pubblicazione",
"number_of_posts": "{{count}} Posts", "number_of_posts": "{{count}} Pubblicazione",
"posts": "Posts", "number_of_posts_plural": "{{count}} Pubblicazioni",
"related_posts": "Questi post potrebbero essere correlati", "posts": "Pubblicazioni",
"cross_posts": "Questo link è stato postato anche in:", "related_posts": "Queste pubblicazioni potrebbero essere collegate",
"cross_post": "cross-post", "cross_posts": "Questo collegamento è stato postato anche in:",
"cross_post": "pubblica altrove",
"comments": "Commenti", "comments": "Commenti",
"number_of_comments": "{{count}} Commenti", "number_of_comments": "{{count}} Commento",
"remove_comment": "Rimuovi Commento", "number_of_comments_plural": "{{count}} Commenti",
"remove_comment": "Elimina Commento",
"communities": "Comunità", "communities": "Comunità",
"users": "Utenti", "users": "Utenti",
"create_a_community": "Crea una Comunità", "create_a_community": "Crea una comunità",
"create_community": "Crea Comunità", "create_community": "Crea Comunità",
"remove_community": "Rimuovi Comunità", "remove_community": "Elimina Comunità",
"subscribed_to_communities": "Iscritto alle <1>comunità</1>", "subscribed_to_communities": "Iscritt* alle <1>comunità</1>",
"trending_communities": "<1>Comunità</1> in crescita", "trending_communities": "<1>Comunità</1> in crescita",
"list_of_communities": "Lista di comunità", "list_of_communities": "Elenco di comunità",
"number_of_communities": "{{count}} Comunità", "number_of_communities": "{{count}} Comunità",
"number_of_communities_plural": "{{count}} Comunità",
"community_reqs": "minuscole, trattini bassi e nessuno spazio.", "community_reqs": "minuscole, trattini bassi e nessuno spazio.",
"edit": "modifica", "edit": "modifica",
"reply": "rispondi", "reply": "rispondi",
@ -33,7 +36,7 @@
"lock": "blocca", "lock": "blocca",
"sticky": "evidenzia", "sticky": "evidenzia",
"unsticky": "rimuovi evidenza", "unsticky": "rimuovi evidenza",
"link": "link", "link": "collegamento",
"mod": "moderatore", "mod": "moderatore",
"mods": "moderatori", "mods": "moderatori",
"moderates": "Moderatore di", "moderates": "Moderatore di",
@ -49,7 +52,7 @@
"removed": "rimosso", "removed": "rimosso",
"locked": "bloccato", "locked": "bloccato",
"stickied": "evidenziato", "stickied": "evidenziato",
"reason": "Ragione", "reason": "Motivo",
"mark_as_read": "segna come letto", "mark_as_read": "segna come letto",
"mark_as_unread": "segna come non letto", "mark_as_unread": "segna come non letto",
"delete": "cancella", "delete": "cancella",
@ -57,21 +60,25 @@
"delete_account": "Cancella Account", "delete_account": "Cancella Account",
"delete_account_confirm": "Attenzione: stai per cancellare permanentemente tutti i tuoi dati. Inserisci la tua password per confermare questa azione.", "delete_account_confirm": "Attenzione: stai per cancellare permanentemente tutti i tuoi dati. Inserisci la tua password per confermare questa azione.",
"restore": "ripristina", "restore": "ripristina",
"ban": "ban", "ban": "espulsione",
"ban_from_site": "banna dal sito", "ban_from_site": "espulsione dal sito",
"unban": "rimuovi ban", "unban": "rimuovi espulsione",
"unban_from_site": "rimuove il ban dal sito", "unban_from_site": "rimuove l'espulsione dal sito",
"banned": "bannato", "banned": "espulso",
"save": "salva", "save": "salva",
"unsave": "rimuovi", "unsave": "rimuovi",
"create": "crea", "create": "crea",
"creator": "autore", "creator": "autore",
"username": "Username", "username": "Nome Utente",
"email_or_username": "Email o Username", "email_or_username": "Email o Nome Utente",
"number_of_users": "{{count}} Utenti", "number_of_users": "{{count}} Utente",
"number_of_subscribers": "{{count}} Iscritti", "number_of_users_plural": "{{count}} Utenti",
"number_of_points": "{{count}} Punti", "number_of_subscribers": "{{count}} Iscritto",
"number_online": "{{count}} Utenti Online", "number_of_subscribers_plural": "{{count}} Iscritti",
"number_of_points": "{{count}} Punto",
"number_of_points_plural": "{{count}} Punti",
"number_online": "{{count}} Utente Connesso",
"number_online_plural": "{{count}} Utenti Connessi",
"name": "Nome", "name": "Nome",
"title": "Titolo", "title": "Titolo",
"category": "Categoria", "category": "Categoria",
@ -105,11 +112,11 @@
"search": "Cerca", "search": "Cerca",
"overview": "Panoramica", "overview": "Panoramica",
"view": "Visualizza", "view": "Visualizza",
"logout": "Logout", "logout": "Esci",
"login_sign_up": "Login / Iscriviti", "login_sign_up": "Accedi / Iscriviti",
"login": "Login", "login": "Accedi",
"sign_up": "Iscriviti", "sign_up": "Iscriviti",
"notifications_error": "Le notifiche desktop non sono supportate sul tuo browser. Prova Firefox o Chrome.", "notifications_error": "Le notifiche desktop non sono disponibili sul tuo browser. Prova Firefox o Chrome.",
"unread_messages": "Messaggi Non Letti", "unread_messages": "Messaggi Non Letti",
"password": "Password", "password": "Password",
"verify_password": "Verifica Password", "verify_password": "Verifica Password",
@ -118,75 +125,75 @@
"expires": "Scade", "expires": "Scade",
"url": "URL", "url": "URL",
"body": "Contenuto", "body": "Contenuto",
"copy_suggested_title": "copia titolo suggerito: {{title}}", "copy_suggested_title": "copia titolo consigliato: {{title}}",
"community": "Comunità", "community": "Comunità",
"expand_here": "Visualizza qui", "expand_here": "Visualizza qui",
"subscribe_to_communities": "Iscriviti ad una <1>comunità</1>.", "subscribe_to_communities": "Iscriviti ad una <1>comunità</1>.",
"chat": "Chat", "chat": "Chat",
"recent_comments": "Commenti Recenti", "recent_comments": "Commenti Recenti",
"no_results": "Nessun risultato.", "no_results": "Nessun risultato.",
"setup": "Setup", "setup": "Configura",
"lemmy_instance_setup": "Setup dell'istanza di Lemmy", "lemmy_instance_setup": "Configurazione dell'istanza di Lemmy",
"setup_admin": "Imposta Amministratore del Sito", "setup_admin": "Imposta Amministratore del Sito",
"your_site": "il tuo sito", "your_site": "il tuo sito",
"modified": "modificato", "modified": "modificato",
"nsfw": "NSFW", "nsfw": "NSFW",
"show_nsfw": "Mostra contenuto NSFW", "show_nsfw": "Mostra contenuto NSFW",
"theme": "Tema", "theme": "Tema",
"sponsors": "Sponsors", "sponsors": "Sponsor",
"sponsors_of_lemmy": "Sponsors di Lemmy", "sponsors_of_lemmy": "Sponsor di Lemmy",
"sponsor_message": "Lemmy è un software gratuito e <1>open-source</1>, il che significa nessuna pubblicità, monetizzazione o investitori esterni, per sempre. Le tue donazioni supportano direttamente lo sviluppo full-time del progetto. Si ringraziano le seguenti persone:", "sponsor_message": "Lemmy è software libero e <1>open-source</1>, il che significa nessuna pubblicità, monetizzazione o investitori esterni, per sempre. Le tue donazioni sostengono direttamente lo sviluppo full-time del progetto. Si ringraziano le seguenti persone:",
"support_on_patreon": "Supporta su Patreon", "support_on_patreon": "Sostieni su Patreon",
"support_on_liberapay": "Supporta su Liberapay", "support_on_liberapay": "Sostieni su Liberapay",
"general_sponsors": "I \"General Sponsors\" sono quelli che hanno investito dai 10$ ai 39$ su Lemmy.", "general_sponsors": "Gli sponsor generali sono quelli che hanno investito dai 10$ ai 39$ su Lemmy.",
"crypto": "Crypto", "crypto": "Criptomonete",
"bitcoin": "Bitcoin", "bitcoin": "Bitcoin",
"ethereum": "Ethereum", "ethereum": "Ethereum",
"monero": "Monero", "monero": "Monero",
"code": "Code", "code": "Codice",
"joined": "Iscritto da", "joined": "Iscritto da",
"by": "di", "by": "di",
"to": "su", "to": "su",
"transfer_community": "trasferisci comunità", "transfer_community": "trasferisci comunità",
"transfer_site": "trasferisci sito", "transfer_site": "trasferisci sito",
"are_you_sure": "sei sicuro?", "are_you_sure": "sei sicuro?",
"yes": "si", "yes": "sì",
"no": "no", "no": "no",
"powered_by": "Powered by", "powered_by": "Offerto da",
"landing_0": "Lemmy è un <1>aggregatore di link</1> / alternativa a reddit, creato per integrarsi con il <2>fediverse</2>. <3></3>È self-hosted, i commenti sono aggiornati in tempo reale ed è molto piccolo (<4>~80kB</4>). La Federazione con la rete ActivityPub sarà implementata nel futuro. <5></5>Questa versione è una <6>beta molto giovane</6> e molte funzionalità sono incomplete o mancanti. <7></7>Suggerisci nuove funzionalità o segnala errori a <8>questa pagina.</8><9></9>Sviluppato con <10>Rust</10>, <11>Actix</11>, <12>Inferno</12>, <13>Typescript</13>.", "landing": "Lemmy è un <1>aggregatore di link</1> / alternativa a reddit, creato per integrarsi con il <2>fediverso</2>. <3></3>È self-hosted, i commenti sono aggiornati in tempo reale ed è molto piccolo (<4>~80kB</4>). La federazione con la rete ActivityPub sarà implementata nel futuro. <5></5>Questa versione è una <6>beta molto giovane</6> e molte funzionalità sono incomplete o mancanti. <7></7>Suggerisci nuove funzionalità o segnala errori a <8>questa pagina.</8><9></9>Sviluppato con <10>Rust</10>, <11>Actix</11>, <12>Inferno</12>, <13>Typescript</13>.",
"not_logged_in": "Non hai effettuato l'accesso.", "not_logged_in": "Non hai effettuato l'accesso.",
"community_ban": "Sei stato bannato da questa comunità.", "community_ban": "Sei stato escluso da questa comunità.",
"site_ban": "Sei stato bannato dal sito", "site_ban": "Sei stato escluso dal sito",
"couldnt_create_comment": "Impossibile creare il commento.", "couldnt_create_comment": "Impossibile creare il commento.",
"couldnt_like_comment": "Impossibile mettere 'Mi piace' al commento.", "couldnt_like_comment": "Impossibile apprezzare il commento.",
"couldnt_update_comment": "Impossibile aggiornare il commento.", "couldnt_update_comment": "Impossibile aggiornare il commento.",
"couldnt_save_comment": "Impossibile salvare il commento.", "couldnt_save_comment": "Impossibile salvare il commento.",
"no_comment_edit_allowed": "Non sei autorizzato a modificare il commento.", "no_comment_edit_allowed": "Non sei autorizzato a modificare il commento.",
"no_post_edit_allowed": "Non sei autorizzato a modificare il post.", "no_post_edit_allowed": "Non sei autorizzato a modificare la pubblicazione.",
"no_community_edit_allowed": "Non sei autorizzato a modificare la comunità.", "no_community_edit_allowed": "Non sei autorizzato a modificare la comunità.",
"couldnt_find_community": "Impossibile trovare la comunità.", "couldnt_find_community": "Impossibile trovare la comunità.",
"couldnt_update_community": "Impossibile aggiornare la comunità.", "couldnt_update_community": "Impossibile aggiornare la comunità.",
"community_already_exists": "La comunità esiste già.", "community_already_exists": "La comunità esiste già.",
"community_moderator_already_exists": "Questo utente è già moderatore della comunità.", "community_moderator_already_exists": "Questo utente è già moderatore della comunità.",
"community_follower_already_exists": "Questo utente è già moderatore della comunità.", "community_follower_already_exists": "Questo utente è già moderatore della comunità.",
"community_user_already_banned": "L'utente della comunità è già stato bannato.", "community_user_already_banned": "L'utente della comunità è già stato espulso.",
"couldnt_create_post": "Impossibile creare il post.", "couldnt_create_post": "Impossibile creare la pubblicazione.",
"couldnt_like_post": "Impossibile mettere 'Mi piace' post.", "couldnt_like_post": "Impossibile apprezzare la pubblicazione.",
"couldnt_find_post": "Impossibile trovare il post.", "couldnt_find_post": "Impossibile trovare la pubblicazione.",
"couldnt_get_posts": "Impossibile recuperare i post", "couldnt_get_posts": "Impossibile recuperare le pubblicazioni",
"couldnt_update_post": "Impossibile aggiornare il post", "couldnt_update_post": "Impossibile aggiornare la pubblicazione",
"couldnt_save_post": "Impossibile salvare il post.", "couldnt_save_post": "Impossibile salvare la pubblicazione.",
"no_slurs": "Niente offese.", "no_slurs": "Niente offese.",
"not_an_admin": "Non un amministratore.", "not_an_admin": "Non un amministratore.",
"site_already_exists": "Il sito esiste già.", "site_already_exists": "Il sito esiste già.",
"couldnt_update_site": "Impossibile aggiornare il sito.", "couldnt_update_site": "Impossibile aggiornare il sito.",
"couldnt_find_that_username_or_email": "L'username o la email non sono stati trovati.", "couldnt_find_that_username_or_email": "Il nome utente o l'email non sono stati trovati.",
"password_incorrect": "Password non corretta.", "password_incorrect": "Password non corretta.",
"passwords_dont_match": "Le password non corrispondono.", "passwords_dont_match": "Le password non corrispondono.",
"admin_already_created": "Spiacente, esiste già un amministratore.", "admin_already_created": "Spiacente, esiste già un amministratore.",
"user_already_exists": "L'utente esiste già.", "user_already_exists": "L'utente esiste già.",
"couldnt_update_user": "Impossibile aggiornare l'utente.", "couldnt_update_user": "Impossibile aggiornare l'utente.",
"system_err_login": "Si è verificato un errore. Prova ad effettuare nuovamente il login.", "system_err_login": "Si è verificato un errore. Prova ad effettuare nuovamente l'accesso.",
"more": "altro", "more": "altro",
"message": "Messaggio", "message": "Messaggio",
"avatar": "Avatar", "avatar": "Avatar",
@ -200,14 +207,49 @@
"new_password": "Nuova Password", "new_password": "Nuova Password",
"private_message_disclaimer": "Attenzione: i messaggi privati su Lemmy non sono sicuri. Crea un account su <1>Riot.im</1> per una messaggistica sicura.", "private_message_disclaimer": "Attenzione: i messaggi privati su Lemmy non sono sicuri. Crea un account su <1>Riot.im</1> per una messaggistica sicura.",
"language": "Lingua", "language": "Lingua",
"enable_downvotes": "Abilita Downvote", "enable_downvotes": "Abilita voti negativi",
"enable_nsfw": "Abilita NSFW", "enable_nsfw": "Abilita NSFW",
"donate_to_lemmy": "Dona a Lemmy", "donate_to_lemmy": "Dona a Lemmy",
"donate": "Dona", "donate": "Dona",
"from": "da", "from": "da",
"archive_link": "link archivio", "archive_link": "archivia collegamento",
"matrix_user_id": "Utente Matrix", "matrix_user_id": "Utente Matrix",
"downvotes_disabled": "Downvote disabilitati", "downvotes_disabled": "Voti negativi disabilitati",
"post_title_too_long": "Titolo del post troppo lungo.", "post_title_too_long": "Titolo della pubblicazione troppo lungo.",
"email_already_exists": "Indirizzo email già presente." "email_already_exists": "Indirizzo email già presente.",
"cross_posted_to": "pubblicato pure su: ",
"support_on_open_collective": "Sostieni su OpenCollective",
"admin_settings": "Impostazioni per Admin",
"site_config": "Configurazione del sito",
"banned_users": "Utenti Espulsi",
"emoji_picker": "Selettore Emoji",
"send_message": "Invia Messaggio",
"create_private_message": "Crea Messaggio Privato",
"send_secure_message": "Invia Messaggio Sicuro",
"password_change": "Cambia password",
"reset_password_mail_sent": "Un'email è stata inviata per resettare la tua password.",
"no_email_setup": "Questo server non ha impostato un'email correttamente.",
"send_notifications_to_email": "Invia notifiche via email",
"upvote": "Voto Positivo",
"sorting_help": "aiuto ordinamento",
"old": "Vecchi",
"browser_default": "Default del browser",
"couldnt_get_comments": "Impossibile ottenere i commenti.",
"couldnt_update_private_message": "Impossibile aggiornare un messaggio privato.",
"block_leaving": "Sei sicuro di voler uscire?",
"couldnt_create_private_message": "Impossibile creare un messaggio privato.",
"show_context": "Mostra contesto",
"site_saved": "Sito Salvato.",
"downvote": "Voto Negativo",
"number_of_upvotes": "{{count}} Voto Positivo",
"number_of_upvotes_plural": "{{count}} Voti Positivi",
"number_of_downvotes": "{{count}} Voto Negativo",
"number_of_downvotes_plural": "{{count}} Voti Negativi",
"open_registration": "Registrazione Aperta",
"logged_in": "Connesso.",
"registration_closed": "Registrazione Chiusa",
"no_private_message_edit_allowed": "Non hai i permessi per modificare un messaggio privato.",
"time": "Tempo",
"action": "Azione",
"silver_sponsors": "Gli sponsor generali sono quelli che hanno investito 40$ su Lemmy."
} }

View file

@ -144,7 +144,7 @@
"enable_nsfw": "閲覧注意を有効化", "enable_nsfw": "閲覧注意を有効化",
"url": "URL", "url": "URL",
"body": "本文", "body": "本文",
"copy_suggested_title": "タイトルの提案をコピーする: {{title}}", "copy_suggested_title": "提案されたタイトルをコピーする: {{title}}",
"community": "コミュニティ", "community": "コミュニティ",
"expand_here": "拡大表示", "expand_here": "拡大表示",
"subscribe_to_communities": "<1>コミュニティ</1>をいくつか登録してみましょう。", "subscribe_to_communities": "<1>コミュニティ</1>をいくつか登録してみましょう。",
@ -233,5 +233,7 @@
"system_err_login": "システムエラーが発生しました。一度ログアウトして、再度ログインをお試しください。", "system_err_login": "システムエラーが発生しました。一度ログアウトして、再度ログインをお試しください。",
"couldnt_create_private_message": "プライベートメッセージが作成されない。", "couldnt_create_private_message": "プライベートメッセージが作成されない。",
"no_private_message_edit_allowed": "プライベートメッセージの編集許可がありません。", "no_private_message_edit_allowed": "プライベートメッセージの編集許可がありません。",
"couldnt_update_private_message": "プライベートメッセージが更新されない。" "couldnt_update_private_message": "プライベートメッセージが更新されない。",
"couldnt_like_comment": "コメントが「いいね」できない。",
"couldnt_like_post": "投稿が「いいね」できない。"
} }

View file

@ -221,5 +221,27 @@
"couldnt_like_post": "პოსტის მოწონება ვერ მოხერხდა.", "couldnt_like_post": "პოსტის მოწონება ვერ მოხერხდა.",
"community_moderator_already_exists": "ამ თემის მოდერატორი უკვე არსებობს.", "community_moderator_already_exists": "ამ თემის მოდერატორი უკვე არსებობს.",
"couldnt_create_post": "პოსტი ვერ შეიქმნა.", "couldnt_create_post": "პოსტი ვერ შეიქმნა.",
"post_title_too_long": "პოსტის სათაური ძალიან გრძელია." "post_title_too_long": "პოსტის სათაური ძალიან გრძელია.",
"admin_settings": "ადმინი პარამეტრები",
"site_config": "საიტის კონფიგურაცია",
"banned_users": "გაშავებული მომხმარებლები",
"support_on_open_collective": "Support on OpenCollective",
"site_saved": "Site Saved.",
"couldnt_find_post": "პოსტი ვერ მოიძებნა.",
"couldnt_get_posts": "პოსტები არ არის.",
"couldnt_update_post": "პოსტი ვერ განახლდა",
"couldnt_save_post": "პოსტის დასეივება ვერ მოხერხდა.",
"monero": "Monero",
"no_slurs": "No slurs.",
"not_an_admin": "ადმინი არ არის",
"site_already_exists": "Site already exists.",
"couldnt_update_site": "Couldn't update site.",
"couldnt_find_that_username_or_email": "სახელი ან ელ-პოსტა ვერ მოიძებნა.",
"password_incorrect": "პაროლი არასწორია .",
"passwords_dont_match": "პაროლები იგივი არ არის.",
"admin_already_created": "ადმინი უკვე არსებობს.",
"user_already_exists": "მომხმარებელი უკვე არსებობს.",
"email_already_exists": "ელ-პოსტა უკვე არსებობს.",
"couldnt_update_user": "მომხმარებლის განახლება ვერ მოხერხდა.",
"system_err_login": "ერორი. თავიდან შემოსვლა ცადეთ."
} }

View file

@ -4,13 +4,15 @@
"no_posts": "Geen posts.", "no_posts": "Geen posts.",
"create_a_post": "Plaats een post", "create_a_post": "Plaats een post",
"create_post": "Plaats post", "create_post": "Plaats post",
"number_of_posts": "{{count}} posts", "number_of_posts": "{{count}} post",
"number_of_posts_plural": "{{count}} posts",
"posts": "posts", "posts": "posts",
"related_posts": "Deze posts kunnen gerelateerd zijn", "related_posts": "Deze posts kunnen gerelateerd zijn",
"cross_posts": "Deze link is ook geplaatst in:", "cross_posts": "Deze link is ook geplaatst in:",
"cross_post": "cross-post", "cross_post": "cross-post",
"comments": "Reacties", "comments": "Reacties",
"number_of_comments": "{{count}} reacties", "number_of_comments": "{{count}} reactie",
"number_of_comments_plural": "{{count}} reacties",
"remove_comment": "Verwijder reactie", "remove_comment": "Verwijder reactie",
"communities": "Communities", "communities": "Communities",
"users": "Gebruikers", "users": "Gebruikers",
@ -20,8 +22,9 @@
"subscribed_to_communities": "Geabonneerd op <1>communities</1>", "subscribed_to_communities": "Geabonneerd op <1>communities</1>",
"trending_communities": "Populaire <1>communities</1>", "trending_communities": "Populaire <1>communities</1>",
"list_of_communities": "Lijst van communities", "list_of_communities": "Lijst van communities",
"number_of_communities": "{{count}} communities", "number_of_communities": "{{count}} community",
"community_reqs": "kleine letters, onderstrepingsteken en geen spaties", "number_of_communities_plural": "{{count}} community's",
"community_reqs": "kleine letters, onderstrepingsteken en geen spaties.",
"edit": "bewerk", "edit": "bewerk",
"reply": "reageer", "reply": "reageer",
"cancel": "Annuleer", "cancel": "Annuleer",
@ -57,9 +60,12 @@
"create": "maak", "create": "maak",
"username": "Gebruikersnaam", "username": "Gebruikersnaam",
"email_or_username": "E-mail of gebruikersnaam", "email_or_username": "E-mail of gebruikersnaam",
"number_of_users": "{{count}} gebruikers", "number_of_users": "{{count}} gebruiker",
"number_of_subscribers": "{{count}} abonnees", "number_of_users_plural": "{{count}} gebruikers",
"number_of_points": "{{count}} punten", "number_of_subscribers": "{{count}} abonnee",
"number_of_subscribers_plural": "{{count}} abonnees",
"number_of_points": "{{count}} punt",
"number_of_points_plural": "{{count}} punten",
"name": "Naam", "name": "Naam",
"title": "Titel", "title": "Titel",
"category": "Categorie", "category": "Categorie",
@ -95,8 +101,7 @@
"login_sign_up": "Log in / Aanmelden", "login_sign_up": "Log in / Aanmelden",
"login": "Log in", "login": "Log in",
"sign_up": "Aanmelden", "sign_up": "Aanmelden",
"notifications_error": "notifications_error": "Bureabladberichten niet beschikbaar in je browser. Probeer Firefox of Chrome.",
"Bureabladberichten niet beschikbaar in je browser. Probeer Firefox of Chrome.",
"unread_messages": "Ongelezen berichten", "unread_messages": "Ongelezen berichten",
"password": "Wachtwoord", "password": "Wachtwoord",
"verify_password": "Herhaal wachtwoord", "verify_password": "Herhaal wachtwoord",
@ -111,7 +116,7 @@
"subscribe_to_communities": "Abonneer je op een paar <1>communities</1>.", "subscribe_to_communities": "Abonneer je op een paar <1>communities</1>.",
"chat": "Praat", "chat": "Praat",
"recent_comments": "Recente reacties", "recent_comments": "Recente reacties",
"no_results": "Geen resultaten", "no_results": "Geen resultaten.",
"setup": "Installatie", "setup": "Installatie",
"lemmy_instance_setup": "Installatie van Lemmy-instantie", "lemmy_instance_setup": "Installatie van Lemmy-instantie",
"setup_admin": "Maak een administrator", "setup_admin": "Maak een administrator",
@ -121,12 +126,10 @@
"show_nsfw": "Laat NSFW-inhoud zien", "show_nsfw": "Laat NSFW-inhoud zien",
"sponsors": "Sponsoren", "sponsors": "Sponsoren",
"sponsors_of_lemmy": "Sponsoren van Lemmy", "sponsors_of_lemmy": "Sponsoren van Lemmy",
"sponsor_message": "sponsor_message": "Lemmy is vrije, <1>open-source</1> software, dus zonder reclame, winstoogmerk en durfkapitaal, punt. Jouw donaties gaan direct naar de full-time-ontwikkeling van het project. Met veel dank aan de volgende mensen:",
"Lemmy is vrije, <1>open-source</1> software, dus zonder reclame, winstoogmerk en durfkapitaal, punt. Jouw donaties gaan direct naar de full-time-ontwikkeling van het project. Met veel dank aan de volgende mensen:",
"support_on_patreon": "Ondersteun op Patreon", "support_on_patreon": "Ondersteun op Patreon",
"support_on_liberapay": "Ondersteun op Liberapay", "support_on_liberapay": "Ondersteun op Liberapay",
"general_sponsors": "general_sponsors": "Algemene sponsors zijn sponsors die tussen de $10 en $39 hebben gegeven aan Lemmy.",
"Algemene sponsors zijn sponsors die tussen de $10 en $39 hebben gegeven aan Lemmy.",
"crypto": "Cryptovaluta", "crypto": "Cryptovaluta",
"bitcoin": "Bitcoin", "bitcoin": "Bitcoin",
"ethereum": "Ethereum", "ethereum": "Ethereum",
@ -141,11 +144,10 @@
"yes": "ja", "yes": "ja",
"no": "nee", "no": "nee",
"powered_by": "Mogelijk gemaakt door", "powered_by": "Mogelijk gemaakt door",
"landing_0": "landing_0": "Lemmy is een <1>linkverzameler</1> / reddit-alternatief, bedoeld om in de <2>fediverse</2> te werken.<3></3>Lemmy kan door om het even wie gehost worden, heeft live-bijgewerkte reacties en is superklein (<4>ca. 80 kB</4>). Federatie in hte ActivityPub-netwerk is gepland. <5></5>Dit is een <6>erg vroege bèta-versie</6>, en een hoop functies zijn stuk of afwezig. <7></7>Stel nieuwe functies voor of meldt fouten <8>hier</8>.<9></9>Gemaakt met <10>Rust</10>, <11>Actix</11>, <12>Inferno</12> en <13>Typescript</13>.",
"Lemmy is een <1>linkverzameler</1> / reddit-alternatief, bedoeld om in de <2>fediverse</2> te werken.<3></3>Lemmy kan door om het even wie gehost worden, heeft live-bijgewerkte reacties en is superklein (<4>ca. 80 kB</4>). Federatie in hte ActivityPub-netwerk is gepland. <5></5>Dit is een <6>erg vroege bèta-versie</6>, en een hoop functies zijn stuk of afwezig. <7></7>Stel nieuwe functies voor of meldt fouten <8>hier</8>.<9></9>Gemaakt met <10>Rust</10>, <11>Actix</11>, <12>Inferno</12> en <13>Typescript</13>.",
"not_logged_in": "Niet ingelogd.", "not_logged_in": "Niet ingelogd.",
"community_ban": "Je bent verbannen uit deze community.", "community_ban": "Je bent verbannen uit deze community.",
"site_ban": "Je bent verbannen van deze site.", "site_ban": "Je bent verbannen van deze site",
"couldnt_create_comment": "Kon reactie niet maken.", "couldnt_create_comment": "Kon reactie niet maken.",
"couldnt_like_comment": "Kon reactie niet leuk vinden.", "couldnt_like_comment": "Kon reactie niet leuk vinden.",
"couldnt_update_comment": "Kon reactie niet bijwerken.", "couldnt_update_comment": "Kon reactie niet bijwerken.",
@ -162,22 +164,20 @@
"couldnt_create_post": "Kon post niet maken.", "couldnt_create_post": "Kon post niet maken.",
"couldnt_like_post": "Kon post niet leuk vinden.", "couldnt_like_post": "Kon post niet leuk vinden.",
"couldnt_find_post": "Kon post niet vinden.", "couldnt_find_post": "Kon post niet vinden.",
"couldnt_get_posts": "Kon posts niet ophalen.", "couldnt_get_posts": "Kon posts niet ophalen",
"couldnt_update_post": "Kon post niet bijwerken.", "couldnt_update_post": "Kon post niet bijwerken",
"couldnt_save_post": "Kon post niet opslaan.", "couldnt_save_post": "Kon post niet opslaan.",
"no_slurs": "Geen beledigingen.", "no_slurs": "Geen beledigingen.",
"not_an_admin": "Niet een beheerder.", "not_an_admin": "Niet een beheerder.",
"site_already_exists": "Site bestaat al.", "site_already_exists": "Site bestaat al.",
"couldnt_update_site": "Kon site niet bijwerken.", "couldnt_update_site": "Kon site niet bijwerken.",
"couldnt_find_that_username_or_email": "couldnt_find_that_username_or_email": "Kon gebruikersnaam of e-mailadres niet vinden.",
"Kon gebruikersnaam of e-mailadres niet vinden.",
"password_incorrect": "Wachtwoord incorrect.", "password_incorrect": "Wachtwoord incorrect.",
"passwords_dont_match": "Wachtwoorden zijn niet gelijk.", "passwords_dont_match": "Wachtwoorden zijn niet gelijk.",
"admin_already_created": "Sorry, er is al een beheerder.", "admin_already_created": "Sorry, er is al een beheerder.",
"user_already_exists": "Gebruiker bestaat al.", "user_already_exists": "Gebruiker bestaat al.",
"couldnt_update_user": "Kon gebruiker niet bijwerken.", "couldnt_update_user": "Kon gebruiker niet bijwerken.",
"system_err_login": "system_err_login": "Systeemfout. Probeer uit te loggen en weer in te loggen.",
"Systeemfout. Probeer uit te loggen en weer in te loggen.",
"preview": "voorbeeld", "preview": "voorbeeld",
"upload_image": "Afbeelding uploaden", "upload_image": "Afbeelding uploaden",
"avatar": "Avatar", "avatar": "Avatar",
@ -193,16 +193,17 @@
"delete_account_confirm": "Waarschuwing: dit zal al uw data voorgoed verwijderen, vul uw wachtwoord in om te bevestigen.", "delete_account_confirm": "Waarschuwing: dit zal al uw data voorgoed verwijderen, vul uw wachtwoord in om te bevestigen.",
"banned": "verbannen", "banned": "verbannen",
"creator": "auteur", "creator": "auteur",
"number_online": "{{count}} gebruikers online", "number_online": "{{count}} gebruiker online",
"number_online_plural": "{{count}} gebruikers online",
"docs": "Documentatie", "docs": "Documentatie",
"replies": "Reacties", "replies": "Reacties",
"mentions": "vermeldingen", "mentions": "vermeldingen",
"old_password": "Oud wachtwoord", "old_password": "Oud wachtwoord",
"forgot_password": "wachtwoord vergeten", "forgot_password": "wachtwoord vergeten",
"reset_password_mail_sent": "Stuur een email om uw wachtwoord te resetten", "reset_password_mail_sent": "Stuurde een email om uw wachtwoord te resetten.",
"password_change": "Wachtwoord aanpassen", "password_change": "Wachtwoord aanpassen",
"new_password": "Nieuw wachtwoord", "new_password": "Nieuw wachtwoord",
"no_email_setup": "Deze server heeft email niet correct opgezet", "no_email_setup": "Deze server heeft email niet correct opgezet.",
"send_notifications_to_email": "Stuur meldingen naar je email", "send_notifications_to_email": "Stuur meldingen naar je email",
"language": "Taal", "language": "Taal",
"browser_default": "Browser standaard", "browser_default": "Browser standaard",
@ -220,13 +221,35 @@
"message_sent": "Bericht verstuurd", "message_sent": "Bericht verstuurd",
"messages": "Berichten", "messages": "Berichten",
"matrix_user_id": "Matrix gebruikers-id", "matrix_user_id": "Matrix gebruikers-id",
"private_message_disclaimer": "Waarschuwing: Privé berichten in Lemmy zijn niet beveiligd. Maak een account aan op <1>Riot.im</1> om veilig te communiceren", "private_message_disclaimer": "Waarschuwing: Privé berichten in Lemmy zijn niet beveiligd. Maak een account aan op <1>Riot.im</1> om veilig te communiceren.",
"donate_to_lemmy": "Doneer aan Lemmy", "donate_to_lemmy": "Doneer aan Lemmy",
"donate": "Doneer", "donate": "Doneer",
"from": "van", "from": "van",
"logged_in": "Ingelogd", "logged_in": "Ingelogd.",
"email_already_exists": "Email bestaat al", "email_already_exists": "Email bestaat al.",
"couldnt_create_private_message": "Kan beveiligd bericht niet maken", "couldnt_create_private_message": "Kan beveiligd bericht niet maken.",
"no_private_message_edit_allowed": "Niet toegestaan om privé berichten te wijzigen", "no_private_message_edit_allowed": "Niet toegestaan om privé berichten te wijzigen.",
"couldnt_update_private_message": "Kan beveiligd bericht niet bijwerken" "couldnt_update_private_message": "Kan beveiligd bericht niet bijwerken.",
"cross_posted_to": "gecross-post naar: ",
"more": "meer",
"site_config": "Configuratie van de website",
"sorting_help": "hulp bij sorteren",
"show_context": "Toon context",
"support_on_open_collective": "Ondersteun op OpenCollective",
"site_saved": "Pagina opgeslaan.",
"emoji_picker": "Emojikiezer",
"upvote": "Upvote",
"number_of_upvotes": "{{count}} upvote",
"number_of_upvotes_plural": "{{count}} upvotes",
"downvote": "Downvote",
"number_of_downvotes": "{{count}} downvote",
"number_of_downvotes_plural": "{{count}} downvotes",
"couldnt_get_comments": "Kon reacties niet ophalen.",
"time": "Tijd",
"action": "Actie",
"block_leaving": "Weet je zeker dat je weg wilt gaan?",
"silver_sponsors": "Zilveren sponsors zijn sponsors die $40 hebben gegeven aan Lemmy.",
"post_title_too_long": "Posttitel te lang.",
"admin_settings": "Beheerderinstellingen",
"banned_users": "Verbannen gebruikers"
} }

View file

@ -65,14 +65,14 @@
"remove_as_admin": "wycofaj uprawnienia administratora", "remove_as_admin": "wycofaj uprawnienia administratora",
"appoint_as_admin": "przyznaj uprawnienia administratora", "appoint_as_admin": "przyznaj uprawnienia administratora",
"remove": "usuń", "remove": "usuń",
"removed": "usunięte", "removed": "usunięte przez moderatora",
"locked": "zablokowane", "locked": "zablokowane",
"stickied": "przyklejone", "stickied": "przyklejone",
"reason": "Powód", "reason": "Powód",
"mark_as_read": "zaznacz jako przeczytane", "mark_as_read": "zaznacz jako przeczytane",
"mark_as_unread": "zaznacz jako nieprzeczytane", "mark_as_unread": "zaznacz jako nieprzeczytane",
"delete": "usuń", "delete": "usuń",
"deleted": "usunięte", "deleted": "usunięte przez autora",
"delete_account": "Usuń Konto", "delete_account": "Usuń Konto",
"delete_account_confirm": "Ostrzeżenie: twoje dane zostaną bezpowrotnie usunięte. Wpisz swoje hasło aby potwierdzić.", "delete_account_confirm": "Ostrzeżenie: twoje dane zostaną bezpowrotnie usunięte. Wpisz swoje hasło aby potwierdzić.",
"restore": "przywróć", "restore": "przywróć",
@ -189,7 +189,7 @@
"theme": "Motyw", "theme": "Motyw",
"sponsors": "Sponsorzy", "sponsors": "Sponsorzy",
"sponsors_of_lemmy": "Sponsorzy projektu Lemmy", "sponsors_of_lemmy": "Sponsorzy projektu Lemmy",
"sponsor_message": "Lemmy jest wolnym, <1>otwartoźródłowym</1> oprogramowaniem, co oznacza zero reklam, opłat, czy innych form kapitalizacji, od zawsze na zawsze. Twoje darowizny idą bezpośrednio na rozwój projektu w pełno-etatowym wymiarze. Specjalne wyrazy podziękowania dla następujących osób:", "sponsor_message": "Lemmy jest wolnym, <1>otwartoźródłowym</1> oprogramowaniem, bez reklam, opłat, czy innych form kapitalizacji, od zawsze na zawsze. Twoje darowizny idą bezpośrednio na rozwój projektu w pełno-etatowym wymiarze. Specjalne wyrazy podziękowania dla następujących osób:",
"support_on_patreon": "Wspieraj w serwisie Patreon", "support_on_patreon": "Wspieraj w serwisie Patreon",
"support_on_liberapay": "Wspieraj na Liberapay", "support_on_liberapay": "Wspieraj na Liberapay",
"donate_to_lemmy": "Przekaż datek na Lemmiego", "donate_to_lemmy": "Przekaż datek na Lemmiego",
@ -209,7 +209,7 @@
"are_you_sure": "na pewno?", "are_you_sure": "na pewno?",
"no": "nie", "no": "nie",
"powered_by": "Powered by", "powered_by": "Powered by",
"landing": "Lemmy jest <1>agregatorem linków</1> / alternatywą dla reddita. Jest przeznaczony do działania w ramach cyfrowej przestrzeni nazywanej <2>fediverse<2>. <3></3>Opiera się na samodzielnym hostingu, posiada aktualizowane na żywo wątki z komentarzami, i zajmuje bardzo mało miejsce (<4>~80kB</4>). Federacja w ramach sieci ActivityPub jest w planach. <5></5>Ta wersja jest <6>bardzo wczesną wersją beta</6>, co oznacza, że wiele funkcji nadal nie działa tak jak powinny. <7></7><8>Pod tym adresem</8> można sugerować nową funkcjonalność i zgłaszać błędy.<9></9>Stworzono z wykorzystaniem <10>Rust</10>, <11>Actix</11>, <12>Inferno</12>, <13>Typescript</13>.", "landing_0": "Lemmy jest <1>agregatorem linków</1> / alternatywą dla reddita. Jest przeznaczony do działania w ramach cyfrowej przestrzeni nazywanej <2>fediverse</2>. <3></3>Opiera się na samodzielnym hostingu, posiada aktualizowane na żywo wątki z komentarzami, i zajmuje bardzo mało miejsce (<4>~80kB</4>). Federacja w ramach sieci ActivityPub jest w planach. <5></5>Ta wersja jest <6>bardzo wczesną wersją beta</6>, co oznacza, że wiele funkcji nadal nie działa tak jak powinny. <7></7><8>Pod tym adresem</8> można sugerować nową funkcjonalność i zgłaszać błędy.<9></9>Stworzono z wykorzystaniem <10>Rust</10>, <11>Actix</11>, <12>Inferno</12>, <13>Typescript</13>.",
"not_logged_in": "Nie jesteś zalogowana/y.", "not_logged_in": "Nie jesteś zalogowana/y.",
"logged_in": "Zalogowano.", "logged_in": "Zalogowano.",
"community_ban": "Zostałaś/eś zbanowana/y z tej społeczności.", "community_ban": "Zostałaś/eś zbanowana/y z tej społeczności.",
@ -253,5 +253,14 @@
"time": "Czas", "time": "Czas",
"action": "Akcja", "action": "Akcja",
"block_leaving": "Czy na pewno chcesz wyjść?", "block_leaving": "Czy na pewno chcesz wyjść?",
"show_context": "Pokaż kontekst" "show_context": "Pokaż kontekst",
"site_config": "Ustawienia Witryny",
"banned_users": "Zbanowani Użytkownicy",
"support_on_open_collective": "Wspieraj na OpenCollective",
"site_saved": "Witryna Zapisana.",
"admin_settings": "Ustawienia Administratora",
"emoji_picker": "Wybór Emoji",
"silver_sponsors": "Srebrni Sponsorzy to ci, którzy wpłacili co najmniej $40 na Lemmiego.",
"select_a_community": "Wybierz społeczność",
"invalid_username": "Nieprawidłowa nazwa użytkownika."
} }

View file

@ -58,9 +58,15 @@
"create": "создать", "create": "создать",
"username": "Имя пользователя", "username": "Имя пользователя",
"email_or_username": "Электронная почта или имя пользователя", "email_or_username": "Электронная почта или имя пользователя",
"number_of_users": "{{count}} пользователей", "number_of_users_0": "{{count}} пользователь",
"number_of_subscribers": "{{count}} подписчиков", "number_of_users_1": "{{count}} пользователя",
"number_of_points": "{{count}} баллов", "number_of_users_2": "{{count}} пользователей",
"number_of_subscribers_0": "{{count}} подписчик",
"number_of_subscribers_1": "{{count}} подписчика",
"number_of_subscribers_2": "{{count}} подписчиков",
"number_of_points_0": "{{count}} балл",
"number_of_points_1": "{{count}} балла",
"number_of_points_2": "{{count}} баллов",
"name": "Имя", "name": "Имя",
"title": "Название", "title": "Название",
"category": "Категория", "category": "Категория",
@ -170,7 +176,7 @@
"avatar": "Аватар", "avatar": "Аватар",
"show_avatars": "Показать Аватары", "show_avatars": "Показать Аватары",
"formatting_help": "Помощь в верстке текста", "formatting_help": "Помощь в верстке текста",
"sticky": "", "sticky": "приклеить",
"stickied": "закрепленный пост", "stickied": "закрепленный пост",
"delete_account": "Удалить аккаунт", "delete_account": "Удалить аккаунт",
"delete_account_confirm": "Предупреждение: это действие полностью уничтожит все данные вашего аккаунта. Введите свой пароль для подтверждения.", "delete_account_confirm": "Предупреждение: это действие полностью уничтожит все данные вашего аккаунта. Введите свой пароль для подтверждения.",
@ -214,5 +220,32 @@
"number_of_communities_2": "{{count}} сообществ", "number_of_communities_2": "{{count}} сообществ",
"creator": "автор", "creator": "автор",
"old": "Старое", "old": "Старое",
"to": "в" "to": "в",
"admin_settings": "Настройки админа",
"banned_users": "Забаненные Пользователи",
"support_on_open_collective": "Поддержка на OpenCollective",
"site_saved": "Сайт Сохранен.",
"enable_nsfw": "Включить NSFW",
"donate": "Пожертвование",
"unsticky": "отклеить",
"site_config": "Конфигурация сайта",
"banned": "забаненный",
"password_change": "Смена пароля",
"no_email_setup": "Этот сервер неправильно настроил электронную почту.",
"matrix_user_id": "Матрица пользователя",
"are_you_sure": "вы уверены?",
"archive_link": "архивировать ссылку",
"logged_in": "Войти в систему.",
"couldnt_get_comments": "Не удалось получить комментарии.",
"from": "от",
"transfer_site": "трансфер сайт",
"show_context": "Показать контекст",
"email_already_exists": "E-mail уже существует.",
"couldnt_create_private_message": "Не удалось создать личное сообщение.",
"no_private_message_edit_allowed": "Не разрешается редактировать личное сообщение.",
"couldnt_update_private_message": "Не удалось обновить личное сообщение.",
"block_leaving": "Вы уверены, что хотите покинуть?",
"number_online_0": "{{count}} Пользователь онлайн",
"number_online_1": "{{count}} Пользователя онлайн",
"number_online_2": "{{count}} Пользователей онлайн"
} }

1
ui/translations/tr.json vendored Normal file
View file

@ -0,0 +1 @@
{}

1
ui/translations/uk.json vendored Normal file
View file

@ -0,0 +1 @@
{}

View file

@ -1,5 +1,5 @@
{ {
"post": "", "post": "帖",
"remove_post": "移除帖子", "remove_post": "移除帖子",
"no_posts": "没有帖子。", "no_posts": "没有帖子。",
"create_a_post": "创建新帖子", "create_a_post": "创建新帖子",
@ -100,9 +100,9 @@
"url": "网址", "url": "网址",
"body": "内容", "body": "内容",
"copy_suggested_title": "复制建议的标题: {{title}}", "copy_suggested_title": "复制建议的标题: {{title}}",
"community": "节点", "community": "社群",
"expand_here": "展开", "expand_here": "展开",
"subscribe_to_communities": "订阅一些 <1>节点</1>.", "subscribe_to_communities": "订阅一些 <1>社群</1>.",
"chat": "聊天", "chat": "聊天",
"no_results": "没有结果.", "no_results": "没有结果.",
"setup": "设置", "setup": "设置",
@ -122,23 +122,23 @@
"code": "代码", "code": "代码",
"joined": "已加入", "joined": "已加入",
"powered_by": "保留所有权利", "powered_by": "保留所有权利",
"landing_0": "Lemmy is a <1>link aggregator</1> / reddit alternative, intended to work in the <2>fediverse</2>.<3></3>It's self-hostable, has live-updating comment threads, and is tiny (<4>~80kB</4>). Federation into the ActivityPub network is on the roadmap. <5></5>This is a <6>very early beta version</6>, and a lot of features are currently broken or missing. <7></7>Suggest new features or report bugs <8>here.</8><9></9>Made with <10>Rust</10>, <11>Actix</11>, <12>Inferno</12>, <13>Typescript</13>.", "landing": "Lemmy是一个 <1>链接聚合器</1> / reddit的替代选择为在<2>fediverse</2>上使用而设计。<3></3>它支持自托管, 提供实时更新的讨论串, 并且十分轻量 (<4>约80kB</4>)。对ActivityPub网络的联邦整合已经在规划之中。<5></5>这是一个<6>非常早期的beta版本</6>,许多功能还不能使用或还未开发完成。 <7></7>请到 <8>这里</8>提出新功能或报告bug。<9></9>由<10>Rust</10>、 <11>Actix</11>、<12>Inferno</12>、<13>Typescript</13>写成。",
"not_logged_in": "未登录.", "not_logged_in": "未登录.",
"community_ban": "你已被此社群拉黑。", "community_ban": "你已被此社群拉黑。",
"site_ban": "你已被本站拉黑", "site_ban": "你已被本站拉黑",
"couldnt_create_comment": "不能创建评论.", "couldnt_create_comment": "无法创建评论。",
"couldnt_like_comment": "无法点赞评论。", "couldnt_like_comment": "无法点赞评论。",
"couldnt_update_comment": "不能更新评论.", "couldnt_update_comment": "无法更新评论。",
"couldnt_save_comment": "不能保存评论.", "couldnt_save_comment": "无法保存评论。",
"no_comment_edit_allowed": "没有编辑评论的权限。", "no_comment_edit_allowed": "没有编辑评论的权限。",
"no_post_edit_allowed": "没有编辑帖子的权限。", "no_post_edit_allowed": "没有编辑帖子的权限。",
"no_community_edit_allowed": "没有编辑节点的权限。", "no_community_edit_allowed": "没有编辑社群的权限。",
"couldnt_find_community": "无法找到节点。", "couldnt_find_community": "无法找到社群。",
"couldnt_update_community": "无法更新节点。", "couldnt_update_community": "无法更新社群。",
"community_already_exists": "节点已存在。", "community_already_exists": "社群已存在。",
"community_moderator_already_exists": "节点监管人已存在。", "community_moderator_already_exists": "社群监管人已存在。",
"community_follower_already_exists": "节点追随者已存在。", "community_follower_already_exists": "社群关注者已存在。",
"community_user_already_banned": "节点用户已禁止。", "community_user_already_banned": "社群用户已被禁止。",
"couldnt_create_post": "无法创建帖子。", "couldnt_create_post": "无法创建帖子。",
"couldnt_like_post": "无法点赞帖子。", "couldnt_like_post": "无法点赞帖子。",
"couldnt_find_post": "无法找到帖子。", "couldnt_find_post": "无法找到帖子。",
@ -156,14 +156,14 @@
"user_already_exists": "用户已存在。", "user_already_exists": "用户已存在。",
"couldnt_update_user": "无法更新用户。", "couldnt_update_user": "无法更新用户。",
"system_err_login": "系统错误。请尝试注销后重新登入。", "system_err_login": "系统错误。请尝试注销后重新登入。",
"nsfw": "少儿不宜", "nsfw": "工作场所不宜",
"show_nsfw": "显示少儿不宜内容", "show_nsfw": "显示工作场所不宜内容",
"theme": "主题", "theme": "主题",
"from": "来自", "from": "",
"donate_to_lemmy": "向Lemmy捐赠", "donate_to_lemmy": "向Lemmy捐赠",
"donate": "捐赠", "donate": "捐赠",
"monero": "门罗币", "monero": "门罗币",
"to": "", "to": "发布到",
"are_you_sure": "你确定吗?", "are_you_sure": "你确定吗?",
"yes": "是", "yes": "是",
"no": "否", "no": "否",
@ -175,7 +175,7 @@
"more": "更多", "more": "更多",
"preview": "预览", "preview": "预览",
"upload_image": "上传图片", "upload_image": "上传图片",
"enable_nsfw": "允许少儿不宜内容", "enable_nsfw": "允许工作场所不宜内容",
"show_avatars": "显示头像", "show_avatars": "显示头像",
"avatar": "头像", "avatar": "头像",
"formatting_help": "格式帮助", "formatting_help": "格式帮助",
@ -213,7 +213,7 @@
"private_message_disclaimer": "警告Lemmy的私信功能并不安全。想要进行安全的信息传递请在 <1>Riot.im</1>上创建账号。", "private_message_disclaimer": "警告Lemmy的私信功能并不安全。想要进行安全的信息传递请在 <1>Riot.im</1>上创建账号。",
"send_notifications_to_email": "向邮箱发送通知", "send_notifications_to_email": "向邮箱发送通知",
"language": "语言", "language": "语言",
"browser_default": "默认浏览器", "browser_default": "浏览器默认语言",
"downvotes_disabled": "点踩功能已禁用", "downvotes_disabled": "点踩功能已禁用",
"enable_downvotes": "启用点踩功能", "enable_downvotes": "启用点踩功能",
"upvote": "点赞", "upvote": "点赞",
@ -223,8 +223,8 @@
"open_registration": "开放注册", "open_registration": "开放注册",
"registration_closed": "注册功能已关闭", "registration_closed": "注册功能已关闭",
"recent_comments": "最新评论", "recent_comments": "最新评论",
"by": "来自", "by": "",
"transfer_community": "节点转让", "transfer_community": "转让社群",
"transfer_site": "站点转让", "transfer_site": "站点转让",
"post_title_too_long": "帖子标题过长。", "post_title_too_long": "帖子标题过长。",
"couldnt_get_comments": "无法获取评论。", "couldnt_get_comments": "无法获取评论。",