Browse Source

Feature/setup i18n (#1139)

* Setup i18n

* Update changelog
pull/1138/head
Thomas Kaul 3 years ago
committed by GitHub
parent
commit
81245635af
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 4
      CHANGELOG.md
  2. 41
      angular.json
  3. 13
      apps/api/src/app/auth/auth.controller.ts
  4. 11
      apps/api/src/app/subscription/subscription.controller.ts
  5. 20
      apps/client/src/app/app-routing.module.ts
  6. 6
      apps/client/src/app/components/access-table/access-table.component.html
  7. 2
      apps/client/src/app/components/access-table/access-table.component.ts
  8. 6
      apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html
  9. 4
      apps/client/src/app/pages/about/changelog/changelog-page.html
  10. 2
      apps/client/src/app/pages/about/privacy-policy/privacy-policy-page.html
  11. 2
      apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.html
  12. 2
      apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.html
  13. 2
      apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.html
  14. 10
      apps/client/src/app/pages/blog/blog-page.html
  15. 4
      apps/client/src/app/pages/landing/landing-page.html
  16. 6
      apps/client/src/app/pages/register/register-page.html
  17. 10
      apps/client/src/assets/index.html
  18. 4
      apps/client/src/assets/robots.txt
  19. 4
      apps/client/src/assets/site.webmanifest
  20. 28
      apps/client/src/assets/sitemap.xml
  21. 16
      apps/client/src/index.html
  22. 2278
      apps/client/src/locales/messages.de.xlf
  23. 2278
      apps/client/src/locales/messages.xlf
  24. 1
      libs/common/src/lib/config.ts
  25. 5
      package.json

4
CHANGELOG.md

@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## Unreleased ## Unreleased
### Added
- Set up i18n support
### Changed ### Changed
- Reduced the maximum width of the performance chart on the home page - Reduced the maximum width of the performance chart on the home page

41
angular.json

@ -77,41 +77,50 @@
"polyfills": "apps/client/src/polyfills.ts", "polyfills": "apps/client/src/polyfills.ts",
"tsConfig": "apps/client/tsconfig.app.json", "tsConfig": "apps/client/tsconfig.app.json",
"assets": [ "assets": [
"apps/client/src/assets",
{ {
"glob": "assetlinks.json", "glob": "assetlinks.json",
"input": "apps/client/src/assets", "input": "apps/client/src/assets",
"output": "./.well-known" "output": "./../.well-known"
}, },
{ {
"glob": "CHANGELOG.md", "glob": "CHANGELOG.md",
"input": "", "input": "",
"output": "./assets" "output": "./../assets"
},
{
"glob": "index.html",
"input": "apps/client/src/assets",
"output": "./../"
}, },
{ {
"glob": "LICENSE", "glob": "LICENSE",
"input": "", "input": "",
"output": "./assets" "output": "./../assets"
}, },
{ {
"glob": "robots.txt", "glob": "robots.txt",
"input": "apps/client/src/assets", "input": "apps/client/src/assets",
"output": "./" "output": "./../"
}, },
{ {
"glob": "sitemap.xml", "glob": "sitemap.xml",
"input": "apps/client/src/assets", "input": "apps/client/src/assets",
"output": "./" "output": "./../"
}, },
{ {
"glob": "**/*", "glob": "**/*",
"input": "node_modules/ionicons/dist/ionicons", "input": "node_modules/ionicons/dist/ionicons",
"output": "./ionicons" "output": "./../ionicons"
}, },
{ {
"glob": "**/*.js", "glob": "**/*.js",
"input": "node_modules/ionicons/dist/", "input": "node_modules/ionicons/dist/",
"output": "./" "output": "./../"
},
{
"glob": "**/*",
"input": "apps/client/src/assets",
"output": "./../assets/"
} }
], ],
"styles": ["apps/client/src/styles.scss"], "styles": ["apps/client/src/styles.scss"],
@ -124,6 +133,10 @@
"namedChunks": true "namedChunks": true
}, },
"configurations": { "configurations": {
"development-en": {
"baseHref": "/en/",
"localize": ["en"]
},
"production": { "production": {
"fileReplacements": [ "fileReplacements": [
{ {
@ -162,6 +175,9 @@
"proxyConfig": "apps/client/proxy.conf.json" "proxyConfig": "apps/client/proxy.conf.json"
}, },
"configurations": { "configurations": {
"development-en": {
"browserTarget": "client:build:development-en"
},
"production": { "production": {
"browserTarget": "client:build:production" "browserTarget": "client:build:production"
} }
@ -188,6 +204,15 @@
"outputs": ["coverage/apps/client"] "outputs": ["coverage/apps/client"]
} }
}, },
"i18n": {
"locales": {
"de": {
"baseHref": "/de/",
"translation": "apps/client/src/locales/messages.de.xlf"
}
},
"sourceLocale": "en"
},
"tags": [] "tags": []
}, },
"client-e2e": { "client-e2e": {

13
apps/api/src/app/auth/auth.controller.ts

@ -1,5 +1,6 @@
import { WebAuthService } from '@ghostfolio/api/app/auth/web-auth.service'; import { WebAuthService } from '@ghostfolio/api/app/auth/web-auth.service';
import { ConfigurationService } from '@ghostfolio/api/services/configuration.service'; import { ConfigurationService } from '@ghostfolio/api/services/configuration.service';
import { DEFAULT_LANGUAGE_CODE } from '@ghostfolio/common/config';
import { OAuthResponse } from '@ghostfolio/common/interfaces'; import { OAuthResponse } from '@ghostfolio/common/interfaces';
import { import {
Body, Body,
@ -62,9 +63,17 @@ export class AuthController {
const jwt: string = req.user.jwt; const jwt: string = req.user.jwt;
if (jwt) { if (jwt) {
res.redirect(`${this.configurationService.get('ROOT_URL')}/auth/${jwt}`); res.redirect(
`${this.configurationService.get(
'ROOT_URL'
)}/${DEFAULT_LANGUAGE_CODE}/auth/${jwt}`
);
} else { } else {
res.redirect(`${this.configurationService.get('ROOT_URL')}/auth`); res.redirect(
`${this.configurationService.get(
'ROOT_URL'
)}/${DEFAULT_LANGUAGE_CODE}/auth`
);
} }
} }

11
apps/api/src/app/subscription/subscription.controller.ts

@ -1,6 +1,9 @@
import { ConfigurationService } from '@ghostfolio/api/services/configuration.service'; import { ConfigurationService } from '@ghostfolio/api/services/configuration.service';
import { PropertyService } from '@ghostfolio/api/services/property/property.service'; import { PropertyService } from '@ghostfolio/api/services/property/property.service';
import { PROPERTY_COUPONS } from '@ghostfolio/common/config'; import {
DEFAULT_LANGUAGE_CODE,
PROPERTY_COUPONS
} from '@ghostfolio/common/config';
import { Coupon } from '@ghostfolio/common/interfaces'; import { Coupon } from '@ghostfolio/common/interfaces';
import type { RequestWithUser } from '@ghostfolio/common/types'; import type { RequestWithUser } from '@ghostfolio/common/types';
import { import {
@ -93,7 +96,11 @@ export class SubscriptionController {
'SubscriptionController' 'SubscriptionController'
); );
res.redirect(`${this.configurationService.get('ROOT_URL')}/account`); res.redirect(
`${this.configurationService.get(
'ROOT_URL'
)}/${DEFAULT_LANGUAGE_CODE}/account`
);
} }
@Post('stripe/checkout-session') @Post('stripe/checkout-session')

20
apps/client/src/app/app-routing.module.ts

@ -54,45 +54,45 @@ const routes: Routes = [
import('./pages/blog/blog-page.module').then((m) => m.BlogPageModule) import('./pages/blog/blog-page.module').then((m) => m.BlogPageModule)
}, },
{ {
path: 'de/blog/2021/07/hallo-ghostfolio', path: 'blog/2021/07/hallo-ghostfolio',
loadChildren: () => loadChildren: () =>
import( import(
'./pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.module' './pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.module'
).then((m) => m.HalloGhostfolioPageModule) ).then((m) => m.HalloGhostfolioPageModule)
}, },
{ {
path: 'demo', path: 'blog/2021/07/hello-ghostfolio',
loadChildren: () =>
import('./pages/demo/demo-page.module').then((m) => m.DemoPageModule)
},
{
path: 'en/blog/2021/07/hello-ghostfolio',
loadChildren: () => loadChildren: () =>
import( import(
'./pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.module' './pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.module'
).then((m) => m.HelloGhostfolioPageModule) ).then((m) => m.HelloGhostfolioPageModule)
}, },
{ {
path: 'en/blog/2022/01/ghostfolio-first-months-in-open-source', path: 'blog/2022/01/ghostfolio-first-months-in-open-source',
loadChildren: () => loadChildren: () =>
import( import(
'./pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.module' './pages/blog/2022/01/first-months-in-open-source/first-months-in-open-source-page.module'
).then((m) => m.FirstMonthsInOpenSourcePageModule) ).then((m) => m.FirstMonthsInOpenSourcePageModule)
}, },
{ {
path: 'en/blog/2022/07/ghostfolio-meets-internet-identity', path: 'blog/2022/07/ghostfolio-meets-internet-identity',
loadChildren: () => loadChildren: () =>
import( import(
'./pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.module' './pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.module'
).then((m) => m.GhostfolioMeetsInternetIdentityPageModule) ).then((m) => m.GhostfolioMeetsInternetIdentityPageModule)
}, },
{ {
path: 'en/blog/2022/07/how-do-i-get-my-finances-in-order', path: 'blog/2022/07/how-do-i-get-my-finances-in-order',
loadChildren: () => loadChildren: () =>
import( import(
'./pages/blog/2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page.module' './pages/blog/2022/07/how-do-i-get-my-finances-in-order/how-do-i-get-my-finances-in-order-page.module'
).then((m) => m.HowDoIGetMyFinancesInOrderPageModule) ).then((m) => m.HowDoIGetMyFinancesInOrderPageModule)
}, },
{
path: 'demo',
loadChildren: () =>
import('./pages/demo/demo-page.module').then((m) => m.DemoPageModule)
},
{ {
path: 'faq', path: 'faq',
loadChildren: () => loadChildren: () =>

6
apps/client/src/app/components/access-table/access-table.component.html

@ -21,8 +21,10 @@
<td *matCellDef="let element" class="px-1 text-nowrap" mat-cell> <td *matCellDef="let element" class="px-1 text-nowrap" mat-cell>
<ng-container *ngIf="element.type === 'PUBLIC'"> <ng-container *ngIf="element.type === 'PUBLIC'">
<ion-icon class="mr-1" name="link-outline"></ion-icon> <ion-icon class="mr-1" name="link-outline"></ion-icon>
<a href="{{ baseUrl }}/p/{{ element.id }}" target="_blank" <a
>{{ baseUrl }}/p/{{ element.id }}</a href="{{ baseUrl }}/{{ defaultLanguageCode }}/p/{{ element.id }}"
target="_blank"
>{{ baseUrl }}/{{ defaultLanguageCode }}/p/{{ element.id }}</a
> >
</ng-container> </ng-container>
</td> </td>

2
apps/client/src/app/components/access-table/access-table.component.ts

@ -8,6 +8,7 @@ import {
Output Output
} from '@angular/core'; } from '@angular/core';
import { MatTableDataSource } from '@angular/material/table'; import { MatTableDataSource } from '@angular/material/table';
import { DEFAULT_LANGUAGE_CODE } from '@ghostfolio/common/config';
import { Access } from '@ghostfolio/common/interfaces'; import { Access } from '@ghostfolio/common/interfaces';
@Component({ @Component({
@ -24,6 +25,7 @@ export class AccessTableComponent implements OnChanges, OnInit {
public baseUrl = window.location.origin; public baseUrl = window.location.origin;
public dataSource: MatTableDataSource<Access>; public dataSource: MatTableDataSource<Access>;
public defaultLanguageCode = DEFAULT_LANGUAGE_CODE;
public displayedColumns = []; public displayedColumns = [];
public constructor() {} public constructor() {}

6
apps/client/src/app/components/login-with-access-token-dialog/login-with-access-token-dialog.html

@ -25,14 +25,14 @@
> >
<img <img
class="mr-2" class="mr-2"
src="./assets/icons/internet-computer.svg" src="../assets/icons/internet-computer.svg"
style="height: 0.75rem" style="height: 0.75rem"
/><span i18n>Sign in with Internet Identity</span> /><span i18n>Sign in with Internet Identity</span>
</button> </button>
<a href="/api/v1/auth/google" mat-stroked-button <a href="../api/v1/auth/google" mat-stroked-button
><img ><img
class="mr-2" class="mr-2"
src="./assets/icons/google.svg" src="../assets/icons/google.svg"
style="height: 1rem" style="height: 1rem"
/><span i18n>Sign in with Google</span></a /><span i18n>Sign in with Google</span></a
> >

4
apps/client/src/app/pages/about/changelog/changelog-page.html

@ -4,7 +4,7 @@
<h3 class="mb-3 text-center" i18n>Changelog</h3> <h3 class="mb-3 text-center" i18n>Changelog</h3>
<mat-card class="changelog"> <mat-card class="changelog">
<mat-card-content> <mat-card-content>
<markdown [src]="'assets/CHANGELOG.md'"></markdown> <markdown [src]="'../assets/CHANGELOG.md'"></markdown>
</mat-card-content> </mat-card-content>
</mat-card> </mat-card>
</div> </div>
@ -15,7 +15,7 @@
<h3 class="mb-3 text-center" i18n>License</h3> <h3 class="mb-3 text-center" i18n>License</h3>
<mat-card> <mat-card>
<mat-card-content> <mat-card-content>
<markdown [src]="'assets/LICENSE'"></markdown> <markdown [src]="'../assets/LICENSE'"></markdown>
</mat-card-content> </mat-card-content>
</mat-card> </mat-card>
</div> </div>

2
apps/client/src/app/pages/about/privacy-policy/privacy-policy-page.html

@ -2,7 +2,7 @@
<div class="mb-5 row"> <div class="mb-5 row">
<div class="col"> <div class="col">
<h3 class="mb-3 text-center" i18n>Privacy Policy</h3> <h3 class="mb-3 text-center" i18n>Privacy Policy</h3>
<markdown [src]="'assets/privacy-policy.md'"></markdown> <markdown [src]="'../assets/privacy-policy.md'"></markdown>
</div> </div>
</div> </div>
</div> </div>

2
apps/client/src/app/pages/blog/2021/07/hallo-ghostfolio/hallo-ghostfolio-page.html

@ -68,7 +68,7 @@
<p class="my-5 text-center"> <p class="my-5 text-center">
<img <img
alt="Ghostfol.io Screenshot" alt="Ghostfol.io Screenshot"
src="./assets/images/screenshot.png" src="../assets/images/screenshot.png"
style="max-width: 100%; width: 20rem" style="max-width: 100%; width: 20rem"
title="Ghostfol.io Screenshot" title="Ghostfol.io Screenshot"
/> />

2
apps/client/src/app/pages/blog/2021/07/hello-ghostfolio/hello-ghostfolio-page.html

@ -66,7 +66,7 @@
<p class="my-5 text-center"> <p class="my-5 text-center">
<img <img
alt="Ghostfol.io Screenshot" alt="Ghostfol.io Screenshot"
src="./assets/images/screenshot.png" src="../assets/images/screenshot.png"
style="max-width: 100%; width: 20rem" style="max-width: 100%; width: 20rem"
title="Ghostfol.io Screenshot" title="Ghostfol.io Screenshot"
/> />

2
apps/client/src/app/pages/blog/2022/07/ghostfolio-meets-internet-identity/ghostfolio-meets-internet-identity-page.html

@ -8,7 +8,7 @@
<img <img
alt="Ghostfolio meets Internet Identity Teaser" alt="Ghostfolio meets Internet Identity Teaser"
class="w-100" class="w-100"
src="./assets/images/blog/ghostfolio-meets-internet-identity.png" src="../assets/images/blog/ghostfolio-meets-internet-identity.png"
title="Ghostfolio meets Internet Identity" title="Ghostfolio meets Internet Identity"
/> />
</div> </div>

10
apps/client/src/app/pages/blog/blog-page.html

@ -8,7 +8,7 @@
<div class="flex-nowrap no-gutters row"> <div class="flex-nowrap no-gutters row">
<a <a
class="d-flex w-100" class="d-flex w-100"
[routerLink]="['/en', 'blog', '2022', '07', 'ghostfolio-meets-internet-identity']" [routerLink]="['/blog', '2022', '07', 'ghostfolio-meets-internet-identity']"
> >
<div class="flex-grow-1"> <div class="flex-grow-1">
<div class="h6 m-0 text-truncate"> <div class="h6 m-0 text-truncate">
@ -34,7 +34,7 @@
<div class="flex-nowrap no-gutters row"> <div class="flex-nowrap no-gutters row">
<a <a
class="d-flex w-100" class="d-flex w-100"
[routerLink]="['/en', 'blog', '2022', '07', 'how-do-i-get-my-finances-in-order']" [routerLink]="['/blog', '2022', '07', 'how-do-i-get-my-finances-in-order']"
> >
<div class="flex-grow-1"> <div class="flex-grow-1">
<div class="h6 m-0 text-truncate"> <div class="h6 m-0 text-truncate">
@ -60,7 +60,7 @@
<div class="flex-nowrap no-gutters row"> <div class="flex-nowrap no-gutters row">
<a <a
class="d-flex w-100" class="d-flex w-100"
[routerLink]="['/en', 'blog', '2022', '01', 'ghostfolio-first-months-in-open-source']" [routerLink]="['/blog', '2022', '01', 'ghostfolio-first-months-in-open-source']"
> >
<div class="flex-grow-1"> <div class="flex-grow-1">
<div class="h6 m-0 text-truncate"> <div class="h6 m-0 text-truncate">
@ -86,7 +86,7 @@
<div class="flex-nowrap no-gutters row"> <div class="flex-nowrap no-gutters row">
<a <a
class="d-flex w-100" class="d-flex w-100"
[routerLink]="['/en', 'blog', '2021', '07', 'hello-ghostfolio']" [routerLink]="['/blog', '2021', '07', 'hello-ghostfolio']"
> >
<div class="flex-grow-1"> <div class="flex-grow-1">
<div class="h6 m-0 text-truncate">Hello Ghostfolio</div> <div class="h6 m-0 text-truncate">Hello Ghostfolio</div>
@ -110,7 +110,7 @@
<div class="flex-nowrap no-gutters row"> <div class="flex-nowrap no-gutters row">
<a <a
class="d-flex w-100" class="d-flex w-100"
[routerLink]="['/de', 'blog', '2021', '07', 'hallo-ghostfolio']" [routerLink]="['/blog', '2021', '07', 'hallo-ghostfolio']"
> >
<div class="flex-grow-1"> <div class="flex-grow-1">
<div class="h6 m-0 text-truncate">Hallo Ghostfolio</div> <div class="h6 m-0 text-truncate">Hallo Ghostfolio</div>

4
apps/client/src/app/pages/landing/landing-page.html

@ -13,7 +13,7 @@
<img <img
alt="Ghostfol.io Trailer" alt="Ghostfol.io Trailer"
class="rounded video" class="rounded video"
src="./assets/images/video-preview.jpg" src="../assets/images/video-preview.jpg"
style="max-width: 100%; width: 40rem" style="max-width: 100%; width: 40rem"
/> />
</a> </a>
@ -183,7 +183,7 @@
href="https://play.google.com/store/apps/details?id=ch.dotsilver.ghostfolio.twa" href="https://play.google.com/store/apps/details?id=ch.dotsilver.ghostfolio.twa"
title="Get Ghostfolio on Google Play" title="Get Ghostfolio on Google Play"
> >
<img alt="Google Play Badge" src="assets/badge-en-google-play.png" /> <img alt="Google Play Badge" src="../assets/badge-en-google-play.png" />
</a> </a>
</div> </div>
</div> </div>

6
apps/client/src/app/pages/register/register-page.html

@ -36,15 +36,15 @@
> >
<img <img
class="mr-2" class="mr-2"
src="./assets/icons/internet-computer.svg" src="../assets/icons/internet-computer.svg"
style="height: 0.75rem" style="height: 0.75rem"
/> />
<span i18n>Continue with Internet Identity</span> <span i18n>Continue with Internet Identity</span>
</button> </button>
<a class="d-block" href="/api/v1/auth/google" mat-stroked-button <a class="d-block" href="../api/v1/auth/google" mat-stroked-button
><img ><img
class="mr-2" class="mr-2"
src="./assets/icons/google.svg" src="../assets/icons/google.svg"
style="height: 1rem" style="height: 1rem"
/><span i18n>Continue with Google</span></a /><span i18n>Continue with Google</span></a
> >

10
apps/client/src/assets/index.html

@ -0,0 +1,10 @@
<!DOCTYPE html>
<html>
<head>
<title>Ghostfol.io</title>
<link rel="canonical" href="https://ghostfol.io/en/" />
<meta name="robots" content="noindex" />
<meta charset="utf-8" />
<meta http-equiv="refresh" content="0; url=https://ghostfol.io/en/" />
</head>
</html>

4
apps/client/src/assets/robots.txt

@ -1,6 +1,6 @@
User-agent: * User-agent: *
Allow: / Allow: /
Disallow: /about/privacy-policy Disallow: /en/about/privacy-policy
Disallow: /p/* Disallow: /en/p/*
Sitemap: https://ghostfol.io/sitemap.xml Sitemap: https://ghostfol.io/sitemap.xml

4
apps/client/src/assets/site.webmanifest

@ -6,12 +6,12 @@
"icons": [ "icons": [
{ {
"sizes": "192x192", "sizes": "192x192",
"src": "/assets/android-chrome-192x192.png", "src": "/en/assets/android-chrome-192x192.png",
"type": "image/png" "type": "image/png"
}, },
{ {
"sizes": "512x512", "sizes": "512x512",
"src": "/assets/android-chrome-512x512.png", "src": "/en/assets/android-chrome-512x512.png",
"type": "image/png" "type": "image/png"
} }
], ],

28
apps/client/src/assets/sitemap.xml

@ -9,23 +9,19 @@
<lastmod>2022-07-29T00:00:00+00:00</lastmod> <lastmod>2022-07-29T00:00:00+00:00</lastmod>
</url> </url>
<url> <url>
<loc>https://ghostfol.io/about</loc> <loc>https://ghostfol.io/de/blog/2021/07/hallo-ghostfolio</loc>
<lastmod>2022-07-29T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/about/changelog</loc>
<lastmod>2022-07-29T00:00:00+00:00</lastmod> <lastmod>2022-07-29T00:00:00+00:00</lastmod>
</url> </url>
<url> <url>
<loc>https://ghostfol.io/blog</loc> <loc>https://ghostfol.io/en/about</loc>
<lastmod>2022-07-29T00:00:00+00:00</lastmod> <lastmod>2022-07-29T00:00:00+00:00</lastmod>
</url> </url>
<url> <url>
<loc>https://ghostfol.io/de/blog/2021/07/hallo-ghostfolio</loc> <loc>https://ghostfol.io/en/about/changelog</loc>
<lastmod>2022-07-29T00:00:00+00:00</lastmod> <lastmod>2022-07-29T00:00:00+00:00</lastmod>
</url> </url>
<url> <url>
<loc>https://ghostfol.io/demo</loc> <loc>https://ghostfol.io/en/blog</loc>
<lastmod>2022-07-29T00:00:00+00:00</lastmod> <lastmod>2022-07-29T00:00:00+00:00</lastmod>
</url> </url>
<url> <url>
@ -45,27 +41,31 @@
<lastmod>2022-07-29T00:00:00+00:00</lastmod> <lastmod>2022-07-29T00:00:00+00:00</lastmod>
</url> </url>
<url> <url>
<loc>https://ghostfol.io/faq</loc> <loc>https://ghostfol.io/en/demo</loc>
<lastmod>2022-07-29T00:00:00+00:00</lastmod>
</url>
<url>
<loc>https://ghostfol.io/en/faq</loc>
<lastmod>2022-07-29T00:00:00+00:00</lastmod> <lastmod>2022-07-29T00:00:00+00:00</lastmod>
</url> </url>
<url> <url>
<loc>https://ghostfol.io/features</loc> <loc>https://ghostfol.io/en/features</loc>
<lastmod>2022-07-29T00:00:00+00:00</lastmod> <lastmod>2022-07-29T00:00:00+00:00</lastmod>
</url> </url>
<url> <url>
<loc>https://ghostfol.io/markets</loc> <loc>https://ghostfol.io/en/markets</loc>
<lastmod>2022-07-29T00:00:00+00:00</lastmod> <lastmod>2022-07-29T00:00:00+00:00</lastmod>
</url> </url>
<url> <url>
<loc>https://ghostfol.io/pricing</loc> <loc>https://ghostfol.io/en/pricing</loc>
<lastmod>2022-07-29T00:00:00+00:00</lastmod> <lastmod>2022-07-29T00:00:00+00:00</lastmod>
</url> </url>
<url> <url>
<loc>https://ghostfol.io/register</loc> <loc>https://ghostfol.io/en/register</loc>
<lastmod>2022-07-29T00:00:00+00:00</lastmod> <lastmod>2022-07-29T00:00:00+00:00</lastmod>
</url> </url>
<url> <url>
<loc>https://ghostfol.io/resources</loc> <loc>https://ghostfol.io/en/resources</loc>
<lastmod>2022-07-29T00:00:00+00:00</lastmod> <lastmod>2022-07-29T00:00:00+00:00</lastmod>
</url> </url>
</urlset> </urlset>

16
apps/client/src/index.html

@ -21,7 +21,7 @@
/> />
<meta <meta
name="twitter:image" name="twitter:image"
content="https://www.ghostfol.io/assets/cover.png" content="https://ghostfol.io/en/assets/cover.png"
/> />
<meta <meta
name="twitter:title" name="twitter:title"
@ -37,10 +37,10 @@
content="Ghostfolio – Open Source Wealth Management Software" content="Ghostfolio – Open Source Wealth Management Software"
/> />
<meta property="og:type" content="website" /> <meta property="og:type" content="website" />
<meta property="og:url" content="https://www.ghostfol.io" /> <meta property="og:url" content="https://ghostfol.io" />
<meta <meta
property="og:image" property="og:image"
content="https://www.ghostfol.io/assets/cover.png" content="https://ghostfol.io/en/assets/cover.png"
/> />
<meta property="og:updated_time" content="2022-05-28T00:00:00+00:00" /> <meta property="og:updated_time" content="2022-05-28T00:00:00+00:00" />
<meta <meta
@ -51,26 +51,26 @@
<link <link
rel="apple-touch-icon" rel="apple-touch-icon"
sizes="180x180" sizes="180x180"
href="/assets/apple-touch-icon.png" href="../assets/apple-touch-icon.png"
/> />
<link <link
rel="icon" rel="icon"
type="image/png" type="image/png"
sizes="32x32" sizes="32x32"
href="/assets/favicon-32x32.png" href="../assets/favicon-32x32.png"
/> />
<link <link
rel="icon" rel="icon"
type="image/png" type="image/png"
sizes="16x16" sizes="16x16"
href="/assets/favicon-16x16.png" href="../assets/favicon-16x16.png"
/> />
<link rel="manifest" href="/assets/site.webmanifest" /> <link rel="manifest" href="../assets/site.webmanifest" />
</head> </head>
<body> <body>
<gf-root></gf-root> <gf-root></gf-root>
<script type="module" src="ionicons/ionicons.esm.js"></script> <script type="module" src="../ionicons/ionicons.esm.js"></script>
<script nomodule="" src="ionicons.js"></script> <script nomodule="" src="ionicons.js"></script>
<noscript <noscript

2278
apps/client/src/locales/messages.de.xlf

File diff suppressed because it is too large

2278
apps/client/src/locales/messages.xlf

File diff suppressed because it is too large

1
libs/common/src/lib/config.ts

@ -49,6 +49,7 @@ export const DATA_GATHERING_QUEUE_PRIORITY_LOW = Number.MAX_SAFE_INTEGER;
export const DATA_GATHERING_QUEUE_PRIORITY_HIGH = 1; export const DATA_GATHERING_QUEUE_PRIORITY_HIGH = 1;
export const DEFAULT_DATE_FORMAT_MONTH_YEAR = 'MMM yyyy'; export const DEFAULT_DATE_FORMAT_MONTH_YEAR = 'MMM yyyy';
export const DEFAULT_LANGUAGE_CODE = 'en';
export const GATHER_ASSET_PROFILE_PROCESS = 'GATHER_ASSET_PROFILE'; export const GATHER_ASSET_PROFILE_PROCESS = 'GATHER_ASSET_PROFILE';
export const GATHER_ASSET_PROFILE_PROCESS_OPTIONS: JobOptions = { export const GATHER_ASSET_PROFILE_PROCESS_OPTIONS: JobOptions = {

5
package.json

@ -13,7 +13,7 @@
"affected:lint": "nx affected:lint", "affected:lint": "nx affected:lint",
"affected:test": "nx affected:test", "affected:test": "nx affected:test",
"angular": "node --max_old_space_size=32768 ./node_modules/@angular/cli/bin/ng", "angular": "node --max_old_space_size=32768 ./node_modules/@angular/cli/bin/ng",
"build:all": "nx run api:build:production && nx run client:build:production && yarn replace-placeholders-in-build", "build:all": "nx run api:build:production && nx run client:build:production --localize && yarn replace-placeholders-in-build",
"build:dev": "nx run api:build && nx run client:build && yarn replace-placeholders-in-build", "build:dev": "nx run api:build && nx run client:build && yarn replace-placeholders-in-build",
"build:storybook": "nx run ui:build-storybook", "build:storybook": "nx run ui:build-storybook",
"clean": "rimraf dist", "clean": "rimraf dist",
@ -29,6 +29,7 @@
"database:validate": "prisma validate", "database:validate": "prisma validate",
"dep-graph": "nx dep-graph", "dep-graph": "nx dep-graph",
"e2e": "ng e2e", "e2e": "ng e2e",
"extract-locales": "ng extract-i18n --output-path ./apps/client/src/locales",
"format": "nx format:write", "format": "nx format:write",
"format:check": "nx format:check", "format:check": "nx format:check",
"format:write": "nx format:write", "format:write": "nx format:write",
@ -40,7 +41,7 @@
"postinstall": "prisma generate && ngcc --properties es2020 browser module main", "postinstall": "prisma generate && ngcc --properties es2020 browser module main",
"replace-placeholders-in-build": "node ./replace.build.js", "replace-placeholders-in-build": "node ./replace.build.js",
"start": "node dist/apps/api/main", "start": "node dist/apps/api/main",
"start:client": "ng serve client --hmr -o", "start:client": "ng serve client --configuration=development-en --hmr -o",
"start:prod": "node apps/api/main", "start:prod": "node apps/api/main",
"start:server": "nx serve api --watch", "start:server": "nx serve api --watch",
"start:storybook": "nx run ui:storybook", "start:storybook": "nx run ui:storybook",

Loading…
Cancel
Save