Pré-renderização
O componente <t> e o t pipe são traduzidos no navegador. Se você pré-renderizar seu aplicativo Angular, poderá traduzir suas páginas no momento da criação. O HTML é então traduzido antes de ser enviado, os usuários nunca esperam por uma tradução e os mecanismos de pesquisa indexam todos os idiomas.
O projeto de exemplo pré-renderiza uma página por idioma. Abra a página alemã e inspecione o tráfego da rede: nenhuma solicitação é feita à API Magic Translate.
Traduzir em um resolvedor
Adicione um parâmetro de rota para o idioma e traduza os textos da página em um resolvedor de rotas com o método translate. Armazene o resultado em Angular's TransferState, para que o navegador o reutilize em vez de traduzir novamente após a hidratação.
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 }}];
Com withComponentInputBinding() em provideRouter, as traduções resolvidas chegam como uma entrada do componente da página.
Pré-renderize todos os idiomas
Diga ao Angular quais idiomas pré-renderizar com getPrerenderParams:
// 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 agora grava um arquivo HTML traduzido por idioma. As traduções são armazenadas em cache, portanto, as compilações posteriores pagam apenas pelo texto alterado.