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

15
README.md vendored
View file

@ -34,7 +34,7 @@
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).
@ -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.
*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?
@ -125,16 +125,19 @@ Lemmy is free, open-source software, meaning no advertising, monetizing, or vent
- [Docker Development](https://dev.lemmy.ml/docs/contributing_docker_development.html)
- [Local Development](https://dev.lemmy.ml/docs/contributing_local_development.html)
### Translations
### Translations
If you want to help with translating, take a look at [Weblate](https://weblate.yerbamate.dev/projects/lemmy/).
## 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)
- [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)
- [Mastodon](https://mastodon.social/@LemmyDev)
- [Matrix](https://riot.im/app/#/room/#rust-reddit-fediverse:matrix.org)
## Code Mirrors
- [GitHub](https://github.com/LemmyNet/lemmy)
- [Gitea](https://yerbamate.dev/dessalines/lemmy)
- [Gitea](https://yerbamate.dev/LemmyNet/lemmy)
- [GitLab](https://gitlab.com/dessalines/lemmy)
## Credits

2
ansible/VERSION vendored
View file

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

View file

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

View file

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

View file

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

4
docker/lemmy.hjson vendored
View file

@ -23,9 +23,6 @@
jwt_secret: "changeme"
# The dir for the front end
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_limit: {
# maximum number of messages created in interval
@ -60,6 +57,7 @@
# smtp_password: ""
# # address to send emails from, eg "info@your-instance.com"
# smtp_from_address: ""
# use_tls: true
# }
}

View file

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

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.
![](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/lemmy.hjson
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
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:
```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:
```bash
git remote add federation https://yerbamate.dev/LemmyNet/lemmy.git
git remote add federation https://github.com/LemmyNet/lemmy
git checkout federation
git pull federation federation
```

View file

@ -1,6 +1,6 @@
# 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 -->

73
install.sh vendored
View file

@ -1,4 +1,4 @@
#!/bin/bash
#!/bin/sh
set -e
# 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 HOSTNAME=rrr
yes_no_prompt_invalid() {
echo "Invalid input. Please enter either \"y\" or \"n\"." 1>&2
}
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
case "$init_db" in
[yY]* ) init_db_valid=1; init_db_final=1;;
[nN]* ) init_db_valid=1; init_db_final=0;;
* ) yes_no_prompt_invalid;;
esac
echo
done
if [ "$init_db_final" = 1 ]
then
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..."
echo
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
init_db_valid=0
init_db_final=0
while [ "$init_db_valid" == 0 ]
do
read -p "Initialize database (y/n)? " init_db
case "${init_db,,}" in
y|yes ) init_db_valid=1; init_db_final=1;;
n|no ) init_db_valid=1; init_db_final=0;;
* ) echo "Invalid input" 1>&2;;
esac
echo
done
if [ "$init_db_final" = 1 ]
then
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..."
echo
fi
ask_to_init_db
# Build the web client
cd ui
@ -39,6 +69,5 @@ yarn build
cd ../server
RUST_LOG=debug cargo run
# For live coding, where both the front and back end, automagically reload on any save, do:
# cd ui && yarn start
# cd server && cargo watch -x run
# For live coding, where both the front and back end, automagically reload on any save
ask_to_auto_reload

8
server/Cargo.toml vendored
View file

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

115
server/db-init.sh vendored
View file

@ -1,43 +1,106 @@
#!/bin/bash
#!/bin/sh
# Default configurations
username=lemmy
dbname=lemmy
port=5432
password=""
password_confirm=""
password_valid=0
yes_no_prompt_invalid() {
echo "Invalid input. Please enter either \"y\" or \"n\"." 1>&2
}
while [ "$password_valid" == 0 ]
do
read -p "Enter database password: " -s password
print_config() {
echo " database name: $dbname"
echo " username: $username"
echo " port: $port"
}
ask_for_db_config() {
echo "The default database configuration is:"
print_config
echo
read -p "Verify database password: " -s password_confirm
echo
echo
# Start the loop from the top if either check fails
if [ -z "$password" ]
then
echo "Error: Password cannot be empty." 1>&2
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
continue
fi
if [ "$password" != "$password_confirm" ]
done
if [ "$default_config_final" == 0 ]
then
echo "Error: Passwords don't match." 1>&2
echo
continue
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
}
# Set the password_valid variable to break out of the loop
password_valid=1
done
ask_for_password() {
password=""
password_confirm=""
password_valid=0
while [ "$password_valid" == 0 ]
do
read -p "Enter database password: " -s password
echo
read -p "Verify database password: " -s password_confirm
echo
echo
# Start the loop from the top if either check fails
if [ -z "$password" ]
then
echo "Error: Password cannot be empty." 1>&2
echo
continue
fi
if [ "$password" != "$password_confirm" ]
then
echo "Error: Passwords don't match." 1>&2
echo
continue
fi
# Set the password_valid variable to break out of the loop
password_valid=1
done
}
ask_for_db_config
ask_for_password
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
echo $LEMMY_DATABASE_URL
echo "The database URL is $LEMMY_DATABASE_URL"

View file

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

View file

@ -85,6 +85,20 @@ pub fn is_email_regex(test: &str) -> bool {
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 {
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> {
is_image_content_type(image_url)?;
let fetch_url = format!(
"http://pictshare/api/geturl.php?url={}",
utf8_percent_encode(image_url, NON_ALPHANUMERIC)
@ -195,36 +211,46 @@ fn fetch_iframely_and_pictshare_data(
Option<String>,
Option<String>,
) {
// Fetch iframely data
let (iframely_title, iframely_description, iframely_thumbnail_url, iframely_html) = match url {
Some(url) => match fetch_iframely(&url) {
Ok(res) => (res.title, res.description, res.thumbnail_url, res.html),
Err(e) => {
error!("iframely err: {}", e);
(None, None, None, None)
}
},
match &url {
Some(url) => {
// Fetch iframely data
let (iframely_title, iframely_description, iframely_thumbnail_url, iframely_html) =
match fetch_iframely(url) {
Ok(res) => (res.title, res.description, res.thumbnail_url, res.html),
Err(e) => {
error!("iframely err: {}", e);
(None, None, None, None)
}
};
// Fetch pictshare thumbnail
let pictshare_thumbnail = match iframely_thumbnail_url {
Some(iframely_thumbnail_url) => match fetch_pictshare(&iframely_thumbnail_url) {
Ok(res) => Some(res.url),
Err(e) => {
error!("pictshare err: {}", e);
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
}
},
};
(
iframely_title,
iframely_description,
iframely_html,
pictshare_thumbnail,
)
}
None => (None, None, None, None),
};
// Fetch pictshare thumbnail
let pictshare_thumbnail = match iframely_thumbnail_url {
Some(iframely_thumbnail_url) => match fetch_pictshare(&iframely_thumbnail_url) {
Ok(res) => Some(res.url),
Err(e) => {
error!("pictshare err: {}", e);
None
}
},
None => None,
};
(
iframely_title,
iframely_description,
iframely_html,
pictshare_thumbnail,
)
}
}
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()
}
pub fn is_valid_username(name: &str) -> bool {
VALID_USERNAME_REGEX.is_match(name)
}
#[cfg(test)]
mod tests {
use crate::{
is_email_regex,
is_image_content_type,
is_valid_username,
remove_slurs,
scrape_text_for_mentions,
slur_check,
@ -288,12 +320,30 @@ mod tests {
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]
fn test_email() {
assert!(is_email_regex("gush@gmail.com"));
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]
fn test_slur_filter() {
let test =
@ -351,4 +401,5 @@ lazy_static! {
// 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._:-]+)").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;
#[macro_use]
extern crate diesel_migrations;
#[macro_use]
pub extern crate lazy_static;
use crate::lemmy_server::actix_web::dev::Service;
use actix::prelude::*;
use actix_web::*;
use actix_web::{
body::Body,
dev::{ServiceRequest, ServiceResponse},
http::{
header::{CACHE_CONTROL, CONTENT_TYPE},
HeaderValue,
},
*,
};
use diesel::{
r2d2::{ConnectionManager, Pool},
PgConnection,
};
use failure::Error;
use lemmy_server::{
db::code_migrations::run_advanced_migrations,
rate_limit::{rate_limiter::RateLimiter, RateLimit},
@ -16,13 +26,22 @@ use lemmy_server::{
settings::Settings,
websocket::server::*,
};
use std::sync::Arc;
use regex::Regex;
use std::{io, sync::Arc};
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!();
#[actix_rt::main]
async fn main() -> Result<(), Error> {
async fn main() -> io::Result<()> {
env_logger::init();
let settings = Settings::get();
@ -52,33 +71,52 @@ async fn main() -> Result<(), Error> {
);
// Create Http server with websocket support
Ok(
HttpServer::new(move || {
let settings = Settings::get();
let rate_limiter = rate_limiter.clone();
App::new()
.wrap(middleware::Logger::default())
.data(pool.clone())
.data(server.clone())
// The routes
.configure(move |cfg| api::config(cfg, &rate_limiter))
.configure(federation::config)
.configure(feeds::config)
.configure(index::config)
.configure(nodeinfo::config)
.configure(webfinger::config)
// static files
.service(actix_files::Files::new(
"/static",
settings.front_end_dir.to_owned(),
))
.service(actix_files::Files::new(
"/docs",
settings.front_end_dir + "/documentation",
))
})
.bind((settings.bind, settings.port))?
.run()
.await?,
)
HttpServer::new(move || {
let settings = Settings::get();
let rate_limiter = rate_limiter.clone();
App::new()
.wrap_fn(add_cache_headers)
.wrap(middleware::Logger::default())
.data(pool.clone())
.data(server.clone())
// The routes
.configure(move |cfg| api::config(cfg, &rate_limiter))
.configure(federation::config)
.configure(feeds::config)
.configure(index::config)
.configure(nodeinfo::config)
.configure(webfinger::config)
// static files
.service(actix_files::Files::new(
"/static",
settings.front_end_dir.to_owned(),
))
.service(actix_files::Files::new(
"/docs",
settings.front_end_dir + "/documentation",
))
})
.bind((settings.bind, settings.port))?
.run()
.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(())
})
.wait(ctx);
.spawn(ctx);
}
ws::Message::Binary(_bin) => info!("Unexpected binary"),
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 {
max-height: 50vh;
overflow: hidden;
}
.new-comments:hover {
overflow-x: hidden;
overflow-y: auto;
}

View file

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

View file

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

View file

@ -288,9 +288,11 @@ export class Main extends Component<any, MainState> {
</ul>
)}
<ul class="my-2 list-inline">
{/*
<li className="list-inline-item badge badge-secondary">
{i18n.t('number_online', { count: this.state.siteRes.online })}
</li>
*/}
<li className="list-inline-item badge badge-secondary">
{i18n.t('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}
onInput={linkEvent(this, this.handlePostCommunityChange)}
>
<option>{i18n.t('select_a_community')}</option>
{this.state.communities.map(community => (
<option value={community.id}>
{community.local
@ -362,7 +363,11 @@ export class PostForm extends Component<PostFormProps, PostFormState> {
)}
<div class="form-group row">
<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 ? (
<svg class="icon icon-spinner spin">
<use xlinkHref="#icon-spinner"></use>
@ -568,7 +573,7 @@ export class PostForm extends Component<PostFormProps, PostFormState> {
).id;
this.state.postForm.community_id = foundCommunityId;
} else {
this.state.postForm.community_id = data.communities[0].id;
// By default, the null valued 'Select a Community'
}
this.setState(this.state);
@ -578,6 +583,7 @@ export class PostForm extends Component<PostFormProps, PostFormState> {
let selector = new Selectr(selectId, { nativeDropdown: false });
selector.on('selectr.select', option => {
this.state.postForm.community_id = Number(option.value);
this.setState(this.state);
});
}
} else if (res.op == UserOperation.CreatePost) {

View file

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

View file

@ -40,7 +40,6 @@ import {
setupTippy,
} from '../utils';
import { PostListing } from './post-listing';
import { PostListings } from './post-listings';
import { Sidebar } from './sidebar';
import { CommentForm } from './comment-form';
import { CommentNodes } from './comment-nodes';
@ -183,14 +182,6 @@ export class Post extends Component<any, PostState> {
moderators={this.state.moderators}
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" />
<CommentForm
postId={this.state.post.id}
@ -466,6 +457,9 @@ export class Post extends Component<any, PostState> {
this.state.crossPosts = data.posts.filter(
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);
} else if (res.op == UserOperation.TransferSite) {
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>
{this.state.showDisclaimer && (
<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">
<T i18nKey="private_message_disclaimer">
#
@ -211,7 +185,7 @@ export class PrivateMessageForm extends Component<
</div>
)}
<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">
{this.state.loading ? (
<svg class="icon icon-spinner spin">
@ -242,6 +216,31 @@ export class PrivateMessageForm extends Component<
{i18n.t('cancel')}
</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>
</form>

View file

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

View file

@ -4,14 +4,25 @@ import { i18n } from '../i18next';
import { T } from 'inferno-i18next';
import { repoUrl } from '../utils';
interface SilverUser {
name: string;
link: string;
}
let general = [
'alexx henry',
'Nathan J. Goode',
'Ernest Wiśniewski',
'HN',
'Forrest Weghorst',
'Andre Vallestero',
'NotTooHighToHack',
];
let highlighted = ['Oskenso Kashi', 'Alex Benishek'];
// let silver = [];
let silver: Array<SilverUser> = [
{
name: 'Redjoker',
link: 'https://iww.org',
},
];
// let gold = [];
// let latinum = [];
@ -70,6 +81,18 @@ export class Sponsors extends Component<any, any> {
return (
<div class="container">
<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>
<div class="row card-columns">
{highlighted.map(s => (

View file

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

18
ui/src/i18next.ts vendored
View file

@ -1,6 +1,8 @@
import i18next from 'i18next';
import { getLanguage } from './utils';
import { en } from './translations/en';
import { el } from './translations/el';
import { eu } from './translations/eu';
import { eo } from './translations/eo';
import { es } from './translations/es';
import { de } from './translations/de';
@ -13,14 +15,25 @@ import { it } from './translations/it';
import { fi } from './translations/fi';
import { ca } from './translations/ca';
import { fa } from './translations/fa';
import { hi } from './translations/hi';
import { pl } from './translations/pl';
import { pt_BR } from './translations/pt_BR';
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
const resources = {
en,
el,
eu,
eo,
es,
ka,
hi,
de,
zh,
fr,
@ -31,8 +44,13 @@ const resources = {
fi,
ca,
fa,
pl,
pt_BR,
ja,
gl,
tr,
hu,
uk,
};
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/el';
import 'moment/locale/eu';
import 'moment/locale/eo';
import 'moment/locale/de';
import 'moment/locale/zh-cn';
@ -10,9 +12,15 @@ import 'moment/locale/it';
import 'moment/locale/fi';
import 'moment/locale/ca';
import 'moment/locale/fa';
import 'moment/locale/pl';
import 'moment/locale/pt-br';
import 'moment/locale/ja';
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 {
UserOperation,
@ -58,17 +66,25 @@ export const mentionDropdownFetchLimit = 10;
export const languages = [
{ code: 'ca', name: 'Català' },
{ code: 'en', name: 'English' },
{ code: 'el', name: 'Ελληνικά' },
{ code: 'eu', name: 'Euskara' },
{ code: 'eo', name: 'Esperanto' },
{ code: 'es', name: 'Español' },
{ code: 'de', name: 'Deutsch' },
{ code: 'gl', name: 'Galego' },
{ code: 'hu', name: 'Magyar Nyelv' },
{ code: 'ka', name: 'ქართული ენა' },
{ code: 'hi', name: 'मानक हिन्दी' },
{ code: 'fa', name: 'فارسی' },
{ code: 'ja', name: '日本語' },
{ code: 'pl', name: 'Polski' },
{ code: 'pt_BR', name: 'Português Brasileiro' },
{ code: 'zh', name: '中文' },
{ code: 'fi', name: 'Suomi' },
{ code: 'fr', name: 'Français' },
{ code: 'sv', name: 'Svenska' },
{ code: 'tr', name: 'Türkçe' },
{ code: 'uk', name: 'українська мова' },
{ code: 'ru', name: 'Русский' },
{ code: 'nl', name: 'Nederlands' },
{ code: 'it', name: 'Italiano' },
@ -208,7 +224,7 @@ export function isMod(modIds: Array<number>, creator_id: number): boolean {
}
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))`);
@ -360,12 +376,28 @@ export function getMomentLanguage(): string {
lang = 'ca';
} else if (lang.startsWith('fa')) {
lang = 'fa';
} else if (lang.startsWith('pl')) {
lang = 'pl';
} else if (lang.startsWith('pt')) {
lang = 'pt-br';
} else if (lang.startsWith('ja')) {
lang = 'ja';
} else if (lang.startsWith('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 {
lang = 'en';
}
@ -382,17 +414,22 @@ export function setTheme(theme: string = 'darkly') {
}
// 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 link = document.createElement('link');
link.id = theme;
link.id = id;
link.rel = 'stylesheet';
link.type = 'text/css';
link.href = `/static/assets/css/themes/${theme}.min.css`;
link.href = loc;
link.media = 'all';
head.appendChild(link);
}
document.getElementById(theme).removeAttribute('disabled');
}
export function objectFlip(obj: any) {
@ -406,7 +443,7 @@ export function objectFlip(obj: any) {
export function pictshareAvatarThumbnail(src: string): string {
// sample url: http://localhost:8535/pictshare/gs7xuu.jpg
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;
}
@ -431,7 +468,9 @@ export function pictshareImage(
hash = split[1];
}
let out = `${root}/${thumbnail ? '192/' : ''}${hash}`;
let out = `${root}/${canUseWebP() ? 'webp/' : ''}${
thumbnail ? '192/' : ''
}${hash}`;
return out;
}
@ -462,6 +501,7 @@ export function messageToastify(
text: `${body}<br />${creator}`,
avatar: avatar,
backgroundColor: backgroundColor,
className: 'text-body',
close: true,
gravity: 'top',
position: 'right',
@ -864,3 +904,21 @@ export function hostname(url: string): string {
? `${cUrl.hostname}:${cUrl.port}`
: `${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": "إنشاء منشور",
"posts": "منشورات",
"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": "يمكن لهذه المنشورات أن تكون ذات صلة",
"communities": "المجتمعات",
"users": "المستخدِمون",
@ -50,9 +55,24 @@
"ban_from_site": "طرده مِن الموقع",
"banned": "مطرود",
"save": "حفظ",
"number_of_users": "{{count}} مستخدِمين",
"number_of_points": "{{count}} نقاط",
"number_online": "{{count}} مستخدمين متّصلين",
"number_of_users_0": "بلا مستخدمين",
"number_of_users_1": "مستخدم واحد",
"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": "الإسم",
"title": "العنوان",
"category": "الفئة",
@ -114,7 +134,12 @@
"delete_account": "حذف الحساب",
"create": "إنشاء",
"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": "إلغاء الإشتراك",
"week": "أسبوع",
"reply_sent": "تم إرسال الرد",
@ -127,7 +152,12 @@
"are_you_sure": "هل أنت متأكّد؟",
"logged_in": "إنّك متّصل.",
"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": "مُتابِعون",
"url": "الرابط",
"nsfw": "محتوى حساس",
@ -145,7 +175,12 @@
"support_on_patreon": "ساندنا على Patreon",
"support_on_liberapay": "ساندنا عبر Liberapay",
"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_post": "منشور نُشِر تبادليا",
"cross_posted_to": "نشر تبادلي إلى: ",
@ -176,5 +211,13 @@
"lemmy_instance_setup": "تنصيب مثيل خادم Lemmy",
"show_nsfw": "إظهار المحتوى الحساس",
"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",
"no_posts": "Keine Beiträge.",
"create_a_post": "Einen Beitrag anlegen",
@ -14,16 +14,16 @@
"number_of_comments": "{{count}} Kommentar",
"number_of_comments_plural": "{{count}} Kommentare",
"remove_comment": "Kommentar löschen",
"communities": "Communities",
"communities": "Communitys",
"users": "Benutzer",
"create_a_community": "Eine Gemeinschaft anlegen",
"create_community": "Gemeinschaft anlegen",
"remove_community": "Gemeinschaft entfernen",
"subscribed_to_communities": "Abonnierte <1>communities</1>",
"trending_communities": "Trending <1>communities</1>",
"list_of_communities": "Liste von communities",
"create_a_community": "Eine Community anlegen",
"create_community": "Community erstellen",
"remove_community": "Community entfernen",
"subscribed_to_communities": "Abonnierte <1>Communitys</1>",
"trending_communities": "Populäre <1>Communitys</1>",
"list_of_communities": "Liste von Communitys",
"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.",
"edit": "editieren",
"reply": "antworten",
@ -44,7 +44,7 @@
"settings": "Einstellungen",
"remove_as_mod": "Als Moderator entfernen",
"appoint_as_mod": "Zum Moderator ernennen",
"modlog": "Modlog",
"modlog": "Moderations-Log",
"admin": "Administrator",
"admins": "Administratoren",
"remove_as_admin": "Als Administrator entfernen",
@ -73,27 +73,27 @@
"username": "Benutzername",
"email_or_username": "E-mail oder Username",
"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_plural": "{{count}} Abonnenten",
"number_of_subscribers_plural": "{{count}} Abonnent*innen",
"number_of_points": "{{count}} Punkt",
"number_of_points_plural": "{{count}} Punkte",
"number_online": "{{count}} Benutzer online",
"number_online_plural": "{{count}} Benutzer online",
"number_online_plural": "{{count}} Benutzer*innen online",
"name": "Name",
"title": "Titel",
"category": "Kategorie",
"subscribers": "Abonnenten",
"subscribers": "Abonnent*innen",
"both": "Beide",
"saved": "Gespeichert",
"unsubscribe": "Abbestellen",
"unsubscribe": "Deabonnieren",
"subscribe": "Abonnieren",
"subscribed": "Abonniert",
"prev": "Zurück",
"next": "Weiter",
"sidebar": "Seitenleiste",
"sort_type": "Sortieren nach",
"hot": "Hot",
"hot": "Heiß",
"new": "Neu",
"top_day": "Top täglich",
"week": "Woche",
@ -115,14 +115,14 @@
"view": "Ansicht",
"logout": "Ausloggen",
"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",
"password": "Passwort",
"verify_password": "Passwort überprüfen",
"forgot_password": "Passwort vergessen",
"reset_password_mail_sent": "Eine E-Mail wurde geschickt, um dein Passwort zurückzusetzen.",
"password_change": "Passwort geändert",
"new_password": "neues Passwort",
"reset_password_mail_sent": "Eine E-Mail wurde geschickt, um Ihr Passwort zurückzusetzen.",
"password_change": "Passwort ändern",
"new_password": "Neues Passwort",
"no_email_setup": "Dieser Server hat E-Mails nicht korrekt eingerichtet.",
"login": "Einloggen",
"sign_up": "Registrieren",
@ -134,15 +134,15 @@
"url": "URL",
"body": "Text",
"copy_suggested_title": "Vorgeschlagenen Titel übernehmen: {{title}}",
"community": "Gemeinschaft",
"community": "Community",
"expand_here": "hier erweitern",
"subscribe_to_communities": "Abonniere ein paar <1>communities</1>.",
"subscribe_to_communities": "Abonniere einige <1>Communitys</1>.",
"chat": "Chat",
"recent_comments": "Neueste Kommentare",
"no_results": "Keine Ergebnisse.",
"setup": "Einrichten",
"lemmy_instance_setup": "Lemmy Instanz Einrichten",
"setup_admin": "Seiten Administrator konfigurieren",
"lemmy_instance_setup": "Lemmy-Instanz einrichten",
"setup_admin": "Seiten-Administrator konfigurieren",
"your_site": "deine Seite",
"modified": "verändert",
"nsfw": "NSFW",
@ -161,8 +161,8 @@
"code": "Code",
"joined": "beigetreten",
"by": "von",
"to": "bis",
"transfer_community": "Gemeinschaft übertragen",
"to": "in",
"transfer_community": "Community übertragen",
"transfer_site": "Transferseite",
"are_you_sure": "Bist du sicher?",
"yes": "Ja",
@ -170,7 +170,7 @@
"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>.",
"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",
"couldnt_create_comment": "Konnte Kommentar nicht anlegen.",
"couldnt_like_comment": "Konnte nicht liken.",
@ -178,18 +178,18 @@
"couldnt_save_comment": "Konnte Kommentar nicht speichern.",
"no_comment_edit_allowed": "Keine Erlaubnis Kommentar zu editieren.",
"no_post_edit_allowed": "Keine Erlaubnis Beitrag zu editieren.",
"no_community_edit_allowed": "Keine Erlaubnis Gemeinschaft zu editieren.",
"couldnt_find_community": "Konnte Gemeinschaft nicht finden.",
"couldnt_update_community": "Konnte Gemeinschaft nicht aktualisieren.",
"community_already_exists": "Gemeinschaft existiert bereits.",
"community_moderator_already_exists": "Gemeinschaft Moderator existiert bereits.",
"community_follower_already_exists": "Gemeinschaft Follower existiert bereits.",
"community_user_already_banned": "Gemeinschaft Nutzer schon gebannt.",
"no_community_edit_allowed": "Keine Erlaubnis, die Community zu editieren.",
"couldnt_find_community": "Konnte Community nicht finden.",
"couldnt_update_community": "Konnte die Community nicht aktualisieren.",
"community_already_exists": "Die Community existiert bereits.",
"community_moderator_already_exists": "Community-Moderator*in existiert bereits.",
"community_follower_already_exists": "Community-Abonennt*in existiert bereits.",
"community_user_already_banned": "Der*die Community-Benutzer*in ist schon gebannt.",
"couldnt_create_post": "Konnte Beitrag nicht anlegen.",
"couldnt_like_post": "Konnte Beitrag nicht liken.",
"couldnt_find_post": "Konnte Beitrag nicht finden.",
"couldnt_get_posts": "Konnte Beiträge nicht holen.",
"couldnt_update_post": "Konnte Beitrag nicht aktualisieren.",
"couldnt_get_posts": "Konnte Beiträge nicht holen",
"couldnt_update_post": "Konnte Beitrag nicht aktualisieren",
"couldnt_save_post": "Konnte Beitrag nicht speichern.",
"no_slurs": "Keine Beleidigungen.",
"not_an_admin": "Kein Administrator.",
@ -200,9 +200,9 @@
"passwords_dont_match": "Passwörter stimmen nicht überein.",
"admin_already_created": "Entschuldigung, es gibt schon einen Administrator.",
"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.",
"cross_posted_to": "Crossposted auf: ",
"cross_posted_to": "Crossgeposted auf: ",
"create_private_message": "Privatnachricht erstellen",
"send_secure_message": "Sichere Nachricht absenden",
"send_message": "Nachricht absenden",
@ -223,10 +223,10 @@
"open_registration": "Registrierung öffnen",
"registration_closed": "Registrierung geschlossen",
"enable_nsfw": "NSFW Erlauben",
"donate_to_lemmy": "Lemmy spenden",
"donate_to_lemmy": "An Lemmy spenden",
"donate": "Spenden",
"from": "von",
"logged_in": "Eingeloggt",
"logged_in": "Eingeloggt.",
"couldnt_get_comments": "Konnte Kommentare nicht laden.",
"post_title_too_long": "Posttitel zu lang.",
"email_already_exists": "Email existiert bereits.",
@ -235,5 +235,21 @@
"couldnt_update_private_message": "Konnte Privatnachricht nicht aktualisieren.",
"time": "Zeit",
"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",
"users": "Users",
"create_a_community": "Create a community",
"select_a_community": "Select a community",
"create_community": "Create Community",
"remove_community": "Remove Community",
"subscribed_to_communities": "Subscribed to <1>communities</1>",
@ -63,14 +64,14 @@
"remove_as_admin": "remove as admin",
"appoint_as_admin": "appoint as admin",
"remove": "remove",
"removed": "removed",
"removed": "removed by mod",
"locked": "locked",
"stickied": "stickied",
"reason": "Reason",
"mark_as_read": "mark as read",
"mark_as_unread": "mark as unread",
"delete": "delete",
"deleted": "deleted",
"deleted": "deleted by creator",
"delete_account": "Delete Account",
"delete_account_confirm":
"Warning: this will permanently delete all your data. Enter your password to confirm.",
@ -187,7 +188,7 @@
"sponsors": "Sponsors",
"sponsors_of_lemmy": "Sponsors of Lemmy",
"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_liberapay": "Support on Liberapay",
"support_on_open_collective": "Support on OpenCollective",
@ -195,6 +196,8 @@
"donate": "Donate",
"general_sponsors":
"General Sponsors are those that pledged $10 to $39 to Lemmy.",
"silver_sponsors":
"Silver Sponsors are those that pledged $40 to Lemmy.",
"crypto": "Crypto",
"bitcoin": "Bitcoin",
"ethereum": "Ethereum",
@ -246,6 +249,7 @@
"Couldn't find that username or email.",
"password_incorrect": "Password incorrect.",
"passwords_dont_match": "Passwords do not match.",
"invalid_username": "Invalid username.",
"admin_already_created": "Sorry, there's already an admin.",
"user_already_exists": "User already exists.",
"email_already_exists": "Email already exists.",

View file

@ -175,7 +175,7 @@
"donate_to_lemmy": "Donar a Lemmy",
"donate": "Donar",
"general_sponsors": "Los Patrocinadores Generales son aquellos que señaron entre $10 y $39 a Lemmy.",
"crypto": "Crypto",
"crypto": "Cripto",
"bitcoin": "Bitcoin",
"ethereum": "Ethereum",
"monero": "Monero",
@ -233,7 +233,7 @@
"time": "Tiempo",
"action": "Acción",
"more": "más",
"cross_posted_to": "publicado también en:",
"cross_posted_to": "publicado también en: ",
"sorting_help": "ayuda del orden",
"upvote": "Voto Positivo",
"number_of_upvotes": "{{count}} Voto Positivo",
@ -244,5 +244,12 @@
"couldnt_get_comments": "No se pudo obtener los comentarios.",
"post_title_too_long": "El título de la publicación es muy largo.",
"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,28 +1,30 @@
{
"post": "viesti",
"remove_post": "Poista viesti",
"no_posts": "Ei viestjä.",
"no_posts": "Ei viestejä.",
"create_a_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",
"related_posts": "Nämä viestit voivat liittyä toisiinsa",
"cross_posts": "Tämä linkki on jaettu:",
"cross_post": "jaa ristiin",
"comments": "Kommentit",
"number_of_comments": "{{count}} kommenttia",
"number_of_comments": "{{count}} kommentti",
"number_of_comments_plural": "{{count}} kommenttia",
"remove_comment": "Poista kommentti",
"communities": "Yhteisöt",
"users": "Käyttäjät",
"create_a_community": "Luo yhteisö",
"create_community": "Luo yhteisö",
"remove_community": "Poista yhteisö",
"subscribed_to_communities": "Tilatut <1>yhteisöt</1>",
"subscribed_to_communities": "Tilatut <1>yhteisöt</1>",
"trending_communities": "Nousevat <1>yhteisöt</1>",
"list_of_communities": "Lista yhteisöistä",
"number_of_communities": "{{count}} yhteisöä",
"community_reqs":
"pienillä kirjaimilla, alleviivauksella, eikä välilyöntejä.",
"number_of_communities": "{{count}} yhteisö",
"number_of_communities_plural": "{{count}} yhteisöä",
"community_reqs": "pienillä kirjaimilla, alleviivauksella, eikä välilyöntejä.",
"create_private_message": "Luo yksityisviesti",
"send_secure_message": "Lähetä suojattu viesti",
"send_message": "Lähetä viesti",
@ -50,7 +52,7 @@
"remove_as_mod": "Poista moderaattorina",
"appoint_as_mod": "Nimitä moderaattoriksi",
"modlog": "Moderoinnin loki",
"admin": "Ylläpitäjä",
"admin": "ylläpitäjä",
"admins": "ylläpitäjät",
"remove_as_admin": "poista ylläpitäjänä",
"appoint_as_admin": "nimitä ylläpitäjäksi",
@ -62,10 +64,9 @@
"mark_as_read": "merkitse luetuksi",
"mark_as_unread": "merkitse lukemattomaksi",
"delete": "poista",
"deleted": "deleted",
"deleted": "poistettu",
"delete_account": "Poista tili",
"delete_account_confirm":
"Varoitus: tämä poistaa pysyvästi kaiken datasi. Anna salasanasi varmistukseksi.",
"delete_account_confirm": "Varoitus: tämä poistaa pysyvästi kaiken datasi. Anna salasanasi varmistukseksi.",
"restore": "palauta",
"ban": "porttikielto",
"ban_from_site": "aseta porttikielto sivulle",
@ -78,12 +79,16 @@
"creator": "luoja",
"username": "Käyttäjänimi",
"email_or_username": "Sähköposti tai käyttäjätunnus",
"number_of_users": "{{count}} käyttäjää",
"number_of_subscribers": "{{count}} tilaajaa",
"number_of_points": "{{count}} pistettä",
"number_online": "{{count}} käyttäjää aktiivisena",
"number_of_users": "{{count}} käyttäjä",
"number_of_users_plural": "{{count}} käyttäjää",
"number_of_subscribers": "{{count}} tilaaja",
"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",
"title": "Kuvaus",
"title": "Otsikko",
"category": "Luokka",
"subscribers": "Tilaajat",
"both": "Molemmat",
@ -121,8 +126,7 @@
"login_sign_up": "Kirjaudu sisään / Rekisteröidy",
"login": "Kirjaudu sisään",
"sign_up": "Rekisteröidy",
"notifications_error":
"Työpöydän ilmoitukset eivät ole saatavilla selaimellesi. Yritä Firefoxia tai Chromea.",
"notifications_error": "Työpöydän ilmoitukset eivät ole saatavilla selaimellesi. Yritä Firefoxia tai Chromea.",
"unread_messages": "Lukemattomat viestit",
"messages": "Viestit",
"password": "Salasana",
@ -134,9 +138,8 @@
"new_password": "Uusi salasana",
"no_email_setup": "Tämä palvelin ei ole asettanut sähköpostia oikein.",
"email": "Sähköposti",
"matrix_user_id": " Matrix-käyttäjä",
"private_message_disclaimer":
"Varoitus: Yksityisviestit Lemmyssä eivät ole turvallisia. Luo tili <1>Riot.im</1> -palveluun turvallista viestintää varten.",
"matrix_user_id": "Matrix-käyttäjä",
"private_message_disclaimer": "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",
"optional": "Valinnainen",
"expires": "Umpeutuu",
@ -148,7 +151,7 @@
"registration_closed": "Rekisteröityminen suljettu",
"enable_nsfw": "Salli NSFW",
"url": "URL",
"body": "Body",
"body": "Sisältö",
"copy_suggested_title": "kopioi ehdotettu otsikko: {{title}}",
"community": "Yhteisö",
"expand_here": "Laajenna tässä",
@ -166,14 +169,12 @@
"theme": "Teema",
"sponsors": "Sponsorit",
"sponsors_of_lemmy": "Lemmy-sponsorit",
"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:",
"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:",
"support_on_patreon": "Tue Patreonissa",
"donate_to_lemmy": "Lahjoita Lemmylle",
"donate": "Lahjoita",
"general_sponsors":
"Yleisiä sponsoreja ovat he, jotka lupaavat 10-39 dollaria Lemmylle.",
"crypto": "Crypto",
"general_sponsors": "Yleisiä sponsoreja ovat he, jotka lupaavat 10-39 dollaria Lemmylle.",
"crypto": "Krypto",
"bitcoin": "Bitcoin",
"ethereum": "Ethereum",
"monero": "Monero",
@ -188,8 +189,7 @@
"yes": "kyllä",
"no": "ei",
"powered_by": "Vauhdittajana",
"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>.",
"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>.",
"not_logged_in": "Ei kirjautunut sisään.",
"logged_in": "Kirjautunut sisää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_update_comment": "Kommenttia ei voitu päivittää.",
"couldnt_save_comment": "Kommenttia ei voitu tallentaa.",
"no_comment_edit_allowed": "Et ole sallittu muokkaamaan kommenttia.",
"no_post_edit_allowed": "Et ole sallittu muokkaamaan viestiä.",
"no_community_edit_allowed": "Et ole sallittu muokkaamaan yhteisöä.",
"no_comment_edit_allowed": "Sinulla ei ole oikeutta muokata kommenttia.",
"no_post_edit_allowed": "Sinulla ei ole oikeutta muokata viestiä.",
"no_community_edit_allowed": "Sinulla ei ole oikeutta muokata yhteisöä.",
"couldnt_find_community": "Yhteisöä ei voitu löytää.",
"couldnt_update_community": "Yhteisöä ei voitu päivittää.",
"community_already_exists": "Yhteisö on jo olemassa.",
@ -217,18 +217,39 @@
"not_an_admin": "Ei ole ylläpitäjä.",
"site_already_exists": "Sivusto on jo olemassa.",
"couldnt_update_site": "Sivustoa ei voitu päivittää.",
"couldnt_find_that_username_or_email":
"Käyttäjänimeä tai sähköpostia ei onnistuttu löytämään.",
"couldnt_find_that_username_or_email": "Käyttäjänimeä tai sähköpostia ei onnistuttu löytämään.",
"password_incorrect": "Salasana on väärin.",
"passwords_dont_match": "Salasanat eivät täsmää.",
"admin_already_created": "Anteeksi, mutta täällä on jo ylläpitäjä.",
"user_already_exists": "Käyttäjä on jo olemassa.",
"email_already_exists": "Sähköposti on jo olemassa.",
"couldnt_update_user": "Käyttäjää ei voitu päivittää.",
"system_err_login":
"Järjestelmävirhe. Yritä kirjautua ulos ja kirjautua uudestaan sisään.",
"system_err_login": "Järjestelmävirhe. Yritä kirjautua ulos ja kirjautua uudestaan sisään.",
"couldnt_create_private_message": "Yksityisviestiä ei voitu luoda.",
"no_private_message_edit_allowed":
"Et ole sallittu muokkaamaan yksityisviestiä.",
"couldnt_update_private_message": "Yksityisviestiä ei voitu päivittää."
"no_private_message_edit_allowed": "Sinulla ei ole oikeutta muokata yksityisviestiä.",
"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",
"remove_post": "Supprimer la publication",
"no_posts": "Pas de publications.",
"no_posts": "Aucune publication.",
"create_a_post": "Créer une publication",
"create_post": "Créer la publication",
"number_of_posts": "{{count}} Publications",
"create_post": "Créer une publication",
"number_of_posts": "{{count}} Publication",
"number_of_posts_plural": "{{count}} Publications",
"posts": "Publications",
"related_posts": "Ces sujets peuvent être corrélés",
"cross_posts": "Ce sujet a également été posté sur :",
"related_posts": "Publications similaires",
"cross_posts": "Ce lien a également été publié sur :",
"cross_post": "publication croisée",
"cross_posted_to": "publication croisée à : ",
"comments": "Commentaires",
"number_of_comments": "{{count}} Commentaires",
"number_of_comments": "{{count}} Commentaire",
"number_of_comments_plural": "{{count}} Commentaires",
"remove_comment": "Supprimer le commentaire",
"communities": "Communautés",
"users": "Utilisateurs",
"create_a_community": "Créer une communauté",
"create_community": "Créer la communauté",
"create_community": "Créer une communauté",
"remove_community": "Supprimer la Communauté",
"subscribed_to_communities": "Abonné à ces <1>communautés</1>",
"trending_communities": "<1>Communautés</1> appréciées",
"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.",
"create_private_message": "Créer un message privé",
"send_secure_message": "Envoyer le message sécurisé",
@ -75,12 +78,16 @@
"unsave": "retirer",
"create": "créer",
"creator": "createur",
"username": "Nom d'utilisateur",
"email_or_username": "Email ou Nom d'utilisateur",
"number_of_users": "{{count}} Utilisateurs",
"number_of_subscribers": "{{count}} Abonnés",
"number_of_points": "{{count}} Points",
"number_online": "{{count}} Utilisateurs en ligne",
"username": "Nom dutilisateur·rice",
"email_or_username": "Email ou nom dutilisateur·rice",
"number_of_users": "{{count}} Utilisateur",
"number_of_users_plural": "{{count}} Utilisateurs",
"number_of_subscribers": "{{count}} Abonné",
"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",
"title": "Titre",
"category": "Catégorie",
@ -88,7 +95,7 @@
"both": "Les deux",
"saved": "Sauvegardé",
"unsubscribe": "Se désabonner",
"subscribe": "S'abonner",
"subscribe": "Sabonner",
"subscribed": "Abonnés",
"prev": "Précédent",
"next": "Suivant",
@ -118,9 +125,9 @@
"overview": "Général",
"view": "Voir",
"logout": "Se déconnecter",
"login_sign_up": "Se connecter / S'inscrire",
"login_sign_up": "Se connecter / Sinscrire",
"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.",
"unread_messages": "Messages non-lu",
"messages": "Messages",
@ -131,7 +138,7 @@
"reset_password_mail_sent": "Un email a été envoyé pour réinitialiser votre mot de passe.",
"password_change": "Changement de 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",
"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.",
@ -142,24 +149,24 @@
"browser_default": "Défaut pour le navigateur",
"downvotes_disabled": "Votes négatifs désactivés",
"enable_downvotes": "Votes négatifs activés",
"open_registration": "Ouvrir la regestration",
"registration_closed": "Régestration fermée",
"open_registration": "Ouvrir les inscriptions",
"registration_closed": "Inscriptions fermées",
"enable_nsfw": "Activer NSFW",
"url": "URL",
"body": "Texte",
"copy_suggested_title": "copier le titre suggéré : {{title}}",
"community": "Communauté",
"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",
"recent_comments": "Commentaires récents",
"no_results": "Pas de résultats.",
"setup": "Installation",
"lemmy_instance_setup": "Installation d'une instance Lemmy",
"lemmy_instance_setup": "Installation dune instance Lemmy",
"setup_admin": "Créer un administrateur",
"your_site": "votre site",
"modified": "modifié",
"nsfw": "Pas sûr pour le travail",
"nsfw": "Pas sûr pour le travail (NSFW)",
"show_nsfw": "Afficher le contenu NSFW",
"theme": "Thème",
"sponsors": "Sponsors",
@ -185,48 +192,64 @@
"yes": "oui",
"no": "non",
"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>.",
"not_logged_in": "Vous n'êtes pas connecté.",
"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é.",
"logged_in": "Vous êtes connecté.",
"community_ban": "Vous avez été banni de cette communauté.",
"site_ban": "Vous avez été banni du site",
"couldnt_create_comment": "Impossible de poster le commentaire.",
"couldnt_like_comment": "Impossible d'aimer le commentaire.",
"couldnt_create_comment": "Impossible de publier le commentaire.",
"couldnt_like_comment": "Impossible daimer le commentaire.",
"couldnt_update_comment": "Impossible de mettre à jour le commentaire.",
"couldnt_save_comment": "Impossible de sauvegarder le commentaire.",
"couldnt_get_comments": "Impossible de obtenir les commentaires.",
"no_comment_edit_allowed": "Vous n'êtes pas autorisé à éditer ce commentaire.",
"no_post_edit_allowed": "Vous n'êtes pas autorisé à éditer sujet.",
"no_community_edit_allowed": "Vous n'êtes pas autorisé à éditer cette communauté.",
"no_comment_edit_allowed": "Vous nêtes pas autorisé à éditer ce commentaire.",
"no_post_edit_allowed": "Vous nêtes pas autorisé à éditer la publication.",
"no_community_edit_allowed": "Vous nêtes pas autorisé à éditer 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_moderator_already_exists": "Ce membre est déjà modérateur.",
"community_follower_already_exists": "Ce membre est déjà abonné.",
"community_user_already_banned": "Ce membre est déjà banni.",
"couldnt_create_post": "Impossible de créer le sujet.",
"post_title_too_long": "Sujet titre trop long.",
"couldnt_like_post": "Impossible d'aimer le sujet.",
"couldnt_find_post": "Impossible de trouver le sujet.",
"couldnt_get_posts": "Impossible d'obtenir les sujets",
"couldnt_update_post": "Impossible de mettre à jour le sujet",
"couldnt_save_post": "Impossible de sauvegarder le sujet.",
"no_slurs": "Pas d'insultes.",
"couldnt_create_post": "Impossible de créer la publication.",
"post_title_too_long": "Le titre de la publication est trop long.",
"couldnt_like_post": "Impossible daimer la publication.",
"couldnt_find_post": "Impossible de trouver la publication.",
"couldnt_get_posts": "Impossible dobtenir les publications",
"couldnt_update_post": "Impossible de mettre à jour la publication",
"couldnt_save_post": "Impossible de sauvegarder la publication.",
"no_slurs": "Pas dinsultes.",
"not_an_admin": "Pas administrateur.",
"site_already_exists": "Le site existe déjà.",
"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.",
"passwords_dont_match": "Les mots de passes ne correspondent pas..",
"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à.",
"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.",
"couldnt_create_private_message": "Impossible de créer un message privé.",
"no_private_message_edit_allowed": "Pas autorisé à modifier un message privé.",
"couldnt_update_private_message": "Impossible de modifier un message privé.",
"time": "Temps",
"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",
"remove_post": "Rimuovi Post",
"no_posts": "Nessun Post.",
"create_a_post": "Crea un post",
"create_post": "Crea Post",
"number_of_posts": "{{count}} Posts",
"posts": "Posts",
"related_posts": "Questi post potrebbero essere correlati",
"cross_posts": "Questo link è stato postato anche in:",
"cross_post": "cross-post",
"post": "pubblica",
"remove_post": "Elimina la pubblicazione",
"no_posts": "Nessuna pubblicazione.",
"create_a_post": "Crea una pubblicazione",
"create_post": "Crea una pubblicazione",
"number_of_posts": "{{count}} Pubblicazione",
"number_of_posts_plural": "{{count}} Pubblicazioni",
"posts": "Pubblicazioni",
"related_posts": "Queste pubblicazioni potrebbero essere collegate",
"cross_posts": "Questo collegamento è stato postato anche in:",
"cross_post": "pubblica altrove",
"comments": "Commenti",
"number_of_comments": "{{count}} Commenti",
"remove_comment": "Rimuovi Commento",
"number_of_comments": "{{count}} Commento",
"number_of_comments_plural": "{{count}} Commenti",
"remove_comment": "Elimina Commento",
"communities": "Comunità",
"users": "Utenti",
"create_a_community": "Crea una Comunità",
"create_a_community": "Crea una comunità",
"create_community": "Crea Comunità",
"remove_community": "Rimuovi Comunità",
"subscribed_to_communities": "Iscritto alle <1>comunità</1>",
"remove_community": "Elimina Comunità",
"subscribed_to_communities": "Iscritt* alle <1>comunità</1>",
"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_plural": "{{count}} Comunità",
"community_reqs": "minuscole, trattini bassi e nessuno spazio.",
"edit": "modifica",
"reply": "rispondi",
@ -33,7 +36,7 @@
"lock": "blocca",
"sticky": "evidenzia",
"unsticky": "rimuovi evidenza",
"link": "link",
"link": "collegamento",
"mod": "moderatore",
"mods": "moderatori",
"moderates": "Moderatore di",
@ -49,7 +52,7 @@
"removed": "rimosso",
"locked": "bloccato",
"stickied": "evidenziato",
"reason": "Ragione",
"reason": "Motivo",
"mark_as_read": "segna come letto",
"mark_as_unread": "segna come non letto",
"delete": "cancella",
@ -57,21 +60,25 @@
"delete_account": "Cancella Account",
"delete_account_confirm": "Attenzione: stai per cancellare permanentemente tutti i tuoi dati. Inserisci la tua password per confermare questa azione.",
"restore": "ripristina",
"ban": "ban",
"ban_from_site": "banna dal sito",
"unban": "rimuovi ban",
"unban_from_site": "rimuove il ban dal sito",
"banned": "bannato",
"ban": "espulsione",
"ban_from_site": "espulsione dal sito",
"unban": "rimuovi espulsione",
"unban_from_site": "rimuove l'espulsione dal sito",
"banned": "espulso",
"save": "salva",
"unsave": "rimuovi",
"create": "crea",
"creator": "autore",
"username": "Username",
"email_or_username": "Email o Username",
"number_of_users": "{{count}} Utenti",
"number_of_subscribers": "{{count}} Iscritti",
"number_of_points": "{{count}} Punti",
"number_online": "{{count}} Utenti Online",
"username": "Nome Utente",
"email_or_username": "Email o Nome Utente",
"number_of_users": "{{count}} Utente",
"number_of_users_plural": "{{count}} Utenti",
"number_of_subscribers": "{{count}} Iscritto",
"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",
"title": "Titolo",
"category": "Categoria",
@ -105,11 +112,11 @@
"search": "Cerca",
"overview": "Panoramica",
"view": "Visualizza",
"logout": "Logout",
"login_sign_up": "Login / Iscriviti",
"login": "Login",
"logout": "Esci",
"login_sign_up": "Accedi / Iscriviti",
"login": "Accedi",
"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",
"password": "Password",
"verify_password": "Verifica Password",
@ -118,75 +125,75 @@
"expires": "Scade",
"url": "URL",
"body": "Contenuto",
"copy_suggested_title": "copia titolo suggerito: {{title}}",
"copy_suggested_title": "copia titolo consigliato: {{title}}",
"community": "Comunità",
"expand_here": "Visualizza qui",
"subscribe_to_communities": "Iscriviti ad una <1>comunità</1>.",
"chat": "Chat",
"recent_comments": "Commenti Recenti",
"no_results": "Nessun risultato.",
"setup": "Setup",
"lemmy_instance_setup": "Setup dell'istanza di Lemmy",
"setup": "Configura",
"lemmy_instance_setup": "Configurazione dell'istanza di Lemmy",
"setup_admin": "Imposta Amministratore del Sito",
"your_site": "il tuo sito",
"modified": "modificato",
"nsfw": "NSFW",
"show_nsfw": "Mostra contenuto NSFW",
"theme": "Tema",
"sponsors": "Sponsors",
"sponsors_of_lemmy": "Sponsors 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:",
"support_on_patreon": "Supporta su Patreon",
"support_on_liberapay": "Supporta su Liberapay",
"general_sponsors": "I \"General Sponsors\" sono quelli che hanno investito dai 10$ ai 39$ su Lemmy.",
"crypto": "Crypto",
"sponsors": "Sponsor",
"sponsors_of_lemmy": "Sponsor di Lemmy",
"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": "Sostieni su Patreon",
"support_on_liberapay": "Sostieni su Liberapay",
"general_sponsors": "Gli sponsor generali sono quelli che hanno investito dai 10$ ai 39$ su Lemmy.",
"crypto": "Criptomonete",
"bitcoin": "Bitcoin",
"ethereum": "Ethereum",
"monero": "Monero",
"code": "Code",
"code": "Codice",
"joined": "Iscritto da",
"by": "di",
"to": "su",
"transfer_community": "trasferisci comunità",
"transfer_site": "trasferisci sito",
"are_you_sure": "sei sicuro?",
"yes": "si",
"yes": "sì",
"no": "no",
"powered_by": "Powered by",
"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>.",
"powered_by": "Offerto da",
"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.",
"community_ban": "Sei stato bannato da questa comunità.",
"site_ban": "Sei stato bannato dal sito",
"community_ban": "Sei stato escluso da questa comunità.",
"site_ban": "Sei stato escluso dal sito",
"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_save_comment": "Impossibile salvare 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à.",
"couldnt_find_community": "Impossibile trovare la comunità.",
"couldnt_update_community": "Impossibile aggiornare la comunità.",
"community_already_exists": "La comunità esiste già.",
"community_moderator_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.",
"couldnt_create_post": "Impossibile creare il post.",
"couldnt_like_post": "Impossibile mettere 'Mi piace' post.",
"couldnt_find_post": "Impossibile trovare il post.",
"couldnt_get_posts": "Impossibile recuperare i post",
"couldnt_update_post": "Impossibile aggiornare il post",
"couldnt_save_post": "Impossibile salvare il post.",
"community_user_already_banned": "L'utente della comunità è già stato espulso.",
"couldnt_create_post": "Impossibile creare la pubblicazione.",
"couldnt_like_post": "Impossibile apprezzare la pubblicazione.",
"couldnt_find_post": "Impossibile trovare la pubblicazione.",
"couldnt_get_posts": "Impossibile recuperare le pubblicazioni",
"couldnt_update_post": "Impossibile aggiornare la pubblicazione",
"couldnt_save_post": "Impossibile salvare la pubblicazione.",
"no_slurs": "Niente offese.",
"not_an_admin": "Non un amministratore.",
"site_already_exists": "Il sito esiste già.",
"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.",
"passwords_dont_match": "Le password non corrispondono.",
"admin_already_created": "Spiacente, esiste già un amministratore.",
"user_already_exists": "L'utente esiste già.",
"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",
"message": "Messaggio",
"avatar": "Avatar",
@ -200,14 +207,49 @@
"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.",
"language": "Lingua",
"enable_downvotes": "Abilita Downvote",
"enable_downvotes": "Abilita voti negativi",
"enable_nsfw": "Abilita NSFW",
"donate_to_lemmy": "Dona a Lemmy",
"donate": "Dona",
"from": "da",
"archive_link": "link archivio",
"archive_link": "archivia collegamento",
"matrix_user_id": "Utente Matrix",
"downvotes_disabled": "Downvote disabilitati",
"post_title_too_long": "Titolo del post troppo lungo.",
"email_already_exists": "Indirizzo email già presente."
"downvotes_disabled": "Voti negativi disabilitati",
"post_title_too_long": "Titolo della pubblicazione troppo lungo.",
"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": "閲覧注意を有効化",
"url": "URL",
"body": "本文",
"copy_suggested_title": "タイトルの提案をコピーする: {{title}}",
"copy_suggested_title": "提案されたタイトルをコピーする: {{title}}",
"community": "コミュニティ",
"expand_here": "拡大表示",
"subscribe_to_communities": "<1>コミュニティ</1>をいくつか登録してみましょう。",
@ -233,5 +233,7 @@
"system_err_login": "システムエラーが発生しました。一度ログアウトして、再度ログインをお試しください。",
"couldnt_create_private_message": "プライベートメッセージが作成されない。",
"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": "პოსტის მოწონება ვერ მოხერხდა.",
"community_moderator_already_exists": "ამ თემის მოდერატორი უკვე არსებობს.",
"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.",
"create_a_post": "Plaats een post",
"create_post": "Plaats post",
"number_of_posts": "{{count}} posts",
"number_of_posts": "{{count}} post",
"number_of_posts_plural": "{{count}} posts",
"posts": "posts",
"related_posts": "Deze posts kunnen gerelateerd zijn",
"cross_posts": "Deze link is ook geplaatst in:",
"cross_post": "cross-post",
"comments": "Reacties",
"number_of_comments": "{{count}} reacties",
"number_of_comments": "{{count}} reactie",
"number_of_comments_plural": "{{count}} reacties",
"remove_comment": "Verwijder reactie",
"communities": "Communities",
"users": "Gebruikers",
@ -20,8 +22,9 @@
"subscribed_to_communities": "Geabonneerd op <1>communities</1>",
"trending_communities": "Populaire <1>communities</1>",
"list_of_communities": "Lijst van communities",
"number_of_communities": "{{count}} communities",
"community_reqs": "kleine letters, onderstrepingsteken en geen spaties",
"number_of_communities": "{{count}} community",
"number_of_communities_plural": "{{count}} community's",
"community_reqs": "kleine letters, onderstrepingsteken en geen spaties.",
"edit": "bewerk",
"reply": "reageer",
"cancel": "Annuleer",
@ -57,9 +60,12 @@
"create": "maak",
"username": "Gebruikersnaam",
"email_or_username": "E-mail of gebruikersnaam",
"number_of_users": "{{count}} gebruikers",
"number_of_subscribers": "{{count}} abonnees",
"number_of_points": "{{count}} punten",
"number_of_users": "{{count}} gebruiker",
"number_of_users_plural": "{{count}} gebruikers",
"number_of_subscribers": "{{count}} abonnee",
"number_of_subscribers_plural": "{{count}} abonnees",
"number_of_points": "{{count}} punt",
"number_of_points_plural": "{{count}} punten",
"name": "Naam",
"title": "Titel",
"category": "Categorie",
@ -95,8 +101,7 @@
"login_sign_up": "Log in / Aanmelden",
"login": "Log in",
"sign_up": "Aanmelden",
"notifications_error":
"Bureabladberichten niet beschikbaar in je browser. Probeer Firefox of Chrome.",
"notifications_error": "Bureabladberichten niet beschikbaar in je browser. Probeer Firefox of Chrome.",
"unread_messages": "Ongelezen berichten",
"password": "Wachtwoord",
"verify_password": "Herhaal wachtwoord",
@ -111,7 +116,7 @@
"subscribe_to_communities": "Abonneer je op een paar <1>communities</1>.",
"chat": "Praat",
"recent_comments": "Recente reacties",
"no_results": "Geen resultaten",
"no_results": "Geen resultaten.",
"setup": "Installatie",
"lemmy_instance_setup": "Installatie van Lemmy-instantie",
"setup_admin": "Maak een administrator",
@ -121,12 +126,10 @@
"show_nsfw": "Laat NSFW-inhoud zien",
"sponsors": "Sponsoren",
"sponsors_of_lemmy": "Sponsoren van Lemmy",
"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:",
"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:",
"support_on_patreon": "Ondersteun op Patreon",
"support_on_liberapay": "Ondersteun op Liberapay",
"general_sponsors":
"Algemene sponsors zijn sponsors die tussen de $10 en $39 hebben gegeven aan Lemmy.",
"general_sponsors": "Algemene sponsors zijn sponsors die tussen de $10 en $39 hebben gegeven aan Lemmy.",
"crypto": "Cryptovaluta",
"bitcoin": "Bitcoin",
"ethereum": "Ethereum",
@ -141,11 +144,10 @@
"yes": "ja",
"no": "nee",
"powered_by": "Mogelijk gemaakt door",
"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>.",
"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>.",
"not_logged_in": "Niet ingelogd.",
"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_like_comment": "Kon reactie niet leuk vinden.",
"couldnt_update_comment": "Kon reactie niet bijwerken.",
@ -162,22 +164,20 @@
"couldnt_create_post": "Kon post niet maken.",
"couldnt_like_post": "Kon post niet leuk vinden.",
"couldnt_find_post": "Kon post niet vinden.",
"couldnt_get_posts": "Kon posts niet ophalen.",
"couldnt_update_post": "Kon post niet bijwerken.",
"couldnt_get_posts": "Kon posts niet ophalen",
"couldnt_update_post": "Kon post niet bijwerken",
"couldnt_save_post": "Kon post niet opslaan.",
"no_slurs": "Geen beledigingen.",
"not_an_admin": "Niet een beheerder.",
"site_already_exists": "Site bestaat al.",
"couldnt_update_site": "Kon site niet bijwerken.",
"couldnt_find_that_username_or_email":
"Kon gebruikersnaam of e-mailadres niet vinden.",
"couldnt_find_that_username_or_email": "Kon gebruikersnaam of e-mailadres niet vinden.",
"password_incorrect": "Wachtwoord incorrect.",
"passwords_dont_match": "Wachtwoorden zijn niet gelijk.",
"admin_already_created": "Sorry, er is al een beheerder.",
"user_already_exists": "Gebruiker bestaat al.",
"couldnt_update_user": "Kon gebruiker niet bijwerken.",
"system_err_login":
"Systeemfout. Probeer uit te loggen en weer in te loggen.",
"system_err_login": "Systeemfout. Probeer uit te loggen en weer in te loggen.",
"preview": "voorbeeld",
"upload_image": "Afbeelding uploaden",
"avatar": "Avatar",
@ -193,16 +193,17 @@
"delete_account_confirm": "Waarschuwing: dit zal al uw data voorgoed verwijderen, vul uw wachtwoord in om te bevestigen.",
"banned": "verbannen",
"creator": "auteur",
"number_online": "{{count}} gebruikers online",
"number_online": "{{count}} gebruiker online",
"number_online_plural": "{{count}} gebruikers online",
"docs": "Documentatie",
"replies": "Reacties",
"mentions": "vermeldingen",
"old_password": "Oud wachtwoord",
"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",
"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",
"language": "Taal",
"browser_default": "Browser standaard",
@ -220,13 +221,35 @@
"message_sent": "Bericht verstuurd",
"messages": "Berichten",
"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": "Doneer",
"from": "van",
"logged_in": "Ingelogd",
"email_already_exists": "Email bestaat al",
"couldnt_create_private_message": "Kan beveiligd bericht niet maken",
"no_private_message_edit_allowed": "Niet toegestaan om privé berichten te wijzigen",
"couldnt_update_private_message": "Kan beveiligd bericht niet bijwerken"
"logged_in": "Ingelogd.",
"email_already_exists": "Email bestaat al.",
"couldnt_create_private_message": "Kan beveiligd bericht niet maken.",
"no_private_message_edit_allowed": "Niet toegestaan om privé berichten te wijzigen.",
"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",
"appoint_as_admin": "przyznaj uprawnienia administratora",
"remove": "usuń",
"removed": "usunięte",
"removed": "usunięte przez moderatora",
"locked": "zablokowane",
"stickied": "przyklejone",
"reason": "Powód",
"mark_as_read": "zaznacz jako przeczytane",
"mark_as_unread": "zaznacz jako nieprzeczytane",
"delete": "usuń",
"deleted": "usunięte",
"deleted": "usunięte przez autora",
"delete_account": "Usuń Konto",
"delete_account_confirm": "Ostrzeżenie: twoje dane zostaną bezpowrotnie usunięte. Wpisz swoje hasło aby potwierdzić.",
"restore": "przywróć",
@ -189,7 +189,7 @@
"theme": "Motyw",
"sponsors": "Sponsorzy",
"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_liberapay": "Wspieraj na Liberapay",
"donate_to_lemmy": "Przekaż datek na Lemmiego",
@ -209,7 +209,7 @@
"are_you_sure": "na pewno?",
"no": "nie",
"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.",
"logged_in": "Zalogowano.",
"community_ban": "Zostałaś/eś zbanowana/y z tej społeczności.",
@ -253,5 +253,14 @@
"time": "Czas",
"action": "Akcja",
"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": "создать",
"username": "Имя пользователя",
"email_or_username": "Электронная почта или имя пользователя",
"number_of_users": "{{count}} пользователей",
"number_of_subscribers": "{{count}} подписчиков",
"number_of_points": "{{count}} баллов",
"number_of_users_0": "{{count}} пользователь",
"number_of_users_1": "{{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": "Имя",
"title": "Название",
"category": "Категория",
@ -170,7 +176,7 @@
"avatar": "Аватар",
"show_avatars": "Показать Аватары",
"formatting_help": "Помощь в верстке текста",
"sticky": "",
"sticky": "приклеить",
"stickied": "закрепленный пост",
"delete_account": "Удалить аккаунт",
"delete_account_confirm": "Предупреждение: это действие полностью уничтожит все данные вашего аккаунта. Введите свой пароль для подтверждения.",
@ -214,5 +220,32 @@
"number_of_communities_2": "{{count}} сообществ",
"creator": "автор",
"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": "移除帖子",
"no_posts": "没有帖子。",
"create_a_post": "创建新帖子",
@ -100,9 +100,9 @@
"url": "网址",
"body": "内容",
"copy_suggested_title": "复制建议的标题: {{title}}",
"community": "节点",
"community": "社群",
"expand_here": "展开",
"subscribe_to_communities": "订阅一些 <1>节点</1>.",
"subscribe_to_communities": "订阅一些 <1>社群</1>.",
"chat": "聊天",
"no_results": "没有结果.",
"setup": "设置",
@ -122,23 +122,23 @@
"code": "代码",
"joined": "已加入",
"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": "未登录.",
"community_ban": "你已被此社群拉黑。",
"site_ban": "你已被本站拉黑",
"couldnt_create_comment": "不能创建评论.",
"couldnt_create_comment": "无法创建评论。",
"couldnt_like_comment": "无法点赞评论。",
"couldnt_update_comment": "不能更新评论.",
"couldnt_save_comment": "不能保存评论.",
"couldnt_update_comment": "无法更新评论。",
"couldnt_save_comment": "无法保存评论。",
"no_comment_edit_allowed": "没有编辑评论的权限。",
"no_post_edit_allowed": "没有编辑帖子的权限。",
"no_community_edit_allowed": "没有编辑节点的权限。",
"couldnt_find_community": "无法找到节点。",
"couldnt_update_community": "无法更新节点。",
"community_already_exists": "节点已存在。",
"community_moderator_already_exists": "节点监管人已存在。",
"community_follower_already_exists": "节点追随者已存在。",
"community_user_already_banned": "节点用户已禁止。",
"no_community_edit_allowed": "没有编辑社群的权限。",
"couldnt_find_community": "无法找到社群。",
"couldnt_update_community": "无法更新社群。",
"community_already_exists": "社群已存在。",
"community_moderator_already_exists": "社群监管人已存在。",
"community_follower_already_exists": "社群关注者已存在。",
"community_user_already_banned": "社群用户已被禁止。",
"couldnt_create_post": "无法创建帖子。",
"couldnt_like_post": "无法点赞帖子。",
"couldnt_find_post": "无法找到帖子。",
@ -156,14 +156,14 @@
"user_already_exists": "用户已存在。",
"couldnt_update_user": "无法更新用户。",
"system_err_login": "系统错误。请尝试注销后重新登入。",
"nsfw": "少儿不宜",
"show_nsfw": "显示少儿不宜内容",
"nsfw": "工作场所不宜",
"show_nsfw": "显示工作场所不宜内容",
"theme": "主题",
"from": "来自",
"from": "",
"donate_to_lemmy": "向Lemmy捐赠",
"donate": "捐赠",
"monero": "门罗币",
"to": "",
"to": "发布到",
"are_you_sure": "你确定吗?",
"yes": "是",
"no": "否",
@ -175,7 +175,7 @@
"more": "更多",
"preview": "预览",
"upload_image": "上传图片",
"enable_nsfw": "允许少儿不宜内容",
"enable_nsfw": "允许工作场所不宜内容",
"show_avatars": "显示头像",
"avatar": "头像",
"formatting_help": "格式帮助",
@ -213,7 +213,7 @@
"private_message_disclaimer": "警告Lemmy的私信功能并不安全。想要进行安全的信息传递请在 <1>Riot.im</1>上创建账号。",
"send_notifications_to_email": "向邮箱发送通知",
"language": "语言",
"browser_default": "默认浏览器",
"browser_default": "浏览器默认语言",
"downvotes_disabled": "点踩功能已禁用",
"enable_downvotes": "启用点踩功能",
"upvote": "点赞",
@ -223,8 +223,8 @@
"open_registration": "开放注册",
"registration_closed": "注册功能已关闭",
"recent_comments": "最新评论",
"by": "来自",
"transfer_community": "节点转让",
"by": "",
"transfer_community": "转让社群",
"transfer_site": "站点转让",
"post_title_too_long": "帖子标题过长。",
"couldnt_get_comments": "无法获取评论。",