diff options
35 files changed, 1097 insertions, 58 deletions
@@ -15,7 +15,7 @@ <h3 align="center"><a href="https://dev.lemmy.ml">Lemmy</a></h3> <p align="center"> - A link aggregator / reddit clone for the fediverse. + A link aggregator / Reddit clone for the fediverse. <br /> <br /> <a href="https://dev.lemmy.ml">View Site</a> @@ -40,9 +40,9 @@ Front Page|Post For a link aggregator, this means a user registered on one server can subscribe to forums on any other server, and can have discussions with users registered elsewhere. -The overall goal is to create an easily self-hostable, decentralized alternative to reddit and other link aggregators, outside of their corporate control and meddling. +The overall goal is to create an easily self-hostable, decentralized alternative to Reddit and other link aggregators, outside of their corporate control and meddling. -Each lemmy server can set its own moderation policy; appointing site-wide admins, and community moderators to keep out the trolls, and foster a healthy, non-toxic environment where all can feel comfortable contributing. +Each Lemmy server can set its own moderation policy; appointing site-wide admins, and community moderators to keep out the trolls, and foster a healthy, non-toxic environment where all can feel comfortable contributing. *Note: Federation is still in active development and the WebSocket, as well as, HTTP API are currently unstable* @@ -70,7 +70,7 @@ Each lemmy server can set its own moderation policy; appointing site-wide admins - Only a minimum of a username and password is required to sign up! - User avatar support. - Live-updating Comment threads. - - Full vote scores `(+/-)` like old reddit. + - Full vote scores `(+/-)` like old Reddit. - Themes, including light, dark, and solarized. - Emojis with autocomplete support. Start typing `:` - User tagging using `@`, Community tagging using `!`. diff --git a/ansible/VERSION b/ansible/VERSION index 2c0a9c7b..378c127d 100644 --- a/ansible/VERSION +++ b/ansible/VERSION @@ -1 +1 @@ -v0.7.2 +v0.7.6 diff --git a/ansible/templates/docker-compose.yml b/ansible/templates/docker-compose.yml index f4c94fd7..76c53463 100644 --- a/ansible/templates/docker-compose.yml +++ b/ansible/templates/docker-compose.yml @@ -35,7 +35,7 @@ services: restart: always iframely: - image: dogbin/iframely:latest + image: jolt/iframely:v1.4.3 ports: - "127.0.0.1:8061:80" volumes: diff --git a/ansible/templates/nginx.conf b/ansible/templates/nginx.conf index b710fdb3..5847bad0 100644 --- a/ansible/templates/nginx.conf +++ b/ansible/templates/nginx.conf @@ -1,4 +1,5 @@ proxy_cache_path /var/cache/lemmy_frontend levels=1:2 keys_zone=lemmy_frontend_cache:10m max_size=100m use_temp_path=off; +limit_req_zone $binary_remote_addr zone=lemmy_ratelimit:10m rate=1r/s; server { listen 80; @@ -51,6 +52,9 @@ server { # Upload limit for pictrs client_max_body_size 20M; + # Rate limit + limit_req zone=lemmy_ratelimit burst=30 nodelay; + location / { proxy_pass http://0.0.0.0:8536; proxy_set_header X-Real-IP $remote_addr; diff --git a/docker/dev/docker-compose.yml b/docker/dev/docker-compose.yml index 51a3ecda..fc6e2105 100644 --- a/docker/dev/docker-compose.yml +++ b/docker/dev/docker-compose.yml @@ -40,7 +40,7 @@ services: restart: always iframely: - image: dogbin/iframely:latest + image: jolt/iframely:v1.4.3 ports: - "127.0.0.1:8061:80" volumes: diff --git a/docker/dev/test_deploy.sh b/docker/dev/test_deploy.sh index c2ecc0c8..7641c940 100755 --- a/docker/dev/test_deploy.sh +++ b/docker/dev/test_deploy.sh @@ -9,10 +9,10 @@ export COMPOSE_DOCKER_CLI_BUILD=1 export DOCKER_BUILDKIT=1 # Rebuilding dev docker -sudo docker build . -f "docker/dev/Dockerfile" -t "dessalines/lemmy:$BRANCH" +sudo docker build ../../ -f . -t "dessalines/lemmy:$BRANCH" sudo docker push "dessalines/lemmy:$BRANCH" # Run the playbook -pushd ../lemmy-ansible +pushd ../../../lemmy-ansible ansible-playbook -i test playbooks/site.yml popd diff --git a/docker/federation/docker-compose.yml b/docker/federation/docker-compose.yml index cbc648e6..51a37b91 100644 --- a/docker/federation/docker-compose.yml +++ b/docker/federation/docker-compose.yml @@ -107,6 +107,6 @@ services: - ./volumes/postgres_gamma:/var/lib/postgresql/data iframely: - image: dogbin/iframely:latest + image: jolt/iframely:v1.4.3 volumes: - ../iframely.config.local.js:/iframely/config.local.js:ro diff --git a/docker/prod/docker-compose.yml b/docker/prod/docker-compose.yml index ef3d6975..cd364a3c 100644 --- a/docker/prod/docker-compose.yml +++ b/docker/prod/docker-compose.yml @@ -12,7 +12,7 @@ services: restart: always lemmy: - image: dessalines/lemmy:v0.7.2 + image: dessalines/lemmy:v0.7.6 ports: - "127.0.0.1:8536:8536" restart: always @@ -35,7 +35,7 @@ services: restart: always iframely: - image: dogbin/iframely:latest + image: jolt/iframely:v1.4.3 ports: - "127.0.0.1:8061:80" volumes: diff --git a/docs/src/administration_install_ansible.md b/docs/src/administration_install_ansible.md index 77d901b3..4676f47d 100644 --- a/docs/src/administration_install_ansible.md +++ b/docs/src/administration_install_ansible.md @@ -11,6 +11,9 @@ git clone https://github.com/LemmyNet/lemmy.git cd lemmy/ansible/ cp inventory.example inventory nano inventory # enter your server, domain, contact email +# If the command below fails, you may need to comment out this line +# In the ansible.cfg file: +# interpreter_python=/usr/bin/python3 ansible-playbook lemmy.yml --become ``` diff --git a/docs/src/lemmy_council.md b/docs/src/lemmy_council.md index 08c25fb8..9b24522a 100644 --- a/docs/src/lemmy_council.md +++ b/docs/src/lemmy_council.md @@ -1,6 +1,7 @@ # Lemmy Council -- A group of lemmy developers and users that use a well-defined democratic process to steer the project in a positive direction, keep it aligned to community goals, and resolve conflicts. +- A group of lemmy developers and users that use a well-defined democratic process to steer the project in a positive direction, keep it aligned to community goals, and resolve conflicts. +- Council members are also added as administrators to any official Lemmy instances. ## Voting / Decision-Making @@ -52,4 +53,4 @@ General Contact [@LemmyDev Mastodon](https://mastodon.social/@LemmyDev) - [Dessalines](https://dev.lemmy.ml/u/dessalines) - [Nutomic](https://dev.lemmy.ml/u/nutomic) - [AgreeableLandscape](https://dev.lemmy.ml/u/AgreeableLandscape) -- [fruechtchen](https://dev.lemmy.ml/u/fruechtchen)
\ No newline at end of file +- [fruechtchen](https://dev.lemmy.ml/u/fruechtchen) diff --git a/server/src/api/user.rs b/server/src/api/user.rs index e7c27def..a4e47e41 100644 --- a/server/src/api/user.rs +++ b/server/src/api/user.rs @@ -739,7 +739,8 @@ impl Perform for Oper<BanUser> { } let ban = data.ban; - let ban_user = move |conn: &'_ _| User_::ban_user(conn, user_id, ban); + let banned_user_id = data.user_id; + let ban_user = move |conn: &'_ _| User_::ban_user(conn, banned_user_id, ban); if blocking(pool, ban_user).await?.is_err() { return Err(APIError::err("couldnt_update_user").into()); } diff --git a/server/src/lib.rs b/server/src/lib.rs index 3657b4a2..3d09b25d 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -480,7 +480,7 @@ mod tests { lazy_static! { static ref EMAIL_REGEX: Regex = Regex::new(r"^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$").unwrap(); - static ref SLUR_REGEX: Regex = RegexBuilder::new(r"(fag(g|got|tard)?|maricos?|cock\s?sucker(s|ing)?|nig(\b|g?(a|er)?(s|z)?)\b|dindu(s?)|mudslime?s?|kikes?|mongoloids?|towel\s*heads?|\bspi(c|k)s?\b|\bchinks?|niglets?|beaners?|\bnips?\b|\bcoons?\b|jungle\s*bunn(y|ies?)|jigg?aboo?s?|\bpakis?\b|rag\s*heads?|gooks?|cunts?|bitch(es|ing|y)?|puss(y|ies?)|twats?|feminazis?|whor(es?|ing)|\bslut(s|t?y)?|\btrann?(y|ies?)|ladyboy(s?)|\b(b|re|r)tard(ed)?s?)").case_insensitive(true).build().unwrap(); + static ref SLUR_REGEX: Regex = RegexBuilder::new(r"(fag(g|got|tard)?|maricos?|cock\s?sucker(s|ing)?|n(i|1)g(\b|g?(a|er)?(s|z)?)\b|dindu(s?)|mudslime?s?|kikes?|mongoloids?|towel\s*heads?|\bspi(c|k)s?\b|\bchinks?|niglets?|beaners?|\bnips?\b|\bcoons?\b|jungle\s*bunn(y|ies?)|jigg?aboo?s?|\bpakis?\b|rag\s*heads?|gooks?|cunts?|bitch(es|ing|y)?|puss(y|ies?)|twats?|feminazis?|whor(es?|ing)|\bslut(s|t?y)?|\btr(a|@)nn?(y|ies?)|ladyboy(s?)|\b(b|re|r)tard(ed)?s?)").case_insensitive(true).build().unwrap(); static ref USERNAME_MATCHES_REGEX: Regex = Regex::new(r"/u/[a-zA-Z][0-9a-zA-Z_]*").unwrap(); // 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(); diff --git a/server/src/version.rs b/server/src/version.rs index b49db803..b72c8198 100644 --- a/server/src/version.rs +++ b/server/src/version.rs @@ -1 +1 @@ -pub const VERSION: &str = "v0.7.2"; +pub const VERSION: &str = "v0.7.6"; diff --git a/ui/src/components/comment-form.tsx b/ui/src/components/comment-form.tsx index 45974cc0..72a604b9 100644 --- a/ui/src/components/comment-form.tsx +++ b/ui/src/components/comment-form.tsx @@ -185,6 +185,7 @@ export class CommentForm extends Component<CommentFormProps, CommentFormState> { target="_blank" class="d-inline-block float-right text-muted font-weight-bold" title={i18n.t('formatting_help')} + rel="noopener" > <svg class="icon icon-inline"> <use xlinkHref="#icon-help-circle"></use> diff --git a/ui/src/components/community.tsx b/ui/src/components/community.tsx index 373d8f80..c193532b 100644 --- a/ui/src/components/community.tsx +++ b/ui/src/components/community.tsx @@ -217,6 +217,7 @@ export class Community extends Component<any, State> { }`} target="_blank" title="RSS" + rel="noopener" > <svg class="icon text-muted small"> <use xlinkHref="#icon-rss">#</use> diff --git a/ui/src/components/iframely-card.tsx b/ui/src/components/iframely-card.tsx index 3a89023f..0d3f43f6 100644 --- a/ui/src/components/iframely-card.tsx +++ b/ui/src/components/iframely-card.tsx @@ -44,7 +44,12 @@ export class IFramelyCard extends Component< </span> ) : ( <span> - <a class="text-body" target="_blank" href={post.url}> + <a + class="text-body" + target="_blank" + href={post.url} + rel="noopener" + > {post.embed_title} </a> </span> @@ -55,6 +60,7 @@ export class IFramelyCard extends Component< class="text-muted font-italic" target="_blank" href={post.url} + rel="noopener" > {new URL(post.url).hostname} <svg class="ml-1 icon"> diff --git a/ui/src/components/inbox.tsx b/ui/src/components/inbox.tsx index edbacd51..3b963a79 100644 --- a/ui/src/components/inbox.tsx +++ b/ui/src/components/inbox.tsx @@ -109,6 +109,7 @@ export class Inbox extends Component<any, InboxState> { href={`/feeds/inbox/${UserService.Instance.auth}.xml`} target="_blank" title="RSS" + rel="noopener" > <svg class="icon ml-2 text-muted small"> <use xlinkHref="#icon-rss">#</use> diff --git a/ui/src/components/main.tsx b/ui/src/components/main.tsx index c168feb0..4e04fe48 100644 --- a/ui/src/components/main.tsx +++ b/ui/src/components/main.tsx @@ -452,6 +452,7 @@ export class Main extends Component<any, MainState> { <a href={`/feeds/all.xml?sort=${SortType[this.state.sort]}`} target="_blank" + rel="noopener" title="RSS" > <svg class="icon text-muted small"> @@ -467,6 +468,7 @@ export class Main extends Component<any, MainState> { }`} target="_blank" title="RSS" + rel="noopener" > <svg class="icon text-muted small"> <use xlinkHref="#icon-rss">#</use> diff --git a/ui/src/components/post-form.tsx b/ui/src/components/post-form.tsx index 9f5aa363..fdf6ebe4 100644 --- a/ui/src/components/post-form.tsx +++ b/ui/src/components/post-form.tsx @@ -222,6 +222,7 @@ export class PostForm extends Component<PostFormProps, PostFormState> { )}`} target="_blank" class="mr-2 d-inline-block float-right text-muted small font-weight-bold" + rel="noopener" > {i18n.t('archive_link')} </a> @@ -302,6 +303,7 @@ export class PostForm extends Component<PostFormProps, PostFormState> { <a href={markdownHelpUrl} target="_blank" + rel="noopener" class="d-inline-block float-right text-muted font-weight-bold" title={i18n.t('formatting_help')} > diff --git a/ui/src/components/post-listing.tsx b/ui/src/components/post-listing.tsx index b4cc4f92..3d608842 100644 --- a/ui/src/components/post-listing.tsx +++ b/ui/src/components/post-listing.tsx @@ -197,6 +197,7 @@ export class PostListing extends Component<PostListingProps, PostListingState> { className="text-body" href={post.url} target="_blank" + rel="noopener" title={post.url} > {this.imgThumb(this.getImage(true))} @@ -227,6 +228,7 @@ export class PostListing extends Component<PostListingProps, PostListingState> { href={post.url} target="_blank" title={post.url} + rel="noopener" > <svg class="icon thumbnail"> <use xlinkHref="#icon-external-link"></use> @@ -303,6 +305,7 @@ export class PostListing extends Component<PostListingProps, PostListingState> { href={post.url} target="_blank" title={post.url} + rel="noopener" > {post.name} </a> @@ -323,6 +326,7 @@ export class PostListing extends Component<PostListingProps, PostListingState> { href={post.url} target="_blank" title={post.url} + rel="noopener" > {hostname(post.url)} <svg class="ml-1 icon icon-inline"> diff --git a/ui/src/components/private-message-form.tsx b/ui/src/components/private-message-form.tsx index 8cb7590e..10782361 100644 --- a/ui/src/components/private-message-form.tsx +++ b/ui/src/components/private-message-form.tsx @@ -175,6 +175,7 @@ export class PrivateMessageForm extends Component< <a class="alert-link" target="_blank" + rel="noopener" href="https://about.riot.im/" > # @@ -236,6 +237,7 @@ export class PrivateMessageForm extends Component< <a href={markdownHelpUrl} target="_blank" + rel="noopener" class="text-muted" title={i18n.t('formatting_help')} > diff --git a/ui/src/components/sort-select.tsx b/ui/src/components/sort-select.tsx index a6ce2ea9..05abdb20 100644 --- a/ui/src/components/sort-select.tsx +++ b/ui/src/components/sort-select.tsx @@ -47,6 +47,7 @@ export class SortSelect extends Component<SortSelectProps, SortSelectState> { className="text-muted" href={sortingHelpUrl} target="_blank" + rel="noopener" title={i18n.t('sorting_help')} > <svg class={`icon icon-inline`}> diff --git a/ui/src/components/sponsors.tsx b/ui/src/components/sponsors.tsx index 35ec7635..06e13524 100644 --- a/ui/src/components/sponsors.tsx +++ b/ui/src/components/sponsors.tsx @@ -10,6 +10,9 @@ interface SilverUser { } let general = [ + 'Andrew Plaza', + 'Jonathan Cremin', + 'Arthur Nieuwland', 'Ernest Wiśniewski', 'HN', 'Forrest Weghorst', @@ -86,7 +89,7 @@ export class Sponsors extends Component<any, any> { {silver.map(s => ( <div class="card col-12 col-md-2"> <div> - <a href={s.link} target="_blank"> + <a href={s.link} target="_blank" rel="noopener"> 💎 {s.name} </a> </div> diff --git a/ui/src/components/user.tsx b/ui/src/components/user.tsx index f635a1cd..69914fd3 100644 --- a/ui/src/components/user.tsx +++ b/ui/src/components/user.tsx @@ -317,6 +317,7 @@ export class User extends Component<any, UserState> { SortType[this.state.sort] }`} target="_blank" + rel="noopener" title="RSS" > <svg class="icon mx-2 text-muted small"> @@ -463,6 +464,7 @@ export class User extends Component<any, UserState> { !this.state.user.matrix_user_id && 'disabled' }`} target="_blank" + rel="noopener" href={`https://matrix.to/#/${this.state.user.matrix_user_id}`} > {i18n.t('send_secure_message')} @@ -586,7 +588,11 @@ export class User extends Component<any, UserState> { </div> <div class="form-group row"> <label class="col-lg-5 col-form-label"> - <a href="https://about.riot.im/" target="_blank"> + <a + href="https://about.riot.im/" + target="_blank" + rel="noopener" + > {i18n.t('matrix_user_id')} </a> </label> diff --git a/ui/src/env.ts b/ui/src/env.ts index a57b9349..5003986b 100644 --- a/ui/src/env.ts +++ b/ui/src/env.ts @@ -1,6 +1,6 @@ const host = `${window.location.hostname}`; const port = `${ - window.location.port == '4444' ? '8540' : window.location.port + window.location.port == '4444' ? '8536' : window.location.port }`; const endpoint = `${host}:${port}`; diff --git a/ui/src/version.ts b/ui/src/version.ts index 92d18546..8ad27e7c 100644 --- a/ui/src/version.ts +++ b/ui/src/version.ts @@ -1 +1 @@ -export const version: string = 'v0.7.2'; +export const version: string = 'v0.7.6'; diff --git a/ui/translations/de.json b/ui/translations/de.json index ef42d418..3199bc7a 100644 --- a/ui/translations/de.json +++ b/ui/translations/de.json @@ -50,14 +50,14 @@ "remove_as_admin": "Als Administrator entfernen", "appoint_as_admin": "Zum Administrator ernennen", "remove": "entfernen", - "removed": "entfernt", + "removed": "entfernt durch die Moderation", "locked": "gesperrt", "stickied": "angeheftet", "reason": "Grund", "mark_as_read": "als gelesen markieren", "mark_as_unread": "als ungelesen markieren", "delete": "löschen", - "deleted": "gelöscht", + "deleted": "vom Ersteller gelöscht", "delete_account": "Konto löschen", "delete_account_confirm": "Achtung: Dadurch werden alle Ihre Daten dauerhaft gelöscht. Geben Sie zur Bestätigung Ihr Passwort ein.", "restore": "wiederherstellen", @@ -150,7 +150,7 @@ "theme": "Aussehen", "sponsors": "Sponsoren", "sponsors_of_lemmy": "Sponsoren von Lemmy", - "sponsor_message": "Lemmy ist freie <1>Open-Source</1> Software, also ohne Werbung, Monetarisierung oder Venturekapital, Punkt. Deine Spenden gehen direkt an die Vollzeit Entwicklung des Projekts. Vielen Dank an die folgenden Personen:", + "sponsor_message": "Lemmy ist freie <1>Open-Source</1> Software, ohne Werbung, Monetarisierung oder Venturekapital, Punkt. Deine Spenden gehen direkt an die Vollzeit Entwicklung des Projekts. Vielen Dank an die folgenden Personen:", "support_on_patreon": "Auf Patreon unterstützen", "support_on_liberapay": "Auf Liberapay unterstützen", "general_sponsors": "Allgemeine Sponsoren sind die, die zwischen $10 und $39 zu Lemmy beitragen.", @@ -251,5 +251,10 @@ "number_of_upvotes": "{{count}} Stimme", "number_of_upvotes_plural": "{{count}} Stimmen", "number_of_downvotes": "{{count}} Gegenstimme", - "number_of_downvotes_plural": "{{count}} Gegenstimmen" + "number_of_downvotes_plural": "{{count}} Gegenstimmen", + "invalid_community_name": "Ungültiger Name.", + "click_to_delete_picture": "Klicke, um das Bild zu löschen.", + "picture_deleted": "Bild gelöscht.", + "select_a_community": "Wähle eine Community aus", + "invalid_username": "Ungültiger Benutzername." } diff --git a/ui/translations/el.json b/ui/translations/el.json index 0967ef42..4dab7c88 100644 --- a/ui/translations/el.json +++ b/ui/translations/el.json @@ -1 +1,260 @@ -{} +{ + "invalid_community_name": "Άκυρο όνομα.", + "click_to_delete_picture": "Κλικ για διαγραφή εικόνας.", + "picture_deleted": "Η φωτογραφία διαγράφηκε.", + "cross_posts": "Αυτός ο σύνδεσμος έχει επίσης δημοσιευτεί σε:", + "create_post": "Δημιουργία δημοσίευσης", + "create_a_post": "Δημιουργία μιας δημοσίευσης", + "number_of_posts": "{{count}} Δημοσίευση", + "number_of_posts_plural": "{{count}} Δημοσιεύσεις", + "posts": "Δημοσιεύσεις", + "related_posts": "Αυτές οι δημοσιεύσεις μπορεί να σχετίζονται", + "cross_post": "Επαναδημοσίευση", + "cross_posted_to": "Επαναδημοσιευμένο σε: ", + "comments": "Σχόλια", + "number_of_comments": "{{count}} Σχόλιο", + "number_of_comments_plural": "{{count}} Σχόλια", + "post": "δημοσίευση", + "remove_post": "Αφαίρεση δημοσίευσης", + "no_posts": "Δεν υπάρχουν δημοσιεύσεις.", + "remove_comment": "Αφαίρεση σχολίου", + "communities": "Κοινότητες", + "users": "Χρήστες", + "create_a_community": "Δημιουργία μιας κοινότητας", + "create_community": "Δημιουργία κοινότητας", + "remove_community": "Αφαίρεση κοινότητας", + "subscribed_to_communities": "Εγγεγραμμένος σε <1>κοινότητες</1>", + "trending_communities": "Τάση σε <1>κοινότητες</1>", + "list_of_communities": "Κατάλογος κοινοτήτων", + "number_of_communities": "{{count}} Κοινότητα", + "number_of_communities_plural": "{{count}} Κοινότητες", + "community_reqs": "πεζά (μικρά) γράμματα, υπογραμμίσεις, και χωρίς κενά.", + "create_private_message": "Δημιουργία προσωπικού μηνύματος", + "send_secure_message": "Αποστολή ασφαλούς μηνύματος", + "send_message": "Αποστολή μηνύματος", + "message": "Μήνυμα", + "edit": "επεξεργασία", + "reply": "απάντηση", + "more": "περισσότερα", + "cancel": "Ακύρωση", + "preview": "Προεπισκόπηση", + "upload_image": "φόρτωση εικόνας", + "avatar": "Άβαταρ", + "upload_avatar": "Φόρτωση άβαταρ", + "show_avatars": "Εμφάνιση των άβαταρς", + "show_context": "Εμφάνιση συμφραζόμενων", + "formatting_help": "βοήθεια μορφοποίησης", + "sorting_help": "βοήθεια ταξινόμησης", + "view_source": "προβολή πηγής", + "unlock": "ξεκλείδωμα", + "lock": "κλείδωμα", + "sticky": "καρφίτσωμα", + "unsticky": "ξεκαρφίτσωμα", + "link": "σύνδεσμος", + "archive_link": "αρχειοθέτηση συνδέσμου", + "mod": "συντονιστής", + "mods": "συντονιστές", + "moderates": "Συντονίζει", + "settings": "Ρυθμίσεις", + "admin_settings": "Ρυθμίσεις διαχειριστή", + "appoint_as_mod": "διορισμός ως συντονιστής", + "site_config": "Διαμόρφωση ιστότοπου", + "remove_as_mod": "αφαίρεση ως συντονιστής", + "modlog": "Ιστορικό συντονισμού", + "admin": "διαχειριστής", + "admins": "διαχειριστές", + "remove_as_admin": "αφαίρεση ως διαχειριστής", + "appoint_as_admin": "διορισμός ως διαχειριστής", + "remove": "αφαίρεση", + "removed": "αφαιρέθηκε από συντονιστή", + "locked": "κλειδωμένο", + "stickied": "καρφιτσωμένο", + "reason": "Λόγος", + "mark_as_read": "επισήμανση ως διαβασμένο", + "mark_as_unread": "επισήμανση ως μη διαβασμένο", + "delete": "διαγραφή", + "deleted": "διαγράφηκε από τον δημιουργό", + "delete_account": "Διαγραφή λογαριασμού", + "delete_account_confirm": "Προσοχή: αυτό θα διαγράψει όλα τα δεδομένα σας. Είσαγετε τον κωδικό σας για επιβεβαίωση.", + "restore": "επαναφορά", + "ban": "απαγόρευση", + "ban_from_site": "απαγόρευση εισόδου στον ιστότοπο", + "unban": "άρση απαγόρευσης", + "unban_from_site": "άρση απαγόρευσης εισόδου στον ιστότοπο", + "banned": "αποβεβλημένος", + "banned_users": "Αποβεβλημένοι χρήστες", + "save": "αποθήκευση", + "unsave": "αναίρεση αποθήκευσης", + "create": "δημιουργία", + "creator": "δημιουργός", + "username": "Όνομα χρήστη", + "email_or_username": "Διεύθυνση ηλεκτρονικού ταχυδρομείου ή όνομα χρήστη", + "number_of_users": "{{count}} Χρήστης", + "number_of_users_plural": "{{count}} Χρήστες", + "number_of_subscribers": "{{count}} Εγγεγραμμένος", + "number_of_subscribers_plural": "{{count}} Εγγεγραμμένοι", + "number_of_points": "{{count}} Βαθμός", + "number_of_points_plural": "{{count}} Βαθμοί", + "number_online": "{{count}} Ενεργός χρήστης", + "number_online_plural": "{{count}} Ενεργοί χρήστες", + "name": "Όνομα", + "title": "Επικεφαλίδα", + "category": "Κατηγορία", + "subscribers": "Εγγεγραμμένοι", + "both": "Και οι δύο", + "saved": "Αποθηκευμένα", + "prev": "Προηγούμενο", + "next": "Επόμενο", + "sidebar": "Πλευρικό μενού", + "sort_type": "Ταξινόμηση κατά", + "hot": "Δημοφιλή", + "new": "Νέα", + "old": "Παλιά", + "unsubscribe": "Απεγγραφή", + "subscribe": "Εγγραφή", + "inbox_for": "Εισερχόμενα για <1>{{user}}</1>", + "mark_all_as_read": "επισήμανση όλων ως διαβασμένα", + "type": "Είδος", + "unread": "Μη διαβασμένα", + "url": "URL", + "subscribed": "Εγγεγραμμένος", + "week": "Εβδομάδα", + "month": "Μήνας", + "year" |