diff options
author | Dessalines <dessalines@users.noreply.github.com> | 2019-08-09 17:14:43 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-08-09 17:14:43 -0700 |
commit | 536c3f491546b4546f43a46e7a1a699ca9ac2934 (patch) | |
tree | f080c86e51b9660560ac493cb7f6d9676ea12fbe /ui/src/components/main.tsx | |
parent | 5a1e8aa645c9f0898e765b45c2f362308292db26 (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.tsx | 120 |
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; |