Skip to content

Commit 5c7d8e8

Browse files
committed
fix: SSR with the new standalone
- instead of using custom loader for browser and server, to use just one for both - this has a problem that the translations files will be loaded in the frontend, which we will fix with hydration in a future commit
1 parent 40a7429 commit 5c7d8e8

11 files changed

+68
-252
lines changed

server.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ import { ngExpressEngine } from '@nguniversal/express-engine';
44
import * as express from 'express';
55
import { join } from 'path';
66

7-
import { AppServerModule } from './src/main.server';
87
import { APP_BASE_HREF } from '@angular/common';
98
import { existsSync } from 'fs';
9+
import bootstrap from './src/main.server';
1010

1111
// The Express app is exported so that it can be used by serverless Functions.
1212
export function app(): express.Express {
@@ -16,7 +16,7 @@ export function app(): express.Express {
1616

1717
// Our Universal express-engine (found @ https://github.com/angular/universal/tree/master/modules/express-engine)
1818
server.engine('html', ngExpressEngine({
19-
bootstrap: AppServerModule,
19+
bootstrap,
2020
}));
2121

2222
server.set('view engine', 'html');

src/app/app.config.server.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { provideServerRendering } from '@angular/platform-server';
2+
import { ApplicationConfig, mergeApplicationConfig } from '@angular/core';
3+
import { appConfig } from './app.config';
4+
5+
const serverConfig: ApplicationConfig = {
6+
providers: [
7+
provideServerRendering()
8+
]
9+
};
10+
11+
export const config = mergeApplicationConfig(appConfig, serverConfig);

src/app/app.config.ts

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { ApplicationConfig, importProvidersFrom } from '@angular/core';
2+
import { BrowserModule } from '@angular/platform-browser';
3+
import { AppRoutingModule, routes } from './app-routing.module';
4+
import { CollapseModule } from 'ngx-bootstrap/collapse';
5+
import { BsDropdownModule } from 'ngx-bootstrap/dropdown';
6+
import { TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core';
7+
import { translateBrowserLoaderFactory } from './core/utils/translate-browser.loader';
8+
import { HttpClient, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';
9+
import { LocalizeParser, LocalizeRouterModule, LocalizeRouterSettings } from '@gilsdav/ngx-translate-router';
10+
import { localizeBrowserLoaderFactory } from './core/utils/localize-browser.loader';
11+
import { Location } from '@angular/common';
12+
import { provideAnimations } from '@angular/platform-browser/animations';
13+
14+
export const appConfig: ApplicationConfig = {
15+
providers: [
16+
importProvidersFrom(BrowserModule, AppRoutingModule, CollapseModule.forRoot(), BsDropdownModule.forRoot(), TranslateModule.forRoot({
17+
defaultLanguage: 'en',
18+
loader: {
19+
provide: TranslateLoader,
20+
useFactory: translateBrowserLoaderFactory,
21+
deps: [HttpClient],
22+
},
23+
}), LocalizeRouterModule.forRoot(routes, {
24+
parser: {
25+
provide: LocalizeParser,
26+
useFactory: localizeBrowserLoaderFactory,
27+
deps: [TranslateService, Location, LocalizeRouterSettings, HttpClient],
28+
},
29+
initialNavigation: true,
30+
})),
31+
provideAnimations(),
32+
provideHttpClient(withInterceptorsFromDi()),
33+
],
34+
};

src/app/app.server.module.ts

Lines changed: 0 additions & 36 deletions
This file was deleted.
Lines changed: 7 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,21 @@
11
import { LocalizeParser, LocalizeRouterSettings } from '@gilsdav/ngx-translate-router';
2-
import { Routes } from '@angular/router';
32
import { TranslateService } from '@ngx-translate/core';
43
import { Location } from '@angular/common';
54
import { HttpClient } from '@angular/common/http';
6-
import { makeStateKey, StateKey, TransferState } from '@angular/platform-browser';
75
import { LocalizeRouterHttpLoader } from '@gilsdav/ngx-translate-router-http-loader';
8-
9-
export class LocalizeBrowserLoader extends LocalizeParser {
10-
private translateService: TranslateService;
11-
private LocalLocation: Location;
12-
private localizeRouterSettings: LocalizeRouterSettings;
13-
14-
constructor(
15-
translateService: TranslateService,
16-
location: Location,
17-
settings: LocalizeRouterSettings,
18-
private data: any,
19-
) {
20-
super(translateService, location, settings);
21-
this.translateService = translateService;
22-
this.LocalLocation = location;
23-
this.localizeRouterSettings = settings;
24-
}
25-
26-
public load(routes: Routes): Promise<any> {
27-
return new Promise((resolve: any) => {
28-
this.locales = this.data.locales;
29-
this.prefix = this.data.prefix;
30-
this.init(routes).then(resolve);
31-
});
32-
}
33-
}
6+
import { environment } from '../../../environments/environment';
347

358
export function localizeBrowserLoaderFactory(
369
translate: TranslateService,
3710
location: Location,
3811
settings: LocalizeRouterSettings,
3912
httpClient: HttpClient,
40-
transferState: TransferState,
4113
): LocalizeParser {
42-
const key: StateKey<number> = makeStateKey<number>(
43-
'transfer-locales',
14+
return new LocalizeRouterHttpLoader(
15+
translate,
16+
location,
17+
settings,
18+
httpClient,
19+
`${environment.appUrl}assets/locales.json`,
4420
);
45-
const data = transferState.get(key, null);
46-
if (data) {
47-
return new LocalizeBrowserLoader(translate, location, settings, data);
48-
} else {
49-
return new LocalizeRouterHttpLoader(
50-
translate,
51-
location,
52-
settings,
53-
httpClient,
54-
);
55-
}
5621
}

src/app/core/utils/localize-server.loader.ts

Lines changed: 0 additions & 63 deletions
This file was deleted.
Lines changed: 3 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,9 @@
1-
import { Observable } from 'rxjs';
2-
import { TranslateLoader } from '@ngx-translate/core';
31
import { TranslateHttpLoader } from '@ngx-translate/http-loader';
42
import { HttpClient } from '@angular/common/http';
5-
import { makeStateKey, StateKey, TransferState } from '@angular/platform-browser';
6-
7-
export class TranslateBrowserLoader implements TranslateLoader {
8-
constructor(
9-
private http: HttpClient,
10-
private transferState: TransferState,
11-
) {
12-
}
13-
14-
public getTranslation(lang: string): Observable<unknown> {
15-
const key: StateKey<number> = makeStateKey<number>(
16-
'transfer-translate-' + lang,
17-
);
18-
const data = this.transferState.get(key, null);
19-
20-
// if none found, http load as fallback
21-
if (data) {
22-
return new Observable((observer) => {
23-
observer.next(data);
24-
observer.complete();
25-
});
26-
} else {
27-
return new TranslateHttpLoader(this.http).getTranslation(lang);
28-
}
29-
}
30-
}
3+
import { environment } from '../../../environments/environment';
314

325
export function translateBrowserLoaderFactory(
336
httpClient: HttpClient,
34-
transferState: TransferState,
35-
): TranslateBrowserLoader {
36-
return new TranslateBrowserLoader(httpClient, transferState);
7+
): TranslateHttpLoader {
8+
return new TranslateHttpLoader(httpClient, `${environment.appUrl}assets/i18n/`);
379
}

src/app/core/utils/translate-server.loader.ts

Lines changed: 0 additions & 44 deletions
This file was deleted.

src/environments/environment.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
export const environment = {
2+
appUrl: 'http://localhost:4200/'
23
};

src/main.server.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,7 @@
1-
export { AppServerModule } from './app/app.server.module';
1+
import { bootstrapApplication } from '@angular/platform-browser';
2+
import { AppComponent } from './app/app.component';
3+
import { config } from './app/app.config.server';
4+
5+
const bootstrap = () => bootstrapApplication(AppComponent, config);
6+
7+
export default bootstrap;

0 commit comments

Comments
 (0)