mirror of
https://github.com/LemmyNet/lemmy.git
synced 2024-12-27 05:11:32 +00:00
Merge branch 'master' into federation
This commit is contained in:
commit
0f1a8ec928
57 changed files with 1151 additions and 476 deletions
15
README.md
vendored
15
README.md
vendored
|
@ -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
2
ansible/VERSION
vendored
|
@ -1 +1 @@
|
|||
v0.6.51
|
||||
v0.6.71
|
||||
|
|
2
ansible/templates/docker-compose.yml
vendored
2
ansible/templates/docker-compose.yml
vendored
|
@ -26,7 +26,7 @@ services:
|
|||
restart: always
|
||||
|
||||
pictshare:
|
||||
image: shtripok/pictshare:latest
|
||||
image: hascheksolutions/pictshare:latest
|
||||
ports:
|
||||
- "127.0.0.1:8537:80"
|
||||
volumes:
|
||||
|
|
2
ansible/templates/nginx.conf
vendored
2
ansible/templates/nginx.conf
vendored
|
@ -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
|
||||
|
|
2
docker/dev/docker-compose.yml
vendored
2
docker/dev/docker-compose.yml
vendored
|
@ -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
4
docker/lemmy.hjson
vendored
|
@ -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
|
||||
# }
|
||||
}
|
||||
|
||||
|
|
8
docker/prod/docker-compose.yml
vendored
8
docker/prod/docker-compose.yml
vendored
|
@ -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
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
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
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
2
docs/src/about.md
vendored
|
@ -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).
|
||||
|
||||
|
|
2
docs/src/about_ranking.md
vendored
2
docs/src/about_ranking.md
vendored
|
@ -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)
|
||||
|
|
7
docs/src/administration_install_docker.md
vendored
7
docs/src/administration_install_docker.md
vendored
|
@ -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
|
||||
|
|
|
@ -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
|
||||
```
|
||||
|
|
2
docs/src/contributing_websocket_http_api.md
vendored
2
docs/src/contributing_websocket_http_api.md
vendored
|
@ -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
73
install.sh
vendored
|
@ -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
8
server/Cargo.toml
vendored
|
@ -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
115
server/db-init.sh
vendored
|
@ -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"
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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(_) => {
|
||||
|
|
|
@ -1 +1 @@
|
|||
pub const VERSION: &str = "v0.6.51";
|
||||
pub const VERSION: &str = "v0.6.71";
|
||||
|
|
5
ui/assets/css/main.css
vendored
5
ui/assets/css/main.css
vendored
|
@ -128,10 +128,7 @@ blockquote {
|
|||
|
||||
.new-comments {
|
||||
max-height: 50vh;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.new-comments:hover {
|
||||
overflow-x: hidden;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
|
|
22
ui/src/components/comment-node.tsx
vendored
22
ui/src/components/comment-node.tsx
vendored
|
@ -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>
|
||||
);
|
||||
}
|
||||
|
||||
|
|
2
ui/src/components/login.tsx
vendored
2
ui/src/components/login.tsx
vendored
|
@ -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
|
||||
|
|
2
ui/src/components/main.tsx
vendored
2
ui/src/components/main.tsx
vendored
|
@ -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,
|
||||
|
|
10
ui/src/components/post-form.tsx
vendored
10
ui/src/components/post-form.tsx
vendored
|
@ -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) {
|
||||
|
|
2
ui/src/components/post-listing.tsx
vendored
2
ui/src/components/post-listing.tsx
vendored
|
@ -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;
|
||||
}
|
||||
|
|
12
ui/src/components/post.tsx
vendored
12
ui/src/components/post.tsx
vendored
|
@ -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;
|
||||
|
|
55
ui/src/components/private-message-form.tsx
vendored
55
ui/src/components/private-message-form.tsx
vendored
|
@ -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>
|
||||
|
|
2
ui/src/components/sidebar.tsx
vendored
2
ui/src/components/sidebar.tsx
vendored
|
@ -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,
|
||||
|
|
29
ui/src/components/sponsors.tsx
vendored
29
ui/src/components/sponsors.tsx
vendored
|
@ -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 => (
|
||||
|
|
4
ui/src/components/user.tsx
vendored
4
ui/src/components/user.tsx
vendored
|
@ -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
18
ui/src/i18next.ts
vendored
|
@ -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
72
ui/src/utils.ts
vendored
|
@ -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
2
ui/src/version.ts
vendored
|
@ -1 +1 @@
|
|||
export const version: string = 'v0.6.51';
|
||||
export const version: string = 'v0.6.71';
|
||||
|
|
59
ui/translations/ar.json
vendored
59
ui/translations/ar.json
vendored
|
@ -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": "صوّت سلبيا"
|
||||
}
|
||||
|
|
98
ui/translations/de.json
vendored
98
ui/translations/de.json
vendored
|
@ -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
1
ui/translations/el.json
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
{}
|
10
ui/translations/en.json
vendored
10
ui/translations/en.json
vendored
|
@ -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.",
|
||||
|
|
13
ui/translations/es.json
vendored
13
ui/translations/es.json
vendored
|
@ -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
67
ui/translations/eu.json
vendored
Normal 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"
|
||||
}
|
99
ui/translations/fi.json
vendored
99
ui/translations/fi.json
vendored
|
@ -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."
|
||||
}
|
||||
|
|
109
ui/translations/fr.json
vendored
109
ui/translations/fr.json
vendored
|
@ -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 d’utilisateur·rice",
|
||||
"email_or_username": "Email ou nom d’utilisateur·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": "S’abonner",
|
||||
"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 / S’inscrire",
|
||||
"login": "Se connecter",
|
||||
"sign_up": "S'inscrire",
|
||||
"sign_up": "S’inscrire",
|
||||
"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 n’a 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": "S’abonner à 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 d’une 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 d’aimer 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 d’aimer la publication.",
|
||||
"couldnt_find_post": "Impossible de trouver la publication.",
|
||||
"couldnt_get_posts": "Impossible d’obtenir les publications",
|
||||
"couldnt_update_post": "Impossible de mettre à jour la publication",
|
||||
"couldnt_save_post": "Impossible de sauvegarder la publication.",
|
||||
"no_slurs": "Pas d’insultes.",
|
||||
"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": "L’utilisateur·rice existe déjà.",
|
||||
"email_already_exists": "L’email existe déjà.",
|
||||
"couldnt_update_user": "Impossible de mettre à jour l'utilisateur.",
|
||||
"couldnt_update_user": "Impossible de mettre à jour l’utilisateur·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
1
ui/translations/gl.json
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
{}
|
66
ui/translations/hi.json
vendored
Normal file
66
ui/translations/hi.json
vendored
Normal 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
1
ui/translations/hu.json
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
{}
|
172
ui/translations/it.json
vendored
172
ui/translations/it.json
vendored
|
@ -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."
|
||||
}
|
||||
|
|
6
ui/translations/ja.json
vendored
6
ui/translations/ja.json
vendored
|
@ -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": "投稿が「いいね」できない。"
|
||||
}
|
||||
|
|
24
ui/translations/ka.json
vendored
24
ui/translations/ka.json
vendored
|
@ -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": "ერორი. თავიდან შემოსვლა ცადეთ."
|
||||
}
|
||||
|
|
87
ui/translations/nl.json
vendored
87
ui/translations/nl.json
vendored
|
@ -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"
|
||||
}
|
||||
|
|
19
ui/translations/pl.json
vendored
19
ui/translations/pl.json
vendored
|
@ -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."
|
||||
}
|
||||
|
|
43
ui/translations/ru.json
vendored
43
ui/translations/ru.json
vendored
|
@ -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
1
ui/translations/tr.json
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
{}
|
1
ui/translations/uk.json
vendored
Normal file
1
ui/translations/uk.json
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
{}
|
44
ui/translations/zh.json
vendored
44
ui/translations/zh.json
vendored
|
@ -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": "无法获取评论。",
|
||||
|
|
Loading…
Reference in a new issue