Browse Source

Merge tag 'v0.7.12' into chapo-merge-upstream

feature/settings-cleanup
Ryexandra 1 year ago
parent
commit
d6caf9d462
  1. 15
      assets/css/main.css
  2. 18
      src/api_tests/api.spec.ts
  3. 5
      src/components/comment-form.tsx
  4. 1
      src/components/community.tsx
  5. 8
      src/components/iframely-card.tsx
  6. 1
      src/components/inbox.tsx
  7. 53
      src/components/login.tsx
  8. 1
      src/components/main.tsx
  9. 123
      src/components/navbar.tsx
  10. 2
      src/components/post-form.tsx
  11. 1
      src/components/post-listing.tsx
  12. 2
      src/components/private-message-form.tsx
  13. 1
      src/components/sort-select.tsx
  14. 17
      src/components/sponsors.tsx
  15. 4
      src/components/symbols.tsx
  16. 8
      src/components/user.tsx
  17. 2
      src/i18next.ts
  18. 8
      src/utils.ts
  19. 2
      src/version.ts
  20. 5
      translations/ar.json
  21. 337
      translations/ca.json
  22. 11
      translations/de.json
  23. 10
      translations/el.json
  24. 1
      translations/en.json
  25. 237
      translations/eo.json
  26. 66
      translations/es.json
  27. 4
      translations/fr.json
  28. 6
      translations/it.json
  29. 260
      translations/sq.json
  30. 270
      translations/uk.json
  31. 64
      translations/zh.json

15
assets/css/main.css

@ -254,3 +254,18 @@ pre {
white-space: pre-wrap;
word-break: keep-all;
}
.form-control.search-input {
float: right !important;
transition: width 0.2s ease-out 0s !important;
}
.show-input {
width: 13em !important;
}
.hide-input {
background: transparent !important;
width: 0px !important;
padding: 0 !important;
}

18
src/api_tests/api.spec.ts

@ -124,10 +124,10 @@ describe('main', () => {
});
describe('follow_accept', () => {
test('/u/lemmy_alpha follows and accepts lemmy_beta/c/main', async () => {
// Make sure lemmy_beta/c/main is cached on lemmy_alpha
test('/u/lemmy_alpha follows and accepts lemmy-beta/c/main', async () => {
// Make sure lemmy-beta/c/main is cached on lemmy_alpha
// Use short-hand search url
let searchUrl = `${lemmyAlphaApiUrl}/[email protected]_beta:8550&type_=All&sort=TopAll`;
let searchUrl = `${lemmyAlphaApiUrl}/[email protected]-beta:8550&type_=All&sort=TopAll`;
let searchResponse: SearchResponse = await fetch(searchUrl, {
method: 'GET',
@ -215,7 +215,7 @@ describe('main', () => {
// Also make G follow B
// Use short-hand search url
let searchUrlG = `${lemmyGammaApiUrl}/[email protected]_beta:8550&type_=All&sort=TopAll`;
let searchUrlG = `${lemmyGammaApiUrl}/[email protected]-beta:8550&type_=All&sort=TopAll`;
let searchResponseG: SearchResponse = await fetch(searchUrlG, {
method: 'GET',
@ -449,7 +449,7 @@ describe('main', () => {
// Lemmy alpha responds to their own comment, but mentions lemmy beta.
// Make sure lemmy beta gets that in their inbox.
let mentionContent = 'A test mention of @[email protected]_beta:8550';
let mentionContent = 'A test mention of @[email protected]-beta:8550';
let mentionCommentForm: CommentForm = {
content: mentionContent,
post_id: 2,
@ -550,7 +550,7 @@ describe('main', () => {
expect(createCommunityRes.community.name).toBe(communityName);
// Cache it on lemmy_alpha
let searchUrl = `${lemmyAlphaApiUrl}/search?q=http://lemmy_beta:8550/c/${communityName}&type_=All&sort=TopAll`;
let searchUrl = `${lemmyAlphaApiUrl}/search?q=http://lemmy-beta:8550/c/${communityName}&type_=All&sort=TopAll`;
let searchResponse: SearchResponse = await fetch(searchUrl, {
method: 'GET',
}).then(d => d.json());
@ -826,7 +826,7 @@ describe('main', () => {
expect(createCommunityRes.community.name).toBe(communityName);
// Cache it on lemmy_alpha
let searchUrl = `${lemmyAlphaApiUrl}/search?q=http://lemmy_beta:8550/c/${communityName}&type_=All&sort=TopAll`;
let searchUrl = `${lemmyAlphaApiUrl}/search?q=http://lemmy-beta:8550/c/${communityName}&type_=All&sort=TopAll`;
let searchResponse: SearchResponse = await fetch(searchUrl, {
method: 'GET',
}).then(d => d.json());
@ -1278,7 +1278,7 @@ describe('main', () => {
// Create a test comment on Gamma, make sure it gets announced to alpha
let commentContent =
'A jest test federated comment announce, lets mention @[email protected]_beta:8550';
'A jest test federated comment announce, lets mention @[email protected]-beta:8550';
let commentForm: CommentForm = {
content: commentContent,
@ -1417,7 +1417,7 @@ describe('main', () => {
expect(createChildCommentRes.comment.content).toBe(childCommentContent);
// Follow again, for other tests
let searchUrl = `${lemmyAlphaApiUrl}/[email protected]_beta:8550&type_=All&sort=TopAll`;
let searchUrl = `${lemmyAlphaApiUrl}/[email protected]-beta:8550&type_=All&sort=TopAll`;
let searchResponse: SearchResponse = await fetch(searchUrl, {
method: 'GET',

5
src/components/comment-form.tsx

@ -189,6 +189,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>
@ -266,7 +267,9 @@ export class CommentForm extends Component<CommentFormProps, CommentFormState> {
// If its a comment edit, only check that its from your user, and that its a
// text edit only
(op == UserOperation.EditComment && data.comment.content)
(data.comment.creator_id == UserService.Instance.user.id &&
op == UserOperation.EditComment &&
data.comment.content)
) {
this.state.previewMode = false;
this.state.loading = false;

1
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>

8
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">

1
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>

53
src/components/login.tsx

@ -20,6 +20,11 @@ interface State {
loginLoading: boolean;
registerLoading: boolean;
enable_nsfw: boolean;
mathQuestion: {
a: number;
b: number;
answer: number;
};
}
function initCaptcha() {
@ -56,6 +61,11 @@ export class Login extends Component<any, State> {
loginLoading: false,
registerLoading: false,
enable_nsfw: undefined,
mathQuestion: {
a: Math.floor(Math.random() * 10) + 1,
b: Math.floor(Math.random() * 10) + 1,
answer: undefined,
},
};
constructor(props: any, context: any) {
@ -259,6 +269,23 @@ export class Login extends Component<any, State> {
/>
</div>
</div>
<div class="form-group row">
<label class="col-sm-10 col-form-label" htmlFor="register-math">
{i18n.t('what_is')}{' '}
{`${this.state.mathQuestion.a} + ${this.state.mathQuestion.b}?`}
</label>
<div class="col-sm-2">
<input
type="number"
id="register-math"
class="form-control"
value={this.state.mathQuestion.answer}
onInput={linkEvent(this, this.handleMathAnswerChange)}
required
/>
</div>
</div>
{this.state.enable_nsfw && (
<div class="form-group row">
<div class="col-sm-10">
@ -289,7 +316,11 @@ export class Login extends Component<any, State> {
</div>
<div class="form-group row">
<div class="col-sm-10">
<button type="submit" class="btn btn-secondary">
<button
type="submit"
class="btn btn-secondary"
disabled={this.mathCheck}
>
{this.state.registerLoading ? (
<svg class="icon icon-spinner spin">
<use xlinkHref="#icon-spinner"></use>
@ -313,9 +344,9 @@ export class Login extends Component<any, State> {
i.state.loginForm.password = (document.getElementById(
'login-password'
) as HTMLInputElement).value;
i.state.loginForm.captcha_id = (document.querySelector(
i.state.loginForm.captcha_id = document.querySelector(
"textarea[name='h-captcha-response']"
)).value;
).value;
i.setState(i.state);
WebSocketService.Instance.login(i.state.loginForm);
}
@ -338,7 +369,9 @@ export class Login extends Component<any, State> {
)[1] as HTMLInputElement).value;
i.setState(i.state);
WebSocketService.Instance.register(i.state.registerForm);
if (!i.mathCheck) {
WebSocketService.Instance.register(i.state.registerForm);
}
}
handleRegisterUsernameChange(i: Login, event: any) {
@ -369,6 +402,11 @@ export class Login extends Component<any, State> {
i.setState(i.state);
}
handleMathAnswerChange(i: Login, event: any) {
i.state.mathQuestion.answer = event.target.value;
i.setState(i.state);
}
handlePasswordReset(i: Login) {
event.preventDefault();
let resetForm: PasswordResetForm = {
@ -383,6 +421,13 @@ export class Login extends Component<any, State> {
.classList.add('is-invalid');
}
get mathCheck(): boolean {
return (
this.state.mathQuestion.answer !=
this.state.mathQuestion.a + this.state.mathQuestion.b
);
}
parseMessage(msg: WebSocketJsonResponse) {
let res = wsJsonToRes(msg);
if (msg.error) {

1
src/components/main.tsx

@ -505,6 +505,7 @@ export class Main extends Component<any, MainState> {
href={`/feeds/all.xml?sort=${SortType[this.state.sort]}`}
target="_blank"
title="RSS"
rel="noopener"
>
<svg class="icon text-muted small">
<use xlinkHref="#icon-rss">#</use>

123
src/components/navbar.tsx

@ -1,4 +1,4 @@
import { Component, linkEvent } from 'inferno';
import { Component, linkEvent, createRef, RefObject } from 'inferno';
import { Link, withRouter } from 'inferno-router';
import { Subscription } from 'rxjs';
import { retryWhen, delay, take } from 'rxjs/operators';
@ -42,11 +42,14 @@ interface NavbarState {
unreadCount: number;
siteName: string;
admins: Array<UserView>;
searchParam: string;
toggleSearch: boolean;
}
class UnwrappedNavbar extends Component<any, NavbarState> {
private wsSub: Subscription;
private userSub: Subscription;
private searchTextField: RefObject<HTMLInputElement>;
emptyState: NavbarState = {
isLoggedIn: UserService.Instance.user !== undefined,
unreadCount: 0,
@ -56,6 +59,8 @@ class UnwrappedNavbar extends Component<any, NavbarState> {
expanded: false,
siteName: undefined,
admins: [],
searchParam: '',
toggleSearch: false,
};
constructor(props: any, context: any) {
@ -87,6 +92,49 @@ class UnwrappedNavbar extends Component<any, NavbarState> {
}
WebSocketService.Instance.getSite();
this.searchTextField = createRef();
}
handleSearchParam(i: Navbar, event: any) {
i.state.searchParam = event.target.value;
i.setState(i.state);
}
updateUrl() {
const searchParam = this.state.searchParam;
this.setState({ searchParam: '' });
this.setState({ toggleSearch: false });
if (searchParam === '') {
this.context.router.history.push(`/search/`);
} else {
this.context.router.history.push(
`/search/q/${searchParam}/type/all/sort/topall/page/1`
);
}
}
handleSearchSubmit(i: Navbar, event: any) {
event.preventDefault();
i.updateUrl();
}
handleSearchBtn(i: Navbar, event: any) {
event.preventDefault();
i.setState({ toggleSearch: true });
i.searchTextField.current.focus();
const offsetWidth = i.searchTextField.current.offsetWidth;
if (i.state.searchParam && offsetWidth > 100) {
i.updateUrl();
}
}
handleSearchBlur(i: Navbar, event: any) {
if (!(event.relatedTarget && event.relatedTarget.name !== 'search-btn')) {
i.state.toggleSearch = false;
i.setState(i.state);
}
}
render() {
@ -147,7 +195,7 @@ class UnwrappedNavbar extends Component<any, NavbarState> {
<div
className={`${!this.state.expanded && 'collapse'} navbar-collapse`}
>
<ul class="navbar-nav mr-auto">
<ul class="navbar-nav my-2 mr-auto">
<li class="nav-item">
<Link
class="nav-link"
@ -157,11 +205,6 @@ class UnwrappedNavbar extends Component<any, NavbarState> {
{i18n.t('communities')}
</Link>
</li>
<li class="nav-item">
<Link class="nav-link" to="/search" title={i18n.t('search')}>
{i18n.t('search')}
</Link>
</li>
<li class="nav-item">
<Link
class="nav-link"
@ -195,7 +238,37 @@ class UnwrappedNavbar extends Component<any, NavbarState> {
</Link>
</li>
</ul>
<ul class="navbar-nav ml-auto navbar-right">
{!this.context.router.history.location.pathname.match(
/^\/search/
) && (
<form
class="form-inline"
onSubmit={linkEvent(this, this.handleSearchSubmit)}
>
<input
class={`form-control mr-0 search-input ${
this.state.toggleSearch ? 'show-input' : 'hide-input'
}`}
onInput={linkEvent(this, this.handleSearchParam)}
value={this.state.searchParam}
ref={this.searchTextField}
type="text"
placeholder={i18n.t('search')}
onBlur={linkEvent(this, this.handleSearchBlur)}
></input>
<button
name="search-btn"
onClick={linkEvent(this, this.handleSearchBtn)}
class="btn btn-link"
style="color: var(--gray)"
>
<svg class="icon">
<use xlinkHref="#icon-search"></use>
</svg>
</button>
</form>
)}
<ul class="navbar-nav my-2 navbar-right">
{this.canAdmin && (
<li className="nav-item">
<Link
@ -209,8 +282,10 @@ class UnwrappedNavbar extends Component<any, NavbarState> {
</Link>
</li>
)}
{this.state.isLoggedIn ? (
<>
</ul>
{this.state.isLoggedIn ? (
<>
<ul class="navbar-nav my-2">
<li className="nav-item">
<Link
class="nav-link p-0 px-2 nav-icon"
@ -227,6 +302,8 @@ class UnwrappedNavbar extends Component<any, NavbarState> {
)}
</Link>
</li>
</ul>
<ul class="navbar-nav">
<li className="nav-item">
<Link
class="nav-link"
@ -248,17 +325,21 @@ class UnwrappedNavbar extends Component<any, NavbarState> {
</span>
</Link>
</li>
</>
) : (
<Link
class="nav-link"
to="/login"
title={i18n.t('login_sign_up')}
>
{i18n.t('login_sign_up')}
</Link>
)}
</ul>
</ul>
</>
) : (
<ul class="navbar-nav my-2">
<li className="nav-item">
<Link
class="nav-link"
to="/login"
title={i18n.t('login_sign_up')}
>
{i18n.t('login_sign_up')}
</Link>
</li>
</ul>
)}
</div>
</nav>
);

2
src/components/post-form.tsx

@ -230,6 +230,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>
@ -314,6 +315,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')}
>

1
src/components/post-listing.tsx

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

2
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')}
>

1
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`}>

17
src/components/sponsors.tsx

@ -6,10 +6,13 @@ import { repoUrl } from '../utils';
interface SilverUser {
name: string;
link: string;
link?: string;
}
let general = [
'ybaumy',
'dude in phx',
'twilight loki',
'Andrew Plaza',
'Jonathan Cremin',
'Arthur Nieuwland',
@ -19,7 +22,7 @@ let general = [
'Andre Vallestero',
'NotTooHighToHack',
];
let highlighted = ['Oskenso Kashi', 'Alex Benishek'];
let highlighted = ['DiscountFuneral', 'Oskenso Kashi', 'Alex Benishek'];
let silver: Array<SilverUser> = [
{
name: 'Redjoker',
@ -89,9 +92,13 @@ 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">
💎 {s.name}
</a>
{s.link ? (
<a href={s.link} target="_blank" rel="noopener">
💎 {s.name}
</a>
) : (
<div>💎 {s.name}</div>
)}
</div>
</div>
))}

4
src/components/symbols.tsx

@ -159,8 +159,8 @@ export class Symbols extends Component<any, any> {
/>
</g>
</symbol>
<symbol id="icon-search" viewBox="0 0 32 32">
<path d="M31.008 27.231l-7.58-6.447c-0.784-0.705-1.622-1.029-2.299-0.998 1.789-2.096 2.87-4.815 2.87-7.787 0-6.627-5.373-12-12-12s-12 5.373-12 12 5.373 12 12 12c2.972 0 5.691-1.081 7.787-2.87-0.031 0.677 0.293 1.515 0.998 2.299l6.447 7.58c1.104 1.226 2.907 1.33 4.007 0.23s0.997-2.903-0.23-4.007zM12 20c-4.418 0-8-3.582-8-8s3.582-8 8-8 8 3.582 8 8-3.582 8-8 8z"></path>
<symbol id="icon-search" viewBox="0 0 24 24">
<path d="M16.041 15.856c-0.034 0.026-0.067 0.055-0.099 0.087s-0.060 0.064-0.087 0.099c-1.258 1.213-2.969 1.958-4.855 1.958-1.933 0-3.682-0.782-4.95-2.050s-2.050-3.017-2.050-4.95 0.782-3.682 2.050-4.95 3.017-2.050 4.95-2.050 3.682 0.782 4.95 2.050 2.050 3.017 2.050 4.95c0 1.886-0.745 3.597-1.959 4.856zM21.707 20.293l-3.675-3.675c1.231-1.54 1.968-3.493 1.968-5.618 0-2.485-1.008-4.736-2.636-6.364s-3.879-2.636-6.364-2.636-4.736 1.008-6.364 2.636-2.636 3.879-2.636 6.364 1.008 4.736 2.636 6.364 3.879 2.636 6.364 2.636c2.125 0 4.078-0.737 5.618-1.968l3.675 3.675c0.391 0.391 1.024 0.391 1.414 0s0.391-1.024 0-1.414z"></path>
</symbol>
<symbol id="icon-github" viewBox="0 0 32 32">
<path d="M16 0.395c-8.836 0-16 7.163-16 16 0 7.069 4.585 13.067 10.942 15.182 0.8 0.148 1.094-0.347 1.094-0.77 0-0.381-0.015-1.642-0.022-2.979-4.452 0.968-5.391-1.888-5.391-1.888-0.728-1.849-1.776-2.341-1.776-2.341-1.452-0.993 0.11-0.973 0.11-0.973 1.606 0.113 2.452 1.649 2.452 1.649 1.427 2.446 3.743 1.739 4.656 1.33 0.143-1.034 0.558-1.74 1.016-2.14-3.554-0.404-7.29-1.777-7.29-7.907 0-1.747 0.625-3.174 1.649-4.295-0.166-0.403-0.714-2.030 0.155-4.234 0 0 1.344-0.43 4.401 1.64 1.276-0.355 2.645-0.532 4.005-0.539 1.359 0.006 2.729 0.184 4.008 0.539 3.054-2.070 4.395-1.64 4.395-1.64 0.871 2.204 0.323 3.831 0.157 4.234 1.026 1.12 1.647 2.548 1.647 4.295 0 6.145-3.743 7.498-7.306 7.895 0.574 0.497 1.085 1.47 1.085 2.963 0 2.141-0.019 3.864-0.019 4.391 0 0.426 0.288 0.925 1.099 0.768 6.354-2.118 10.933-8.113 10.933-15.18 0-8.837-7.164-16-16-16z"></path>

8
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>

2
src/i18next.ts

@ -24,6 +24,7 @@ import { gl } from './translations/gl';
import { tr } from './translations/tr';
import { hu } from './translations/hu';
import { uk } from './translations/uk';
import { sq } from './translations/sq';
// https://github.com/nimbusec-oss/inferno-i18next/blob/master/tests/T.test.js#L66
const resources = {
@ -51,6 +52,7 @@ const resources = {
tr,
hu,
uk,
sq,
};
function format(value: any, format: any, lng: any): any {

8
src/utils.ts

@ -21,6 +21,7 @@ import 'moment/locale/gl';
import 'moment/locale/tr';
import 'moment/locale/hu';
import 'moment/locale/uk';
import 'moment/locale/sq';
import {
UserOperation,
@ -84,8 +85,9 @@ export const languages = [
{ code: 'fi', name: 'Suomi' },
{ code: 'fr', name: 'Français' },
{ code: 'sv', name: 'Svenska' },
{ code: 'sq', name: 'Shqip' },
{ code: 'tr', name: 'Türkçe' },
{ code: 'uk', name: 'українська мова' },
{ code: 'uk', name: 'Українська Mова' },
{ code: 'ru', name: 'Русский' },
{ code: 'nl', name: 'Nederlands' },
{ code: 'it', name: 'Italiano' },
@ -426,6 +428,8 @@ export function getMomentLanguage(): string {
lang = 'hu';
} else if (lang.startsWith('uk')) {
lang = 'uk';
} else if (lang.startsWith('sq')) {
lang = 'sq';
} else {
lang = 'en';
}
@ -939,7 +943,7 @@ export function postSort(
+a.removed - +b.removed ||
+a.deleted - +b.deleted ||
(communityType && +b.stickied - +a.stickied) ||
hotRankPost(b) - hotRankPost(a)
b.hot_rank - a.hot_rank
);
}
}

2
src/version.ts

@ -1 +1 @@
export const version: string = 'v0.7.5';
export const version: string = 'v0.7.12';

5
translations/ar.json

@ -44,12 +44,12 @@
"remove_as_admin": "إزالة كمدير",
"appoint_as_admin": "تعيين كمدير",
"remove": "إزالة",
"removed": "تمت إزالته",
"removed": "أزاله المشرف",
"reason": "السبب",
"mark_as_read": "تعيين كمقروء",
"mark_as_unread": "تعيين كغير مقروء بعد",
"delete": "حذف",
"deleted": "تم حذفه",
"deleted": "حذفه صاحبه",
"restore": "استعادة",
"ban": "طرد",
"ban_from_site": "طرده مِن الموقع",
@ -220,5 +220,6 @@
"reset_password_mail_sent": "لقد أرسِلت إليك رسالة إلكترونية لتصفير كلمتك السرية.",
"upvote": "صوّت إيجابيا",
"downvote": "صوّت سلبيا",
"select_a_community": "اختر مجتمعًا",
"invalid_login_credentials": "اعتماد تسجيل الدخول غير صالح"
}

337
translations/ca.json

@ -1,99 +1,105 @@
{
"post": "Publicar",
"remove_post": "Eliminar publicació",
"no_posts": "Sense publicacions.",
"remove_post": "Suprimir publicació",
"no_posts": "No hi han publicacions.",
"create_a_post": "Crear una publicació",
"create_post": "Crear Publicació",
"number_of_posts": "{{count}} Publicacions",
"create_post": "Crear publicació",
"number_of_posts": "{{count}} Publicació",
"number_of_posts_plural": "{{count}} Publicacions",
"posts": "Publicacions",
"related_posts": "Aquestes publicacions podrien estar relacionades",
"cross_posts": "Aquest link també ha sigut publicat en:",
"cross_posts": "Aquest enllaç també s’ha publicat en:",
"cross_post": "cross-post",
"comments": "Comentaris",
"number_of_comments": "{{count}} Comentaris",
"remove_comment": "Eliminar Comentaris",
"number_of_comments": "{{count}} comentari",
"number_of_comments_plural": "{{count}} comentaris",
"remove_comment": "Suprimeix el comentari",
"communities": "Comunitats",
"users": "Usuaris",
"create_a_community": "Crear una comunitat",
"create_community": "Crear Comunitat",
"remove_community": "Eliminar Comunitat",
"create_a_community": "Crea una comunitat",
"create_community": "Crea una comunitat",
"remove_community": "Suprimeix la comunitat",
"subscribed_to_communities": "Subscrit a <1>comunitats</1>",
"trending_communities": "<1>Comunitats</1> en tendència",
"list_of_communities": "Llista de comunitats",
"number_of_communities": "{{count}} Comunitats",
"number_of_communities": "{{count}} comunitat",
"number_of_communities_plural": "{{count}} comunitats",
"community_reqs": "minúscules, guió baix, i sense espais.",
"create_private_message": "Crear Missatge Privat",
"send_secure_message": "Enviar Missatge Segur",
"send_message": "Enviar Missatge",
"create_private_message": "Crea un missatge privat",
"send_secure_message": "Envia un missatge segur",
"send_message": "Envia el missatge",
"message": "Missatge",
"edit": "editar",
"reply": "respondre",
"cancel": "Cancelar",
"preview": "Previsualitzar",
"upload_image": "pujar imatge",
"edit": "edita",
"reply": "respon",
"cancel": "Cancel·la",
"preview": "Previsualitza",
"upload_image": "puja una imatge",
"avatar": "Avatar",
"upload_avatar": "Pujar Avatar",
"show_avatars": "Veure Avatares",
"formatting_help": "Ajuda de format",
"view_source": "veure font",
"unlock": "desbloquejar",
"lock": "bloquejar",
"upload_avatar": "Puja un avatar",
"show_avatars": "Mostra els avatars",
"formatting_help": "ajuda amb la formatació",
"view_source": "mostra’n el codi font",
"unlock": "desbloca",
"lock": "bloca",
"sticky": "fijat",
"unsticky": "no fijat",
"link": "link",
"archive_link": "arxivar link",
"link": "enllaç",
"archive_link": "enllaç de l’arxiu",
"mod": "moderador",
"mods": "moderadores",
"moderates": "Modera",
"settings": "Configuració",
"remove_as_mod": "eliminar com moderador",
"appoint_as_mod": "designar com moderador",
"remove_as_mod": "suprimeix com a moderador",
"appoint_as_mod": "designa com a moderador",
"modlog": "Historial de moderació",
"admin": "administrador",
"admins": "administradors",
"remove_as_admin": "eliminar com administrador",
"appoint_as_admin": "designar com administrador",
"remove": "eliminar",
"removed": "eliminat",
"locked": "bloquejat",
"remove_as_admin": "suprimeix com a administrador",
"appoint_as_admin": "designa com a administrador",
"remove": "suprimeix",
"removed": "suprimit pel moderador",
"locked": "blocat",
"stickied": "fijat",
"reason": "Raó",
"mark_as_read": "marcar com llegit",
"mark_as_unread": "marcar com no llegit",
"delete": "eliminar",
"deleted": "eliminat",
"delete_account": "Eliminar Compte",
"delete_account_confirm":
"Avís: aquesta acció eliminarà permanentment la teva informació. Introdueix la teva contrasenya per a continuar",
"restore": "restaurar",
"ban": "expulsar",
"ban_from_site": "expulsar del lloc",
"unban": "admetre",
"unban_from_site": "admetre al lloc",
"mark_as_read": "marca com a llegit",
"mark_as_unread": "marca com a no llegit",
"delete": "suprimeix",
"deleted": "suprimit pel creador",
"delete_account": "Suprimeix el compte",
"delete_account_confirm": "Atenció: aquesta acció suprimirà permanentment la vostra informació. Introduïu la vostra contrasenya per a confirmar.",
"restore": "restaura",
"ban": "expulsa",
"ban_from_site": "expulsa del lloc",
"unban": "readmet",
"unban_from_site": "readmet al lloc",
"banned": "expulsat",
"save": "guardar",
"unsave": "descartar",
"create": "crear",
"save": "desa",
"unsave": "descarta",
"create": "crea",
"creator": "creador",
"username": "Nom d'Usuari",
"email_or_username": "Correu o Usuari",
"number_of_users": "{{count}} Usuaris",
"number_of_subscribers": "{{count}} Subscriptors",
"number_of_points": "{{count}} Punts",
"number_online": "{{count}} Usauris En Línia",
"username": "Nom d’usuari",
"email_or_username": "Adreça electrònica o usuari",
"number_of_users": "{{count}} usuari",
"number_of_users_plural": "{{count}} usuaris",
"number_of_subscribers": "{{count}} subscriptor",
"number_of_subscribers_plural": "{{count}} subscriptors",
"number_of_points": "{{count}} punt",
"number_of_points_plural": "{{count}} punts",
"number_online": "{{count}} usuari en línia",
"number_online_plural": "{{count}} usuaris en línia",
"name": "Nom",
"title": "Titol",
"title": "Títol",
"category": "Categoria",
"subscribers": "Suscriptors",
"both": "Ambdos",
"saved": "Guardat",
"unsubscribe": "Desubscriure's",
"subscribe": "Subscriure's",
"subscribers": "Subscriptors",
"both": "Tots dos",
"saved": "Desat",
"unsubscribe": "Dóna’t de baixa",
"subscribe": "Subscriu-t’hi",
"subscribed": "Subscrit",
"prev": "Anterior",
"next": "Següent",
"sidebar": "Descripció de la comunitat",
"sort_type": "Tipus d'orden",
"sidebar": "Barra lateral",
"sort_type": "Tipus d’ordenació",
"hot": "Popular",
"new": "Nou",
"top_day": "El millor del dia",
@ -103,75 +109,71 @@
"all": "Tot",
"top": "Millor",
"api": "API",
"docs": "Docs",
"inbox": "Bústia d'entrada",
"inbox_for": "Bústia d'entrada per a <1>{{user}}</1>",
"mark_all_as_read": "marcar tot com llegit",
"docs": "Documentació",
"inbox": "Bústia dentrada",
"inbox_for": "Bústia dentrada per a <1>{{user}}</1>",
"mark_all_as_read": "marca-ho tot com a llegit",
"type": "Tipus",
"unread": "No llegit",
"replies": "Respostes",
"mentions": "Menciones",
"reply_sent": "Resposta enviada",
"message_sent": "Missatge enviado",
"search": "Buscar",
"overview": "Resum",
"mentions": "Mencions",
"reply_sent": "La resposta ha estat enviada",
"message_sent": "El missatge ha estat enviat",
"search": "Cerca",
"overview": "Visió de conjunt",
"view": "Vista",
"logout": "Tancar sessió",
"login_sign_up": "Iniciar sessió / Crear compte",
"login": "Iniciar sessió",
"sign_up": "Crear compte",
"notifications_error":
"Notificacions d'escriptori no disponibles al teu navegador. Prova amb Firefox o Chrome.",
"logout": "Finalitza la sessió",
"login_sign_up": "Inicia una sessió / crea un compte",
"login": "Inicia una sessió",
"sign_up": "Crea un compte",
"notifications_error": "Les notificacions d’escriptori no estan disponibles al vostre navegador. Proveu amb el Firefox o el Chrome.",
"unread_messages": "Missatges no llegits",
"messages": "Missatges",
"password": "Contrasenya",
"verify_password": "Verificar Contrasenya",
"old_password": "Antiga Contrasenya",
"forgot_password": "oblidí la meva contrasenya",
"reset_password_mail_sent": "Enviar correu per a restablir la contrasenya.",
"password_change": "Canvi de Contrasenya",
"new_password": "Nueva Contrasenya",
"no_email_setup": "Aquest servidor no ha activat correctament el correu.",
"verify_password": "Verifica la contrasenya",
"old_password": "Contrasenya antiga",
"forgot_password": "vaig oblidar la meva contrasenya",
"reset_password_mail_sent": "Hem enviat un missatge per correu per a restablir la contrasenya.",
"password_change": "Canvi de contrasenya",
"new_password": "Contrasenya nova",
"no_email_setup": "Aquest servidor no ha configurat correctament el correu.",
"email": "Correu electrònic",
"matrix_user_id": "Usuari Matricial",
"private_message_disclaimer":
"Avís: Els missatges privats en Lemmy no són segurs. Sisplau creu un compte en <1>Riot.im</1> per a mensajeria segura.",
"send_notifications_to_email": "Enviar notificacions al correu",
"matrix_user_id": "Usuari del Matrix",
"private_message_disclaimer": "Atenció: els missatges privats al Lemmy no són segurs. Creeu-vos un compte a <1>Riot.im</1> per a una missatgeria segura.",
"send_notifications_to_email": "Envia notificacions al correu",
"optional": "Opcional",
"expires": "Expira",
"language": "Llenguatge",
"language": "Llengua",
"browser_default": "Per defecte del navegador",
"downvotes_disabled": "Vots negatius deshabilitats",
"enable_downvotes": "Habilitar vots negatius",
"open_registration": "Obrir registre",
"registration_closed": "Registre tancat",
"enable_nsfw": "Habilitar NSFW",
"downvotes_disabled": "Vots negatius inhabilitats",
"enable_downvotes": "Habilita els vots negatius",
"open_registration": "Obre els registres",
"registration_closed": "S’han tancat els registres",
"enable_nsfw": "Habilita el contingut per a adults",
"url": "URL",
"body": "Descripció",
"copy_suggested_title": "Copiar el títol sugerido: {{title}}",
"body": "Corps",
"copy_suggested_title": "copia el títol suggerit: {{title}}",
"community": "Comunitat",
"expand_here": "Expandir ací",
"subscribe_to_communities": "Subscriure's a algunes <1>comunitats</1>.",
"chat": "Chat",
"expand_here": "Expandeix ací",
"subscribe_to_communities": "Subscriviu-vos a algunes <1>comunitats</1>.",
"chat": "Xat",
"recent_comments": "Comentaris recients",
"no_results": "Sense resultats.",
"setup": "Configurar",
"lemmy_instance_setup": "Configuració d'instancia de Lemmy",
"setup_admin": "Configurar administrador del Lloc",
"your_site": "el teu lloc",
"lemmy_instance_setup": "Configuració d’instància del Lemmy",
"setup_admin": "Configura administrador del lloc",
"your_site": "el vostre lloc",
"modified": "modificat",
"nsfw": "NSFW",
"show_nsfw": "Mostrar contingut NSFW",
"nsfw": "Per a adults",
"show_nsfw": "Mostra el contingut per a adults",
"theme": "Tema",
"sponsors": "Patrocinadors",
"sponsors_of_lemmy": "Patrocinadors de Lemmy",
"sponsor_message":
"Lemmy és programari lliure i de <1>codi obert</1>, la qual cosa significa que no tindrà publicitats, monetització, ni capitals emprenedors, mai. Les teves donacions secunden directament el desenvolupament a temps complet del projecte. Moltes gràcies a les següents persones:",
"support_on_patreon": "Suport a Patreon",
"sponsors_of_lemmy": "Patrocinadors del Lemmy",
"sponsor_message": "El Lemmy és programari lliure i de <1>codi obert</1>, la qual cosa significa que no tindrà publicitats, monetització, ni capitals emprenedors, mai. Les vostres donacions donen suport directament al desenvolupament a temps complet del projecte. Moltes gràcies a les següents persones:",
"support_on_patreon": "Suport al Patreon",
"donate_to_lemmy": "Donar a Lemmy",
"donate": "Donar",
"general_sponsors":
"Los Patrocinadores Generales son aquellos que señaron entre $10 y $39 a Lemmy.",
"donate": "Dona",
"general_sponsors": "Els patrocinadors generals són aquells que es van comprometre a donar entre 10 y 39 $ al Lemmy.",
"crypto": "Crypto",
"bitcoin": "Bitcoin",
"ethereum": "Ethereum",
@ -181,58 +183,79 @@
"by": "per",
"to": "a",
"from": "des de",
"transfer_community": "transferir comunitat",
"transfer_site": "transferir lloc",
"are_you_sure": "Ets segur?",
"transfer_community": "transfereix la comunitat",
"transfer_site": "transfereix el lloc",
"are_you_sure": "n’esteu segur?",
"yes": "sí",
"no": "no",
"powered_by": "Impulsat per",
"landing_0":
"Lemmy és un <1>agregador de links</1> / alternativa a reddit, amb la intenció de funcionar al <2>fedivers</2>.<3></3>És allotjable per un mateix (sense necessitat de grans companyies), té actualització en directe de cadenes de comentaris, i és petit (<4>~80kB</4>). Federar amb el sistema de xarxes ActivityPub forma part dels objectius del projecte. <5></5>Aquesta és una <6>versió beta molt prematura</6>, i actualment moltes de les característiques són trencades o falten. <7></7>Suggereix noves característiques o reporta errors <8>aquí</8>.<9></9>Fet amb <10>Rust</10>, <11>Actix</11>, <12>Inferno</12>, <13>Typescript</13>.",
"not_logged_in": "No has iniciat sessió.",
"logged_in": "Has iniciat sessió.",
"community_ban": "Has sigut expulsat d'aquesta comunitat.",
"site_ban": "Has sigut expulsat d'aquest lloc.",
"couldnt_create_comment": "No s'ha pogut crear el comentari.",
"couldnt_like_comment": "No s'ha pogut donar m'agrada al comentari.",
"couldnt_update_comment": "No s'ha pogut actualitzar el comentari.",
"couldnt_save_comment": "No s'ha pogut guardar el comentari.",
"no_comment_edit_allowed": "No tens permisos per a editar el comentari.",
"no_post_edit_allowed": "No tens permisos per a editar la publicació.",
"no_community_edit_allowed": "No tens permisos per a editar la comunitat.",
"couldnt_find_community": "No s'ha pogut trobar la comunitat.",
"couldnt_update_community": "No s'ha pogut actualitzar la comunitat.",
"powered_by": "Funciona amb",
"landing_0": "Lemmy és un <1>agregador de links</1> / alternativa a reddit, amb la intenció de funcionar al <2>fedivers</2>.<3></3>És allotjable per un mateix (sense necessitat de grans companyies), té actualització en directe de cadenes de comentaris, i és petit (<4>~80kB</4>). Federar amb el sistema de xarxes ActivityPub forma part dels objectius del projecte. <5></5>Aquesta és una <6>versió beta molt prematura</6>, i actualment moltes de les característiques són trencades o falten. <7></7>Suggereix noves característiques o reporta errors <8>aquí</8>.<9></9>Fet amb <10>Rust</10>, <11>Actix</11>, <12>Inferno</12>, <13>Typescript</13>.",
"not_logged_in": "No heu iniciat una sessió.",
"logged_in": "Heu iniciat una sessió.",
"community_ban": "Us han expulsat d’aquesta comunitat.",
"site_ban": "Us han expulsat del lloc",
"couldnt_create_comment": "No s’ha pogut crear el comentari.",
"couldnt_like_comment": "No s’ha pogut donar «m’agrada» al comentari.",
"couldnt_update_comment": "No s’ha pogut actualitzar el comentari.",
"couldnt_save_comment": "No s’ha pogut desar el comentari.",
"no_comment_edit_allowed": "No teniu permisos per a editar el comentari.",
"no_post_edit_allowed": "No teniu permisos per a editar l’apunt.",
"no_community_edit_allowed": "No teniu permisos per a editar la comunitat.",
"couldnt_find_community": "No s’ha pogut trobar la comunitat.",
"couldnt_update_community": "No s’ha pogut actualitzar la comunitat.",
"community_already_exists": "Aquesta comunitat ja existeix.",
"community_moderator_already_exists":
"Aquest moderador de la comunitat ja existeix.",
"community_follower_already_exists":
"Aquest seguidor de la comunitat ja existeix.",
"community_user_already_banned":
"Aquest usuari de la comunitat ja fou expulsat.",
"couldnt_create_post": "No s'ha pogut crear la publicació.",
"couldnt_like_post": "No s'ha pogut donar m'agrada a la publicació.",
"couldnt_find_post": "No s'ha pogut trobar la publicació.",
"couldnt_get_posts": "No s'han pogut obtindre les publicacions.",
"couldnt_update_post": "No s'ha pogut actualitzar la publicació.",
"couldnt_save_post": "No s'ha pogut guardar la publicació.",
"community_moderator_already_exists": "Aquest moderador de la comunitat ja existeix.",
"community_follower_already_exists": "Aquest seguidor de la comunitat ja existeix.",
"community_user_already_banned": "Aquest usuari de la comunitat ja fou expulsat.",
"couldnt_create_post": "No s’ha pogut crear l’apunt.",
"couldnt_like_post": "No s’ha pogut donar «m’agrada» a l’apunt.",
"couldnt_find_post": "No s’ha pogut trobar l’apunt.",
"couldnt_get_posts": "No s’han pogut recuperar els apunts",
"couldnt_update_post": "No s’ha pogut actualitzar l’apunt",
"couldnt_save_post": "No s’ha pogut desar l’apunt.",
"no_slurs": "Prohibit insultar.",
"not_an_admin": "No és un administrador.",
"site_already_exists": "El lloc ja existeix.",
"couldnt_update_site": "No s'ha pogut actualitzar el lloc.",
"couldnt_find_that_username_or_email":
"No s'ha pogut trobar aquest nom de usuari o correu electrònic.",
"couldnt_update_site": "No s’ha pogut actualitzar el lloc.",
"couldnt_find_that_username_or_email": "No s’ha pogut trobar aquest nom de usuari o adreça electrònica.",
"password_incorrect": "Contrasenya incorrecta.",
"passwords_dont_match": "Les contrasenyes no coincideixen.",
"admin_already_created": "Ho sentim, ja hi ha un adminisitrador.",
"user_already_exists": "L'usuari ja existeix.",
"email_already_exists": "El correu ja és en ús.",
"couldnt_update_user": "No s'ha pogut actualitzar l'usuari.",
"system_err_login":
"Error del sistema. Intenti tancar sessió i ingressar de nou.",
"couldnt_create_private_message": "No s'ha pogut crear el missatge privat.",
"no_private_message_edit_allowed":
"Sense permisos per a editar el missatge privat.",
"couldnt_update_private_message":
"No s'ha pogut actualitzar el missatge privat.",
"admin_already_created": "Disculpeu; ja hi ha un adminisitrador.",
"user_already_exists": "L’usuari ja existeix.",
"email_already_exists": "L’adreça ja és en ús.",
"couldnt_update_user": "No s’ha pogut actualitzar l’usuari.",
"system_err_login": "Error del sistema. Intenti tancar sessió i ingressar de nou.",
"couldnt_create_private_message": "No s’ha pogut crear el missatge privat.",
"no_private_message_edit_allowed": "No teniu permisos per a editar el missatge privat.",
"couldnt_update_private_message": "No s’ha pogut actualitzar el missatge privat.",
"cross_posted_to": "publicat també a: ",
"invalid_username": "El nom d’usuari no és vàlid.",
"click_to_delete_picture": "Feu clic per a suprimir la imatge.",
"picture_deleted": "S’ha suprimit la imatge.",
"invalid_community_name": "El nom no és vàlid.",
"sorting_help": "ajuda amb l’ordenament",
"old": "Antic",
"more": "més",
"show_context": "Mostra el context",
"upvote": "Dona un vot positiu",
"number_of_upvotes": "{{count}} vot positiu",
"number_of_upvotes_plural": "{{count}} vots positius",
"downvote": "Dona un vot negatiu",
"number_of_downvotes": "{{count}} vot negatiu",
"number_of_downvotes_plural": "{{count}} vots negatius",
"admin_settings": "Configuració administrativa",
"site_config": "Configuració del lloc",
"banned_users": "Usuaris expulsats",
"support_on_liberapay": "Suport al Liberapay",
"support_on_open_collective": "Suport a l’OpenCollective",
"silver_sponsors": "Els patrocinadors «silver» són els que van comprometre’s a donar 40 $ al Lemmy.",
"site_saved": "S’ha desat el lloc.",
"couldnt_get_comments": "No s’han pogut recuperar els comentaris.",
"post_title_too_long": "El títol de l’apunt és massa llarg.",
"time": "Hora",
"action": "Acció",
"emoji_picker": "Selector d’emojis",
"block_leaving": "Segur que voleu sortir?",
"select_a_community": "Seleccioneu una comunitat",
"invalid_login_credentials": "Les credencials d'inici de sessió no són vàlides"
}

11
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.",
@ -252,5 +252,10 @@
"number_of_upvotes_plural": "{{count}} Stimmen",
"number_of_downvotes": "{{count}} Gegenstimme",
"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.",
"invalid_login_credentials": "Ungültige Login-Details"
}

10
translations/el.json

@ -102,7 +102,7 @@
"category": "Κατηγορία",
"subscribers": "Εγγεγραμμένοι",
"both": "Και οι δύο",
"saved": "Αποθηκεύτηκε",
"saved": "Αποθηκευμένα",
"prev": "Προηγούμενο",
"next": "Επόμενο",
"sidebar": "Πλευρικό μενού",
@ -116,7 +116,7 @@
"mark_all_as_read": "επισήμανση όλων ως διαβασμένα",
"type": "Είδος",
"unread": "Μη διαβασμένα",
"url": "Ενιαίος Εντοπιστής Πόρων (URL)",
"url": "URL",
"subscribed": "Εγγεγραμμένος",
"week": "Εβδομάδα",
"month": "Μήνας",
@ -151,8 +151,8 @@
"reset_password_mail_sent": "Μόλις στάλθηκε ένα μήνυμα ηλεκτρονικού ταχυδρομείου για την επαναφορά του κωδικού σας.",
"password_change": "Αλλαγή κωδικού",
"new_password": "Νέος κωδικός",
"no_email_setup": "Αυτός ο διακομιστής δεν έχει εγκαταστήσει σωστά το ηλεκτρονικό ταχυδρομείο.",
"email": "Ηλεκτρονικό ταχυδρομείο",
"no_email_setup": "Αυτός ο διακομιστής δεν έχει εγκαταστήσει σωστά το email.",
"email": "Email",
"matrix_user_id": "Χρήστης Matrix",
"private_message_disclaimer": "Προσοχή: τα προσωπικά μηνύματα στο Lemmy δεν είναι ασφαλή. Παρακαλούμε δημιουργήστε έναν λογαριασμό στο <1>Riot.im</1> για ασφαλή επικοινωνία.",
"send_notifications_to_email": "Αποστολή ειδοποιήσεων στη διεύθυνση ηλεκτρονικού ταχυδρομείου",
@ -200,7 +200,7 @@
"monero": "Monero",
"code": "Κώδικας",
"by": "από",
"to": "μέχρι",
"to": "προς",
"from": "από",
"transfer_community": "μεταφορά κοινότητας",
"transfer_site": "μεταφορά ιστότοπου",

1
translations/en.json

@ -267,6 +267,7 @@
"action": "Action",
"emoji_picker": "Emoji Picker",
"block_leaving": "Are you sure you want to leave?",
"what_is": "What is",
"email_required": "Email required",
"modlog_warning": "CONTENT WARNING: Some deleted posts may contain disturbing or adult material. Proceed with caution.",
"invalid_login_credentials": "Invalid login credentials.",

237
translations/eo.json

@ -1,33 +1,34 @@
{
"post": "Poŝti",
"remove_post": "Fortiri Poŝton",
"no_posts": "Ne Poŝtoj.",
"create_a_post": "Verki Poŝton",
"create_post": "Verki Poŝton",
"number_of_posts": "{{count}} Poŝtoj",
"posts": "Poŝtoj",
"related_posts": "Tiuj poŝtoj eble rilatas",
"cross_posts": "Tiuj ligilo ankaŭ estas poŝtinta al:",
"cross_post": "laŭapoŝto",
"post": "Afiŝi",
"remove_post": "Forigi afiŝon",
"no_posts": "Neniuj afiŝoj.",
"create_a_post": "Verki afiŝon",
"create_post": "Verki afiŝon",
"number_of_posts": "{{count}} afiŝo",
"number_of_posts_plural": "{{count}} afiŝoj",
"posts": "Afiŝoj",
"related_posts": "Ĉi tiuj afiŝoj eble rilatas",
"cross_posts": "Tiu ligilo ankaŭ estas afiŝita al:",
"cross_post": "transafiŝo",
"comments": "Komentoj",
"number_of_comments": "{{count}} Komento",
"number_of_comments_plural": "{{count}} Komentoj",
"remove_comment": "Fortiri Komentojn",
"number_of_comments": "{{count}} komento",
"number_of_comments_plural": "{{count}} komentoj",
"remove_comment": "Forigi komenton",
"communities": "Komunumoj",
"users": "Uzantoj",
"create_a_community": "Krei komunumon",
"create_community": "Krei Komunumon",
"remove_community": "Forigi Komunumon",
"subscribed_to_communities": "Abonita al <1>komunumoj</1>",
"trending_communities": "Furora <1>komunumoj</1>",
"create_community": "Krei komunumon",
"remove_community": "Forigi komunumon",
"subscribed_to_communities": "Abonanta <1>komunumojn</1>",
"trending_communities": "Furoraj <1>komunumoj</1>",
"list_of_communities": "Listo de komunumoj",
"community_reqs": "minusklaj leteroj, substrekoj, kaj ne spacetoj.",
"community_reqs": "minusklaj literoj, substrekoj, kaj neniuj spacetoj.",
"edit": "redakti",
"reply": "repliki",
"cancel": "nuligi",
"reply": "respondi",
"cancel": "Nuligi",
"unlock": "malŝlosi",
"lock": "ŝlosi",
"link": "ligi",
"link": "ligilo",
"mod": "moderanto",
"mods": "moderantoj",
"moderates": "Moderigas",
@ -37,17 +38,17 @@
"modlog": "Moderlogo",
"admin": "administranto",
"admins": "administrantoj",
"remove_as_admin": "forigi per administranto",
"appoint_as_admin": "nomumi per administranto",
"remove": "fortiri",
"remove_as_admin": "forigi kiel administranto",
"appoint_as_admin": "nomumi administranto",
"remove": "forigi",
"removed": "fortirita",
"locked": "ŝlosita",
"reason": "Kialo",
"mark_as_read": "marki kiel legita",
"mark_as_unread": "marki kiel nelegita",
"mark_as_read": "marki legita",
"mark_as_unread": "marki nelegita",
"delete": "forigi",
"deleted": "forigita",
"restore": "restaŭri",
"deleted": "forigita de la kreinto",
"restore": "revenigi",
"ban": "forbari",
"ban_from_site": "forbari de retejo",
"unban": "malforbari",
@ -55,11 +56,14 @@
"save": "konservi",
"unsave": "malkonservi",
"create": "krei",
"username": "Uzantnomo",
"email_or_username": "Retadreso aŭ Uzantnomo",
"number_of_users": "{{count}} Uzantoj",
"number_of_subscribers": "{{count}} Abonantoj",
"number_of_points": "{{count}} Voĉdonoj",
"username": "Uzantonomo",
"email_or_username": "Retpoŝtadreso aŭ uzantonomo",
"number_of_users": "{{count}} uzanto",
"number_of_users_plural": "{{count}} uzantoj",
"number_of_subscribers": "{{count}} abonanto",
"number_of_subscribers_plural": "{{count}} abonantoj",
"number_of_points": "{{count}} voĉdono",
"number_of_points_plural": "{{count}} voĉdonoj",
"name": "Nomo",
"title": "Titolo",
"category": "Kategorio",
@ -69,10 +73,10 @@
"unsubscribe": "Malaboni",
"subscribe": "Aboni",
"subscribed": "Abonita",
"prev": "Antaŭe",
"next": "Poste",
"sidebar": "Flankstango",
"sort_type": "Klasi per kia",
"prev": "Malpluen",
"next": "Pluen",
"sidebar": "Flankobreto",
"sort_type": "Ordigilo",
"hot": "Varmaj",
"new": "Novaj",
"top_day": "Supraj tagaj",
@ -84,46 +88,46 @@
"api": "API",
"inbox": "Ricevujo",
"inbox_for": "Ricevujo de <1>{{user}}</1>",
"mark_all_as_read": "marki ĉiujn kiel legitaj",
"mark_all_as_read": "marki ĉiujn legitaj",
"type": "Tipo",
"unread": "Nelegitaj",
"reply_sent": "Repliko sendis",
"reply_sent": "Respondo sendiĝis",
"search": "Serĉi",
"overview": "Resumo",
"view": "Rigardi",
"logout": "Elsaluti",
"login_sign_up": "Ensaluti / Registriĝi",
"login": "Ensaluti",
"logout": "Adiaŭi",
"login_sign_up": "Saluti / Registriĝi",
"login": "Saluti",
"sign_up": "Registriĝi",
"notifications_error": "Labortablaj avizoj estas nehavebla en via retumilo. Provu Firefox-on aŭ Chrome-on.",
"unread_messages": "Nelegitaj Mesaĝoj",
"notifications_error": "Labortablaj avizoj estas nehaveblaj en via foliumilo. Provu foliumilojn Firefox aŭ Chrome.",
"unread_messages": "Nelegitaj mesaĝoj",
"password": "Pasvorto",
"verify_password": "Konfirmu Vian Pasvorton",