summaryrefslogtreecommitdiffstats
path: root/ui/src/components/main.tsx
diff options
context:
space:
mode:
authorDessalines <dessalines@users.noreply.github.com>2019-08-09 17:14:43 -0700
committerGitHub <noreply@github.com>2019-08-09 17:14:43 -0700
commit536c3f491546b4546f43a46e7a1a699ca9ac2934 (patch)
treef080c86e51b9660560ac493cb7f6d9676ea12fbe /ui/src/components/main.tsx
parent5a1e8aa645c9f0898e765b45c2f362308292db26 (diff)
Adding support for internationalization / i18n (#189)
* Still not working * Starting to work on internationalization * Main done. * i18n translations first pass. * Localization testing mostly done. * Second front end pass. * Added a few more translations. * Adding back end translations.
Diffstat (limited to 'ui/src/components/main.tsx')
-rw-r--r--ui/src/components/main.tsx120
1 files changed, 75 insertions, 45 deletions
diff --git a/ui/src/components/main.tsx b/ui/src/components/main.tsx
index fe59ac2c..91d56cc0 100644
--- a/ui/src/components/main.tsx
+++ b/ui/src/components/main.tsx
@@ -7,6 +7,8 @@ import { WebSocketService, UserService } from '../services';
import { PostListings } from './post-listings';
import { SiteForm } from './site-form';
import { msgOp, repoUrl, mdToHtml, fetchLimit, routeSortTypeToEnum, routeListingTypeToEnum } from '../utils';
+import { i18n } from '../i18next';
+import { T } from 'inferno-i18next';
interface MainState {
subscribedCommunities: Array<CommunityUser>;
@@ -120,26 +122,38 @@ export class Main extends Component<any, MainState> {
{this.posts()}
</div>
<div class="col-12 col-md-4">
- {!this.state.loading &&
+ {this.my_sidebar()}
+ </div>
+ </div>
+ </div>
+ )
+ }
+
+ my_sidebar() {
+ return(
+ <div>
+ {!this.state.loading &&
+ <div>
+ {this.trendingCommunities()}
+ {UserService.Instance.user && this.state.subscribedCommunities.length > 0 &&
<div>
- {this.trendingCommunities()}
- {UserService.Instance.user && this.state.subscribedCommunities.length > 0 &&
- <div>
- <h5>Subscribed <Link class="text-white" to="/communities">communities</Link></h5>
- <ul class="list-inline">
- {this.state.subscribedCommunities.map(community =>
- <li class="list-inline-item"><Link to={`/c/${community.community_name}`}>{community.community_name}</Link></li>
- )}
- </ul>
- </div>
- }
- <Link class="btn btn-sm btn-secondary btn-block mb-3"
- to="/create_community">Create a Community</Link>
- {this.sidebar()}
+ <h5>
+ <T i18nKey="subscribed_to_communities">#<Link class="text-white" to="/communities">#</Link></T>
+ </h5>
+ <ul class="list-inline">
+ {this.state.subscribedCommunities.map(community =>
+ <li class="list-inline-item"><Link to={`/c/${community.community_name}`}>{community.community_name}</Link></li>
+ )}
+ </ul>
</div>
}
- </div>
- </div>
+ <Link class="btn btn-sm btn-secondary btn-block mb-3"
+ to="/create_community">
+ <T i18nKey="create_a_community">#</T>
+ </Link>
+ {this.sidebar()}
+ </div>
+ }
</div>
)
}
@@ -147,7 +161,9 @@ export class Main extends Component<any, MainState> {
trendingCommunities() {
return (
<div>
- <h5>Trending <Link class="text-white" to="/communities">communities</Link></h5>
+ <h5>
+ <T i18nKey="trending_communities">#<Link class="text-white" to="/communities">#</Link></T>
+ </h5>
<ul class="list-inline">
{this.state.trendingCommunities.map(community =>
<li class="list-inline-item"><Link to={`/c/${community.name}`}>{community.name}</Link></li>
@@ -185,18 +201,32 @@ export class Main extends Component<any, MainState> {
{this.canAdmin &&
<ul class="list-inline mb-1 text-muted small font-weight-bold">
<li className="list-inline-item">
- <span class="pointer" onClick={linkEvent(this, this.handleEditClick)}>edit</span>
+ <span class="pointer" onClick={linkEvent(this, this.handleEditClick)}>
+ <T i18nKey="edit">#</T>
+ </span>
</li>
</ul>
}
<ul class="my-2 list-inline">
- <li className="list-inline-item badge badge-light">{this.state.site.site.number_of_users} Users</li>
- <li className="list-inline-item badge badge-light">{this.state.site.site.number_of_posts} Posts</li>
- <li className="list-inline-item badge badge-light">{this.state.site.site.number_of_comments} Comments</li>
- <li className="list-inline-item"><Link className="badge badge-light" to="/modlog">Modlog</Link></li>
+ <li className="list-inline-item badge badge-light">
+ <T i18nKey="number_of_users" interpolation={{count: this.state.site.site.number_of_users}}>#</T>
+ </li>
+ <li className="list-inline-item badge badge-light">
+ <T i18nKey="number_of_posts" interpolation={{count: this.state.site.site.number_of_posts}}>#</T>
+ </li>
+ <li className="list-inline-item badge badge-light">
+ <T i18nKey="number_of_comments" interpolation={{count: this.state.site.site.number_of_comments}}>#</T>
+ </li>
+ <li className="list-inline-item">
+ <Link className="badge badge-light" to="/modlog">
+ <T i18nKey="modlog">#</T>
+ </Link>
+ </li>
</ul>
<ul class="my-1 list-inline small">
- <li class="list-inline-item">admins: </li>
+ <li class="list-inline-item">
+ <T i18nKey="admins" class="d-inline">#</T>:
+ </li>
{this.state.site.admins.map(admin =>
<li class="list-inline-item"><Link class="text-info" to={`/u/${admin.name}`}>{admin.name}</Link></li>
)}
@@ -215,15 +245,15 @@ export class Main extends Component<any, MainState> {
landing() {
return (
<div>
- <h5>Powered by
- <svg class="icon mx-2"><use xlinkHref="#icon-mouse"></use></svg>
- <a href={repoUrl}>Lemmy<sup>Beta</sup></a>
+ <h5>
+ <T i18nKey="powered_by" class="d-inline">#</T>
+ <svg class="icon mx-2"><use xlinkHref="#icon-mouse">#</use></svg>
+ <a href={repoUrl}>Lemmy<sup>beta</sup></a>
</h5>
- <p>Lemmy is a <a href="https://en.wikipedia.org/wiki/Link_aggregation">link aggregator</a> / reddit alternative, intended to work in the <a href="https://en.wikipedia.org/wiki/Fediverse">fediverse</a>.</p>
- <p>Its self-hostable, has live-updating comment threads, and is tiny (<code>~80kB</code>). Federation into the ActivityPub network is on the roadmap.</p>
- <p>This is a <b>very early beta version</b>, and a lot of features are currently broken or missing.</p>
- <p>Suggest new features or report bugs <a href={repoUrl}>here.</a></p>
- <p>Made with <a href="https://www.rust-lang.org">Rust</a>, <a href="https://actix.rs/">Actix</a>, <a href="https://www.infernojs.org">Inferno</a>, <a href="https://www.typescriptlang.org/">Typescript</a>.</p>
+ <p>
+ <T i18nKey="landing_0">#<a href="https://en.wikipedia.org/wiki/Link_aggregation">#</a><a href="https://en.wikipedia.org/wiki/Fediverse">#</a><br></br><code>#</code><br></br><b>#</b><br></br><a href={repoUrl}>#</a><br></br><a href="https://www.rust-lang.org">#</a><a href="https://actix.rs/">#</a><a href="https://www.infernojs.org">#</a><a href="https://www.typescriptlang.org/">#</a>
+ </T>
+ </p>
</div>
)
}
@@ -257,7 +287,7 @@ export class Main extends Component<any, MainState> {
onChange={linkEvent(this, this.handleTypeChange)}
disabled={UserService.Instance.user == undefined}
/>
- Subscribed
+ {i18n.t('subscribed')}
</label>
<label className={`pointer btn btn-sm btn-secondary ${this.state.type_ == ListingType.All && 'active'}`}>
<input type="radio"
@@ -265,19 +295,19 @@ export class Main extends Component<any, MainState> {
checked={this.state.type_ == ListingType.All}
onChange={linkEvent(this, this.handleTypeChange)}
/>
- All
+ {i18n.t('all')}
</label>
</div>
<select value={this.state.sort} onChange={linkEvent(this, this.handleSortChange)} class="ml-2 custom-select custom-select-sm w-auto">
- <option disabled>Sort Type</option>
- <option value={SortType.Hot}>Hot</option>
- <option value={SortType.New}>New</option>
+ <option disabled><T i18nKey="sort_type">#</T></option>
+ <option value={SortType.Hot}><T i18nKey="hot">#</T></option>
+ <option value={SortType.New}><T i18nKey="new">#</T></option>
<option disabled>──────────</option>
- <option value={SortType.TopDay}>Top Day</option>
- <option value={SortType.TopWeek}>Week</option>
- <option value={SortType.TopMonth}>Month</option>
- <option value={SortType.TopYear}>Year</option>
- <option value={SortType.TopAll}>All</option>
+ <option value={SortType.TopDay}><T i18nKey="top_day">#</T></option>
+ <option value={SortType.TopWeek}><T i18nKey="week">#</T></option>
+ <option value={SortType.TopMonth}><T i18nKey="month">#</T></option>
+ <option value={SortType.TopYear}><T i18nKey="year">#</T></option>
+ <option value={SortType.TopAll}><T i18nKey="all">#</T></option>
</select>
</div>
)
@@ -287,9 +317,9 @@ export class Main extends Component<any, MainState> {
return (
<div class="mt-2">
{this.state.page > 1 &&
- <button class="btn btn-sm btn-secondary mr-1" onClick={linkEvent(this, this.prevPage)}>Prev</button>
+ <button class="btn btn-sm btn-secondary mr-1" onClick={linkEvent(this, this.prevPage)}><T i18nKey="prev">#</T></button>
}
- <button class="btn btn-sm btn-secondary" onClick={linkEvent(this, this.nextPage)}>Next</button>
+ <button class="btn btn-sm btn-secondary" onClick={linkEvent(this, this.nextPage)}><T i18nKey="next">#</T></button>
</div>
);
}
@@ -352,7 +382,7 @@ export class Main extends Component<any, MainState> {
console.log(msg);
let op: UserOperation = msgOp(msg);
if (msg.error) {
- alert(msg.error);
+ alert(i18n.t(msg.error));
return;
} else if (op == UserOperation.GetFollowedCommunities) {
let res: GetFollowedCommunitiesResponse = msg;