预渲染
<t> 组件和 t pipe 在浏览器中进行翻译。如果您预渲染 Angular 应用程序,则可以在构建时改为翻译页面。然后,HTML 在发送之前会被翻译,用户无需等待翻译,搜索引擎会为每种语言编制索引。
示例项目每种语言预渲染一页。打开德语页面并检查网络流量:没有向 Magic Translate API 提出任何请求。
在解析器中翻译
为该语言添加路由参数,并使用 translate 方法在路由解析器中翻译页面的文本。将结果存储在 Angular 的 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 }}];
使用 provideRouter 中的 withComponentInputBinding() 时,解析后的翻译作为页面组件的输入到达。
预渲染所有语言
告诉 Angular 使用 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 现在每种语言都写一个翻译过的 HTML 文件。翻译已缓存,因此后续版本仅为更改的文本付费。