Предварительная визуализация
Компонент <t> и t pipe переводятся в браузере. Если вы предварительно отрендерите приложение Angular, вместо этого вы сможете переводить страницы во время сборки. После этого пользователи и поисковые системы получат полностью переведенный HTML-код на все языки.
В примере проекта предварительно отображается одна страница на каждый язык. Откройте страницу на немецком языке и проверьте сетевой трафик: запросы к API Magic Translate не поступают.
Переведите в резольвере
Добавьте параметр маршрута для языка и используйте метод translate в преобразователе маршрутов для перевода текста страницы. Сохраните результат в файле TransferState Angular, чтобы браузер использовал его повторно, а не переводил повторно после гидратации.
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() в provideRouter, чтобы передать разрешенные переводы компоненту страницы в качестве входных данных.
Резольвер работает на вашем сервере сборки, поэтому он переводится с помощью вашего секретного ключа. Задайте ее в качестве переменной окружения MAGIC_TRANSLATE_SECRET_KEY, в которой вы запускаете ng build, например, в качестве секрета CI. Не передавайте его в provideMagicTranslate, потому что эта конфигурация также работает в браузере.
Предпросмотр каждого языка
Укажите 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-файл на каждый язык. Переводы кэшируются, поэтому учитывается только измененный текст, который будет использоваться в последующих сборках.