사전 렌더링
<t> 구성 요소와 t pipe 브라우저에서 번역돼.Angular 앱을 미리 렌더링하면 빌드 시에 페이지를 번역할 수 있어.그러면 HTML이 전송되기 전에 번역되고, 사용자는 번역을 기다릴 필요가 없고, 검색 엔진은 모든 언어를 색인화해.
예제 프로젝트는 언어당 한 페이지를 미리 렌더링해.독일어 페이지를 열고 네트워크 트래픽을 검사해. Magic Translate API에는 요청이 없어.
리졸버로 번역해.
언어의 경로 매개 변수를 추가하고 translate 메서드로 경로 해석기에서 페이지 텍스트를 번역해.결과를 Angular's TransferState 로 저장해 브라우저가 하이드레이션 후 다시 번역하는 대신 재사용하도록 해.
import { inject, makeStateKey, TransferState } from '@angular/core';import { ResolveFn } from '@angular/router';import { MagicTranslate, type Languages } from '@magic-translate/angular';const texts = {title: 'Welcome to our shop',intro: 'This page was translated when the app was built.'};type Texts = Record<keyof typeof texts, string>;export const translationsResolver: ResolveFn<Texts> = async (route) => {const transferState = inject(TransferState);const magicTranslate = inject(MagicTranslate);const lang = (route.paramMap.get('language') ?? 'en') as Languages;const key = makeStateKey<Texts>(`translations-${lang}`);const transferred = transferState.get(key, null);if (transferred) return transferred;const entries = await Promise.all(Object.entries(texts).map(async ([name, text]) => [name,await magicTranslate.translate(text, { lang })]));const translations = Object.fromEntries(entries) as Texts;transferState.set(key, translations);return translations;};
// app.routes.tsexport const routes: Routes = [{path: ':language',component: Page,resolve: { translations: translationsResolver }}];
withComponentInputBinding() in provideRouter 를 사용하면, 해결된 번역이 페이지 구성 요소의 입력으로 도착해.
모든 언어 사전 렌더링
getPrerenderParams 로 어떤 언어를 미리 렌더링할지 Angular 알려줘.
// app.routes.server.tsimport { RenderMode, ServerRoute } from '@angular/ssr';export const serverRoutes: ServerRoute[] = [{path: ':language',renderMode: RenderMode.Prerender,getPrerenderParams: async () =>['en', 'de', 'zh'].map((language) => ({ language }))}];
ng build 이제 언어당 번역된 HTML 파일을 하나씩 써.번역은 캐시돼. 그래서 나중에 빌드는 변경된 텍스트에 대해서만 비용을 지불해.