23 04 23 More translations (#123)

* more translations

* more more
This commit is contained in:
Lu 2023-04-24 09:44:44 +03:00 committed by GitHub
parent be32df1b2a
commit b3a118149a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 470 additions and 118 deletions

View File

@ -34,7 +34,7 @@
<form class="search-box" *ngIf="appState.showSearch">
<mat-form-field class="search-box-input">
<mat-label>Search</mat-label>
<mat-label>{{ 'App.Search' | translate }}</mat-label>
<input matInput #searchInput aria-label="Search" [formControl]="searchControl" [matAutocomplete]="auto" />
<mat-autocomplete #auto="matAutocomplete">
<mat-option class="search-result-option" (onSelectionChange)="searchService.open(state)" *ngFor="let state of searchService.results$ | async" [value]="state.id">
@ -77,15 +77,15 @@
<mat-nav-list>
<a [routerLink]="['/']" mat-menu-item (click)="toggleMenu()" [routerLinkActiveOptions]="{ exact: true }" routerLinkActive="active">
<mat-icon>home</mat-icon>
<span *ngIf="displayLabels">Home</span>
<span *ngIf="displayLabels">{{'App.Home' | translate }}</span>
</a>
<a [routerLink]="['/feed']" mat-menu-item (click)="toggleMenu()" [routerLinkActiveOptions]="{ exact: true }" routerLinkActive="active">
<mat-icon>notes</mat-icon>
<span *ngIf="displayLabels">Feed</span>
<span *ngIf="displayLabels">{{ 'App.Feed' | translate }}</span>
</a>
<a [routerLink]="['/notifications']" mat-menu-item (click)="toggleMenu()" [routerLinkActiveOptions]="{ exact: true }" routerLinkActive="active">
<mat-icon [matBadgeHidden]="(ui.unreadNotifications$ | async) == 0" [matBadge]="ui.unreadNotifications$ | async">notifications</mat-icon>
<span *ngIf="displayLabels">Notifications</span>
<span *ngIf="displayLabels">{{ 'App.Notifications' | translate }}</span>
</a>
<!-- <a [routerLink]="['/chat']" mat-menu-item (click)="toggleMenu()" [routerLinkActiveOptions]="{ exact: true }" routerLinkActive="active">
<mat-icon>chat</mat-icon>
@ -97,15 +97,15 @@
</a> -->
<a [routerLink]="['/people']" mat-menu-item (click)="toggleMenu()" [routerLinkActiveOptions]="{ exact: true }" routerLinkActive="active">
<mat-icon>people</mat-icon>
<span *ngIf="displayLabels">People</span>
<span *ngIf="displayLabels">{{ 'App.People' | translate }}</span>
</a>
<a [routerLink]="['/circles']" mat-menu-item (click)="toggleMenu()" [routerLinkActiveOptions]="{ exact: true }" routerLinkActive="active">
<mat-icon>animation</mat-icon>
<span *ngIf="displayLabels">Circles</span>
<span *ngIf="displayLabels">{{ 'App.Circles' | translate }}</span>
</a>
<a [routerLink]="['/notes']" mat-menu-item (click)="toggleMenu()" [routerLinkActiveOptions]="{ exact: true }" routerLinkActive="active">
<mat-icon>bookmarks</mat-icon>
<span *ngIf="displayLabels">Bookmarks</span>
<span *ngIf="displayLabels">{{ 'App.Bookmarks' | translate }}</span>
</a>
<!-- <a [routerLink]="['/development']" mat-menu-item (click)="toggleMenu()" [routerLinkActiveOptions]="{ exact: true }" routerLinkActive="active">
<mat-icon>construction</mat-icon>
@ -113,7 +113,7 @@
</a> -->
<a [routerLink]="['/relays']" mat-menu-item (click)="toggleMenu()" [routerLinkActiveOptions]="{ exact: true }" routerLinkActive="active">
<mat-icon>dns</mat-icon>
<span *ngIf="displayLabels">Relays</span>
<span *ngIf="displayLabels">{{ 'App.Relays' | translate }}</span>
</a>
<a mat-menu-item (click)="toggleMenuSize()">
<mat-icon *ngIf="displayLabels">chevron_left</mat-icon>
@ -153,9 +153,9 @@
<div class="content">
<div class="data">
<ul>
<li>0 <span>Followers</span></li>
<li>0 <span>{{ 'App.Followers' | translate }}</span></li>
<li>
<a class="opposite-link" [routerLink]="['/following', appState.getPublicKey()]" (click)="toggleProfileMenu()"> {{ profileService.following.length }} <span>Following</span></a>
<a class="opposite-link" [routerLink]="['/following', appState.getPublicKey()]" (click)="toggleProfileMenu()"> {{ profileService.following.length }} <span>{{ 'App.Following' | translate }}</span></a>
</li>
</ul>
</div>
@ -165,27 +165,27 @@
<mat-nav-list>
<a [routerLink]="['/p', appState.getPublicKey()]" mat-menu-item (click)="toggleProfileMenu()" [routerLinkActiveOptions]="{ exact: true }" routerLinkActive="active">
<mat-icon>person</mat-icon>
<span>View profile</span>
<span>{{ 'App.ViewProfile' | translate }}</span>
</a>
<a [routerLink]="['/profile']" mat-menu-item (click)="toggleProfileMenu()" [routerLinkActiveOptions]="{ exact: true }" routerLinkActive="active">
<mat-icon>edit</mat-icon>
<span>Edit profile</span>
<span>{{ 'App.EditProfile' | translate }}</span>
</a>
<a [routerLink]="['/badges', appState.getPublicKey()]" mat-menu-item (click)="toggleProfileMenu()" [routerLinkActiveOptions]="{ exact: true }" routerLinkActive="active">
<mat-icon>badge</mat-icon>
<span>Badges</span>
<span>{{ 'App.Badges' | translate }}</span>
</a>
<a [routerLink]="['/settings']" mat-menu-item (click)="toggleProfileMenu()" [routerLinkActiveOptions]="{ exact: true }" routerLinkActive="active">
<mat-icon>settings</mat-icon>
<span>Settings</span>
<span>{{ 'App.Settings' | translate }}</span>
</a>
<a [routerLink]="['/about']" mat-menu-item (click)="toggleProfileMenu()" [routerLinkActiveOptions]="{ exact: true }" routerLinkActive="active">
<mat-icon>help_outline</mat-icon>
<span>About</span>
<span>{{ 'App.About' | translate }}</span>
</a>
<a [routerLink]="['/logout']" mat-menu-item (click)="toggleProfileMenu()" [routerLinkActiveOptions]="{ exact: true }" routerLinkActive="active">
<mat-icon>logout</mat-icon>
<span>Logout</span>
<span>{{ 'App.Logout' | translate }}</span>
</a>
</mat-nav-list>
<mat-menu #accounts="matMenu" hasBackdrop="true" backdropClass="menu-mode-backdrop" overlapTrigger="false"> </mat-menu>

View File

@ -1,22 +1,22 @@
<div class="page">
<div class="badges" *ngIf="sub.events">
<app-badge-card [badge]="badge" *ngFor="let badge of sub.events">
Created by:&nbsp;<app-profile-name [pubkey]="badge.pubkey"></app-profile-name>
{{ 'Badge.CreatedBy' | translate }}:&nbsp;<app-profile-name [pubkey]="badge.pubkey"></app-profile-name>
<br />
Last updated: <app-date [date]="badge.created_at"></app-date>
<p *ngIf="appState.getPublicKey() == badge.pubkey">
<button class="badge-card-button" (click)="showIssuing = !showIssuing" mat-stroked-button>ISSUE BADGE</button>
<button class="badge-card-button" (click)="edit(badge)" mat-stroked-button>EDIT</button>
<button class="badge-card-button" (click)="showIssuing = !showIssuing" mat-stroked-button>{{ 'Badge.IssueBadge' | translate }}</button>
<button class="badge-card-button" (click)="edit(badge)" mat-stroked-button>{{ 'Badge.Edit' | translate }}</button>
</p>
<div *ngIf="showIssuing">
<mat-form-field class="input-full-width">
<mat-label>Pub Key (hex format only, line separated, add relay comma separated at the end)</mat-label>
<mat-label>{{ 'Badge.PubKeyDescription' | translate }}</mat-label>
<textarea appAutoInputHeight class="note-input" matInput type="text" [(ngModel)]="pubkeys" rows="2"></textarea>
</mat-form-field>
<br />
<button mat-flat-button [disabled]="pubkeys.length == 0" type="button" (click)="issueBadge(badge)" color="primary">Publish Badge Reward</button>
<button mat-flat-button [disabled]="pubkeys.length == 0" type="button" (click)="issueBadge(badge)" color="primary">{{'Badge.PublishBadgeReward' | translate }}</button>
</div>
</app-badge-card>
</div>

View File

@ -3,12 +3,12 @@
<mat-accordion>
<mat-expansion-panel>
<mat-expansion-panel-header>
<mat-panel-title>Options</mat-panel-title>
<mat-panel-title>{{ 'Badges.Options' | translate }}</mat-panel-title>
<mat-panel-description></mat-panel-description>
</mat-expansion-panel-header>
<div class="options-buttons">
<button mat-stroked-button routerLink="/editor/badges">Badge Editor</button>
<button mat-stroked-button routerLink="/editor/badges">{{ 'Badges.BadgeEditor' | translate }}</button>
</div>
</mat-expansion-panel>
</mat-accordion>
@ -20,7 +20,7 @@
<mat-tab>
<ng-template mat-tab-label>
<mat-icon class="example-tab-icon">verified</mat-icon>
<span *ngIf="(appState.displayLabels$ | async) === false">&nbsp;Accepted</span>
<span *ngIf="(appState.displayLabels$ | async) === false">&nbsp;{{ 'Badges.Accepted' | translate }}</span>
</ng-template>
<ng-template matTabContent>
<div class="badges" *ngIf="profileBadgesSub.events">
@ -45,7 +45,7 @@
<mat-tab>
<ng-template mat-tab-label>
<mat-icon class="example-tab-icon">emoji_events</mat-icon>
<span *ngIf="(appState.displayLabels$ | async) === false">&nbsp;Awarded</span>
<span *ngIf="(appState.displayLabels$ | async) === false">&nbsp;{{ 'Badges.Awarded' | translate }}</span>
</ng-template>
<ng-template matTabContent>
<div class="badges" *ngIf="receivedBadgesSub.events">
@ -63,7 +63,7 @@
<mat-tab>
<ng-template mat-tab-label>
<mat-icon class="example-tab-icon">badge</mat-icon>
<span *ngIf="(appState.displayLabels$ | async) === false">&nbsp;Created</span>
<span *ngIf="(appState.displayLabels$ | async) === false">&nbsp;{{ 'Badges.Created' | translate }}</span>
</ng-template>
<ng-template matTabContent>
<div class="badges" *ngIf="badgeDefinitionsSub.events">

View File

@ -7,9 +7,9 @@
<div class="circle-item"><mat-icon matListItemIcon [style.color]="circle.color">trip_origin</mat-icon></div>
<div class="circle-item clickable">
{{ circle.name }}<br />
<span class="dimmed clickable"><span>Count: {{ countMembers(circle) }}</span></span
<span class="dimmed clickable"><span>{{ 'Circles.Count' | translate }}: {{ countMembers(circle) }}</span></span
><br />
<span class="dimmed clickable"><span *ngIf="circle.public">Public</span> <span *ngIf="!circle.public">Private</span> - {{ circle.style | circlestyle }} - Created: {{ circle.created | ago }}</span>
<span class="dimmed clickable"><span *ngIf="circle.public">{{ 'Circles.Public' | translate }}</span> <span *ngIf="!circle.public">{{ 'Circles.Private' | translate }}</span> - {{ circle.style | circlestyle }} - {{ 'Circles.Created' | translate }}: {{ circle.created | ago }}</span>
</div>
<div class="circle-item clickable">
<button class="circle-button" mat-icon-button [matMenuTriggerFor]="menu">
@ -19,22 +19,22 @@
<mat-menu #menu="matMenu">
<button mat-menu-item [matMenuTriggerFor]="copyMenu">
<mat-icon>copy_all</mat-icon>
<span>Copy</span>
<span>{{ 'Circles.Copy' | translate }}</span>
</button>
<button *ngIf="circle.id" mat-menu-item (click)="deleteCircle(circle.id)">
<mat-icon>delete</mat-icon>
<span>Delete Circle</span>
<span>{{ 'Circles.DeleteCircle' | translate }}</span>
</button>
</mat-menu>
<mat-menu #copyMenu="matMenu">
<button mat-menu-item (click)="copyPubKeys(circle)">
<mat-icon>content_copy</mat-icon>
<span>Public Keys (npub)</span>
<span>{{ 'Circles.PublicKeysNpub' | translate }}</span>
</button>
<button mat-menu-item (click)="copyPubKeysHex(circle)">
<mat-icon>content_copy</mat-icon>
<span>Public Keys (hex)</span>
<span>{{ 'Circles.PublicKeysHex' | translate }}</span>
</button>
</mat-menu>
</div>
@ -78,5 +78,5 @@
</div>
</mat-card> -->
<small>Circles is how you organize people you follow. Different circles can have different rules applied and circles is an important way to make the experience more enjoyable.</small>
<small>{{ 'Circles.CirclesDescription' | translate }}</small>
</div>

View File

@ -10,78 +10,78 @@
<div class="connect-content">
<mat-card class="card" *ngIf="step == 1">
<mat-card-content>
<h1>Who are you?</h1>
<p>Add some (optional) basics about yourself. This information will be public.</p>
<h1>{{ 'Create.WhoAreYou' | translate }}</h1>
<p>{{ 'Create.WhoAreYouSubtitle' | translate }}</p>
<p>
<mat-form-field class="input-full-width">
<mat-icon matPrefix>badge</mat-icon>
<mat-label>Display Name</mat-label>
<mat-label>{{ 'Create.DisplayName' | translate }}</mat-label>
<input matInput type="text" [(ngModel)]="profile.display_name" />
</mat-form-field>
</p>
<p>
<mat-form-field class="input-full-width">
<mat-icon matPrefix>alternate_email</mat-icon>
<mat-label>Nickname</mat-label>
<mat-label>{{ 'Create.Nickname' | translate }}</mat-label>
<input matInput type="text" [(ngModel)]="profile.name" />
</mat-form-field>
</p>
<p>
<mat-form-field class="input-full-width">
<mat-icon matPrefix>help_outline</mat-icon>
<mat-label>About</mat-label>
<mat-label>{{ 'Create.About' | translate }}</mat-label>
<textarea matInput type="text" [(ngModel)]="profile.about" rows="3"></textarea>
</mat-form-field>
</p>
<p>
<mat-form-field class="input-full-width">
<mat-icon matPrefix>image</mat-icon>
<mat-label>Profile Image</mat-label>
<mat-label>{{ 'Create.ProfileImage' | translate }}</mat-label>
<input matInput type="text" [(ngModel)]="profile.picture" />
</mat-form-field>
</p>
<p>
<mat-form-field class="input-full-width">
<mat-icon matPrefix>how_to_reg</mat-icon>
<mat-label>E-mail/Domain Identifier (NIP05)</mat-label>
<mat-label>{{ 'Create.EmailDomainIdentifierNIP05' | translate }}</mat-label>
<input matInput type="text" [(ngModel)]="profile.nip05" />
</mat-form-field>
</p>
<div class="connect-action">
<button class="start-button" (click)="step = 2" mat-raised-button color="primary">Continue</button>
<button class="start-button" (click)="step = 2" mat-raised-button color="primary">{{ 'Create.Continue' | translate }}</button>
</div>
</mat-card-content>
</mat-card>
<mat-card class="card" *ngIf="step == 2">
<mat-card-content>
<h1>Your secret recovery phrase</h1>
<h1>{{ 'Create.YourSecretRecoveryPhrase' | translate }}</h1>
<p class="recovery-phrase">{{ mnemonic }}</p>
<br />
<button color="primary" mat-fab extended [cdkCopyToClipboard]="mnemonic">
<mat-icon>content_copy</mat-icon>
Copy
{{ 'Create.Copy' | translate }}
</button>
<br /><br />
<p class="dimmed">This is your private and secret sentence. You must store it safely, if you lose it, you will lose access to your account. Nobody can recover it for you.</p>
<p>Keep it safe, keep it hidden.</p>
<p class="dimmed">{{ 'Create.SecretRecoveryPhraseDescription' | translate }}</p>
<p>{{ 'Create.SecretRecoveryPhraseWarning' | translate }}</p>
<div class="connect-action">
<button class="start-button" (click)="step = 1" mat-raised-button color="primary">Back</button>
<button class="start-button" (click)="step = 3" mat-raised-button color="primary">Continue</button>
<button class="start-button" (click)="step = 1" mat-raised-button color="primary">{{ 'Create.Back' | translate }}</button>
<button class="start-button" (click)="step = 3" mat-raised-button color="primary">{{ 'Create.Continue' | translate }}</button>
</div>
</mat-card-content>
</mat-card>
<mat-card class="card" *ngIf="step == 3">
<mat-card-content>
<h1>Private and Public Keys</h1>
<h1>{{ 'Create.PrivateAndPublicKeys' | translate }}</h1>
Your personal private key:<br />
{{ 'Create.YourPersonalPrivateKey' | translate }}:<br />
<p class="wrap">{{ privateKey }}</p>
<!-- <mat-form-field appearance="fill" class="input-full-width connect-input">
@ -93,13 +93,13 @@
<form>
<mat-form-field appearance="fill" class="input-full-width connect-input">
<mat-icon class="circle" matPrefix>person_add</mat-icon>
<mat-label>Public Key</mat-label>
<mat-label>{{ 'Create.PublicKey' | translate }}</mat-label>
<input [readonly]="true" autocomplete="username" name="email" placeholder="npub..." matInput type="email" [(ngModel)]="publicKey" />
</mat-form-field>
<mat-form-field appearance="fill" class="input-full-width connect-input">
<mat-icon class="circle" matPrefix>password</mat-icon>
<mat-label>Password (optional)</mat-label>
<mat-label>{{ 'Create.PasswordOptional' | translate }}</mat-label>
<input matInput type="password" autocomplete="current-password" name="password" [(ngModel)]="password" />
</mat-form-field>
@ -109,8 +109,8 @@
<p class="dimmed">From your secret recovery phrase, your public key and private key are derived. Some Nostr clients require the private key to be imported.</p>
<div class="connect-action">
<button class="start-button" (click)="step = 2" mat-raised-button color="primary">Back</button>
<button class="start-button" (click)="persistKey()" mat-raised-button color="primary">Save and Log In</button>
<button class="start-button" (click)="step = 2" mat-raised-button color="primary">{{ 'Create.Back' | translate }}</button>
<button class="start-button" (click)="persistKey()" mat-raised-button color="primary">{{ 'Create.SaveAndLogIn' | translate }}</button>
</div>
</mat-card-content>
</mat-card>

View File

@ -10,28 +10,28 @@
<div class="connect-content">
<mat-card class="card" *ngIf="step == 1">
<mat-card-content>
<h1>Private Key Import</h1>
<p>If you already have an existing private for your Nostr account, you can import it here and protect it with a password.</p>
<p>First choose if your backup is a secret recovery phrase or a private key.</p>
<h1>{{ 'Key.PrivateKeyImport' | translate }}</h1>
<p>{{ 'Key.PrivateKeyImportSubtitle' | translate }}</p>
<p>{{ 'Key.PrivateKeyImportDescription' | translate }}</p>
<br />
<button class="start-button full-button" (click)="step = 2" mat-flat-button color="accent">Secret Recovery Phrase</button>
<button class="start-button full-button" (click)="step = 2" mat-flat-button color="accent">{{ 'Key.SecretRecoveryPhrase' | translate }}</button>
<br /><br />
<button class="start-button full-button" (click)="step = 3" mat-flat-button color="accent">Private Key</button>
<button class="start-button full-button" (click)="step = 3" mat-flat-button color="accent">{{ 'Key.PrivateKey' | translate }}</button>
<br /><br />
<button class="start-button full-button" (click)="scanQrCode()" mat-flat-button color="accent"><mat-icon>qr_code_scanner</mat-icon> Scan QR Code</button>
<button class="start-button full-button" (click)="scanQrCode()" mat-flat-button color="accent"><mat-icon>qr_code_scanner</mat-icon>{{ 'Key.ScanQRCode' | translate }}</button>
</mat-card-content>
</mat-card>
<mat-card class="card" *ngIf="step == 2">
<mat-card-content>
<h1>Secret Recovery Phrase Import</h1>
<h1>{{ 'Key.SecretRecoveryPhraseImport' | translate }}</h1>
<br />
<mat-form-field class="input-full-width">
<mat-label>Secret Recovery Phrase</mat-label>
<mat-label>{{ 'Key.SecretRecoveryPhrase' | translate }}</mat-label>
<textarea class="note-input" matInput type="text" [(ngModel)]="mnemonic" rows="2"></textarea>
</mat-form-field>
<br />
<button [disabled]="!mnemonic" class="start-button" (click)="setPrivateKey(); step = 3" mat-raised-button>Continue</button><br /><br />
<button [disabled]="!mnemonic" class="start-button" (click)="setPrivateKey(); step = 3" mat-raised-button>{{ 'Key.Continue' | translate }}</button><br /><br />
<!-- <div><button class="skip-button" (click)="persistKey(privateKey)" color="primary" mat-raised-button>Connect (read-only)</button></div> -->
</mat-card-content>
@ -39,17 +39,17 @@
<mat-card class="card" *ngIf="step == 3">
<mat-card-content>
<h1 *ngIf="mnemonic">Protect Private Key with password</h1>
<h1 *ngIf="!mnemonic">Private Key Import</h1>
<h1 *ngIf="mnemonic">{{ 'Key.ProtectPrivateKeyWithPassword' | translate }}</h1>
<h1 *ngIf="!mnemonic">{{ 'Key.PrivateKeyImport' | translate }}</h1>
<p *ngIf="!mnemonic">If you already have an existing private for your Nostr account, you can import it here and protect it with a password.</p>
<p>Having a strong password (we allow empty) is adviced, as this will be used to protect your private key using encryption when you are not using Blockcore Notes.</p>
<br />
<p class="wrap" *ngIf="mnemonic">Your personal private key:<br>{{ privateKey }}</p>
<p class="wrap" *ngIf="mnemonic">{{ 'Key.YourPersonalPrivateKey' | translate }}:<br>{{ privateKey }}</p>
<div *ngIf="!mnemonic">
<mat-form-field appearance="fill" class="input-full-width connect-input">
<mat-icon class="circle" matPrefix>person_add</mat-icon>
<mat-label>Private Key</mat-label>
<mat-label>{{ 'Key.PrivateKey' | translate }}</mat-label>
<input (keyup)="updatePublicKey()" placeholder="nsec..." matInput type="password" [(ngModel)]="privateKey" />
</mat-form-field>
</div>
@ -57,22 +57,22 @@
<form>
<mat-form-field appearance="fill" class="input-full-width connect-input">
<mat-icon class="circle" matPrefix>person_add</mat-icon>
<mat-label>Public Key</mat-label>
<mat-label>{{ 'Key.PublicKey' | translate }}</mat-label>
<input [readonly]="true" autocomplete="username" name="email" placeholder="npub..." matInput type="email" [(ngModel)]="publicKey" />
</mat-form-field>
<mat-form-field appearance="fill" class="input-full-width connect-input">
<mat-icon class="circle" matPrefix>password</mat-icon>
<mat-label>Password (optional)</mat-label>
<mat-label>{{ 'Create.PasswordOptional' | translate }}</mat-label>
<input matInput type="password" autocomplete="current-password" name="password" [(ngModel)]="password" />
</mat-form-field>
<br />
<button [disabled]="!publicKey" class="start-button" (click)="persistKey()" mat-raised-button>Connect</button><br /><br />
<button [disabled]="!publicKey" class="start-button" (click)="persistKey()" mat-raised-button>{{ 'Key.Connect' | translate }}</button><br /><br />
</form>
<p *ngIf="!error" class="public-key dimmed"><strong>Public Key (hex)</strong>: {{ publicKeyHex }}</p>
<p *ngIf="error" class="error">Error: {{ error }}</p>
<p *ngIf="!error" class="public-key dimmed"><strong>{{ 'Key.PublicKeyHex' | translate }}</strong>: {{ publicKeyHex }}</p>
<p *ngIf="error" class="error">{{ 'Key.Error' | translate }}: {{ error }}</p>
<p class="dimmed">Remember that Blockcore cannot change or reset your password. Make sure you have a separate backup of your <strong>private key</strong> in case you loose your password.</p>
<p class="dimmed">You will be asked to enter password (if supplied) when Notes need to sign events on your behalf.</p>

View File

@ -14,15 +14,15 @@
<div class="home-left">
<mat-card class="home-card">
<mat-card-header>
<mat-card-title>Activity Feed</mat-card-title>
<mat-card-title>{{ 'Home.ActivityFeed' | translate }}</mat-card-title>
</mat-card-header>
<mat-card-content class="activity-feed" *ngIf="ui.activityFeed$ | async as activityFeed">
<p *ngFor="let notification of activityFeed">
<app-notification-label [notification]="notification"></app-notification-label>
</p>
<p class="dimmed" *ngIf="activityFeed.length == 0">No activities</p>
<p class="dimmed" *ngIf="activityFeed.length == 0">{{ 'Home.NoActivities' | translate }}</p>
<div class="centered">
<button mat-button routerLink="/notifications">View more</button>
<button mat-button routerLink="/notifications">{{ 'Home.ViewMore' | translate }}</button>
</div>
</mat-card-content>
</mat-card>
@ -82,25 +82,25 @@
<mat-card class="home-card">
<mat-card-header>
<mat-card-title>Following Lists</mat-card-title>
<mat-card-subtitle>Lists of users based upon topics you can add to your following list.</mat-card-subtitle>
<mat-card-title>{{ 'Home.FollowingLists' | translate }}</mat-card-title>
<mat-card-subtitle>{{ 'Home.FollowingListsNote' | translate }}</mat-card-subtitle>
</mat-card-header>
<mat-card-content>
<div class="list-selection" *ngFor="let list of lists">
{{ list.name }}<br />
<small>{{ list.about }}</small><br />
<button class="full-width" [routerLink]="['/following', list.pubkeyhex]" mat-flat-button color="primary">View profiles</button>
<button class="full-width" [routerLink]="['/following', list.pubkeyhex]" mat-flat-button color="primary">{{ 'Home.ViewProfiles' | translate }}</button>
</div>
</mat-card-content>
</mat-card>
<mat-card class="home-card">
<mat-card-header>
<mat-card-title>Prototype</mat-card-title>
<mat-card-title>{{ 'Home.Prototype' | translate }}</mat-card-title>
</mat-card-header>
<mat-card-content>
<p>Blockcore Notes is currently in prototype quality stage. Reset the database often.</p>
<p>Please consider donating some Bitcoin using Geyser:</p>
<p>{{ 'Home.PrototypeTitle' | translate }}</p>
<p>{{ 'Home.PrototypeSubtitle' | translate }}</p>
<p>
<a href="https://geyser.fund/project/blockcore" target="_blank">geyser.fund/blockcore</a>
</p>
@ -112,7 +112,7 @@
<div class="centered">
<button routerLink="/editor" mat-fab extended color="primary">
<mat-icon>note_add</mat-icon>
Write a Note
{{ 'Home.WriteANote' | translate }}
</button>
</div>
@ -151,7 +151,7 @@
</mat-card>
<p class="view-more-container">
<button mat-button routerLink="/feed">View following notes...</button>
<button mat-button routerLink="/feed">{{ 'Home.ViewFollowingNotes' | translate }}</button>
</p>
<!-- <mat-card class="home-card">

View File

@ -5,18 +5,18 @@
<mat-accordion class="options">
<mat-expansion-panel>
<mat-expansion-panel-header>
<mat-panel-title>Options</mat-panel-title>
<mat-panel-title>{{ 'Note.Options' | translate }}</mat-panel-title>
<mat-panel-description></mat-panel-description>
</mat-expansion-panel-header>
<p>
<mat-slide-toggle class="options-slider" (change)="optionsService.save()" [(ngModel)]="optionsService.values.showLines">Show lines</mat-slide-toggle>
<mat-slide-toggle class="options-slider" (change)="optionsService.save()" [(ngModel)]="optionsService.values.showLines">{{ 'Note.ShowLines' | translate }}</mat-slide-toggle>
</p>
</mat-expansion-panel>
</mat-accordion>
</div>
<mat-card *ngIf="event.rootEventId" class="button-card">
<button mat-flat-button (click)="open(event.rootEventId)"><mat-icon>keyboard_double_arrow_up</mat-icon>View Thread</button>
<button mat-flat-button (click)="open(event.rootEventId)"><mat-icon>keyboard_double_arrow_up</mat-icon>{{ 'Note.ViewThread' | translate }}</button>
</mat-card>
<div class="parent-event" *ngIf="ui.parentEvent$ | async as parentEvent">
@ -25,7 +25,7 @@
<div class="current-event events2 noclick" [ngClass]="{'is-root': !event.parentEventId, 'has-root': event.parentEventId, 'no-lines': !optionsService.values.showLines, 'lines': optionsService.values.showLines }">
<mat-card *ngIf="event.parentEventId" class="button-card">
<button mat-flat-button (click)="open(event.parentEventId)"><mat-icon>keyboard_arrow_up</mat-icon>View Parent</button>
<button mat-flat-button (click)="open(event.parentEventId)"><mat-icon>keyboard_arrow_up</mat-icon>{{ 'Note.ViewParent' | translate }}</button>
</mat-card>
<div class="events-header">

View File

@ -1,11 +1,11 @@
<div class="feed-page">
<app-labels (selectionChanged)="filterNotes($event)"></app-labels>
<div *ngIf="notesService.items.length === 0">Notes are all your saved posts. These can be your own, or they can be copies of public posts made by others. You can add tags to organize your saved notes.<br /></div>
<div *ngIf="notesService.items.length === 0">{{ 'Notes.Title' | translate }}<br /></div>
<div class="notes">
<mat-card class="events" *ngFor="let note of notesService.filtered">
<div class="events-header">
<app-event-header [pubkey]="note.pubkey">Posted: <span class="event-date">{{ note.created_at | ago }}</span>, Saved: <span class="event-date">{{ note.saved | ago }}</span> </app-event-header>
<app-event-header [pubkey]="note.pubkey">{{ 'Notes.Posted' | translate }}: <span class="event-date">{{ note.created_at | ago }}</span>, {{ 'Notes.Saved' | translate }}: <span class="event-date">{{ note.saved | ago }}</span> </app-event-header>
<app-event-actions [event]="note"></app-event-actions>
</div>

View File

@ -122,9 +122,9 @@
<mat-card>
<mat-card-content>
<button mat-stroked-button (click)="registerHandler('web+nostr', 'nostr')">Register Protocol Handler</button>
<button mat-stroked-button (click)="registerHandler('web+nostr', 'nostr')">{{ 'Settings.RegisterProtocolHandler' | translate }}</button>
<br /><br />
<div class="dimmed">Click the button to make Blockcore Notes handle links on websites for npub, nevent and nprofile.</div>
<div class="dimmed">{{ 'Settings.RegisterProtocolHandlerNote' | translate }}</div>
</mat-card-content>
</mat-card>
</div>
@ -134,19 +134,19 @@
<mat-tab>
<ng-template mat-tab-label>
<mat-icon class="example-tab-icon">inventory_2</mat-icon>
<span *ngIf="(appState.displayLabels$ | async) === false">&nbsp;Data</span>
<span *ngIf="(appState.displayLabels$ | async) === false">&nbsp;{{ 'Settings.Data' | translate }}</span>
</ng-template>
<ng-template matTabContent>
<div class="page">
<mat-card *ngIf="hasPrivateKey">
<mat-card-header>
<mat-card-title>Export Private Key</mat-card-title>
<mat-card-subtitle>Keep this private key safe, if you loose it or share it with websites, it can be stolen and misused.</mat-card-subtitle>
<mat-card-title>{{ 'Settings.ExportPrivateKey' | translate }}</mat-card-title>
<mat-card-subtitle>{{ 'Settings.ExportPrivateKeyNote' | translate }}</mat-card-subtitle>
</mat-card-header>
<mat-card-content>
<button class="signup-button" mat-stroked-button (click)="exportPrivateKey()">Export Private Key</button>
<button class="signup-button" mat-stroked-button (click)="exportPrivateKey()">{{ 'Settings.ExportPrivateKey' | translate }}</button>
<div class="selectable wrap" *ngIf="verifiedWalletPassword === true">
<br />Private key:
<br />{{ 'Settings.PrivateKey' | translate }}:
<p>
{{ privateKey }}<button class="copy-button" mat-icon-button [cdkCopyToClipboard]="privateKey!">
<mat-icon>content_copy</mat-icon>
@ -156,8 +156,8 @@
<img [src]="qrCodePrivateKey" class="qr-code" />
</p>
</div>
<div *ngIf="verifiedWalletPassword === false">Invalid Password</div>
<button *ngIf="verifiedWalletPassword === true" class="signup-button" mat-flat-button color="warn" (click)="resetPrivateKey()">Hide</button>
<div *ngIf="verifiedWalletPassword === false">{{ 'Settings.InvalidPassword' | translate }}</div>
<button *ngIf="verifiedWalletPassword === true" class="signup-button" mat-flat-button color="warn" (click)="resetPrivateKey()">{{ 'Settings.Hide' | translate }}</button>
</mat-card-content>
</mat-card>
@ -172,9 +172,9 @@
<p *ngIf="wipedNotes">All cached notes data was cleared.</p> -->
<br />
<p>
<button mat-flat-button color="warn" (click)="db.clearAndReload()">Wipe Local Database</button>
<button mat-flat-button color="warn" (click)="db.clearAndReload()">{{ 'Settings.WipeLocalDatabase' | translate }}</button>
</p>
<p *ngIf="wiped">All local data cache was cleared.</p>
<p *ngIf="wiped">{{ 'Settings.AllLocalDataCacheWasCleared' | translate }}</p>
</div>
</ng-template>
</mat-tab>

View File

@ -44,7 +44,7 @@
<h3 class="marginless">Looks a bit lonely here? This is probably because it's been a while since @{{ ui.profile?.name }} has posted.</h3>
</div> -->
<div *ngIf="!isFollowing" class="dimmed">You must follow the user to automatically render photos.</div>
<div *ngIf="!isFollowing" class="dimmed">{{ 'User.YouMustFollowTheUserToAutomaticallyRenderPhotos' | translate }}</div>
<br />
<div class="image-grid" [photoGalleryGroup]="{ arrowEl: true, indexIndicatorSep: ' - ' }">
@ -71,12 +71,12 @@
</mat-card> -->
</ng-template>
<ng-template [ngIf]="items.loading"><mat-spinner class="loading"></mat-spinner></ng-template>
<ng-template [ngIf]="items.error">Error {{ items.error }}</ng-template>
<ng-template [ngIf]="items.error">{{'User.Error' | translate }} {{ items.error }}</ng-template>
</div>
<div class="show-more centered">
<button *ngIf="!ui.viewCounts.rootEventsViewCountExhausted" mat-button (click)="showMore()">Show more...</button>
<button *ngIf="ui.viewCounts.replyEventsViewCountExhausted" mat-button (click)="showMore()">Loading more events... or there are nothing more to show...</button>
<button *ngIf="!ui.viewCounts.rootEventsViewCountExhausted" mat-button (click)="showMore()">{{ 'User.ShowMore' | translate }}</button>
<button *ngIf="ui.viewCounts.replyEventsViewCountExhausted" mat-button (click)="showMore()">{{ 'User.LoadingMoreEvents' | translate }}</button>
</div>
</mat-tab>
<mat-tab label="Replies">
@ -96,12 +96,12 @@
</mat-card>
</ng-template>
<ng-template [ngIf]="items.loading"><mat-spinner class="loading"></mat-spinner></ng-template>
<ng-template [ngIf]="items.error">Error {{ items.error }}</ng-template>
<ng-template [ngIf]="items.error"> {{'User.Error' | translate }} {{ items.error }}</ng-template>
</div>
<div class="show-more centered">
<button *ngIf="!ui.viewCounts.replyEventsViewCountExhausted" mat-button (click)="showMore()">Show more...</button>
<button *ngIf="ui.viewCounts.replyEventsViewCountExhausted" mat-button (click)="showMore()">Loading more events... or there are nothing more to show...</button>
<button *ngIf="!ui.viewCounts.replyEventsViewCountExhausted" mat-button (click)="showMore()">{{ 'User.ShowMore' | translate }}</button>
<button *ngIf="ui.viewCounts.replyEventsViewCountExhausted" mat-button (click)="showMore()">{{ 'User.LoadingMoreEvents' | translate }}</button>
</div>
</mat-tab>
</mat-tab-group>
@ -123,12 +123,12 @@
</mat-card>
</ng-template>
<ng-template [ngIf]="items.loading"><mat-spinner class="loading"></mat-spinner></ng-template>
<ng-template [ngIf]="items.error">Error {{ items.error }}</ng-template>
<ng-template [ngIf]="items.error">{{'User.Error' | translate }} {{ items.error }}</ng-template>
</div>
<div class="show-more centered">
<button *ngIf="!ui.viewCounts.rootEventsViewCountExhausted" mat-button (click)="showMore()">Show more...</button>
<button *ngIf="ui.viewCounts.replyEventsViewCountExhausted" mat-button (click)="showMore()">Loading more events... or there are nothing more to show...</button>
<button *ngIf="!ui.viewCounts.rootEventsViewCountExhausted" mat-button (click)="showMore()">{{ 'User.ShowMore' | translate }}</button>
<button *ngIf="ui.viewCounts.replyEventsViewCountExhausted" mat-button (click)="showMore()">{{ 'User.LoadingMoreEvents' | translate }}</button>
</div>
</mat-tab>
<mat-tab label="Replies">
@ -148,12 +148,12 @@
</mat-card>
</ng-template>
<ng-template [ngIf]="items.loading"><mat-spinner class="loading"></mat-spinner></ng-template>
<ng-template [ngIf]="items.error">Error {{ items.error }}</ng-template>
<ng-template [ngIf]="items.error">{{'User.Error' | translate }} {{ items.error }}</ng-template>
</div>
<div class="show-more centered">
<button *ngIf="!ui.viewCounts.replyEventsViewCountExhausted" mat-button (click)="showMore()">Show more...</button>
<button *ngIf="ui.viewCounts.replyEventsViewCountExhausted" mat-button (click)="showMore()">Loading more events... or there are nothing more to show...</button>
<button *ngIf="!ui.viewCounts.replyEventsViewCountExhausted" mat-button (click)="showMore()">{{ 'User.ShowMore' | translate }}</button>
<button *ngIf="ui.viewCounts.replyEventsViewCountExhausted" mat-button (click)="showMore()">{{ 'User.LoadingMoreEvents' | translate }}</button>
</div>
</mat-tab>
</mat-tab-group>

View File

@ -9,7 +9,83 @@
"ru": "Русский",
"App": {
"Hide": "Hide",
"ConvertKey": "Convert Key"
"ConvertKey": "Convert Key",
"Search": "Search",
"Home": "Home",
"Feed": "Feed",
"Notifications": "Notifications",
"People": "People",
"Circles": "Circles",
"Bookmarks": "Bookmarks",
"Relays": "Relays",
"Followers": "Followers",
"Following": "Following",
"ViewProfile": "View profile",
"EditProfile": "Edit profile",
"Badges": "Badges",
"Settings": "Settings",
"About": "About",
"Logout": "Logout"
},
"Badge": {
"CreatedBy": "Created by",
"IssueBadge": "ISSUE BADGE",
"Edit": "EDIT",
"PubKeyDescription": "Pub Key (hex format only, line separated, add relay comma separated at the end)",
"PublishBadgeReward": "Publish Badge Reward"
},
"Badges": {
"Options": "Options",
"BadgeEditor": "Badge Editor",
"Accepted": "Accepted",
"Awarded": "Awarded",
"Created": "Created"
},
"Circles": {
"Count": "Count",
"Public": "Public",
"Private": "Private",
"Created": "Created",
"Copy": "Copy",
"DeleteCircle": "Delete Circle",
"PublicKeysNpub": "Public Keys (npub)",
"PublicKeysHex": "Public Keys (hex)",
"CirclesDescription": "Circles is how you organize people you follow. Different circles can have different rules applied and circles is an important way to make the experience more enjoyable."
},
"Create": {
"WhoAreYou": "Who Are You?",
"WhoAreYouSubtitle": "Add some (optional) basics about yourself. This information will be public.",
"DisplayName": "Display Name",
"Nickname": "Nickname",
"About": "About",
"ProfileImage": "Profile Image",
"EmailDomainIdentifierNIP05": "E-mail/Domain Identifier (NIP05)",
"Continue": "Continue",
"YourSecretRecoveryPhrase": "Your secret recovery phrase",
"Copy": "Copy",
"SecretRecoveryPhraseDescription": "This is your private and secret sentence. You must store it safely, if you lose it, you will lose access to your account. Nobody can recover it for you.",
"SecretRecoveryPhraseWarning": "Keep it safe, keep it hidden.",
"Back": "Back",
"PrivateAndPublicKeys": "Private and Public Keys",
"YourPersonalPrivateKey": "Your Personal Private Key",
"PublicKey": "Public Key",
"PasswordOptional": "Password (optional)",
"SaveAndLogIn": "Save and Log In"
},
"Key": {
"PrivateKeyImport": "Private Key Import",
"PrivateKeyImportSubtitle": "If you already have an existing private for your Nostr account, you can import it here and protect it with a password.",
"PrivateKeyImportDescription": "First choose if your backup is a secret recovery phrase or a private key.",
"SecretRecoveryPhrase": "Secret Recovery Phrase",
"PrivateKey": "Private Key",
"ScanQRCode": "Scan QR-code",
"SecretRecoveryPhraseImport": "Secret Recovery Phrase Import",
"Continue": "Continue",
"ProtectPrivateKeyWithPassword": "Protect Private Key with password",
"YourPersonalPrivateKey": "Your personal private key",
"Connect": "Connect",
"PublicKeyHex": "Public Keys (hex)",
"Error": "Error"
},
"Settings": {
"Options": "Options",
@ -35,7 +111,40 @@
"MediaWidgetsNote": "Enable this to allow the app to render music widgets when URLs linked to the services is seen in notes.",
"EnableSpotify": "Enable Spotify",
"EnableTidal": "Enable Tidal",
"OpenMediaPlayer": "Open Media Player"
"OpenMediaPlayer": "Open Media Player",
"RegisterProtocolHandlerNote": "Click the button to make Blockcore Notes handle links on websites for npub, nevent and nprofile.",
"Data": "Data",
"ExportPrivateKey": "Export Private Key",
"ExportPrivateKeyNote": "Keep this private key safe, if you loose it or share it with websites, it can be stolen and misused.",
"PrivateKey": "Private Key",
"InvalidPassword": "Invalid Password",
"Hide": "Hide",
"WipeLocalDatabase": "Wipe Local Database",
"AllLocalDataCacheWasCleared": "All local data cache was cleared."
},
"Home": {
"ActivityFeed": "Activity Feed",
"NoActivities": "No Activities",
"ViewMore": "View more...",
"FollowingLists": "Following Lists",
"FollowingListsNote": "Lists of users based upon topics you can add to your following list.",
"ViewProfiles": "View Profiles",
"Prototype": "Prototype",
"PrototypeTitle": "Blockcore Notes is currently in prototype quality stage. Reset the database often.",
"PrototypeSubtitle": "Please consider donating some Bitcoin using Geyser:",
"WriteANote": "Write a note",
"ViewFollowingNotes": "View following notes"
},
"Note": {
"Options": "Options",
"ShowLines": "Show lines",
"ViewThread": "View Thread",
"ViewParent": "View Parent"
},
"Notes": {
"Title": "Notes are all your saved posts. These can be your own, or they can be copies of public posts made by others. You can add tags to organize your saved notes.",
"Posted": "Posted",
"Saved": "Saved"
},
"Notifications": {
"Options": "Options",
@ -80,6 +189,12 @@
"Cancel": "Cancel",
"Save": "Save"
},
"User": {
"YouMustFollowTheUserToAutomaticallyRenderPhotos": "You must follow the user to automatically render photos",
"Error": "Error",
"ShowMore": "Show more...",
"LoadingMoreEvents": "Loading more events... or there are nothing more to show..."
},
"Relays": {
"Options": "Options",
"AppendFromExtension": "Append from extension",

View File

@ -9,7 +9,83 @@
"ru": "Русский",
"App": {
"Hide": "Skjul",
"ConvertKey": "Endre nøkkel"
"ConvertKey": "Endre nøkkel",
"Search": "Search",
"Home": "Home",
"Feed": "Feed",
"Notifications": "Notifications",
"People": "People",
"Circles": "Circles",
"Bookmarks": "Bookmarks",
"Relays": "Relays",
"Followers": "Followers",
"Following": "Following",
"ViewProfile": "View profile",
"EditProfile": "Edit profile",
"Badges": "Badges",
"Settings": "Settings",
"About": "About",
"Logout": "Logout"
},
"Badge": {
"CreatedBy": "Created by",
"IssueBadge": "ISSUE BADGE",
"Edit": "EDIT",
"PubKeyDescription": "Pub Key (hex format only, line separated, add relay comma separated at the end)",
"PublishBadgeReward": "Publish Badge Reward"
},
"Badges": {
"Options": "Options",
"BadgeEditor": "Badge Editor",
"Accepted": "Accepted",
"Awarded": "Awarded",
"Created": "Created"
},
"Circles": {
"Count": "Count",
"Public": "Public",
"Private": "Private",
"Created": "Created",
"Copy": "Copy",
"DeleteCircle": "Delete Circle",
"PublicKeysNpub": "Public Keys (npub)",
"PublicKeysHex": "Public Keys (hex)",
"CirclesDescription": "Circles is how you organize people you follow. Different circles can have different rules applied and circles is an important way to make the experience more enjoyable."
},
"Create": {
"WhoAreYou": "Who Are You?",
"WhoAreYouSubtitle": "Add some (optional) basics about yourself. This information will be public.",
"DisplayName": "Display Name",
"Nickname": "Nickname",
"About": "About",
"ProfileImage": "Profile Image",
"EmailDomainIdentifierNIP05": "E-mail/Domain Identifier (NIP05)",
"Continue": "Continue",
"YourSecretRecoveryPhrase": "Your secret recovery phrase",
"Copy": "Copy",
"SecretRecoveryPhraseDescription": "This is your private and secret sentence. You must store it safely, if you lose it, you will lose access to your account. Nobody can recover it for you.",
"SecretRecoveryPhraseWarning": "Keep it safe, keep it hidden.",
"Back": "Back",
"PrivateAndPublicKeys": "Private and Public Keys",
"YourPersonalPrivateKey": "Your Personal Private Key",
"PublicKey": "Public Key",
"PasswordOptional": "Password (optional)",
"SaveAndLogIn": "Save and Log In"
},
"Key": {
"PrivateKeyImport": "Private Key Import",
"PrivateKeyImportSubtitle": "If you already have an existing private for your Nostr account, you can import it here and protect it with a password.",
"PrivateKeyImportDescription": "First choose if your backup is a secret recovery phrase or a private key.",
"SecretRecoveryPhrase": "Secret Recovery Phrase",
"PrivateKey": "Private Key",
"ScanQRCode": "Scan QR-code",
"SecretRecoveryPhraseImport": "Secret Recovery Phrase Import",
"Continue": "Continue",
"ProtectPrivateKeyWithPassword": "Protect Private Key with password",
"YourPersonalPrivateKey": "Your personal private key",
"Connect": "Connect",
"PublicKeyHex": "Public Keys (hex)",
"Error": "Error"
},
"Settings": {
"OptionsTitle": "Appinnstillinger",
@ -34,7 +110,40 @@
"MediaWidgetsNote": "Enable this to allow the app to render music widgets when URLs linked to the services is seen in notes.",
"EnableSpotify": "Enable Spotify",
"EnableTidal": "Enable Tidal",
"OpenMediaPlayer": "Open Media Player"
"OpenMediaPlayer": "Open Media Player",
"RegisterProtocolHandlerNote": "Click the button to make Blockcore Notes handle links on websites for npub, nevent and nprofile.",
"Data": "Data",
"ExportPrivateKey": "Export Private Key",
"ExportPrivateKeyNote": "Keep this private key safe, if you loose it or share it with websites, it can be stolen and misused.",
"PrivateKey": "Private Key",
"InvalidPassword": "Invalid Password",
"Hide": "Hide",
"WipeLocalDatabase": "Wipe Local Database",
"AllLocalDataCacheWasCleared": "All local data cache was cleared."
},
"Home": {
"ActivityFeed": "Activity Feed",
"NoActivities": "No Activities",
"ViewMore": "View more...",
"FollowingLists": "Following Lists",
"FollowingListsNote": "Lists of users based upon topics you can add to your following list.",
"ViewProfiles": "View Profiles",
"Prototype": "Prototype",
"PrototypeTitle": "Blockcore Notes is currently in prototype quality stage. Reset the database often.",
"PrototypeSubtitle": "Please consider donating some Bitcoin using Geyser:",
"WriteANote": "Write a note",
"ViewFollowingNotes": "View following notes"
},
"Note": {
"Options": "Options",
"ShowLines": "Show lines",
"ViewThread": "View Thread",
"ViewParent": "View Parent"
},
"Notes": {
"Title": "Notes are all your saved posts. These can be your own, or they can be copies of public posts made by others. You can add tags to organize your saved notes.",
"Posted": "Posted",
"Saved": "Saved"
},
"Notifications": {
"Options": "Alternativ",
@ -79,6 +188,12 @@
"Cancel": "Cancel",
"Save": "Save"
},
"User": {
"YouMustFollowTheUserToAutomaticallyRenderPhotos": "You must follow the user to automatically render photos",
"Error": "Error",
"ShowMore": "Show more...",
"LoadingMoreEvents": "Loading more events... or there are nothing more to show..."
},
"Relays": {
"Options": "Alternativ",
"AppendFromExtension": "Legg til fra utvidelse",
@ -87,6 +202,13 @@
"PublishRelay(NIP-65)list": "Publiser relay (NIP-65) liste",
"DeleteAllRelays": "Slett alle relays"
},
"RelayDialog": {
"AddARelay": "Add a relay",
"Read": "Read",
"Write": "Write",
"Cancel": "Cancel",
"Add": "Add"
},
"Relay": {
"Administrator": "Administrator",
"Contact": "Kontakt",

View File

@ -9,7 +9,83 @@
"ru": "Русский",
"App": {
"Hide": "Hide",
"ConvertKey": "Convert Key"
"ConvertKey": "Convert Key",
"Search": "Search",
"Home": "Home",
"Feed": "Feed",
"Notifications": "Notifications",
"People": "People",
"Circles": "Circles",
"Bookmarks": "Bookmarks",
"Relays": "Relays",
"Followers": "Followers",
"Following": "Following",
"ViewProfile": "View profile",
"EditProfile": "Edit profile",
"Badges": "Badges",
"Settings": "Settings",
"About": "About",
"Logout": "Logout"
},
"Badge": {
"CreatedBy": "Created by",
"IssueBadge": "ISSUE BADGE",
"Edit": "EDIT",
"PubKeyDescription": "Pub Key (hex format only, line separated, add relay comma separated at the end)",
"PublishBadgeReward": "Publish Badge Reward"
},
"Badges": {
"Options": "Options",
"BadgeEditor": "Badge Editor",
"Accepted": "Accepted",
"Awarded": "Awarded",
"Created": "Created"
},
"Circles": {
"Count": "Count",
"Public": "Public",
"Private": "Private",
"Created": "Created",
"Copy": "Copy",
"DeleteCircle": "Delete Circle",
"PublicKeysNpub": "Public Keys (npub)",
"PublicKeysHex": "Public Keys (hex)",
"CirclesDescription": "Circles is how you organize people you follow. Different circles can have different rules applied and circles is an important way to make the experience more enjoyable."
},
"Create": {
"WhoAreYou": "Who Are You?",
"WhoAreYouSubtitle": "Add some (optional) basics about yourself. This information will be public.",
"DisplayName": "Display Name",
"Nickname": "Nickname",
"About": "About",
"ProfileImage": "Profile Image",
"EmailDomainIdentifierNIP05": "E-mail/Domain Identifier (NIP05)",
"Continue": "Continue",
"YourSecretRecoveryPhrase": "Your secret recovery phrase",
"Copy": "Copy",
"SecretRecoveryPhraseDescription": "This is your private and secret sentence. You must store it safely, if you lose it, you will lose access to your account. Nobody can recover it for you.",
"SecretRecoveryPhraseWarning": "Keep it safe, keep it hidden.",
"Back": "Back",
"PrivateAndPublicKeys": "Private and Public Keys",
"YourPersonalPrivateKey": "Your Personal Private Key",
"PublicKey": "Public Key",
"PasswordOptional": "Password (optional)",
"SaveAndLogIn": "Save and Log In"
},
"Key": {
"PrivateKeyImport": "Private Key Import",
"PrivateKeyImportSubtitle": "If you already have an existing private for your Nostr account, you can import it here and protect it with a password.",
"PrivateKeyImportDescription": "First choose if your backup is a secret recovery phrase or a private key.",
"SecretRecoveryPhrase": "Secret Recovery Phrase",
"PrivateKey": "Private Key",
"ScanQRCode": "Scan QR-code",
"SecretRecoveryPhraseImport": "Secret Recovery Phrase Import",
"Continue": "Continue",
"ProtectPrivateKeyWithPassword": "Protect Private Key with password",
"YourPersonalPrivateKey": "Your personal private key",
"Connect": "Connect",
"PublicKeyHex": "Public Keys (hex)",
"Error": "Error"
},
"Settings": {
"Options": "Options",
@ -35,7 +111,40 @@
"MediaWidgetsNote": "Enable this to allow the app to render music widgets when URLs linked to the services is seen in notes.",
"EnableSpotify": "Enable Spotify",
"EnableTidal": "Enable Tidal",
"OpenMediaPlayer": "Open Media Player"
"OpenMediaPlayer": "Open Media Player",
"RegisterProtocolHandlerNote": "Click the button to make Blockcore Notes handle links on websites for npub, nevent and nprofile.",
"Data": "Data",
"ExportPrivateKey": "Export Private Key",
"ExportPrivateKeyNote": "Keep this private key safe, if you loose it or share it with websites, it can be stolen and misused.",
"PrivateKey": "Private Key",
"InvalidPassword": "Invalid Password",
"Hide": "Hide",
"WipeLocalDatabase": "Wipe Local Database",
"AllLocalDataCacheWasCleared": "All local data cache was cleared."
},
"Home": {
"ActivityFeed": "Activity Feed",
"NoActivities": "No Activities",
"ViewMore": "View more...",
"FollowingLists": "Following Lists",
"FollowingListsNote": "Lists of users based upon topics you can add to your following list.",
"ViewProfiles": "View Profiles",
"Prototype": "Prototype",
"PrototypeTitle": "Blockcore Notes is currently in prototype quality stage. Reset the database often.",
"PrototypeSubtitle": "Please consider donating some Bitcoin using Geyser:",
"WriteANote": "Write a note",
"ViewFollowingNotes": "View following notes"
},
"Note": {
"Options": "Options",
"ShowLines": "Show lines",
"ViewThread": "View Thread",
"ViewParent": "View Parent"
},
"Notes": {
"Title": "Notes are all your saved posts. These can be your own, or they can be copies of public posts made by others. You can add tags to organize your saved notes.",
"Posted": "Posted",
"Saved": "Saved"
},
"Notifications": {
"Options": "Options",
@ -80,6 +189,12 @@
"Cancel": "Cancel",
"Save": "Save"
},
"User": {
"YouMustFollowTheUserToAutomaticallyRenderPhotos": "You must follow the user to automatically render photos",
"Error": "Error",
"ShowMore": "Show more...",
"LoadingMoreEvents": "Loading more events... or there are nothing more to show..."
},
"Relays": {
"Options": "Options",
"AppendFromExtension": "Append from extension",