Merge branch 'master' into frontend_runtime_config

This commit is contained in:
wiz 2022-10-15 04:28:56 +09:00 committed by GitHub
commit 3e41e512ad
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
42 changed files with 2357 additions and 622 deletions

View File

@ -22,7 +22,7 @@
"scripts": { "scripts": {
"ng": "./node_modules/@angular/cli/bin/ng.js", "ng": "./node_modules/@angular/cli/bin/ng.js",
"tsc": "./node_modules/typescript/bin/tsc", "tsc": "./node_modules/typescript/bin/tsc",
"i18n-extract-from-source": "./node_modules/@angular/cli/bin/ng extract-i18n --out-file ./src/locale/messages.xlf", "i18n-extract-from-source": "npm run ng -- extract-i18n --out-file ./src/locale/messages.xlf",
"i18n-pull-from-transifex": "tx pull -a --parallel --minimum-perc 1 --force", "i18n-pull-from-transifex": "tx pull -a --parallel --minimum-perc 1 --force",
"serve": "npm run generate-config && npm run ng -- serve -c local", "serve": "npm run generate-config && npm run ng -- serve -c local",
"serve:stg": "npm run generate-config && npm run ng -- serve -c staging", "serve:stg": "npm run generate-config && npm run ng -- serve -c staging",

View File

@ -31,17 +31,17 @@
<button class="btn btn-primary w-100" id="dropdownBasic1" ngbDropdownToggle i18n="lightning">Lightning</button> <button class="btn btn-primary w-100" id="dropdownBasic1" ngbDropdownToggle i18n="lightning">Lightning</button>
<div ngbDropdownMenu aria-labelledby="dropdownBasic1"> <div ngbDropdownMenu aria-labelledby="dropdownBasic1">
<a class="dropdown-item" routerLinkActive="active" [routerLink]="['/graphs/lightning/nodes-networks' | relativeUrl]" <a class="dropdown-item" routerLinkActive="active" [routerLink]="['/graphs/lightning/nodes-networks' | relativeUrl]"
i18n="lightning.nodes-networks">Lightning nodes per network</a> i18n="lightning.nodes-networks">Lightning Nodes Per Network</a>
<a class="dropdown-item" routerLinkActive="active" [routerLink]="['/graphs/lightning/capacity' | relativeUrl]" <a class="dropdown-item" routerLinkActive="active" [routerLink]="['/graphs/lightning/capacity' | relativeUrl]"
i18n="lightning.capacity">Network capacity</a> i18n="lightning.network-capacity">Lightning Network Capacity</a>
<a class="dropdown-item" routerLinkActive="active" [routerLink]="['/graphs/lightning/nodes-per-isp' | relativeUrl]" <a class="dropdown-item" routerLinkActive="active" [routerLink]="['/graphs/lightning/nodes-per-isp' | relativeUrl]"
i18n="lightning.nodes-per-isp">Lightning nodes per ISP</a> i18n="lightning.nodes-per-isp">Lightning Nodes Per ISP</a>
<a class="dropdown-item" routerLinkActive="active" [routerLink]="['/graphs/lightning/nodes-per-country' | relativeUrl]" <a class="dropdown-item" routerLinkActive="active" [routerLink]="['/graphs/lightning/nodes-per-country' | relativeUrl]"
i18n="lightning.nodes-per-country">Lightning nodes per country</a> i18n="lightning.nodes-per-country">Lightning Nodes Per Country</a>
<a class="dropdown-item" routerLinkActive="active" [routerLink]="['/graphs/lightning/nodes-map' | relativeUrl]" <a class="dropdown-item" routerLinkActive="active" [routerLink]="['/graphs/lightning/nodes-map' | relativeUrl]"
i18n="lightning.lightning.nodes-heatmap">Lightning nodes world map</a> i18n="lightning.lightning.nodes-heatmap">Lightning Nodes World Map</a>
<a class="dropdown-item" routerLinkActive="active" [routerLink]="['/graphs/lightning/nodes-channels-map' | relativeUrl]" <a class="dropdown-item" routerLinkActive="active" [routerLink]="['/graphs/lightning/nodes-channels-map' | relativeUrl]"
i18n="lightning.nodes-channels-world-map">Lightning nodes channels world map</a> i18n="lightning.nodes-channels-world-map">Lightning Nodes Channels World Map</a>
</div> </div>
</div> </div>
</div> </div>

View File

@ -24,7 +24,7 @@
</ng-template> </ng-template>
</span> </span>
<span class="field col-sm-4 text-center"><ng-container *ngIf="transactionTime > 0">&lrm;{{ transactionTime * 1000 | date:'yyyy-MM-dd HH:mm' }}</ng-container></span> <span class="field col-sm-4 text-center"><ng-container *ngIf="transactionTime > 0">&lrm;{{ transactionTime * 1000 | date:'yyyy-MM-dd HH:mm' }}</ng-container></span>
<span class="field col-sm-4 text-right"><span class="label" i18n="transaction.fee|Transaction fee">Fee </span>{{ tx.fee | number }} <span class="symbol" i18n="shared.sat|sat">sat</span></span> <span class="field col-sm-4 text-right"><span class="label" i18n="transaction.fee|Transaction fee">Fee</span> {{ tx.fee | number }} <span class="symbol" i18n="shared.sat|sat">sat</span></span>
</div> </div>

View File

@ -3,7 +3,7 @@
} }
.container-buttons { .container-buttons {
align-self: flex-start; align-self: center;
} }
.title-block { .title-block {

View File

@ -42,7 +42,7 @@
<ng-container [ngSwitch]="line.type"> <ng-container [ngSwitch]="line.type">
<span *ngSwitchCase="'input'" i18n="transaction.input">Input</span> <span *ngSwitchCase="'input'" i18n="transaction.input">Input</span>
<span *ngSwitchCase="'output'" i18n="transaction.output">Output</span> <span *ngSwitchCase="'output'" i18n="transaction.output">Output</span>
<span *ngSwitchCase="'fee'" i18n="transaction.fee">Fee</span> <span *ngSwitchCase="'fee'" i18n="transaction.fee|Transaction fee">Fee</span>
</ng-container> </ng-container>
<span *ngIf="line.type !== 'fee'"> #{{ line.index + 1 }}</span> <span *ngIf="line.type !== 'fee'"> #{{ line.index + 1 }}</span>
</p> </p>

View File

@ -123,7 +123,7 @@
<th class="table-cell-txid" i18n="dashboard.latest-transactions.txid">TXID</th> <th class="table-cell-txid" i18n="dashboard.latest-transactions.txid">TXID</th>
<th class="table-cell-satoshis" i18n="dashboard.latest-transactions.amount">Amount</th> <th class="table-cell-satoshis" i18n="dashboard.latest-transactions.amount">Amount</th>
<th class="table-cell-fiat" *ngIf="(network$ | async) === ''" i18n="dashboard.latest-transactions.USD">USD</th> <th class="table-cell-fiat" *ngIf="(network$ | async) === ''" i18n="dashboard.latest-transactions.USD">USD</th>
<th class="table-cell-fees" i18n="dashboard.latest-transactions.fee">Fee</th> <th class="table-cell-fees" i18n="transaction.fee|Transaction fee">Fee</th>
</thead> </thead>
<tbody> <tbody>
<tr *ngFor="let transaction of transactions$ | async; let i = index;"> <tr *ngFor="let transaction of transactions$ | async; let i = index;">

View File

@ -7,7 +7,7 @@
<app-clipboard [text]="channel.public_key"></app-clipboard> <app-clipboard [text]="channel.public_key"></app-clipboard>
</div> </div>
<div class="box-right"> <div class="box-right">
<div class="second-line">{{ channel.channels }} channels</div> <div class="second-line"><ng-container *ngTemplateOutlet="xChannels; context: {$implicit: channel.channels }"></ng-container></div>
<div class="second-line"><app-amount [satoshis]="channel.capacity" digitsInfo="1.2-2"></app-amount></div> <div class="second-line"><app-amount [satoshis]="channel.capacity" digitsInfo="1.2-2"></app-amount></div>
</div> </div>
</div> </div>
@ -16,7 +16,7 @@
<table class="table table-borderless table-striped"> <table class="table table-borderless table-striped">
<tbody> <tbody>
<tr> <tr>
<td i18n="lightning.fee-rate">Fee rate</td> <td i18n="transaction.fee-rate|Transaction fee rate">Fee rate</td>
<td> <td>
<span class="d-inline-block d-md-none"> <span class="d-inline-block d-md-none">
{{ channel.fee_rate !== null ? (channel.fee_rate | amountShortener : 2 : undefined : true) : '-' }} <span class="symbol">ppm {{ channel.fee_rate !== null ? '(' + (channel.fee_rate / 10000 | amountShortener : 2 : undefined : true) + '%)' : '' }}</span> {{ channel.fee_rate !== null ? (channel.fee_rate | amountShortener : 2 : undefined : true) : '-' }} <span class="symbol">ppm {{ channel.fee_rate !== null ? '(' + (channel.fee_rate / 10000 | amountShortener : 2 : undefined : true) + '%)' : '' }}</span>
@ -33,19 +33,24 @@
<span> <span>
<span *ngIf="channel.base_fee_mtokens !== null"> <span *ngIf="channel.base_fee_mtokens !== null">
{{ channel.base_fee_mtokens | amountShortener : 0 }} {{ channel.base_fee_mtokens | amountShortener : 0 }}
<span class="symbol">msats</span> <span class="symbol" i18n="shared.m-sats">mSats</span>
</span> </span>
<span *ngIf="channel.base_fee_mtokens === null"> <span *ngIf="channel.base_fee_mtokens === null">
- -
</span> </span>
</span> </span>
<span *ngIf="channel.base_fee_mtokens !== null" class="badge" [class]="channel.base_fee_mtokens === 0 ? 'badge-success' : 'badge-danger'" <ng-template [ngIf]="channel.base_fee_mtokens !== null">
i18n-ngbTooltip="lightning.zero-base-fee" <span class="badge badge-success" *ngIf="channel.base_fee_mtokens === 0; else nonZeroBaseFee"
[ngbTooltip]="channel.base_fee_mtokens === 0 ? 'This channel supports zero base fee routing' : i18n-ngbTooltip="lightning.zero-base-fee-tooltip"
'This channel does not support zero base fee routing'" ngbTooltip="This channel supports zero base fee routing"
placement="bottom" i18n="lightning.zerobasefee"> placement="bottom" i18n="lightning.zero-base-fee">Zero base fee</span>
{{ channel.base_fee_mtokens === 0 ? 'Zero base fee' : 'Non-zero base fee' }} </ng-template>
</span> <ng-template #nonZeroBaseFee>
<span class="badge badge-danger"
i18n-ngbTooltip="lightning.non-zero-base-fee-tooltip"
ngbTooltip="This channel does not support zero base fee routing"
placement="bottom" i18n="lightning.non-zero-base-fee">Non-zero base fee</span>
</ng-template>
</span> </span>
</td> </td>
</tr> </tr>
@ -62,7 +67,7 @@
</td> </td>
</tr> </tr>
<tr> <tr>
<td i18n="lightning.timelock-detla">Timelock delta</td> <td i18n="lightning.timelock-delta">Timelock delta</td>
<td> <td>
<ng-container *ngTemplateOutlet="blocksPlural; context: {$implicit: channel.cltv_delta ?? '-' }"></ng-container> <ng-container *ngTemplateOutlet="blocksPlural; context: {$implicit: channel.cltv_delta ?? '-' }"></ng-container>
</td> </td>
@ -72,3 +77,4 @@
</div> </div>
<ng-template #blocksPlural let-i i18n="shared.blocks">{{ i }} <span class="shared-block">blocks</span></ng-template> <ng-template #blocksPlural let-i i18n="shared.blocks">{{ i }} <span class="shared-block">blocks</span></ng-template>
<ng-template #xChannels let-i i18n="lightning.x-channels">{{ i }} channels</ng-template>

View File

@ -7,9 +7,9 @@
<h1 class="title">{{ channel.short_id }}</h1> <h1 class="title">{{ channel.short_id }}</h1>
</div> </div>
<div class="badges mb-2"> <div class="badges mb-2">
<span class="badge rounded-pill badge-secondary" *ngIf="channel.status === 0">Inactive</span> <span class="badge rounded-pill badge-secondary" *ngIf="channel.status === 0" i18n="status.inactive">Inactive</span>
<span class="badge rounded-pill badge-success" *ngIf="channel.status === 1">Active</span> <span class="badge rounded-pill badge-success" *ngIf="channel.status === 1" i18n="status.active">Active</span>
<span class="badge rounded-pill badge-danger" *ngIf="channel.status === 2">Closed</span> <span class="badge rounded-pill badge-danger" *ngIf="channel.status === 2" i18n="status.closed">Closed</span>
<app-closing-type [type]="channel.closing_reason" *ngIf="channel.status === 2"></app-closing-type> <app-closing-type [type]="channel.closing_reason" *ngIf="channel.status === 2"></app-closing-type>
</div> </div>
@ -20,20 +20,20 @@
<table class="table table-borderless table-striped"> <table class="table table-borderless table-striped">
<tbody> <tbody>
<tr> <tr>
<td i18n="channel.created">Created</td> <td i18n="lightning.created">Created</td>
<td>{{ channel.created | date:'yyyy-MM-dd HH:mm' }}</td> <td>{{ channel.created | date:'yyyy-MM-dd HH:mm' }}</td>
</tr> </tr>
<tr> <tr>
<td i18n="channel.capacity">Capacity</td> <td i18n="lightning.capacity">Capacity</td>
<td><app-amount [satoshis]="channel.capacity" [noFiat]="true"></app-amount></td> <td><app-amount [satoshis]="channel.capacity" [noFiat]="true"></app-amount></td>
</tr> </tr>
<tr> <tr>
<td i18n="channel.fee-rate">Fee rate</td> <td i18n="transaction.fee-rate|Transaction fee rate">Fee rate</td>
<td> <td>
<div class="dual-cell"> <div class="dual-cell">
<span>{{ channel.node_left.fee_rate }} <span class="symbol">ppm</span></span> <span>{{ channel.node_left.fee_rate }} <span class="symbol" i18n="lightning.ppm">ppm</span></span>
<fa-icon class="between-arrow" [icon]="['fas', 'arrow-right-arrow-left']" [fixedWidth]="true"></fa-icon> <fa-icon class="between-arrow" [icon]="['fas', 'arrow-right-arrow-left']" [fixedWidth]="true"></fa-icon>
<span>{{ channel.node_right.fee_rate }} <span class="symbol">ppm</span></span> <span>{{ channel.node_right.fee_rate }} <span class="symbol" i18n="lightning.ppm">ppm</span></span>
</div> </div>
</td> </td>
</tr> </tr>

View File

@ -8,9 +8,9 @@
</span> </span>
</div> </div>
<div class="badges mb-2"> <div class="badges mb-2">
<span class="badge rounded-pill badge-secondary" *ngIf="channel.status === 0">Inactive</span> <span class="badge rounded-pill badge-secondary" *ngIf="channel.status === 0" i18n="status.inactive">Inactive</span>
<span class="badge rounded-pill badge-success" *ngIf="channel.status === 1">Active</span> <span class="badge rounded-pill badge-success" *ngIf="channel.status === 1" i18n="status.active">Active</span>
<span class="badge rounded-pill badge-danger" *ngIf="channel.status === 2">Closed</span> <span class="badge rounded-pill badge-danger" *ngIf="channel.status === 2" i18n="status.closed">Closed</span>
<app-closing-type *ngIf="channel.closing_reason" [type]="channel.closing_reason"></app-closing-type> <app-closing-type *ngIf="channel.closing_reason" [type]="channel.closing_reason"></app-closing-type>
</div> </div>
@ -45,7 +45,7 @@
<table class="table table-borderless table-striped"> <table class="table table-borderless table-striped">
<tbody> <tbody>
<tr> <tr>
<td i18n="address.total-received">Capacity</td> <td i18n="lightning.capacity">Capacity</td>
<td><app-sats [satoshis]="channel.capacity"></app-sats><app-fiat [value]="channel.capacity" digitsInfo="1.0-0"></app-fiat></td> <td><app-sats [satoshis]="channel.capacity"></app-sats><app-fiat [value]="channel.capacity" digitsInfo="1.0-0"></app-fiat></td>
</tr> </tr>
</tbody> </tbody>
@ -70,7 +70,7 @@
<ng-container *ngIf="transactions$ | async as transactions"> <ng-container *ngIf="transactions$ | async as transactions">
<ng-template [ngIf]="transactions[0]"> <ng-template [ngIf]="transactions[0]">
<div class="d-flex"> <div class="d-flex">
<h3>Opening transaction</h3> <h3 i18n="lightning.opening-transaction">Opening transaction</h3>
<button type="button" class="btn btn-outline-info details-button btn-sm" (click)="txList1.toggleDetails()" <button type="button" class="btn btn-outline-info details-button btn-sm" (click)="txList1.toggleDetails()"
i18n="transaction.details|Transaction Details">Details</button> i18n="transaction.details|Transaction Details">Details</button>
</div> </div>
@ -79,7 +79,7 @@
</ng-template> </ng-template>
<ng-template [ngIf]="transactions[1]"> <ng-template [ngIf]="transactions[1]">
<div class="closing-header d-flex"> <div class="closing-header d-flex">
<h3 style="margin: 0;">Closing transaction</h3>&nbsp;&nbsp;<app-closing-type [type]="channel.closing_reason"> <h3 style="margin: 0;" i18n="lightning.closing-transaction">Closing transaction</h3>&nbsp;&nbsp;<app-closing-type [type]="channel.closing_reason">
</app-closing-type> </app-closing-type>
<button type="button" class="btn btn-outline-info details-button btn-sm" (click)="txList2.toggleDetails()" <button type="button" class="btn btn-outline-info details-button btn-sm" (click)="txList2.toggleDetails()"
i18n="transaction.details|Transaction Details">Details</button> i18n="transaction.details|Transaction Details">Details</button>

View File

@ -34,7 +34,7 @@ export class ChannelComponent implements OnInit {
return this.lightningApiService.getChannel$(params.get('short_id')) return this.lightningApiService.getChannel$(params.get('short_id'))
.pipe( .pipe(
tap((value) => { tap((value) => {
this.seoService.setTitle(`Channel: ${value.short_id}`); this.seoService.setTitle($localize`Channel: ${value.short_id}`);
}), }),
catchError((err) => { catchError((err) => {
this.error = err; this.error = err;

View File

@ -2,10 +2,10 @@
<form [formGroup]="channelStatusForm" class="formRadioGroup"> <form [formGroup]="channelStatusForm" class="formRadioGroup">
<div class="btn-group btn-group-toggle" ngbRadioGroup name="radioBasic" formControlName="status"> <div class="btn-group btn-group-toggle" ngbRadioGroup name="radioBasic" formControlName="status">
<label ngbButtonLabel class="btn-primary btn-sm"> <label ngbButtonLabel class="btn-primary btn-sm">
<input ngbButton type="radio" [value]="'open'" fragment="open" i18n="open">Open <input ngbButton type="radio" [value]="'open'" fragment="open"><span i18n="open">Open</span>
</label> </label>
<label ngbButtonLabel class="btn-primary btn-sm"> <label ngbButtonLabel class="btn-primary btn-sm">
<input ngbButton type="radio" [value]="'closed'" fragment="closed" i18n="closed">Closed <input ngbButton type="radio" [value]="'closed'" fragment="closed"><span i18n="closed">Closed</span>
</label> </label>
</div> </div>
</form> </form>
@ -32,12 +32,12 @@
<ng-template #tableHeader> <ng-template #tableHeader>
<thead> <thead>
<th class="alias text-left" i18n="nodes.alias">Node Alias</th> <th class="alias text-left" i18n="lightning.alias">Alias</th>
<th class="alias text-left d-none d-md-table-cell" i18n="channels.transaction">&nbsp;</th> <th class="alias text-left d-none d-md-table-cell">&nbsp;</th>
<th class="alias text-left d-none d-md-table-cell" i18n="status">Status</th> <th class="alias text-left d-none d-md-table-cell" i18n="status">Status</th>
<th *ngIf="status !== 'closed'" class="channels text-left d-none d-md-table-cell" i18n="channels.rate">Fee Rate</th> <th *ngIf="status !== 'closed'" class="channels text-left d-none d-md-table-cell" i18n="transaction.fee-rate|Transaction fee rate">Fee rate</th>
<th *ngIf="status === 'closed'" class="channels text-left d-none d-md-table-cell" i18n="channels.closing_date">Closing date</th> <th *ngIf="status === 'closed'" class="channels text-left d-none d-md-table-cell" i18n="channels.closing_date">Closing date</th>
<th class="capacity text-right d-none d-md-table-cell" i18n="nodes.capacity">Capacity</th> <th class="capacity text-right d-none d-md-table-cell" i18n="lightning.capacity">Capacity</th>
<th class="capacity text-right" i18n="channels.id">Channel ID</th> <th class="capacity text-right" i18n="channels.id">Channel ID</th>
</thead> </thead>
</ng-template> </ng-template>
@ -53,7 +53,7 @@
</div> </div>
</td> </td>
<td class="alias text-left d-none d-md-table-cell"> <td class="alias text-left d-none d-md-table-cell">
<div class="second-line">{{ node.channels }} channels</div> <div class="second-line"><ng-container *ngTemplateOutlet="xChannels; context: {$implicit: node.channels }"></ng-container></div>
<div class="second-line"> <div class="second-line">
<app-amount *ngIf="node.capacity > 100000000; else smallnode" [satoshis]="node.capacity" [digitsInfo]="'1.2-2'" [noFiat]="true"></app-amount> <app-amount *ngIf="node.capacity > 100000000; else smallnode" [satoshis]="node.capacity" [digitsInfo]="'1.2-2'" [noFiat]="true"></app-amount>
<ng-template #smallnode> <ng-template #smallnode>
@ -63,10 +63,10 @@
</div> </div>
</td> </td>
<td class="d-none d-md-table-cell"> <td class="d-none d-md-table-cell">
<span class="badge rounded-pill badge-secondary" *ngIf="channel.status === 0" i18n="lightning.inactive">Inactive</span> <span class="badge rounded-pill badge-secondary" *ngIf="channel.status === 0" i18n="status.inactive">Inactive</span>
<span class="badge rounded-pill badge-success" *ngIf="channel.status === 1" i18n="lightning.active">Active</span> <span class="badge rounded-pill badge-success" *ngIf="channel.status === 1" i18n="status.active">Active</span>
<ng-template [ngIf]="channel.status === 2"> <ng-template [ngIf]="channel.status === 2">
<span class="badge rounded-pill badge-secondary" *ngIf="!channel.closing_reason; else closingReason" i18n="lightning.closed">Closed</span> <span class="badge rounded-pill badge-secondary" *ngIf="!channel.closing_reason; else closingReason" i18n="status.closed">Closed</span>
<ng-template #closingReason> <ng-template #closingReason>
<app-closing-type [type]="channel.closing_reason"></app-closing-type> <app-closing-type [type]="channel.closing_reason"></app-closing-type>
</ng-template> </ng-template>
@ -117,3 +117,5 @@
</tbody> </tbody>
</table> </table>
</ng-template> </ng-template>
<ng-template #xChannels let-i i18n="lightning.x-channels">{{ i }} channels</ng-template>

View File

@ -14,7 +14,7 @@
<div class="card-text"> <div class="card-text">
<div class="fee-text" [class]="!statistics.previous ? 'no-border' : ''"> <div class="fee-text" [class]="!statistics.previous ? 'no-border' : ''">
{{ statistics.latest?.avg_capacity || 0 | number: '1.0-0' }} {{ statistics.latest?.avg_capacity || 0 | number: '1.0-0' }}
<span i18n="shared.sat-vbyte|sat/vB">sats</span> <span i18n="shared.sats">sats</span>
</div> </div>
<span class="fiat" *ngIf="statistics.previous"> <span class="fiat" *ngIf="statistics.previous">
<app-change [current]="statistics.latest?.avg_capacity" [previous]="statistics.previous?.avg_capacity"></app-change> <app-change [current]="statistics.latest?.avg_capacity" [previous]="statistics.previous?.avg_capacity"></app-change>
@ -29,7 +29,7 @@
placement="bottom"> placement="bottom">
<div class="fee-text" [class]="!statistics.previous ? 'no-border' : ''"> <div class="fee-text" [class]="!statistics.previous ? 'no-border' : ''">
{{ statistics.latest?.avg_fee_rate || 0 | number: '1.0-0' }} {{ statistics.latest?.avg_fee_rate || 0 | number: '1.0-0' }}
<span i18n="shared.sat-vbyte|sat/vB">ppm</span> <span i18n="lightning.ppm">ppm</span>
</div> </div>
<span class="fiat" *ngIf="statistics.previous"> <span class="fiat" *ngIf="statistics.previous">
<app-change [current]="statistics.latest?.avg_fee_rate" [previous]="statistics.previous?.avg_fee_rate"></app-change> <app-change [current]="statistics.latest?.avg_fee_rate" [previous]="statistics.previous?.avg_fee_rate"></app-change>
@ -44,7 +44,7 @@
<div class="card-text"> <div class="card-text">
<div class="fee-text" [class]="!statistics.previous ? 'no-border' : ''"> <div class="fee-text" [class]="!statistics.previous ? 'no-border' : ''">
{{ statistics.latest?.avg_base_fee_mtokens || 0 | number: '1.0-0' }} {{ statistics.latest?.avg_base_fee_mtokens || 0 | number: '1.0-0' }}
<span i18n="shared.sat-vbyte|sat/vB">msats</span> <span i18n="shared.m-sats">mSats</span>
</div> </div>
<span class="fiat" *ngIf="statistics.previous"> <span class="fiat" *ngIf="statistics.previous">
<app-change [current]="statistics.latest?.avg_base_fee_mtokens" [previous]="statistics.previous?.avg_base_fee_mtokens"></app-change> <app-change [current]="statistics.latest?.avg_base_fee_mtokens" [previous]="statistics.previous?.avg_base_fee_mtokens"></app-change>
@ -60,7 +60,7 @@
<div class="card-text"> <div class="card-text">
<div class="fee-text" [class]="!statistics.previous ? 'no-border' : ''"> <div class="fee-text" [class]="!statistics.previous ? 'no-border' : ''">
{{ statistics.latest?.med_capacity || 0 | number: '1.0-0' }} {{ statistics.latest?.med_capacity || 0 | number: '1.0-0' }}
<span i18n="shared.sat-vbyte|sat/vB">sats</span> <span i18n="shared.sats">sats</span>
</div> </div>
<span class="fiat" *ngIf="statistics.previous"> <span class="fiat" *ngIf="statistics.previous">
<app-change [current]="statistics.latest?.med_capacity" [previous]="statistics.previous?.med_capacity"></app-change> <app-change [current]="statistics.latest?.med_capacity" [previous]="statistics.previous?.med_capacity"></app-change>
@ -75,7 +75,7 @@
placement="bottom"> placement="bottom">
<div class="fee-text" [class]="!statistics.previous ? 'no-border' : ''"> <div class="fee-text" [class]="!statistics.previous ? 'no-border' : ''">
{{ statistics.latest?.med_fee_rate || 0 | number: '1.0-0' }} {{ statistics.latest?.med_fee_rate || 0 | number: '1.0-0' }}
<span i18n="shared.sat-vbyte|sat/vB">ppm</span> <span i18n="lightning.ppm">ppm</span>
</div> </div>
<span class="fiat" *ngIf="statistics.previous"> <span class="fiat" *ngIf="statistics.previous">
<app-change [current]="statistics.latest?.med_fee_rate" [previous]="statistics.previous?.med_fee_rate"></app-change> <app-change [current]="statistics.latest?.med_fee_rate" [previous]="statistics.previous?.med_fee_rate"></app-change>
@ -90,7 +90,7 @@
<div class="card-text"> <div class="card-text">
<div class="fee-text" [class]="!statistics.previous ? 'no-border' : ''"> <div class="fee-text" [class]="!statistics.previous ? 'no-border' : ''">
{{ statistics.latest?.med_base_fee_mtokens || 0 | number: '1.0-0' }} {{ statistics.latest?.med_base_fee_mtokens || 0 | number: '1.0-0' }}
<span i18n="shared.sat-vbyte|sat/vB">msats</span> <span i18n="shared.m-sats">mSats</span>
</div> </div>
</div> </div>
<span class="fiat" *ngIf="statistics.previous"> <span class="fiat" *ngIf="statistics.previous">

View File

@ -1,6 +1,6 @@
<div class="box preview-box" *ngIf="nodes$ | async as nodes"> <div class="box preview-box" *ngIf="nodes$ | async as nodes">
<app-preview-title> <app-preview-title>
<span i18n="lightning.node">Lightning node group</span> <span i18n="lightning.node-group">Lightning node group</span>
</app-preview-title> </app-preview-title>
<div class="row d-flex justify-content-between full-width-row"> <div class="row d-flex justify-content-between full-width-row">
<div class="logo-wrapper"> <div class="logo-wrapper">

View File

@ -1,5 +1,5 @@
<div class="container-xl full-height" style="min-height: 335px"> <div class="container-xl full-height" style="min-height: 335px">
<h5 class="mb-1" style="color: #ffffff66" i18n="lightning.node">Lightning node group</h5> <h5 class="mb-1" style="color: #ffffff66" i18n="lightning.node-group">Lightning node group</h5>
<div class="header"> <div class="header">
<div class="logo-container"> <div class="logo-container">

View File

@ -7,7 +7,7 @@
<!-- Network capacity/channels/nodes --> <!-- Network capacity/channels/nodes -->
<div class="col"> <div class="col">
<div class="main-title"> <div class="main-title">
<span i18n="lightning.statistics-title">Network Statistics</span>&nbsp; <span i18n="lightning.network-statistics-title">Network Statistics</span>&nbsp;
</div> </div>
<div class="card-wrapper"> <div class="card-wrapper">
<div class="card" style="height: 123px"> <div class="card" style="height: 123px">
@ -21,7 +21,7 @@
<!-- Channels stats --> <!-- Channels stats -->
<div class="col"> <div class="col">
<div class="main-title"> <div class="main-title">
<span i18n="lightning.statistics-title">Channels Statistics</span>&nbsp; <span i18n="lightning.channel-statistics-title">Channels Statistics</span>&nbsp;
</div> </div>
<div class="card-wrapper"> <div class="card-wrapper">
<div class="card" style="height: 123px"> <div class="card" style="height: 123px">
@ -46,7 +46,7 @@
<div class="col"> <div class="col">
<div class="card graph-card"> <div class="card graph-card">
<div class="card-body pl-2 pr-2 pt-1"> <div class="card-body pl-2 pr-2 pt-1">
<h5 class="card-title mt-3" i18n="lightning.network-history">Lightning network history</h5> <h5 class="card-title mt-3" i18n="lightning.network-history">Lightning Network History</h5>
<app-lightning-statistics-chart [widget]=true></app-lightning-statistics-chart> <app-lightning-statistics-chart [widget]=true></app-lightning-statistics-chart>
<app-nodes-networks-chart [widget]=true></app-nodes-networks-chart> <app-nodes-networks-chart [widget]=true></app-nodes-networks-chart>
<div><a [routerLink]="['/graphs/lightning/nodes-networks' | relativeUrl]" i18n="dashboard.view-more">View more &raquo;</a></div> <div><a [routerLink]="['/graphs/lightning/nodes-networks' | relativeUrl]" i18n="dashboard.view-more">View more &raquo;</a></div>
@ -59,7 +59,7 @@
<div class="card" style="height: 409px"> <div class="card" style="height: 409px">
<div class="card-body"> <div class="card-body">
<a class="title-link" href="" [routerLink]="['/lightning/nodes/rankings/liquidity' | relativeUrl]"> <a class="title-link" href="" [routerLink]="['/lightning/nodes/rankings/liquidity' | relativeUrl]">
<h5 class="card-title d-inline" i18n="lightning.liquidity-ranking">Liquidity ranking</h5> <h5 class="card-title d-inline" i18n="lightning.liquidity-ranking">Liquidity Ranking</h5>
<span>&nbsp;</span> <span>&nbsp;</span>
<fa-icon [icon]="['fas', 'external-link-alt']" [fixedWidth]="true" style="vertical-align: 'text-top'; font-size: 13px; color: '#4a68b9'"></fa-icon> <fa-icon [icon]="['fas', 'external-link-alt']" [fixedWidth]="true" style="vertical-align: 'text-top'; font-size: 13px; color: '#4a68b9'"></fa-icon>
</a> </a>
@ -73,7 +73,7 @@
<div class="card" style="height: 409px"> <div class="card" style="height: 409px">
<div class="card-body"> <div class="card-body">
<a class="title-link" href="" [routerLink]="['/lightning/nodes/rankings/connectivity' | relativeUrl]"> <a class="title-link" href="" [routerLink]="['/lightning/nodes/rankings/connectivity' | relativeUrl]">
<h5 class="card-title d-inline" i18n="lightning.connectivity-ranking">Connectivity ranking</h5> <h5 class="card-title d-inline" i18n="lightning.connectivity-ranking">Connectivity Ranking</h5>
<span>&nbsp;</span> <span>&nbsp;</span>
<fa-icon [icon]="['fas', 'external-link-alt']" [fixedWidth]="true" style="vertical-align: 'text-top'; font-size: 13px; color: '#4a68b9'"></fa-icon> <fa-icon [icon]="['fas', 'external-link-alt']" [fixedWidth]="true" style="vertical-align: 'text-top'; font-size: 13px; color: '#4a68b9'"></fa-icon>
</a> </a>

View File

@ -24,7 +24,7 @@ export class LightningDashboardComponent implements OnInit {
) { } ) { }
ngOnInit(): void { ngOnInit(): void {
this.seoService.setTitle($localize`Lightning Network`); this.seoService.setTitle($localize`:@@142e923d3b04186ac6ba23387265d22a2fa404e0:Lightning Explorer`);
this.nodesRanking$ = this.lightningApiService.getNodesRanking$().pipe(share()); this.nodesRanking$ = this.lightningApiService.getNodesRanking$().pipe(share());
this.statistics$ = this.lightningApiService.getLatestStatistics$().pipe(share()); this.statistics$ = this.lightningApiService.getLatestStatistics$().pipe(share());

View File

@ -1,6 +1,6 @@
<div class="box preview-box" *ngIf="(node$ | async) as node"> <div class="box preview-box" *ngIf="(node$ | async) as node">
<app-preview-title> <app-preview-title>
<span i18n="lightning.node">lightning node</span> <span i18n="lightning.node">Lightning node</span>
</app-preview-title> </app-preview-title>
<div class="row d-flex justify-content-between full-width-row"> <div class="row d-flex justify-content-between full-width-row">
<h1 class="title"></h1> <h1 class="title"></h1>
@ -29,13 +29,13 @@
</td> </td>
</tr> </tr>
<tr> <tr>
<td i18n="lightning.active-channels-avg">Average size</td> <td i18n="lightning.avg-size">Average size</td>
<td> <td>
<app-amount [satoshis]="node.avgCapacity" [noFiat]="true"></app-amount> <app-amount [satoshis]="node.avgCapacity" [noFiat]="true"></app-amount>
</td> </td>
</tr> </tr>
<tr *ngIf="node.city"> <tr *ngIf="node.city">
<td i18n="location">Location</td> <td i18n="lightning.location">Location</td>
<td> <td>
<span>{{ node.city.en }}</span> <span>{{ node.city.en }}</span>
</td> </td>
@ -47,7 +47,7 @@
</td> </td>
</tr> </tr>
<tr *ngIf="!node.city && !node.country"> <tr *ngIf="!node.city && !node.country">
<td i18n="location">Location</td> <td i18n="lightning.location">Location</td>
<td> <td>
<span>unknown</span> <span>unknown</span>
</td> </td>

View File

@ -15,7 +15,6 @@
<div *ngIf="error" class="d-flex flex-column justify-content-around align-items-center mt-5 w-100" style="min-height: 100px"> <div *ngIf="error" class="d-flex flex-column justify-content-around align-items-center mt-5 w-100" style="min-height: 100px">
<span i18n="lightning.node-not-found">No node found for public key "{{ node.public_key | shortenString : 12}}"</span> <span i18n="lightning.node-not-found">No node found for public key "{{ node.public_key | shortenString : 12}}"</span>
<a [routerLink]="['/lightning' | relativeUrl]" i18n="lightning.back-to-lightning-dashboard">Back to the lightning dashboard</a>
</div> </div>
<div class="box" *ngIf="!error"> <div class="box" *ngIf="!error">
@ -45,7 +44,7 @@
</td> </td>
</tr> </tr>
<tr> <tr>
<td i18n="location" class="text-truncate">Location</td> <td i18n="lightning.location" class="text-truncate">Location</td>
<td *ngIf="node.geolocation"> <td *ngIf="node.geolocation">
<app-geolocation [data]="node.geolocation" [type]="'node'"></app-geolocation> <app-geolocation [data]="node.geolocation" [type]="'node'"></app-geolocation>
</td> </td>
@ -61,19 +60,19 @@
<table class="table table-borderless table-striped table-fixed"> <table class="table table-borderless table-striped table-fixed">
<tbody> <tbody>
<tr> <tr>
<td i18n="address.total-received" class="text-truncate label">First seen</td> <td i18n="transaction.first-seen|Transaction first seen" class="text-truncate label">First seen</td>
<td> <td>
<app-timestamp [unixTime]="node.first_seen"></app-timestamp> <app-timestamp [unixTime]="node.first_seen"></app-timestamp>
</td> </td>
</tr> </tr>
<tr> <tr>
<td i18n="address.total-sent" class="text-truncate label">Last update</td> <td class="text-truncate label" i18n="lightning.last_update">Last update</td>
<td> <td>
<app-timestamp [unixTime]="node.updated_at"></app-timestamp> <app-timestamp [unixTime]="node.updated_at"></app-timestamp>
</td> </td>
</tr> </tr>
<tr> <tr>
<td i18n="address.balance" class="text-truncate label">Color</td> <td i18n="lightning.color" class="text-truncate label">Color</td>
<td> <td>
<div [ngStyle]="{'color': node.color}">{{ node.color }}</div> <div [ngStyle]="{'color': node.color}">{{ node.color }}</div>
</td> </td>

View File

@ -39,7 +39,7 @@ export class NodeComponent implements OnInit {
return this.lightningApiService.getNode$(params.get('public_key')); return this.lightningApiService.getNode$(params.get('public_key'));
}), }),
map((node) => { map((node) => {
this.seoService.setTitle(`Node: ${node.alias}`); this.seoService.setTitle($localize`Node: ${node.alias}`);
const socketsObject = []; const socketsObject = [];
for (const socket of node.sockets.split(',')) { for (const socket of node.sockets.split(',')) {

View File

@ -3,7 +3,7 @@
<div *ngIf="chartOptions" [class]="'full-container ' + style + (fitContainer ? ' fit-container' : '')"> <div *ngIf="chartOptions" [class]="'full-container ' + style + (fitContainer ? ' fit-container' : '')">
<div *ngIf="style === 'graph'" class="card-header"> <div *ngIf="style === 'graph'" class="card-header">
<div class="d-flex d-md-block align-items-baseline" style="margin-bottom: -5px"> <div class="d-flex d-md-block align-items-baseline" style="margin-bottom: -5px">
<span i18n="lightning.nodes-channels-world-map">Lightning nodes channels world map</span> <span i18n="lightning.nodes-channels-world-map">Lightning Nodes Channels World Map</span>
</div> </div>
<small style="color: #ffffff66" i18n="lightning.tor-nodes-excluded">(Tor nodes excluded)</small> <small style="color: #ffffff66" i18n="lightning.tor-nodes-excluded">(Tor nodes excluded)</small>
</div> </div>

View File

@ -66,7 +66,7 @@ export class NodesChannelsMap implements OnInit {
} }
if (this.style === 'graph') { if (this.style === 'graph') {
this.seoService.setTitle($localize`Lightning nodes channels world map`); this.seoService.setTitle($localize`Lightning Nodes Channels World Map`);
} }
if (['nodepage', 'channelpage'].includes(this.style)) { if (['nodepage', 'channelpage'].includes(this.style)) {

View File

@ -3,8 +3,8 @@
<table class="table table-borderless"> <table class="table table-borderless">
<thead> <thead>
<th class="alias text-left" i18n="nodes.alias">Alias</th> <th class="alias text-left" i18n="nodes.alias">Alias</th>
<th class="capacity text-right" [class]="show" i18n="node.capacity">Capacity</th> <th class="capacity text-right" [class]="show" i18n="lightning.capacity">Capacity</th>
<th class="channels text-right" [class]="show" i18n="node.channels">Channels</th> <th class="channels text-right" [class]="show" i18n="lightning.channels">Channels</th>
</thead> </thead>
<tbody *ngIf="nodes$ | async as nodes; else skeleton"> <tbody *ngIf="nodes$ | async as nodes; else skeleton">
<tr *ngFor="let node of nodes; let i = index;"> <tr *ngFor="let node of nodes; let i = index;">

View File

@ -2,7 +2,7 @@
<div *ngIf="!widget" class="card-header"> <div *ngIf="!widget" class="card-header">
<div class="d-flex d-md-block align-items-baseline" style="margin-bottom: -5px"> <div class="d-flex d-md-block align-items-baseline" style="margin-bottom: -5px">
<span i18n="lightning.nodes-world-map">Lightning nodes world map</span> <span i18n="lightning.nodes-world-map">Lightning Nodes World Map</span>
</div> </div>
<small style="color: #ffffff66" i18n="lightning.tor-nodes-excluded">(Tor nodes excluded)</small> <small style="color: #ffffff66" i18n="lightning.tor-nodes-excluded">(Tor nodes excluded)</small>
</div> </div>

View File

@ -47,7 +47,7 @@ export class NodesMap implements OnInit, OnChanges {
ngOnInit(): void { ngOnInit(): void {
if (!this.widget) { if (!this.widget) {
this.seoService.setTitle($localize`Lightning nodes world map`); this.seoService.setTitle($localize`:@@af8560ca50882114be16c951650f83bca73161a7:Lightning Nodes World Map`);
} }
if (!this.inputNodes$) { if (!this.inputNodes$) {
@ -141,7 +141,7 @@ export class NodesMap implements OnInit, OnChanges {
color: 'grey', color: 'grey',
fontSize: 15 fontSize: 15
}, },
text: $localize`No data to display yet`, text: $localize`No data to display yet. Try again later.`,
left: 'center', left: 'center',
top: 'center' top: 'center'
}; };

View File

@ -2,7 +2,7 @@
<div class="card-header mb-0 mb-md-4" [style]="widget ? 'display:none' : ''"> <div class="card-header mb-0 mb-md-4" [style]="widget ? 'display:none' : ''">
<div class="d-flex d-md-block align-items-baseline"> <div class="d-flex d-md-block align-items-baseline">
<span i18n="lightning.nodes-networks">Lightning nodes per network</span> <span i18n="lightning.nodes-networks">Lightning Nodes Per Network</span>
<button class="btn p-0 pl-2" style="margin: 0 0 4px 0px" (click)="onSaveChart()"> <button class="btn p-0 pl-2" style="margin: 0 0 4px 0px" (click)="onSaveChart()">
<fa-icon [icon]="['fas', 'download']" [fixedWidth]="true"></fa-icon> <fa-icon [icon]="['fas', 'download']" [fixedWidth]="true"></fa-icon>
</button> </button>

View File

@ -64,7 +64,7 @@ export class NodesNetworksChartComponent implements OnInit {
if (this.widget) { if (this.widget) {
this.miningWindowPreference = '3y'; this.miningWindowPreference = '3y';
} else { } else {
this.seoService.setTitle($localize`Lightning nodes per network`); this.seoService.setTitle($localize`:@@b420668a91f8ebaf6e6409c4ba87f1d45961d2bd:Lightning Nodes Per Network`);
this.miningWindowPreference = this.miningService.getDefaultTimespan('all'); this.miningWindowPreference = this.miningService.getDefaultTimespan('all');
} }
this.radioGroupForm = this.formBuilder.group({ dateSpan: this.miningWindowPreference }); this.radioGroupForm = this.formBuilder.group({ dateSpan: this.miningWindowPreference });
@ -128,7 +128,7 @@ export class NodesNetworksChartComponent implements OnInit {
color: 'grey', color: 'grey',
fontSize: 11 fontSize: 11
}, },
text: $localize`Nodes per network`, text: $localize`:@@b420668a91f8ebaf6e6409c4ba87f1d45961d2bd:Lightning Nodes Per Network`,
left: 'center', left: 'center',
top: 11, top: 11,
zlevel: 10, zlevel: 10,
@ -139,7 +139,7 @@ export class NodesNetworksChartComponent implements OnInit {
{ {
zlevel: 1, zlevel: 1,
yAxisIndex: 0, yAxisIndex: 0,
name: $localize`Unknown`, name: $localize`:@@e5d8bb389c702588877f039d72178f219453a72d:Unknown`,
showSymbol: false, showSymbol: false,
symbol: 'none', symbol: 'none',
data: data.unannounced_nodes, data: data.unannounced_nodes,
@ -308,7 +308,7 @@ export class NodesNetworksChartComponent implements OnInit {
icon: 'roundRect', icon: 'roundRect',
}, },
{ {
name: $localize`Unknown`, name: $localize`:@@e5d8bb389c702588877f039d72178f219453a72d:Unknown`,
inactiveColor: 'rgb(110, 112, 121)', inactiveColor: 'rgb(110, 112, 121)',
textStyle: { textStyle: {
color: 'white', color: 'white',
@ -320,7 +320,7 @@ export class NodesNetworksChartComponent implements OnInit {
'$localize`Reachable on Darknet Only`': true, '$localize`Reachable on Darknet Only`': true,
'$localize`Reachable on Clearnet Only`': true, '$localize`Reachable on Clearnet Only`': true,
'$localize`Reachable on Clearnet and Darknet`': true, '$localize`Reachable on Clearnet and Darknet`': true,
'$localize`Unknown`': true, '$localize`:@@e5d8bb389c702588877f039d72178f219453a72d:Unknown`': true,
} }
}, },
yAxis: data.tor_nodes.length === 0 ? undefined : [ yAxis: data.tor_nodes.length === 0 ? undefined : [

View File

@ -2,7 +2,7 @@
<div class="card-header"> <div class="card-header">
<div class="d-flex d-md-block align-items-baseline" style="margin-bottom: -5px"> <div class="d-flex d-md-block align-items-baseline" style="margin-bottom: -5px">
<span i18n="lightning.nodes-per-country">Lightning nodes per country</span> <span i18n="lightning.nodes-per-country">Lightning Nodes Per Country</span>
<button class="btn p-0 pl-2" style="margin: 0 0 4px 0px" (click)="onSaveChart()"> <button class="btn p-0 pl-2" style="margin: 0 0 4px 0px" (click)="onSaveChart()">
<fa-icon [icon]="['fas', 'download']" [fixedWidth]="true"></fa-icon> <fa-icon [icon]="['fas', 'download']" [fixedWidth]="true"></fa-icon>
</button> </button>

View File

@ -43,7 +43,7 @@ export class NodesPerCountryChartComponent implements OnInit {
} }
ngOnInit(): void { ngOnInit(): void {
this.seoService.setTitle($localize`Lightning nodes per country`); this.seoService.setTitle($localize`:@@9d3ad4c6623870d96b65fb7a708fed6ce7c20044:Lightning Nodes Per Country`);
this.nodesPerCountryObservable$ = this.apiService.getNodesPerCountry$() this.nodesPerCountryObservable$ = this.apiService.getNodesPerCountry$()
.pipe( .pipe(
@ -100,7 +100,7 @@ export class NodesPerCountryChartComponent implements OnInit {
borderColor: '#000', borderColor: '#000',
formatter: () => { formatter: () => {
return `<b style="color: white">${country.name.en} (${country.share}%)</b><br>` + return `<b style="color: white">${country.name.en} (${country.share}%)</b><br>` +
$localize`${country.count.toString()} nodes<br>` + $localize`${country.count.toString()} nodes` + `<br>` +
$localize`${this.amountShortenerPipe.transform(country.capacity / 100000000, 2)} BTC capacity` $localize`${this.amountShortenerPipe.transform(country.capacity / 100000000, 2)} BTC capacity`
; ;
} }

View File

@ -1,6 +1,6 @@
<div class="container-xl full-height" style="min-height: 335px"> <div class="container-xl full-height" style="min-height: 335px">
<h1 i18n="lightning.nodes-in-country"> <h1>
<span>Lightning nodes in {{ country?.name }}</span> <span i18n="lightning.nodes-in-country">Lightning nodes in {{ country?.name }}</span>
<span style="font-size: 50px; vertical-align:sub;"> {{ country?.flag }}</span> <span style="font-size: 50px; vertical-align:sub;"> {{ country?.flag }}</span>
</h1> </h1>
@ -58,7 +58,7 @@
<thead> <thead>
<th class="alias text-left" i18n="lightning.alias">Alias</th> <th class="alias text-left" i18n="lightning.alias">Alias</th>
<th class="timestamp-first text-left" i18n="lightning.first_seen">First seen</th> <th class="timestamp-first text-left" i18n="transaction.first-seen|Transaction first seen">First seen</th>
<th class="timestamp-update text-left" i18n="lightning.last_update">Last update</th> <th class="timestamp-update text-left" i18n="lightning.last_update">Last update</th>
<th class="capacity text-right" i18n="lightning.capacity">Capacity</th> <th class="capacity text-right" i18n="lightning.capacity">Capacity</th>
<th class="channels text-right" i18n="lightning.channels">Channels</th> <th class="channels text-right" i18n="lightning.channels">Channels</th>

View File

@ -3,21 +3,21 @@
<div *ngIf="widget"> <div *ngIf="widget">
<div class="pool-distribution" *ngIf="(nodesPerAsObservable$ | async) as stats; else loadingReward"> <div class="pool-distribution" *ngIf="(nodesPerAsObservable$ | async) as stats; else loadingReward">
<div class="item"> <div class="item">
<h5 class="card-title d-inline-block" i18n="lightning.clearnet-capacity">Clearnet capacity</h5> <h5 class="card-title d-inline-block" i18n="lightning.clearnet-capacity">Clearnet Capacity</h5>
<p class="card-text" i18n-ngbTooltip="lightning.clearnet-capacity-desc" <p class="card-text" i18n-ngbTooltip="lightning.clearnet-capacity-desc"
ngbTooltip="How much liquidity is running on nodes advertising at least one clearnet IP address" placement="bottom"> ngbTooltip="How much liquidity is running on nodes advertising at least one clearnet IP address" placement="bottom">
<app-amount [satoshis]="stats.clearnetCapacity" [digitsInfo]="'1.2-2'" [noFiat]="true"></app-amount> <app-amount [satoshis]="stats.clearnetCapacity" [digitsInfo]="'1.2-2'" [noFiat]="true"></app-amount>
</p> </p>
</div> </div>
<div class="item"> <div class="item">
<h5 class="card-title d-inline-block" i18n="lightning.unknown-capacity">Unknown capacity</h5> <h5 class="card-title d-inline-block" i18n="lightning.unknown-capacity">Unknown Capacity</h5>
<p class="card-text" i18n-ngbTooltip="lightning.unknown-capacity-desc" <p class="card-text" i18n-ngbTooltip="lightning.unknown-capacity-desc"
ngbTooltip="How much liquidity is running on nodes which ISP was not identifiable" placement="bottom"> ngbTooltip="How much liquidity is running on nodes which ISP was not identifiable" placement="bottom">
<app-amount [satoshis]="stats.unknownCapacity" [digitsInfo]="'1.2-2'" [noFiat]="true"></app-amount> <app-amount [satoshis]="stats.unknownCapacity" [digitsInfo]="'1.2-2'" [noFiat]="true"></app-amount>
</p> </p>
</div> </div>
<div class="item"> <div class="item">
<h5 class="card-title d-inline-block" i18n="lightning.tor-capacity">Tor capacity</h5> <h5 class="card-title d-inline-block" i18n="lightning.tor-capacity">Tor Capacity</h5>
<p class="card-text" i18n-ngbTooltip="lightning.tor-capacity-desc" <p class="card-text" i18n-ngbTooltip="lightning.tor-capacity-desc"
ngbTooltip="How much liquidity is running on nodes advertising only Tor addresses" placement="bottom"> ngbTooltip="How much liquidity is running on nodes advertising only Tor addresses" placement="bottom">
<app-amount [satoshis]="stats.torCapacity" [digitsInfo]="'1.2-2'" [noFiat]="true"></app-amount> <app-amount [satoshis]="stats.torCapacity" [digitsInfo]="'1.2-2'" [noFiat]="true"></app-amount>
@ -33,8 +33,8 @@
<fa-icon [icon]="['fas', 'download']" [fixedWidth]="true"></fa-icon> <fa-icon [icon]="['fas', 'download']" [fixedWidth]="true"></fa-icon>
</button> </button>
</div> </div>
<small class="d-block" style="color: #ffffff66; min-height: 25px" i18n="lightning.tor-nodes-excluded"> <small class="d-block" style="color: #ffffff66; min-height: 25px" >
<span>(Tor nodes excluded)</span> <span i18n="lightning.tor-nodes-excluded">(Tor nodes excluded)</span>
</small> </small>
</div> </div>
@ -80,19 +80,19 @@
<ng-template #loadingReward> <ng-template #loadingReward>
<div class="pool-distribution"> <div class="pool-distribution">
<div class="item"> <div class="item">
<h5 class="card-title d-inline-block" i18n="lightning.clearnet-capacity">Clearnet capacity</h5> <h5 class="card-title d-inline-block" i18n="lightning.clearnet-capacity">Clearnet Capacity</h5>
<p class="card-text"> <p class="card-text">
<span class="skeleton-loader skeleton-loader-big"></span> <span class="skeleton-loader skeleton-loader-big"></span>
</p> </p>
</div> </div>
<div class="item"> <div class="item">
<h5 class="card-title d-inline-block" i18n="lightning.unknown-capacity">Unknown capacity</h5> <h5 class="card-title d-inline-block" i18n="lightning.unknown-capacity">Unknown Capacity</h5>
<p class="card-text"> <p class="card-text">
<span class="skeleton-loader skeleton-loader-big"></span> <span class="skeleton-loader skeleton-loader-big"></span>
</p> </p>
</div> </div>
<div class="item"> <div class="item">
<h5 class="card-title d-inline-block" i18n="lightning.tor-capacity">Tor capacity</h5> <h5 class="card-title d-inline-block" i18n="lightning.tor-capacity">Tor Capacity</h5>
<p class="card-text"> <p class="card-text">
<span class="skeleton-loader skeleton-loader-big"></span> <span class="skeleton-loader skeleton-loader-big"></span>
</p> </p>

View File

@ -48,7 +48,7 @@ export class NodesPerISPChartComponent implements OnInit {
ngOnInit(): void { ngOnInit(): void {
if (!this.widget) { if (!this.widget) {
this.seoService.setTitle($localize`Lightning nodes per ISP`); this.seoService.setTitle($localize`:@@8573a1576789bd2c4faeaed23037c4917812c6cf:Lightning Nodes Per ISP`);
} }
this.nodesPerAsObservable$ = combineLatest([ this.nodesPerAsObservable$ = combineLatest([
@ -154,7 +154,7 @@ export class NodesPerISPChartComponent implements OnInit {
borderColor: '#000', borderColor: '#000',
formatter: () => { formatter: () => {
return `<b style="color: white">${isp[1]} (${this.sortBy === 'capacity' ? isp[7] : isp[6]}%)</b><br>` + return `<b style="color: white">${isp[1]} (${this.sortBy === 'capacity' ? isp[7] : isp[6]}%)</b><br>` +
$localize`${isp[4].toString()} nodes<br>` + $localize`${isp[4].toString()} nodes` + `<br>` +
$localize`${this.amountShortenerPipe.transform(isp[2] / 100000000, 2)} BTC` $localize`${this.amountShortenerPipe.transform(isp[2] / 100000000, 2)} BTC`
; ;
} }
@ -186,7 +186,7 @@ export class NodesPerISPChartComponent implements OnInit {
borderColor: '#000', borderColor: '#000',
formatter: () => { formatter: () => {
return `<b style="color: white">Other (${totalShareOther.toFixed(2)}%)</b><br>` + return `<b style="color: white">Other (${totalShareOther.toFixed(2)}%)</b><br>` +
$localize`${nodeCountOther.toString()} nodes<br>` + $localize`${nodeCountOther.toString()} nodes` + `<br>` +
$localize`${this.amountShortenerPipe.transform(capacityOther / 100000000, 2)} BTC`; $localize`${this.amountShortenerPipe.transform(capacityOther / 100000000, 2)} BTC`;
} }
}, },

View File

@ -1,6 +1,6 @@
<div class="box preview-box" *ngIf="(nodes$ | async) as ispNodes"> <div class="box preview-box" *ngIf="(nodes$ | async) as ispNodes">
<app-preview-title> <app-preview-title>
<span i18n="lightning.node">lightning ISP</span> <span i18n="lightning.node-isp">Lightning ISP</span>
</app-preview-title> </app-preview-title>
<div class="row d-flex justify-content-between full-width-row"> <div class="row d-flex justify-content-between full-width-row">
<div class="title-wrapper"> <div class="title-wrapper">

View File

@ -55,7 +55,7 @@
<thead> <thead>
<th class="alias text-left" i18n="lightning.alias">Alias</th> <th class="alias text-left" i18n="lightning.alias">Alias</th>
<th class="timestamp-first text-left" i18n="lightning.first_seen">First seen</th> <th class="timestamp-first text-left" i18n="transaction.first-seen|Transaction first seen">First seen</th>
<th class="timestamp-update text-left" i18n="lightning.last_update">Last update</th> <th class="timestamp-update text-left" i18n="lightning.last_update">Last update</th>
<th class="capacity text-right" i18n="lightning.capacity">Capacity</th> <th class="capacity text-right" i18n="lightning.capacity">Capacity</th>
<th class="channels text-right" i18n="lightning.channels">Channels</th> <th class="channels text-right" i18n="lightning.channels">Channels</th>

View File

@ -1,6 +1,6 @@
<div [class]="!widget ? 'container-xl full-height' : ''"> <div [class]="!widget ? 'container-xl full-height' : ''">
<h1 *ngIf="!widget" class="float-left" i18n="lightning.top-100-oldest-nodes"> <h1 *ngIf="!widget" class="float-left">
<span>Top 100 oldest lightning nodes</span> <span i18n="lightning.top-100-oldest-nodes">Top 100 oldest lightning nodes</span>
</h1> </h1>
<div [class]="widget ? 'widget' : 'full'"> <div [class]="widget ? 'widget' : 'full'">
@ -8,7 +8,7 @@
<thead> <thead>
<th class="rank"></th> <th class="rank"></th>
<th class="alias text-left" i18n="nodes.alias">Alias</th> <th class="alias text-left" i18n="nodes.alias">Alias</th>
<th class="timestamp-first text-right" i18n="lightning.first_seen">First seen</th> <th class="timestamp-first text-right" i18n="transaction.first-seen|Transaction first seen">First seen</th>
<th *ngIf="!widget" class="capacity text-right" i18n="node.liquidity">Liquidity</th> <th *ngIf="!widget" class="capacity text-right" i18n="node.liquidity">Liquidity</th>
<th *ngIf="!widget" class="channels text-right" i18n="lightning.channels">Channels</th> <th *ngIf="!widget" class="channels text-right" i18n="lightning.channels">Channels</th>
<th *ngIf="!widget" class="timestamp-update text-left" i18n="lightning.last_update">Last update</th> <th *ngIf="!widget" class="timestamp-update text-left" i18n="lightning.last_update">Last update</th>

View File

@ -10,7 +10,7 @@
<th class="alias text-left" i18n="nodes.alias">Alias</th> <th class="alias text-left" i18n="nodes.alias">Alias</th>
<th class="capacity text-right" i18n="node.liquidity">Liquidity</th> <th class="capacity text-right" i18n="node.liquidity">Liquidity</th>
<th *ngIf="!widget" class="channels text-right" i18n="lightning.channels">Channels</th> <th *ngIf="!widget" class="channels text-right" i18n="lightning.channels">Channels</th>
<th *ngIf="!widget" class="timestamp-first text-left" i18n="lightning.first_seen">First seen</th> <th *ngIf="!widget" class="timestamp-first text-left" i18n="transaction.first-seen|Transaction first seen">First seen</th>
<th *ngIf="!widget" class="timestamp-update text-left" i18n="lightning.last_update">Last update</th> <th *ngIf="!widget" class="timestamp-update text-left" i18n="lightning.last_update">Last update</th>
<th *ngIf="!widget" class="location text-right" i18n="lightning.location">Location</th> <th *ngIf="!widget" class="location text-right" i18n="lightning.location">Location</th>
</thead> </thead>

View File

@ -26,7 +26,7 @@ export class TopNodesPerCapacity implements OnInit {
ngOnInit(): void { ngOnInit(): void {
if (!this.widget) { if (!this.widget) {
this.seoService.setTitle($localize`Liquidity Ranking`); this.seoService.setTitle($localize`:@@2d9883d230a47fbbb2ec969e32a186597ea27405:Liquidity Ranking`);
} }
for (let i = 1; i <= (this.widget ? (isMobile() ? 8 : 7) : 100); ++i) { for (let i = 1; i <= (this.widget ? (isMobile() ? 8 : 7) : 100); ++i) {

View File

@ -10,7 +10,7 @@
<th class="alias text-left" i18n="nodes.alias">Alias</th> <th class="alias text-left" i18n="nodes.alias">Alias</th>
<th class="channels text-right" i18n="node.channels">Channels</th> <th class="channels text-right" i18n="node.channels">Channels</th>
<th *ngIf="!widget" class="capacity text-right" i18n="lightning.liquidity">Liquidity</th> <th *ngIf="!widget" class="capacity text-right" i18n="lightning.liquidity">Liquidity</th>
<th *ngIf="!widget" class="timestamp-first text-left" i18n="lightning.first_seen">First seen</th> <th *ngIf="!widget" class="timestamp-first text-left" i18n="transaction.first-seen|Transaction first seen">First seen</th>
<th *ngIf="!widget" class="timestamp-update text-left" i18n="lightning.last_update">Last update</th> <th *ngIf="!widget" class="timestamp-update text-left" i18n="lightning.last_update">Last update</th>
<th *ngIf="!widget" class="location text-right" i18n="lightning.location">Location</th> <th *ngIf="!widget" class="location text-right" i18n="lightning.location">Location</th>
</thead> </thead>

View File

@ -1,7 +1,6 @@
import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core'; import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core';
import { map, Observable } from 'rxjs'; import { map, Observable } from 'rxjs';
import { INodesRanking, ITopNodesPerChannels } from '../../../interfaces/node-api.interface'; import { INodesRanking, ITopNodesPerChannels } from '../../../interfaces/node-api.interface';
import { SeoService } from '../../../services/seo.service';
import { isMobile } from '../../../shared/common.utils'; import { isMobile } from '../../../shared/common.utils';
import { GeolocationData } from '../../../shared/components/geolocation/geolocation.component'; import { GeolocationData } from '../../../shared/components/geolocation/geolocation.component';
import { LightningApiService } from '../../lightning-api.service'; import { LightningApiService } from '../../lightning-api.service';
@ -21,14 +20,9 @@ export class TopNodesPerChannels implements OnInit {
constructor( constructor(
private apiService: LightningApiService, private apiService: LightningApiService,
private seoService: SeoService
) {} ) {}
ngOnInit(): void { ngOnInit(): void {
if (!this.widget) {
this.seoService.setTitle($localize`Connectivity Ranking`);
}
for (let i = 1; i <= (this.widget ? (isMobile() ? 8 : 7) : 100); ++i) { for (let i = 1; i <= (this.widget ? (isMobile() ? 8 : 7) : 100); ++i) {
this.skeletonRows.push(i); this.skeletonRows.push(i);
} }

View File

@ -5,7 +5,7 @@
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">
<a class="title-link" href="" [routerLink]="['/lightning/nodes/rankings/liquidity' | relativeUrl]"> <a class="title-link" href="" [routerLink]="['/lightning/nodes/rankings/liquidity' | relativeUrl]">
<h5 class="card-title d-inline" i18n="lightning.liquidity-ranking">Liquidity ranking</h5> <h5 class="card-title d-inline" i18n="lightning.liquidity-ranking">Liquidity Ranking</h5>
<span>&nbsp;</span> <span>&nbsp;</span>
<fa-icon [icon]="['fas', 'external-link-alt']" [fixedWidth]="true" <fa-icon [icon]="['fas', 'external-link-alt']" [fixedWidth]="true"
style="vertical-align: 'text-top'; font-size: 13px; color: '#4a68b9'"></fa-icon> style="vertical-align: 'text-top'; font-size: 13px; color: '#4a68b9'"></fa-icon>
@ -19,7 +19,7 @@
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">
<a class="title-link" href="" [routerLink]="['/lightning/nodes/rankings/connectivity' | relativeUrl]"> <a class="title-link" href="" [routerLink]="['/lightning/nodes/rankings/connectivity' | relativeUrl]">
<h5 class="card-title d-inline" i18n="lightning.connectivity-ranking">Connectivity ranking</h5> <h5 class="card-title d-inline" i18n="lightning.connectivity-ranking">Connectivity Ranking</h5>
<span>&nbsp;</span> <span>&nbsp;</span>
<fa-icon [icon]="['fas', 'external-link-alt']" [fixedWidth]="true" <fa-icon [icon]="['fas', 'external-link-alt']" [fixedWidth]="true"
style="vertical-align: 'text-top'; font-size: 13px; color: '#4a68b9'"></fa-icon> style="vertical-align: 'text-top'; font-size: 13px; color: '#4a68b9'"></fa-icon>

View File

@ -2,7 +2,7 @@
<div class="card-header mb-0 mb-md-4" [style]="widget ? 'display:none' : ''"> <div class="card-header mb-0 mb-md-4" [style]="widget ? 'display:none' : ''">
<div class="d-flex d-md-block align-items-baseline"> <div class="d-flex d-md-block align-items-baseline">
<span i18n="mining.channels-and-capacity">Channels & Capacity</span> <span i18n="lightning.network-capacity">Lightning Network Capacity</span>
<button class="btn p-0 pl-2" style="margin: 0 0 4px 0px" (click)="onSaveChart()"> <button class="btn p-0 pl-2" style="margin: 0 0 4px 0px" (click)="onSaveChart()">
<fa-icon [icon]="['fas', 'download']" [fixedWidth]="true"></fa-icon> <fa-icon [icon]="['fas', 'download']" [fixedWidth]="true"></fa-icon>
</button> </button>
@ -49,9 +49,7 @@
</div> </div>
<div *ngIf="widget && (capacityObservable$ | async) as stats"> <div *ngIf="widget && (capacityObservable$ | async) as stats">
<div *ngIf="stats.days === 0" class="indexing-message d-flex" i18n="lightning.indexing-in-progress"> <div *ngIf="stats.days === 0" class="indexing-message d-flex" i18n="lightning.indexing-in-progress">Indexing in progress</div>
Indexing in progress
</div>
</div> </div>
</div> </div>

View File

@ -63,7 +63,7 @@ export class LightningStatisticsChartComponent implements OnInit {
if (this.widget) { if (this.widget) {
this.miningWindowPreference = '3y'; this.miningWindowPreference = '3y';
} else { } else {
this.seoService.setTitle($localize`Channels and Capacity`); this.seoService.setTitle($localize`:@@ea8db27e6db64f8b940711948c001a1100e5fe9f:Lightning Network Capacity`);
this.miningWindowPreference = this.miningService.getDefaultTimespan('all'); this.miningWindowPreference = this.miningService.getDefaultTimespan('all');
} }
this.radioGroupForm = this.formBuilder.group({ dateSpan: this.miningWindowPreference }); this.radioGroupForm = this.formBuilder.group({ dateSpan: this.miningWindowPreference });
@ -119,7 +119,7 @@ export class LightningStatisticsChartComponent implements OnInit {
color: 'grey', color: 'grey',
fontSize: 11 fontSize: 11
}, },
text: $localize`Channels & Capacity`, text: $localize`:@@ea8db27e6db64f8b940711948c001a1100e5fe9f:Lightning Network Capacity`,
left: 'center', left: 'center',
top: 11, top: 11,
zlevel: 10, zlevel: 10,
@ -191,7 +191,7 @@ export class LightningStatisticsChartComponent implements OnInit {
padding: 10, padding: 10,
data: [ data: [
{ {
name: 'Channels', name: $localize`:@@807cf11e6ac1cde912496f764c176bdfdd6b7e19:Channels`,
inactiveColor: 'rgb(110, 112, 121)', inactiveColor: 'rgb(110, 112, 121)',
textStyle: { textStyle: {
color: 'white', color: 'white',
@ -199,7 +199,7 @@ export class LightningStatisticsChartComponent implements OnInit {
icon: 'roundRect', icon: 'roundRect',
}, },
{ {
name: 'Capacity', name: $localize`:@@ce9dfdc6dccb28dc75a78c704e09dc18fb02dcfa:Capacity`,
inactiveColor: 'rgb(110, 112, 121)', inactiveColor: 'rgb(110, 112, 121)',
textStyle: { textStyle: {
color: 'white', color: 'white',
@ -279,7 +279,7 @@ export class LightningStatisticsChartComponent implements OnInit {
{ {
zlevel: 0, zlevel: 0,
yAxisIndex: 1, yAxisIndex: 1,
name: $localize`Capacity`, name: $localize`:@@ce9dfdc6dccb28dc75a78c704e09dc18fb02dcfa:Capacity`,
showSymbol: false, showSymbol: false,
symbol: 'none', symbol: 'none',
stack: 'Total', stack: 'Total',
@ -341,7 +341,7 @@ export class LightningStatisticsChartComponent implements OnInit {
this.chartInstance.setOption(this.chartOptions); this.chartInstance.setOption(this.chartOptions);
download(this.chartInstance.getDataURL({ download(this.chartInstance.getDataURL({
pixelRatio: 2, pixelRatio: 2,
}), `block-sizes-weights-${this.timespan}-${Math.round(now.getTime() / 1000)}.svg`); }), `lightning-network-capacity-${this.timespan}-${Math.round(now.getTime() / 1000)}.svg`);
// @ts-ignore // @ts-ignore
this.chartOptions.grid.bottom = prevBottom; this.chartOptions.grid.bottom = prevBottom;
this.chartOptions.backgroundColor = 'none'; this.chartOptions.backgroundColor = 'none';

File diff suppressed because it is too large Load Diff