This are all the commits from another PR combined into a single commit.
return (
<div class="container">
{this.state.loading ? (
- <h5 class="">
+ <p class="text-center">
<svg class="icon icon-spinner spin">
<use xlinkHref="#icon-spinner"></use>
</svg>
- </h5>
+ </p>
) : (
<div>
<h5>
- <T i18nKey="list_of_communities">#</T>
+ { i18n.t('list_of_communities') }
</h5>
<div class="table-responsive">
<table id="community_table" class="table table-sm table-hover">
<thead class="pointer">
<tr>
<th>
- <T i18nKey="name">#</T>
+ { i18n.t('name') }
</th>
<th class="d-none d-lg-table-cell">
- <T i18nKey="title">#</T>
+ { i18n.t('title') }
</th>
<th>
- <T i18nKey="category">#</T>
+ { i18n.t('category') }
</th>
<th class="text-right">
- <T i18nKey="subscribers">#</T>
+ { i18n.t('subscribers') }
</th>
<th class="text-right d-none d-lg-table-cell">
- <T i18nKey="posts">#</T>
+ { i18n.t('posts') }
</th>
<th class="text-right d-none d-lg-table-cell">
- <T i18nKey="comments">#</T>
+ { i18n.t('comments') }
</th>
<th></th>
</tr>
this.handleSubscribe
)}
>
- <T i18nKey="subscribe">#</T>
+ { i18n.t('subscribe') }
</span>
)}
</td>
class="btn btn-sm btn-secondary mr-1"
onClick={linkEvent(this, this.prevPage)}
>
- <T i18nKey="prev">#</T>
+ { i18n.t('prev') }
</button>
)}
+
{this.state.communities.length == communityLimit && (
<button
class="btn btn-sm btn-secondary"
onClick={linkEvent(this, this.nextPage)}
>
- <T i18nKey="next">#</T>
+ { i18n.t('next') }
</button>
)}
</div>
return (
<form onSubmit={linkEvent(this, this.handleCreateCommunitySubmit)}>
<div class="form-group row">
- <label class="col-12 col-form-label">
- <T i18nKey="name">#</T>
+ <label class="col-12 col-form-label" for="community-name">
+ { i18n.t('name') }
</label>
<div class="col-12">
<input
type="text"
+ id="community-name"
class="form-control"
value={this.state.communityForm.name}
onInput={linkEvent(this, this.handleCommunityNameChange)}
/>
</div>
</div>
+
<div class="form-group row">
- <label class="col-12 col-form-label">
- <T i18nKey="title">#</T>
+ <label class="col-12 col-form-label" for="community-title">
+ { i18n.t('title') }
</label>
<div class="col-12">
<input
type="text"
+ id="community-title"
value={this.state.communityForm.title}
onInput={linkEvent(this, this.handleCommunityTitleChange)}
class="form-control"
</div>
</div>
<div class="form-group row">
- <label class="col-12 col-form-label">
- <T i18nKey="sidebar">#</T>
+ <label class="col-12 col-form-label" for="community-sidebar">
+ { i18n.t('sidebar') }
</label>
<div class="col-12">
<textarea
id={this.id}
value={this.state.communityForm.description}
+ id="community-sidebar"
onInput={linkEvent(this, this.handleCommunityDescriptionChange)}
class="form-control"
rows={3}
</div>
</div>
<div class="form-group row">
- <label class="col-12 col-form-label">
- <T i18nKey="category">#</T>
+ <label class="col-12 col-form-label" for="community-category">
+ { i18n.t('category') }
</label>
<div class="col-12">
<select
class="form-control"
+ id="community-category"
value={this.state.communityForm.category_id}
onInput={linkEvent(this, this.handleCommunityCategoryChange)}
>
<div class="form-check">
<input
class="form-check-input"
+ id="community-nsfw"
type="checkbox"
checked={this.state.communityForm.nsfw}
onChange={linkEvent(this, this.handleCommunityNsfwChange)}
/>
- <label class="form-check-label">
- <T i18nKey="nsfw">#</T>
+ <label class="form-check-label" for="community-nsfw">
+ { i18n.t('nsfw') }
</label>
</div>
</div>
class="btn btn-secondary"
onClick={linkEvent(this, this.handleCancel)}
>
- <T i18nKey="cancel">#</T>
+ { i18n.t('cancel') }
</button>
)}
</div>
return (
<div class="container">
{this.state.loading ? (
- <h5>
+ <p class="text-center">
<svg class="icon icon-spinner spin">
<use xlinkHref="#icon-spinner"></use>
</svg>
- </h5>
+ </p>
) : (
<div class="row">
<div class="col-12 col-md-8">
{this.state.community.title}
{this.state.community.removed && (
<small className="ml-2 text-muted font-italic">
- <T i18nKey="removed">#</T>
+ { i18n.t('removed') }
</small>
)}
{this.state.community.nsfw && (
<small className="ml-2 text-muted font-italic">
- <T i18nKey="nsfw">#</T>
+ { i18n.t('nsfw') }
</small>
)}
</h5>
class="btn btn-sm btn-secondary mr-1"
onClick={linkEvent(this, this.prevPage)}
>
- <T i18nKey="prev">#</T>
+ { i18n.t('prev') }
</button>
)}
{this.state.posts.length == fetchLimit && (
class="btn btn-sm btn-secondary"
onClick={linkEvent(this, this.nextPage)}
>
- <T i18nKey="next">#</T>
+ { i18n.t('next') }
</button>
)}
</div>
<div class="row">
<div class="col-12 col-lg-6 offset-lg-3 mb-4">
<h5>
- <T i18nKey="create_community">#</T>
+ { i18n.t('create_community') }
</h5>
<CommunityForm onCreate={this.handleCommunityCreate} />
</div>
<div class="row">
<div class="col-12 col-lg-6 offset-lg-3 mb-4">
<h5>
- <T i18nKey="create_post">#</T>
+ { i18n.t('create_post') }
</h5>
<PostForm onCreate={this.handlePostCreate} params={this.params} />
</div>
import { Link } from 'inferno-router';
import { repoUrl } from '../utils';
import { version } from '../version';
-import { T } from 'inferno-i18next';
+import { i18n } from '../i18next';
export class Footer extends Component<any, any> {
constructor(props: any, context: any) {
</li>
<li class="nav-item">
<Link class="nav-link" to="/modlog">
- <T i18nKey="modlog">#</T>
+ { i18n.t('modlog') }
</Link>
</li>
<li class="nav-item">
<a class="nav-link" href={'/docs/index.html'}>
- <T i18nKey="docs">#</T>
+ { i18n.t('docs') }
</a>
</li>
<li class="nav-item">
<Link class="nav-link" to="/sponsors">
- <T i18nKey="donate">#</T>
+ { i18n.t('donate') }
</Link>
</li>
<li class="nav-item">
<a class="nav-link" href={repoUrl}>
- <T i18nKey="code">#</T>
+ { i18n.t('code') }
</a>
</li>
</ul>
<ul class="list-inline mb-1 text-muted small font-weight-bold">
<li className="list-inline-item">
<span class="pointer" onClick={this.markAllAsRead}>
- <T i18nKey="mark_all_as_read">#</T>
+ { i18n.t('mark_all_as_read') }
</span>
</li>
</ul>
class="custom-select custom-select-sm w-auto mr-2"
>
<option disabled>
- <T i18nKey="type">#</T>
+ { i18n.t('type') }
+
</option>
<option value={UnreadOrAll.Unread}>
- <T i18nKey="unread">#</T>
+ { i18n.t('unread') }
</option>
<option value={UnreadOrAll.All}>
- <T i18nKey="all">#</T>
+ { i18n.t('all') }
</option>
</select>
<select
class="custom-select custom-select-sm w-auto mr-2"
>
<option disabled>
- <T i18nKey="type">#</T>
+ { i18n.t('type') }
</option>
<option value={UnreadType.All}>
- <T i18nKey="all">#</T>
+ { i18n.t('all') }
+ </option>
+ <option value={UnreadType.Both}>
+ { i18n.t('both') }
</option>
<option value={UnreadType.Replies}>
- <T i18nKey="replies">#</T>
+ { i18n.t('replies') }
</option>
<option value={UnreadType.Mentions}>
- <T i18nKey="mentions">#</T>
+ { i18n.t('mentions') }
</option>
<option value={UnreadType.Messages}>
- <T i18nKey="messages">#</T>
+ { i18n.t('messages') }
</option>
</select>
<SortSelect
class="btn btn-sm btn-secondary mr-1"
onClick={linkEvent(this, this.prevPage)}
>
- <T i18nKey="prev">#</T>
+ { i18n.t('prev') }
</button>
)}
<button
class="btn btn-sm btn-secondary"
onClick={linkEvent(this, this.nextPage)}
>
- <T i18nKey="next">#</T>
+ { i18n.t('next') }
</button>
</div>
);
return (
<div>
<form onSubmit={linkEvent(this, this.handleLoginSubmit)}>
- <h5>Login</h5>
+ <h2>{ i18n.t('login') }</h2>
<div class="form-group row">
- <label class="col-sm-2 col-form-label">
- <T i18nKey="email_or_username">#</T>
+ <label class="col-sm-2 col-form-label" for="login-email-or-username">
+ { i18n.t('email_or_username') }
</label>
<div class="col-sm-10">
<input
type="text"
class="form-control"
+ id="login-email-or-username"
value={this.state.loginForm.username_or_email}
onInput={linkEvent(this, this.handleLoginUsernameChange)}
required
</div>
</div>
<div class="form-group row">
- <label class="col-sm-2 col-form-label">
- <T i18nKey="password">#</T>
+ <label class="col-sm-2 col-form-label" for="login-password">
+ { i18n.t('password') }
</label>
<div class="col-sm-10">
<input
type="password"
+ id="login-password"
value={this.state.loginForm.password}
onInput={linkEvent(this, this.handleLoginPasswordChange)}
class="form-control"
onClick={linkEvent(this, this.handlePasswordReset)}
className="btn p-0 btn-link d-inline-block float-right text-muted small font-weight-bold"
>
- <T i18nKey="forgot_password">#</T>
+ { i18n.t('forgot_password') }
</button>
</div>
</div>
registerForm() {
return (
<form onSubmit={linkEvent(this, this.handleRegisterSubmit)}>
- <h5>
- <T i18nKey="sign_up">#</T>
- </h5>
+ <h2>
+ { i18n.t('sign_up') }
+ </h2>
+
<div class="form-group row">
- <label class="col-sm-2 col-form-label">
- <T i18nKey="username">#</T>
+ <label class="col-sm-2 col-form-label" for="register-username">
+ { i18n.t('username') }
</label>
+
<div class="col-sm-10">
<input
type="text"
+ id="register-username"
class="form-control"
value={this.state.registerForm.username}
onInput={linkEvent(this, this.handleRegisterUsernameChange)}
/>
</div>
</div>
+
<div class="form-group row">
- <label class="col-sm-2 col-form-label">
- <T i18nKey="email">#</T>
+ <label class="col-sm-2 col-form-label" for="register-email">
+ { i18n.t('email') }
</label>
<div class="col-sm-10">
<input
type="email"
+ id="register-email"
class="form-control"
placeholder={i18n.t('optional')}
value={this.state.registerForm.email}
/>
</div>
</div>
+
<div class="form-group row">
- <label class="col-sm-2 col-form-label">
- <T i18nKey="password">#</T>
+ <label class="col-sm-2 col-form-label" for="register-password">
+ { i18n.t('password') }
</label>
<div class="col-sm-10">
<input
type="password"
+ id="register-password"
value={this.state.registerForm.password}
onInput={linkEvent(this, this.handleRegisterPasswordChange)}
class="form-control"
/>
</div>
</div>
+
<div class="form-group row">
- <label class="col-sm-2 col-form-label">
- <T i18nKey="verify_password">#</T>
+ <label class="col-sm-2 col-form-label" for="register-verify-password">
+ { i18n.t('verify_password') }
</label>
<div class="col-sm-10">
<input
type="password"
+ id="register-verify-password"
value={this.state.registerForm.password_verify}
onInput={linkEvent(this, this.handleRegisterPasswordVerifyChange)}
class="form-control"
/>
</div>
</div>
- {this.state.enable_nsfw && (
+
+ { this.state.enable_nsfw && (
<div class="form-group row">
<div class="col-sm-10">
<div class="form-check">
<input
class="form-check-input"
+ id="register-show-nsfw"
type="checkbox"
checked={this.state.registerForm.show_nsfw}
onChange={linkEvent(this, this.handleRegisterShowNsfwChange)}
/>
- <label class="form-check-label">
- <T i18nKey="show_nsfw">#</T>
+ <label class="form-check-label" for="register-show-nsfw">
+ { i18n.t('show_nsfw') }
</label>
</div>
</div>
return (
<div class="container">
<div class="row">
- <div class="col-12 col-md-8">{this.posts()}</div>
- <div class="col-12 col-md-4">{this.my_sidebar()}</div>
+ <main role="main" class="col-12 col-md-8">{this.posts()}</main>
+ <aside class="col-12 col-md-4">{this.my_sidebar()}</aside>
</div>
</div>
);
posts() {
return (
- <div>
+ <div class="main-content-wrapper">
{this.state.loading ? (
- <h5>
+ <p class="text-center">
<svg class="icon icon-spinner spin">
<use xlinkHref="#icon-spinner"></use>
</svg>
- </h5>
+ </p>
) : (
<div>
{this.selects()}
return (
<div class="container">
{this.state.loading ? (
- <h5 class="">
+ <h5 class="text-center">
<svg class="icon icon-spinner spin">
<use xlinkHref="#icon-spinner"></use>
</svg>
/c/{this.state.communityName}{' '}
</Link>
)}
- <span>Modlog</span>
+ <span>{ i18n.t('modlog') }</span>
</h5>
<div class="table-responsive">
<table id="modlog_table" class="table table-sm table-hover">
<thead class="pointer">
<tr>
- <th>Time</th>
- <th>Mod</th>
- <th>Action</th>
+ <th> { i18n.t('time')}</th>
+ <th>{ i18n.t('mod')}</th>
+ <th>{ i18n.t('action')}</th>
</tr>
</thead>
{this.combined()}
class="btn btn-sm btn-secondary mr-1"
onClick={linkEvent(this, this.prevPage)}
>
- Prev
+ { i18n.t('prev') }
</button>
)}
<button
class="btn btn-sm btn-secondary"
onClick={linkEvent(this, this.nextPage)}
>
- Next
+ { i18n.t('next') }
</button>
</div>
);
<button
class="navbar-toggler"
type="button"
+ aria-label="menu"
onClick={linkEvent(this, this.expandNavbar)}
>
<span class="navbar-toggler-icon"></span>
<ul class="navbar-nav mr-auto">
<li class="nav-item">
<Link class="nav-link" to="/communities">
- <T i18nKey="communities">#</T>
+ { i18n.t('communities') }
</Link>
</li>
<li class="nav-item">
<Link class="nav-link" to="/search">
- <T i18nKey="search">#</T>
+ { i18n.t('search') }
</Link>
</li>
<li class="nav-item">
state: { prevPath: this.currentLocation },
}}
>
- <T i18nKey="create_post">#</T>
+ { i18n.t('create_post') }
</Link>
</li>
<li class="nav-item">
<Link class="nav-link" to="/create_community">
- <T i18nKey="create_community">#</T>
+ { i18n.t('create_community') }
</Link>
</li>
<li className="nav-item">
<Link
- class="nav-link"
+ class="nav-link ml-2"
to="/sponsors"
title={i18n.t('donate_to_lemmy')}
>
</>
) : (
<Link class="nav-link" to="/login">
- <T i18nKey="login_sign_up">#</T>
+ { i18n.t('login_sign_up') }
</Link>
)}
</ul>
<div class="row">
<div class="col-12 col-lg-6 offset-lg-3 mb-4">
<h5>
- <T i18nKey="password_change">#</T>
+ { i18n.t('password_change') }
</h5>
{this.passwordChangeForm()}
</div>
<div>
<form onSubmit={linkEvent(this, this.handlePostSubmit)}>
<div class="form-group row">
- <label class="col-sm-2 col-form-label">
- <T i18nKey="url">#</T>
+ <label class="col-sm-2 col-form-label" for="post-url">
+ { i18n.t('url') }
</label>
<div class="col-sm-10">
<input
type="url"
+ id="post-url"
class="form-control"
value={this.state.postForm.url}
onInput={linkEvent(this, this.handlePostUrlChange)}
className={`${UserService.Instance.user &&
'pointer'} d-inline-block mr-2 float-right text-muted small font-weight-bold`}
>
- <T i18nKey="upload_image">#</T>
+ { i18n.t('upload_image') }
</label>
<input
id="file-upload"
target="_blank"
class="mr-2 d-inline-block float-right text-muted small font-weight-bold"
>
- <T i18nKey="archive_link">#</T>
+ { i18n.t('archive_link') }
</a>
)}
{this.state.imageLoading && (
{this.state.crossPosts.length > 0 && (
<>
<div class="my-1 text-muted small font-weight-bold">
- <T i18nKey="cross_posts">#</T>
+ { i18n.t('cross_posts') }
</div>
<PostListings showCommunity posts={this.state.crossPosts} />
</>
</div>
</div>
<div class="form-group row">
- <label class="col-sm-2 col-form-label">
- <T i18nKey="title">#</T>
+ <label class="col-sm-2 col-form-label" for="post-title">
+ { i18n.t('title') }
</label>
<div class="col-sm-10">
<textarea
value={this.state.postForm.name}
+ id="post-title"
onInput={linkEvent(this, this.handlePostNameChange)}
class="form-control"
required
{this.state.suggestedPosts.length > 0 && (
<>
<div class="my-1 text-muted small font-weight-bold">
- <T i18nKey="related_posts">#</T>
+ { i18n.t('related_posts') }
</div>
<PostListings posts={this.state.suggestedPosts} />
</>
)}
</div>
</div>
+
<div class="form-group row">
- <label class="col-sm-2 col-form-label">
- <T i18nKey="body">#</T>
+ <label class="col-sm-2 col-form-label" for="post-body">
+ { i18n.t('body') }
</label>
<div class="col-sm-10">
<textarea
id={this.id}
value={this.state.postForm.body}
+ id="post-body"
onInput={linkEvent(this, this.handlePostBodyChange)}
className={`form-control ${this.state.previewMode && 'd-none'}`}
rows={4}
.previewMode && 'active'}`}
onClick={linkEvent(this, this.handlePreviewToggle)}
>
- <T i18nKey="preview">#</T>
+ { i18n.t('preview') }
</button>
)}
<a
target="_blank"
class="d-inline-block float-right text-muted small font-weight-bold"
>
- <T i18nKey="formatting_help">#</T>
+ { i18n.t('formatting_help') }
</a>
</div>
</div>
{!this.props.post && (
<div class="form-group row">
- <label class="col-sm-2 col-form-label">
- <T i18nKey="community">#</T>
+ <label class="col-sm-2 col-form-label" for="post-community">
+ { i18n.t('community') }
</label>
<div class="col-sm-10">
<select
class="form-control"
+ id="post-community"
value={this.state.postForm.community_id}
onInput={linkEvent(this, this.handlePostCommunityChange)}
>
<div class="form-check">
<input
class="form-check-input"
+ id="post-nsfw"
type="checkbox"
checked={this.state.postForm.nsfw}
onChange={linkEvent(this, this.handlePostNsfwChange)}
/>
- <label class="form-check-label">
- <T i18nKey="nsfw">#</T>
+ <label class="form-check-label" for="post-nsfw">
+ { i18n.t('nsfw') }
</label>
</div>
</div>
class="btn btn-secondary"
onClick={linkEvent(this, this.handleCancel)}
>
- <T i18nKey="cancel">#</T>
+ { i18n.t('cancel') }
</button>
)}
</div>
)}
{post.removed && (
<small className="ml-2 text-muted font-italic">
- <T i18nKey="removed">#</T>
+ { i18n.t('removed') }
</small>
)}
{post.deleted && (
<small className="ml-2 text-muted font-italic">
- <T i18nKey="deleted">#</T>
+ { i18n.t('deleted') }
</small>
)}
{post.locked && (
<small className="ml-2 text-muted font-italic">
- <T i18nKey="locked">#</T>
+ { i18n.t('locked') }
</small>
)}
{post.stickied && (
<small className="ml-2 text-muted font-italic">
- <T i18nKey="stickied">#</T>
+ { i18n.t('stickied') }
</small>
)}
{post.nsfw && (
<small className="ml-2 text-muted font-italic">
- <T i18nKey="nsfw">#</T>
+ { i18n.t('nsfw') }
</small>
)}
</div>
</Link>
{this.isMod && (
<span className="mx-1 badge badge-light">
- <T i18nKey="mod">#</T>
+ { i18n.t('mod') }
</span>
)}
{this.isAdmin && (
<span className="mx-1 badge badge-light">
- <T i18nKey="admin">#</T>
+ { i18n.t('admin') }
</span>
)}
{(post.banned_from_community || post.banned) && (
<span className="mx-1 badge badge-danger">
- <T i18nKey="banned">#</T>
+ { i18n.t('banned') }
</span>
)}
{this.props.showCommunity && (
class="pointer"
onClick={linkEvent(this, this.handleModRemoveShow)}
>
- <T i18nKey="remove">#</T>
+ { i18n.t('remove') }
</span>
) : (
<span
class="pointer"
onClick={linkEvent(this, this.handleModRemoveSubmit)}
>
- <T i18nKey="restore">#</T>
+ { i18n.t('restore') }
</span>
)}
</li>
this.handleModBanFromCommunityShow
)}
>
- <T i18nKey="ban">#</T>
+ { i18n.t('ban') }
</span>
) : (
<span
this.handleModBanFromCommunitySubmit
)}
>
- <T i18nKey="unban">#</T>
+ { i18n.t('unban') }
</span>
)}
</li>
this.handleTransferCommunity
)}
>
- <T i18nKey="yes">#</T>
+ { i18n.t('yes') }
</span>
<span
class="pointer d-inline-block"
this.handleCancelShowConfirmTransferCommunity
)}
>
- <T i18nKey="no">#</T>
+ { i18n.t('no') }
</span>
</>
)}
class="pointer"
onClick={linkEvent(this, this.handleModBanShow)}
>
- <T i18nKey="ban_from_site">#</T>
+ { i18n.t('ban_from_site') }
</span>
) : (
<span
class="pointer"
onClick={linkEvent(this, this.handleModBanSubmit)}
>
- <T i18nKey="unban_from_site">#</T>
+ { i18n.t('unban_from_site') }
</span>
)}
</li>
this.handleShowConfirmTransferSite
)}
>
- <T i18nKey="transfer_site">#</T>
+ { i18n.t('transfer_site') }
</span>
) : (
<>
<span class="d-inline-block mr-1">
- <T i18nKey="are_you_sure">#</T>
+ { i18n.t('are_you_sure') }
</span>
<span
class="pointer d-inline-block mr-1"
onClick={linkEvent(this, this.handleTransferSite)}
>
- <T i18nKey="yes">#</T>
+ { i18n.t('yes') }
</span>
<span
class="pointer d-inline-block"
this.handleCancelShowConfirmTransferSite
)}
>
- <T i18nKey="no">#</T>
+ { i18n.t('no') }
</span>
</>
)}
className="pointer"
onClick={linkEvent(this, this.handleViewSource)}
>
- <T i18nKey="view_source">#</T>
+ { i18n.t('view_source') }
</span>
</li>
)}
onInput={linkEvent(this, this.handleModRemoveReasonChange)}
/>
<button type="submit" class="btn btn-secondary">
- <T i18nKey="remove_post">#</T>
+ { i18n.t('remove_post') }
</button>
</form>
)}
{this.state.showBanDialog && (
<form onSubmit={linkEvent(this, this.handleModBanBothSubmit)}>
<div class="form-group row">
- <label class="col-form-label">
- <T i18nKey="reason">#</T>
+ <label class="col-form-label" for="post-listing-reason">
+ { i18n.t('reason') }
</label>
<input
type="text"
+ id="post-listing-reason"
class="form-control mr-2"
placeholder={i18n.t('reason')}
value={this.state.banReason}
import { Link } from 'inferno-router';
import { Post } from '../interfaces';
import { PostListing } from './post-listing';
+import { i18n } from '../i18next';
import { T } from 'inferno-i18next';
interface PostListingsProps {
))
) : (
<>
- <div>
- <T i18nKey="no_posts">#</T>
- </div>
+ <h2>
+ { i18n.t('no_posts') }
+ </h2>
{this.props.showCommunity !== undefined && (
<div>
- <T i18nKey="subscribe_to_communities">
- #<Link to="/communities">#</Link>
- </T>
+ <Link to="/communities">{ i18n.t('subscribe_to_communities') }</Link>
</div>
)}
</>
return (
<div class="container">
{this.state.loading ? (
- <h5>
+ <p class="text-center">
<svg class="icon icon-spinner spin">
<use xlinkHref="#icon-spinner"></use>
</svg>
- </h5>
+ </p>
) : (
<div class="row">
<div class="col-12 col-md-8 mb-3">
{this.state.crossPosts.length > 0 && (
<>
<div class="my-1 text-muted small font-weight-bold">
- <T i18nKey="cross_posts">#</T>
+ { i18n.t('cross_posts') }
</div>
<PostListings showCommunity posts={this.state.crossPosts} />
</>
onChange={linkEvent(this, this.handleCommentSortChange)}
/>
</label>
- <label
- className={`btn btn-sm btn-secondary pointer ${this.state
- .commentSort === CommentSortType.Old && 'active'}`}
- >
- {i18n.t('old')}
- <input
- type="radio"
- value={CommentSortType.Old}
- checked={this.state.commentSort === CommentSortType.Old}
- onChange={linkEvent(this, this.handleCommentSortChange)}
- />
- </label>
</div>
);
}
<div class="d-none d-md-block new-comments mb-3 card border-secondary">
<div class="card-body small">
<h6>
- <T i18nKey="recent_comments">#</T>
+ { i18n.t('recent_comments') }
</h6>
{this.state.comments.map(comment => (
<CommentNodes
+a.comment.deleted - +b.comment.deleted ||
b.comment.published.localeCompare(a.comment.published)
);
- } else if (this.state.commentSort == CommentSortType.Old) {
- tree.sort(
- (a, b) =>
- +a.comment.removed - +b.comment.removed ||
- +a.comment.deleted - +b.comment.deleted ||
- a.comment.published.localeCompare(b.comment.published)
- );
} else if (this.state.commentSort == CommentSortType.Hot) {
tree.sort(
(a, b) =>
return (
<div class="container">
<h5>
- <T i18nKey="search">#</T>
+ { i18n.t('search') }
</h5>
{this.selects()}
{this.searchForm()}
</svg>
) : (
<span>
- <T i18nKey="search">#</T>
+ { i18n.t('search') }
</span>
)}
</button>
class="custom-select custom-select-sm w-auto"
>
<option disabled>
- <T i18nKey="type">#</T>
+ { i18n.t('type') }
</option>
<option value={SearchType.All}>
- <T i18nKey="all">#</T>
+ { i18n.t('all') }
</option>
<option value={SearchType.Comments}>
- <T i18nKey="comments">#</T>
+ { i18n.t('comments') }
</option>
<option value={SearchType.Posts}>
- <T i18nKey="posts">#</T>
+ { i18n.t('posts') }
</option>
<option value={SearchType.Communities}>
- <T i18nKey="communities">#</T>
+ { i18n.t('communities') }
</option>
<option value={SearchType.Users}>
- <T i18nKey="users">#</T>
+ { i18n.t('users') }
</option>
</select>
<span class="ml-2">
class="btn btn-sm btn-secondary mr-1"
onClick={linkEvent(this, this.prevPage)}
>
- <T i18nKey="prev">#</T>
+ { i18n.t('prev') }
</button>
)}
<button
class="btn btn-sm btn-secondary"
onClick={linkEvent(this, this.nextPage)}
>
- <T i18nKey="next">#</T>
+ { i18n.t('next') }
</button>
</div>
);
res.communities.length == 0 &&
res.users.length == 0 && (
<span>
- <T i18nKey="no_results">#</T>
+ { i18n.t('no_results') }
</span>
)}
</div>
<div class="row">
<div class="col-12 offset-lg-3 col-lg-6">
<h3>
- <T i18nKey="lemmy_instance_setup">#</T>
+ { i18n.t('lemmy_instance_setup') }
</h3>
{!this.state.doneRegisteringUser ? (
this.registerUser()
registerUser() {
return (
<form onSubmit={linkEvent(this, this.handleRegisterSubmit)}>
- <h5>
- <T i18nKey="setup_admin">#</T>
- </h5>
+ <h4>{ i18n.t('setup_admin')}</h4>
<div class="form-group row">
- <label class="col-sm-2 col-form-label">
- <T i18nKey="username">#</T>
+ <label class="col-sm-2 col-form-label" for="username">
+ { i18n.t('username') }
</label>
<div class="col-sm-10">
<input
type="text"
class="form-control"
+ id="username"
value={this.state.userForm.username}
onInput={linkEvent(this, this.handleRegisterUsernameChange)}
required
</div>
</div>
<div class="form-group row">
- <label class="col-sm-2 col-form-label">
- <T i18nKey="email">#</T>
+ <label class="col-sm-2 col-form-label" for="email">
+ { i18n.t('email') }
</label>
+
<div class="col-sm-10">
<input
type="email"
+ id="email"
class="form-control"
placeholder={i18n.t('optional')}
value={this.state.userForm.email}
</div>
</div>
<div class="form-group row">
- <label class="col-sm-2 col-form-label">
- <T i18nKey="password">#</T>
+ <label class="col-sm-2 col-form-label" for="password">
+ { i18n.t('password')}
</label>
<div class="col-sm-10">
<input
type="password"
+ id="password"
value={this.state.userForm.password}
onInput={linkEvent(this, this.handleRegisterPasswordChange)}
class="form-control"
</div>
</div>
<div class="form-group row">
- <label class="col-sm-2 col-form-label">
- <T i18nKey="verify_password">#</T>
+ <label class="col-sm-2 col-form-label" for="verify-password">
+ { i18n.t('verify_password') }
</label>
<div class="col-sm-10">
<input
type="password"
+ id="verify-password"
value={this.state.userForm.password_verify}
onInput={linkEvent(this, this.handleRegisterPasswordVerifyChange)}
class="form-control"
<span>{community.title}</span>
{community.removed && (
<small className="ml-2 text-muted font-italic">
- <T i18nKey="removed">#</T>
+ { i18n.t('removed') }
</small>
)}
{community.deleted && (
class="pointer"
onClick={linkEvent(this, this.handleEditClick)}
>
- <T i18nKey="edit">#</T>
+ { i18n.t('edit') }
</span>
</li>
{this.amCreator && (
class="pointer"
onClick={linkEvent(this, this.handleModRemoveShow)}
>
- <T i18nKey="remove">#</T>
+ { i18n.t('remove') }
</span>
) : (
<span
class="pointer"
onClick={linkEvent(this, this.handleModRemoveSubmit)}
>
- <T i18nKey="restore">#</T>
+ { i18n.t('restore') }
</span>
)}
</li>
{this.state.showRemoveDialog && (
<form onSubmit={linkEvent(this, this.handleModRemoveSubmit)}>
<div class="form-group row">
- <label class="col-form-label">
- <T i18nKey="reason">#</T>
+ <label class="col-form-label" for="remove-reason">
+ { i18n.t('reason') }
</label>
<input
type="text"
+ id="remove-reason"
class="form-control mr-2"
placeholder={i18n.t('optional')}
value={this.state.removeReason}
{/* </div> */}
<div class="form-group row">
<button type="submit" class="btn btn-secondary">
- <T i18nKey="remove_community">#</T>
+ { i18n.t('remove_community') }
</button>
</div>
</form>
'no-click'}`}
to={`/create_post?community=${community.name}`}
>
- <T i18nKey="create_a_post">#</T>
+ { i18n.t('create_a_post') }
</Link>
<div>
{community.subscribed ? (
class="btn btn-sm btn-secondary btn-block"
onClick={linkEvent(community.id, this.handleUnsubscribe)}
>
- <T i18nKey="unsubscribe">#</T>
+ { i18n.t('unsubscribe') }
</button>
) : (
<button
class="btn btn-sm btn-secondary btn-block"
onClick={linkEvent(community.id, this.handleSubscribe)}
>
- <T i18nKey="subscribe">#</T>
+ { i18n.t('subscribe') }
</button>
)}
</div>
: capitalizeFirstLetter(i18n.t('name'))
} ${i18n.t('your_site')}`}</h5>
<div class="form-group row">
- <label class="col-12 col-form-label">
- <T i18nKey="name">#</T>
+ <label class="col-12 col-form-label" for="create-site-name">
+ { i18n.t('name') }
</label>
<div class="col-12">
<input
type="text"
+ id="create-site-name"
class="form-control"
value={this.state.siteForm.name}
onInput={linkEvent(this, this.handleSiteNameChange)}
</div>
</div>
<div class="form-group row">
- <label class="col-12 col-form-label">
- <T i18nKey="sidebar">#</T>
+ <label class="col-12 col-form-label" for="create-site-sidebar">
+ { i18n.t('sidebar') }
</label>
<div class="col-12">
<textarea
id={this.id}
value={this.state.siteForm.description}
+ id="create-site-sidebar"
onInput={linkEvent(this, this.handleSiteDescriptionChange)}
class="form-control"
rows={3}
<div class="form-check">
<input
class="form-check-input"
+ id="create-site-downvotes"
type="checkbox"
checked={this.state.siteForm.enable_downvotes}
onChange={linkEvent(this, this.handleSiteEnableDownvotesChange)}
/>
- <label class="form-check-label">
- <T i18nKey="enable_downvotes">#</T>
+ <label class="form-check-label" for="create-site-downvotes">
+ { i18n.t('enable_downvotes') }
</label>
</div>
</div>
<div class="form-check">
<input
class="form-check-input"
+ id="create-site-enable-nsfw"
type="checkbox"
checked={this.state.siteForm.enable_nsfw}
onChange={linkEvent(this, this.handleSiteEnableNsfwChange)}
/>
- <label class="form-check-label">
- <T i18nKey="enable_nsfw">#</T>
+ <label class="form-check-label" for="create-site-enable-nsfw">
+ { i18n.t('enable_nsfw') }
</label>
</div>
</div>
<div class="form-check">
<input
class="form-check-input"
+ id="create-site-open-registration"
type="checkbox"
checked={this.state.siteForm.open_registration}
onChange={linkEvent(
this.handleSiteOpenRegistrationChange
)}
/>
- <label class="form-check-label">
- <T i18nKey="open_registration">#</T>
+ <label class="form-check-label" for="create-site-open-registration">
+ { i18n.t('open_registration') }
</label>
</div>
</div>
class="btn btn-secondary"
onClick={linkEvent(this, this.handleCancel)}
>
- <T i18nKey="cancel">#</T>
+ { i18n.t('cancel') }
</button>
)}
</div>
import { Component, linkEvent } from 'inferno';
import { SortType } from '../interfaces';
-
+import { i18n } from '../i18next';
import { T } from 'inferno-i18next';
interface SortSelectProps {
class="custom-select custom-select-sm w-auto"
>
<option disabled>
- <T i18nKey="sort_type">#</T>
+ { i18n.t('sort_type') }
</option>
{!this.props.hideHot && (
<option value={SortType.Hot}>
- <T i18nKey="hot">#</T>
+ { i18n.t('hot') }
</option>
)}
<option value={SortType.New}>
- <T i18nKey="new">#</T>
+ { i18n.t('new') }
</option>
<option disabled>─────</option>
<option value={SortType.TopDay}>
- <T i18nKey="top_day">#</T>
+ { i18n.t('top_day') }
</option>
<option value={SortType.TopWeek}>
- <T i18nKey="week">#</T>
+ { i18n.t('week') }
</option>
<option value={SortType.TopMonth}>
- <T i18nKey="month">#</T>
+ { i18n.t('month') }
</option>
<option value={SortType.TopYear}>
- <T i18nKey="year">#</T>
+ { i18n.t('year') }
</option>
<option value={SortType.TopAll}>
- <T i18nKey="all">#</T>
+ { i18n.t('all') }
</option>
</select>
);
return (
<div>
<h5>
- <T i18nKey="donate_to_lemmy">#</T>
+ { i18n.t('donate_to_lemmy') }
</h5>
<p>
<T i18nKey="sponsor_message">
</T>
</p>
<a class="btn btn-secondary" href="https://www.patreon.com/dessalines">
- <T i18nKey="support_on_patreon">#</T>
+ { i18n.t('support_on_patreon') }
</a>
</div>
);
return (
<div class="container">
<h5>
- <T i18nKey="sponsors">#</T>
+ { i18n.t('sponsors') }
</h5>
<p>
- <T i18nKey="general_sponsors">#</T>
+ { i18n.t('general_sponsors') }
</p>
<div class="row card-columns">
{highlighted.map(s => (
return (
<div>
<h5>
- <T i18nKey="crypto">#</T>
+ { i18n.t('crypto') }
</h5>
<div class="table-responsive">
<table class="table table-hover text-center">
<tbody>
<tr>
<td>
- <T i18nKey="bitcoin">#</T>
+ { i18n.t('bitcoin') }
</td>
<td>
<code>1Hefs7miXS5ff5Ck5xvmjKjXf5242KzRtK</code>
</tr>
<tr>
<td>
- <T i18nKey="ethereum">#</T>
+ { i18n.t('ethereum') }
</td>
<td>
<code>0x400c96c96acbC6E7B3B43B1dc1BB446540a88A01</code>
</tr>
<tr>
<td>
- <T i18nKey="monero">#</T>
+ { i18n.t('monero') }
</td>
<td>
<code>
return (
<div class="container">
{this.state.loading ? (
- <h5>
+ <p class="text-center">
<svg class="icon icon-spinner spin">
<use xlinkHref="#icon-spinner"></use>
</svg>
- </h5>
+ </p>
) : (
<div class="row">
<div class="col-12 col-md-8">
class="custom-select custom-select-sm w-auto"
>
<option disabled>
- <T i18nKey="view">#</T>
+ { i18n.t('view') }
</option>
<option value={View.Overview}>
- <T i18nKey="overview">#</T>
+ { i18n.t('overview') }
</option>
<option value={View.Comments}>
- <T i18nKey="comments">#</T>
+ { i18n.t('comments') }
</option>
<option value={View.Posts}>
- <T i18nKey="posts">#</T>
+ { i18n.t('posts') }
</option>
<option value={View.Saved}>
- <T i18nKey="saved">#</T>
+ { i18n.t('saved') }
</option>
</select>
<span class="ml-2">
<li className="list-inline-item">{user.name}</li>
{user.banned && (
<li className="list-inline-item badge badge-danger">
- <T i18nKey="banned">#</T>
+ { i18n.t('banned') }
</li>
)}
</ul>
class="btn btn-block btn-secondary mt-3"
onClick={linkEvent(this, this.handleLogoutClick)}
>
- <T i18nKey="logout">#</T>
+ { i18n.t('logout') }
</button>
) : (
<>
<div class="card border-secondary mb-3">
<div class="card-body">
<h5>
- <T i18nKey="settings">#</T>
+ { i18n.t('settings') }
</h5>
<form onSubmit={linkEvent(this, this.handleUserSettingsSubmit)}>
<div class="form-group">
<label>
- <T i18nKey="avatar">#</T>
+ { i18n.t('avatar') }
</label>
<form class="d-inline">
<label
>
{!this.state.userSettingsForm.avatar ? (
<span class="btn btn-sm btn-secondary">
- <T i18nKey="upload_avatar">#</T>
+ { i18n.t('upload_avatar') }
</span>
) : (
<img
</div>
<div class="form-group">
<label>
- <T i18nKey="language">#</T>
+ { i18n.t('language') }
</label>
<select
value={this.state.userSettingsForm.lang}
class="ml-2 custom-select custom-select-sm w-auto"
>
<option disabled>
- <T i18nKey="language">#</T>
+ { i18n.t('language') }
</option>
<option value="browser">
- <T i18nKey="browser_default">#</T>
+ { i18n.t('browser_default') }
</option>
<option disabled>──</option>
{languages.map(lang => (
</div>
<div class="form-group">
<label>
- <T i18nKey="theme">#</T>
+ { i18n.t('theme') }
</label>
<select
value={this.state.userSettingsForm.theme}
class="ml-2 custom-select custom-select-sm w-auto"
>
<option disabled>
- <T i18nKey="theme">#</T>
+ { i18n.t('theme') }
</option>
{themes.map(theme => (
<option value={theme}>{theme}</option>
/>
</form>
<div class="form-group row">
- <label class="col-lg-3 col-form-label">
- <T i18nKey="email">#</T>
+ <label class="col-lg-3 col-form-label" for="user-email">
+ { i18n.t('email') }
</label>
<div class="col-lg-9">
<input
type="email"
+ id="user-email"
class="form-control"
placeholder={i18n.t('optional')}
value={this.state.userSettingsForm.email}
</div>
</div>
<div class="form-group row">
- <label class="col-lg-5 col-form-label">
- <T i18nKey="new_password">#</T>
+ <label class="col-lg-5 col-form-label" for="user-password">
+ { i18n.t('new_password') }
</label>
<div class="col-lg-7">
<input
type="password"
+ id="user-password"
class="form-control"
value={this.state.userSettingsForm.new_password}
onInput={linkEvent(
</div>
</div>
<div class="form-group row">
- <label class="col-lg-5 col-form-label">
- <T i18nKey="verify_password">#</T>
+ <label class="col-lg-5 col-form-label" for="user-verify-password">
+ { i18n.t('verify_password') }
</label>
<div class="col-lg-7">
<input
type="password"
+ id="user-verify-password"
class="form-control"
value={this.state.userSettingsForm.new_password_verify}
onInput={linkEvent(
</div>
</div>
<div class="form-group row">
- <label class="col-lg-5 col-form-label">
- <T i18nKey="old_password">#</T>
+ <label class="col-lg-5 col-form-label" for="user-old-password">
+ { i18n.t('old_password') }
</label>
<div class="col-lg-7">
<input
type="password"
+ id="user-old-password"
class="form-control"
value={this.state.userSettingsForm.old_password}
onInput={linkEvent(
<div class="form-check">
<input
class="form-check-input"
+ id="user-show-nsfw"
type="checkbox"
checked={this.state.userSettingsForm.show_nsfw}
onChange={linkEvent(
this.handleUserSettingsShowNsfwChange
)}
/>
- <label class="form-check-label">
- <T i18nKey="show_nsfw">#</T>
+ <label class="form-check-label" for="user-show-nsfw">
+ { i18n.t('show_nsfw') }
</label>
</div>
</div>
<div class="form-check">
<input
class="form-check-input"
+ id="user-show-avatars"
type="checkbox"
checked={this.state.userSettingsForm.show_avatars}
onChange={linkEvent(
this.handleUserSettingsShowAvatarsChange
)}
/>
- <label class="form-check-label">
- <T i18nKey="show_avatars">#</T>
+ <label class="form-check-label" for="user-show-avatars">
+ { i18n.t('show_avatars') }
</label>
</div>
</div>
<div class="form-check">
<input
class="form-check-input"
+ id="user-send-notifications-to-email"
type="checkbox"
disabled={!this.state.user.email}
checked={
this.handleUserSettingsSendNotificationsToEmailChange
)}
/>
- <label class="form-check-label">
- <T i18nKey="send_notifications_to_email">#</T>
+ <label class="form-check-label" for="user-send-notifications-to-email">
+ { i18n.t('send_notifications_to_email') }
</label>
</div>
</div>
this.handleDeleteAccountShowConfirmToggle
)}
>
- <T i18nKey="delete_account">#</T>
+ { i18n.t('delete_account') }
</button>
{this.state.deleteAccountShowConfirm && (
<>
<div class="my-2 alert alert-danger" role="alert">
- <T i18nKey="delete_account_confirm">#</T>
+ { i18n.t('delete_account_confirm') }
</div>
<input
type="password"
this.handleDeleteAccountShowConfirmToggle
)}
>
- <T i18nKey="cancel">#</T>
+ { i18n.t('cancel') }
</button>
</>
)}
<div class="card border-secondary mb-3">
<div class="card-body">
<h5>
- <T i18nKey="moderates">#</T>
+ { i18n.t('moderates') }
</h5>
<ul class="list-unstyled mb-0">
{this.state.moderates.map(community => (
<div class="card border-secondary mb-3">
<div class="card-body">
<h5>
- <T i18nKey="subscribed">#</T>
+ { i18n.t('subscribed') }
</h5>
<ul class="list-unstyled mb-0">
{this.state.follows.map(community => (
class="btn btn-sm btn-secondary"
onClick={linkEvent(this, this.nextPage)}
>
- <T i18nKey="next">#</T>
+ { i18n.t('next') }
</button>
</div>
);
remove_comment: 'Kommentar löschen',
communities: 'Communities',
users: 'Benutzer',
- create_a_community: 'Eine Gemeinschaft anlegen',
- create_community: 'Gemeinschaft anlegen',
- remove_community: 'Gemeinschaft entfernen',
+ create_a_community: 'Eine community anlegen',
+ create_community: 'Community anlegen',
+ remove_community: 'Community entfernen',
subscribed_to_communities: 'Abonnierte <1>communities</1>',
trending_communities: 'Trending <1>communities</1>',
list_of_communities: 'Liste von communities',
unsticky: 'nicht haftend',
link: 'link',
archive_link: 'Archiv-Link',
- mod: 'Moderator',
- mods: 'Moderatoren',
+ mod: 'mod',
+ mods: 'mods',
moderates: 'Moderiert',
settings: 'Einstellungen',
- remove_as_mod: 'Als Moderator entfernen',
- appoint_as_mod: 'Zum Moderator ernennen',
+ remove_as_mod: 'Als mod entfernen',
+ appoint_as_mod: 'Zum mod ernennen',
modlog: 'Modlog',
- admin: 'Administrator',
- admins: 'Administratoren',
- remove_as_admin: 'Als Administrator entfernen',
- appoint_as_admin: 'Zum Administrator ernennen',
+ admin: 'admin',
+ admins: 'admins',
+ remove_as_admin: 'Als admin entfernen',
+ appoint_as_admin: 'Zum admin ernennen',
remove: 'entfernen',
removed: 'entfernt',
locked: 'gesperrt',
unban_from_site: 'Von der Seite entbannen',
banned: 'gesperrt',
save: 'speichern',
- unsave: 'nicht speichern',
+ unsave: 'unsave',
create: 'anlegen',
creator: 'Ersteller',
- username: 'Benutzername',
- email_or_username: 'E-mail oder Username',
+ username: 'Username',
+ email_or_username: 'Email oder Username',
number_of_users: '{{count}} Benutzer',
number_of_subscribers: '{{count}} Abonnenten',
number_of_points: '{{count}} Punkte',
subscribed: 'Abonniert',
prev: 'Zurück',
next: 'Weiter',
- sidebar: 'Seitenleiste',
+ sidebar: 'Sidebar',
sort_type: 'Sortieren nach',
hot: 'Hot',
new: 'Neu',
no_email_setup: "Dieser Server hat E-Mails nicht korrekt eingerichtet.",
login: 'Einloggen',
sign_up: 'Registrieren',
- email: 'E-Mail',
- optional: 'optional',
+ email: 'Email',
+ optional: 'Optional',
expires: 'Ablaufdatum',
language: 'Sprache',
browser_default: 'Standard-Browser',
url: 'URL',
body: 'Text',
copy_suggested_title: 'Vorgeschlagenen Titel übernehmen: {{title}}',
- community: 'Gemeinschaft',
- expand_here: 'hier erweitern',
+ community: 'Community',
+ expand_here: 'Expand here',
subscribe_to_communities: 'Abonniere ein paar <1>communities</1>.',
chat: 'Chat',
recent_comments: 'Neueste Kommentare',
no_results: 'Keine Ergebnisse.',
- setup: 'Einrichten',
- lemmy_instance_setup: 'Lemmy Instanz Einrichten',
+ setup: 'Setup',
+ lemmy_instance_setup: 'Lemmy Instanz Setup',
setup_admin: 'Seiten Administrator konfigurieren',
your_site: 'deine Seite',
modified: 'verändert',
support_on_patreon: 'Auf Patreon unterstützen',
general_sponsors:
'Allgemeine Sponsoren sind die, die zwischen $10 und $39 zu Lemmy beitragen.',
- crypto: 'Kryptowährung',
+ crypto: 'Crypto',
bitcoin: 'Bitcoin',
ethereum: 'Ethereum',
monero: 'Monero',
joined: 'beigetreten',
by: 'von',
to: 'bis',
- transfer_community: 'Gemeinschaft übertragen',
+ transfer_community: 'Transfer-Community',
transfer_site: 'Transferseite',
are_you_sure: 'Bist du sicher?',
yes: 'Ja',
no: 'Nein',
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>.',
+ '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.',
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.',
+ no_community_edit_allowed: 'Keine Erlaubnis Community zu editieren.',
+ couldnt_find_community: 'Konnte Community nicht finden.',
+ couldnt_update_community: 'Konnte Community nicht aktualisieren.',
+ community_already_exists: 'Community 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.',
+ 'Community Moderator existiert bereits.',
+ community_follower_already_exists: 'Community Follower existiert bereits.',
+ community_user_already_banned: 'Community Nutzer schon gebannt.',
couldnt_create_post: 'Konnte Beitrag nicht anlegen.',
couldnt_like_post: 'Konnte Beitrag nicht liken.',
couldnt_find_post: 'Konnte Beitrag nicht finden.',
couldnt_create_private_message: "Couldn't create private message.",
no_private_message_edit_allowed: 'Not allowed to edit private message.',
couldnt_update_private_message: "Couldn't update private message.",
+ time: 'Time',
+ action: 'Action'
},
};