Tài liệu

Pre-Endering

Thành phần <t> và t pipe dịch trong trình duyệt. Nếu bạn khởi chạy trước ứng dụng Angular của mình, thay vào đó bạn có thể dịch các trang của mình tại thời điểm xây dựng. HTML sau đó được dịch trước khi nó được gửi, người dùng không bao giờ chờ đợi bản dịch và các công cụ tìm kiếm lập chỉ mục mọi ngôn ngữ.

Dự án ví dụ cung cấp một trang cho mỗi ngôn ngữ. Mở trang tiếng Đức và kiểm tra lưu lượng mạng: không có yêu cầu nào được thực hiện đối với API Magic Translate.

Dịch trong một trình giải quyết

Thêm tham số tuyến cho ngôn ngữ và dịch văn bản của trang trong trình phân giải tuyến đường bằng phương thức translate. Lưu trữ kết quả trong TransferState của Angular, vì vậy trình duyệt sử dụng lại thay vì dịch lại sau khi hydrat hóa.

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.ts
export const routes: Routes = [
{
path: ':language',
component: Page,
resolve: { translations: translationsResolver }
}
];

Với withComponentInputBinding() trong provideRouter, các bản dịch được giải quyết sẽ đến dưới dạng đầu vào của thành phần trang.

Bắt đầu tất cả các ngôn ngữ

Cho Angular biết ngôn ngữ nào sẽ được sử dụng trước với getPrerenderParams:

// app.routes.server.ts
import { RenderMode, ServerRoute } from '@angular/ssr';
export const serverRoutes: ServerRoute[] = [
{
path: ':language',
renderMode: RenderMode.Prerender,
getPrerenderParams: async () =>
['en', 'de', 'zh'].map((language) => ({ language }))
}
];

ng build bây giờ viết một tệp HTML đã dịch cho mỗi ngôn ngữ. Các bản dịch được lưu trong bộ nhớ cache, vì vậy các bản dựng sau này chỉ trả tiền cho văn bản đã thay đổi.