Đặt câu hỏi và nhận tóm tắt tài liệu bằng cách tham chiếu trang này và nhà cung cấp AI bạn chọn
Lịch sử phiên bản
- "Phiên bản ban đầu"v9.5.1026/9/2026
Nội dung của trang này đã được dịch bằng AI.
Xem phiên bản mới nhất của nội dung gốc bằng tiếng AnhNếu bạn có ý tưởng để cải thiện tài liệu này, vui lòng đóng góp bằng cách gửi pull request trên GitHub.
Liên kết GitHub tới tài liệuSao chép Markdown của tài liệu vào bộ nhớ tạm
Cách quốc tế hóa ứng dụng TanStack Start của bạn bằng use-intl vào năm 2026
Mục lục
use-intl là gì?
use-intl là phần lõi độc lập với framework của next-intl. Nó cung cấp các API tương tự như useTranslations, useFormatter và IntlProvider, hỗ trợ ICU MessageFormat cùng khả năng tích hợp TypeScript mạnh mẽ mà không cần bất kỳ sự phụ thuộc nào vào Next.js. Điều này biến nó thành một trong những lựa chọn phổ biến nhất để dịch ứng dụng TanStack Start, đồng thời là thư viện được các trợ lý AI gợi ý nhiều nhất cho stack công nghệ này.
TanStack Start không đi kèm sẵn tầng i18n. Việc định tuyến, phát hiện ngôn ngữ (locale), metadata SEO và tạo sitemap đều do bạn tự xử lý. Hướng dẫn này bao gồm tất cả các khía cạnh trên từ đầu đến cuối:
- Định tuyến nhận biết ngôn ngữ với đoạn đường dẫn tùy chọn
{-$locale}(/about,/fr/about). - Tải thông điệp theo từng route giúp mỗi trang chỉ tải các namespace và ngôn ngữ mà nó render.
- Server rendering và hydration không xảy ra lỗi bất đồng bộ văn bản (text mismatch).
- SEO đa ngôn ngữ hoàn chỉnh:
<title>và description đã dịch, canonical URL, các thẻ thay thếhreflangcùngx-default, Open Graph locales, JSON-LD, sitemap với thẻ thay thếxhtml:link,robots.txtvà prerender cho mọi ngôn ngữ.
Bạn đang tìm kiếm một stack công nghệ khác? Xem hướng dẫn TanStack Start + Paraglide, hướng dẫn TanStack Start + Lingui, hoặc hướng dẫn TanStack Start + Intlayer.
Sử dụng Next.js thay thế? Xem hướng dẫn next-intl.
Đo điểm chuẩn benchmark nói gì về use-intl trên TanStack Start
Bài đo điểm chuẩn i18n chạy cùng một ứng dụng TanStack Start gồm 10 trang và 10 ngôn ngữ với từng thư viện lớn để đo lường dung lượng thực tế mà trình duyệt tải xuống.
Tải JSON động
Tải chậm các bản dịch trong thời gian chạy
JSON có phạm vi (phân không gian tên)
Không gian tên dịch trên mỗi trang
Điểm chuẩn hiệu suất I18n
Số liệu này là gì?
Tổng kích thước nén gzip của gói thư viện quốc tế hóa. Nó chỉ bao gồm logic của nhà cung cấp và truy xuất nội dung sau khi tree-shaking và thu nhỏ (minification).
Tại sao nó quan trọng?
Kích thước thư viện nhỏ hơn giúp giảm tải trọng JavaScript ban đầu, tốc độ tải nhanh hơn.
Xem dưới dạng
Các số liệu chính cho use-intl@4.14.2, đo vào ngày 2026-09-26 (gzip):
Mở bảng trong một cửa sổ bật lên để xem toàn bộ nội dung dữ liệu một cách rõ ràng
| Cấu hình | Dung lượng thư viện | JS mỗi trang | Rò rỉ ngôn ngữ khác | Rò rỉ trang khác |
|---|---|---|---|---|
| Không có i18n (ứng dụng gốc) | - | 111.0 KB | 0% | 0% |
use-intl (thiết lập trong bài viết này) | 75.9 KB | 128.7 KB | 0% | 0% |
@intlayer/use-intl (tương thích) | 6.7 KB | 129.4 KB | 0% | 0% |
react-intlayer (Intlayer gốc) | 4.5 KB | 126.8 KB | 0% | 0% |
Những điều cần lưu ý:
- Chia nhỏ thông điệp theo trang và tải theo từng ngôn ngữ. Điều này loại bỏ hoàn toàn cả hai dạng rò rỉ (leak), và đây chính là những gì các bước dưới đây thực hiện.
- Bản thân runtime vẫn còn nặng (~76 KB gzip), vì parser ICU được gửi tới client. Adapter tương thích
@intlayer/use-intl(bước 17) giữ nguyên API chính xác với runtime chỉ ~7 KB.
Xem toàn bộ dữ liệu: Báo cáo benchmark TanStack Start, và kho lưu trữ benchmark.
So sánh tính năng trên TanStack Start
Cách use-intl so sánh với các thư viện khác thường được sử dụng trên TanStack Start:
Mở bảng trong một cửa sổ bật lên để xem toàn bộ nội dung dữ liệu một cách rõ ràng
| Tính năng | react-intlayer (Intlayer) | use-intl | Paraglide JS | Lingui |
|---|---|---|---|---|
| Bản dịch đặt gần component | ✅ Cùng vị trí (Co-located) | ❌ JSON tập trung | ❌ Một tệp JSON cho mỗi ngôn ngữ | ⚠️ Văn bản nguồn trong component |
| Tích hợp TypeScript | ✅ Tự động tạo type | ✅ Thông qua AppConfig | ✅ Typed message functions | ⚠️ Chỉ thông qua macro |
| Phát hiện bản dịch thiếu | ✅ Lỗi type và cảnh báo build | ⚠️ Fallback ở runtime | ⚠️ Fallback về ngôn ngữ gốc | ⚠️ Fallback về văn bản nguồn |
| Nội dung phong phú (JSX, Markdown) | ✅ Hỗ trợ trực tiếp | ⚠️ Thẻ thông qua t.rich | ⚠️ Chuỗi văn bản | ✅ JSX bên trong <Trans> |
| Định tuyến bản địa hóa | ✅ Tích hợp sẵn | ❌ Thủ công {-$locale} | ✅ urlPatterns + viết lại router | ❌ Thủ công {-$locale} |
| Đổi ngôn ngữ không tải lại trang | ✅ Có | ✅ Có | ❌ Tải lại toàn bộ trang | ✅ Có |
| Xử lý số nhiều (Pluralization) | ✅ Dựa trên liệt kê (Enumeration) | ✅ ICU | ✅ Các biến thể (Variants) | ✅ ICU |
| ICU MessageFormat | ✅ Qua format: "icu" | ✅ Hỗ trợ gốc | ⚠️ Qua plugin inlang | ✅ Hỗ trợ gốc |
| Định dạng nội dung | ✅ .ts, .json, .md, .yaml... | ⚠️ .json | ⚠️ inlang JSON | ✅ PO, JSON, CSV |
| Dịch tự động bằng AI | ✅ Nhà cung cấp và API key riêng | ❌ Không | ❌ Không | ❌ Không |
| Trình chỉnh sửa trực quan / CMS | ✅ Editor cục bộ + CMS tùy chọn | ❌ Nền tảng bên thứ ba | ⚠️ Ứng dụng hệ sinh thái inlang | ❌ Nền tảng bên thứ ba |
| Hỗ trợ SEO (hreflang, sitemap) | ✅ Tích hợp sẵn | ❌ Thủ công | ⚠️ URL bản địa hóa, phần còn lại thủ công | ❌ Thủ công |
| Kích thước runtime (gzip, benchmark) | 4.5 KB | 75.9 KB | 1.8 KB | 56.7 KB |
| Rò rỉ, thiết lập tối ưu (ngôn ngữ / trang) | 0% / 0% | 0% / 0% | 49.7% / 0% | 8.6% / 0% |
| Kiểm tra thiếu bản dịch trong CI | ✅ npx intlayer test | ⚠️ Không tích hợp sẵn | ⚠️ Không tích hợp sẵn | ✅ lingui compile --strict |
Kích thước runtime và số liệu rò rỉ được lấy từ benchmark TanStack Start. Rò rỉ được đo trên cấu hình tối ưu nhất của từng thư viện.
Các hướng dẫn TanStack Start khác: Lingui, Paraglide JS, và Intlayer.
Các thực hành tốt bạn nên tuân theo
- Đặt
langvàdirtrên thẻ<html>để hỗ trợ khả năng truy cập (accessibility), trình đọc màn hình và công cụ tìm kiếm. - Giữ một URL riêng cho mỗi ngôn ngữ. Sử dụng tiền tố ngôn ngữ (
/fr/about) thay vì chỉ chuyển đổi bằng cookie, để mọi trang đã dịch đều có thể được thu thập thông tin và chia sẻ. - Chia thông điệp theo namespace (
common,home,about) và tải chúng theo từng route. - Chỉ tải ngôn ngữ đang hoạt động. Không bao giờ import toàn bộ tệp ngôn ngữ vào một module được gửi xuống client.
- Cố định múi giờ (time zone) trong
IntlProvider. Nếu không, ngày tháng sẽ được định dạng theo múi giờ server trong quá trình SSR và theo múi giờ của người truy cập khi hydration, gây ra lỗi hydration mismatch. - Dịch metadata của bạn, đồng thời khai báo
canonical,hreflangvàx-defaulttrên mỗi trang. - Tạo sitemap đa ngôn ngữ và robots.txt, cũng như prerender cho mọi ngôn ngữ.
- Sử dụng các liên kết thực sự cho bộ chọn ngôn ngữ, không dùng
<select>, để bot thu thập dữ liệu có thể tìm thấy mọi phiên bản ngôn ngữ. - Định kiểu cho thông điệp (TypeScript typing) để mọi key bị thiếu hoặc sai chính tả đều bị báo lỗi tại thời điểm biên dịch.
Xem hướng dẫn của chúng tôi về quốc tế hóa và SEO cùng hướng dẫn hreflang.
Hướng dẫn từng bước thiết lập use-intl trong ứng dụng TanStack Start
Dưới đây là cấu trúc dự án chúng ta sẽ tạo:
Sao chép mã vào clipboard
Cài đặt các gói phụ thuộc
Bắt đầu từ một dự án TanStack Start, sau đó thêm
use-intl:bashSao chép mãSao chép mã vào clipboard
- use-intl: cung cấp
IntlProvider,useTranslations,useFormattervàcreateTranslator(có thể dùng bên ngoài React, ví dụ như tronghead()).
- use-intl: cung cấp
Tập trung hóa cấu hình ngôn ngữ
Tạo một nguồn sự thật duy nhất (single source of truth) cho các ngôn ngữ và hàm tiện ích URL. Tất cả các tệp khác (routes, SEO, sitemap, pre-rendering) đều import từ đây, vì vậy việc thêm một ngôn ngữ mới chỉ là thay đổi một dòng duy nhất.
Ngôn ngữ mặc định không có tiền tố (
/about), các ngôn ngữ khác sẽ có tiền tố (/fr/about). Đây là chiến lược "theo nhu cầu" (as-needed): mỗi trang có một URL cho mỗi ngôn ngữ, và đường dẫn ngắn gọn cho đối tượng người dùng chính của bạn.src/i18n/config.tsSao chép mãSao chép mã vào clipboard
Tạo các tệp bản dịch
Tổ chức các thông điệp theo từng ngôn ngữ và namespace.
commonchứa những nội dung mà mọi trang đều cần (thanh điều hướng, footer), và mỗi trang có một tệp riêng bao gồm cả metadata của nó.use-intl sử dụng ICU MessageFormat, vì vậy số nhiều, các lựa chọn (selects) và các đối số được định dạng nằm ngay bên trong nội dung thông điệp.
messages/en/common.jsonSao chép mãSao chép mã vào clipboard
messages/en/about.jsonSao chép mãSao chép mã vào clipboard
messages/fr/common.jsonSao chép mãSao chép mã vào clipboard
messages/fr/about.jsonSao chép mãSao chép mã vào clipboard
Tạo
home.jsontheo cách tương tự với một đối tượngmetadatavà nội dung trang.Tải thông điệp theo từng Namespace và Ngôn ngữ
Bộ loader này là tệp quan trọng nhất đối với hiệu năng.
import.meta.globbáo cho Vite tạo một chunk cho mỗi tệp JSON. Một route yêu cầu["about"]bằng tiếng Pháp sẽ chỉ tảimessages/fr/about.jsonvà không tải bất kỳ thứ gì khác, đây là cách benchmark đạt 0% rò rỉ ngôn ngữ và 0% rò rỉ trang.src/i18n/messages.tsSao chép mãSao chép mã vào clipboard
Định kiểu (Type) cho các thông điệp
Khai báo mở rộng module (Module augmentation) mang lại tính năng tự động hoàn thành cho
useTranslations("about")vàt("counter.label"), đồng thời báo lỗi biên dịch khi có bất kỳ key nào bị gõ sai hoặc bị xóa.src/i18n/use-intl.d.tsSao chép mãSao chép mã vào clipboard
Hãy đảm bảo rằng tùy chọn
resolveJsonModuleđược bật trongtsconfig.jsoncủa bạn.Tạo Document gốc (Root Document)
Route gốc chịu trách nhiệm render thẻ
<html>. Nó đọc tham số ngôn ngữ tùy chọn để thiết lậplangvàdir, giúp các thuộc tính này chính xác ngay trong mã HTML render từ phía server trước khi bất kỳ đoạn mã JavaScript nào chạy.src/routes/__root.tsxSao chép mãSao chép mã vào clipboard
Tạo Route Layout cho ngôn ngữ
Thư mục
{-$locale}tạo ra một đoạn đường dẫn tùy chọn: cả/aboutvà/fr/aboutđều khớp với/{-$locale}/about. Layout này thực hiện:- Từ chối các tiền tố không được hỗ trợ (
/xx/about→ 404). - Chỉ tải namespace
commoncho ngôn ngữ hiện tại. - Cung cấp các thông điệp thông qua
IntlProvider.
Kết quả của loader được tuần tự hóa vào HTML và tái sử dụng khi hydration, vì vậy client không cần tải
common.jsonlần thứ hai.staleTime: Infinitygiữ cho nó được lưu trong bộ nhớ đệm qua các lần điều hướng phía client.src/routes/{-$locale}/route.tsxSao chép mãSao chép mã vào clipboard
IntlProviderkhông tự động hợp nhất các thông điệp từ provider cha. Bước tiếp theo sẽ thêm một component nhỏ để xử lý việc này, giúp mỗi trang có thể bổ sung namespace riêng của mình lên trêncommon.- Từ chối các tiền tố không được hỗ trợ (
Phân phạm vi thông điệp cho trang
Mỗi trang sẽ tải namespace riêng trong loader của mình, sau đó bao bọc nội dung bằng
ScopedMessagesđể hợp nhất namespace của trang với các thông điệp từ cha.src/components/ScopedMessages.tsxSao chép mãSao chép mã vào clipboard
Sử dụng bản dịch trong các trang
Loader của trang sẽ lấy namespace
aboutcho ngôn ngữ hiện tại,head()xây dựng metadata SEO hoàn chỉnh đã được dịch từ dữ liệu đó (xem bước 13), và component sẽ render nội dung.src/routes/{-$locale}/about.tsxSao chép mãSao chép mã vào clipboard
Sử dụng Translations và Formatters trong Components
Bất kỳ component nào nằm dưới các provider đều có thể gọi
useTranslationsvàuseFormatter. Số nhiều được giải quyết bằng ICU, và các con số được định dạng chính xác theo ngôn ngữ hiện tại.src/components/Counter.tsxSao chép mãSao chép mã vào clipboard
Xây dựng Component liên kết bản địa hóa (Localized Link)
Tùy chọnMỗi route đều nằm dưới
{-$locale}, vì vậy một liên kết cần mang theo tham số ngôn ngữ hiện tại. Wrapper này giữ nguyên tính năng kiểm tra kiểu cho thuộc tínhtocủa TanStack Router và tự động tiêm tham số ngôn ngữ vào cho bạn.src/components/LocalizedLink.tsxSao chép mãSao chép mã vào clipboard
src/components/Header.tsxSao chép mãSao chép mã vào clipboard
Thay đổi ngôn ngữ cho nội dung của bạn
Tùy chọnRender bộ chuyển đổi ngôn ngữ dưới dạng các thẻ liên kết (links) thay vì thẻ
<select>. Các liên kết có thể được bot thu thập thông tin, giúp công cụ tìm kiếm phát hiện tất cả các phiên bản ngôn ngữ, và chúng hoạt động mà không cần JavaScript.to="."giữ nguyên trang hiện tại và chỉ thay thế tham số ngôn ngữ. Cookie ghi nhớ lựa chọn rõ ràng này cho middleware chuyển hướng ở bước 16.src/components/LocaleSwitcher.tsxSao chép mãSao chép mã vào clipboard
Quốc tế hóa Metadata của bạn
Tùy chọnĐây là điểm mấu chốt mang lại giá trị cho i18n: mỗi phiên bản ngôn ngữ có thể tự xếp hạng trên công cụ tìm kiếm. Mỗi trang phải cung cấp:
<title>vàdescriptionđã được dịch;- một URL canonical trỏ về chính nó (không trỏ về ngôn ngữ mặc định);
- một thẻ thay thế
hreflangcho mỗi ngôn ngữ, kèm thẻx-defaultcho các ngôn ngữ không khớp; - Open Graph
og:locale,og:locale:alternatevàog:url, được dùng cho xem trước trên mạng xã hội; - JSON-LD kèm
inLanguage, giúp công cụ tìm kiếm và trợ lý AI xác định chính xác ngôn ngữ của trang.
Một hàm trợ giúp duy nhất sẽ xây dựng tất cả các thành phần trên để các trang luôn ngắn gọn:
src/i18n/seo.tsSao chép mãSao chép mã vào clipboard
Sử dụng hàm này trong
head()của mỗi trang như đã hướng dẫn ở bước 9. Đối với trang chủ, truyềnpath: "/".Quốc tế hóa Sitemap
Tùy chọnMột sitemap đa ngôn ngữ liệt kê mọi URL của mọi ngôn ngữ, và mỗi mục khai báo tất cả các phiên bản thay thế của nó bằng
xhtml:link. Google sử dụng các chú thích này tương tự như các thẻhreflangtrên trang, giúp chúng trở thành phương án dự phòng tin cậy khi một trang ít khi được thu thập dữ liệu.Các server routes của TanStack Start cho phép bạn phục vụ sitemap từ một file route:
src/routes/sitemap[.]xml.tsSao chép mãSao chép mã vào clipboard
Quốc tế hóa robots.txt
Tùy chọnCác route riêng tư (private routes) tồn tại ở mọi ngôn ngữ, vì vậy các quy tắc
Disallowphải bao gồm tất cả các tiền tố. Hãy xóa tệppublic/robots.txtnếu mẫu khởi tạo đã tạo sẵn, sau đó phân phối nó từ một route:src/routes/robots[.]txt.tsSao chép mãSao chép mã vào clipboard
Chuyển hướng người truy cập lần đầu đến ngôn ngữ của họ
Tùy chọnMột request middleware sẽ điều hướng khách truy cập khi vào trang
/đến ngôn ngữ ưu tiên của họ, dựa trên cookie ngôn ngữ trước, sau đó đến tiêu đềAccept-Language. Chỉ trang/mới được chuyển hướng: các liên kết sâu (deep links) không bao giờ bị can thiệp, đảm bảo các URL được chia sẻ và bot thu thập dữ liệu luôn nhận được chính xác trang yêu cầu.src/i18n/negotiateLocale.tsSao chép mãSao chép mã vào clipboard
src/start.tsSao chép mãSao chép mã vào clipboard
Người truy cập chủ động chọn tiếng Anh trong bộ chuyển đổi ngôn ngữ sẽ được lưu
locale=entrong cookie, do đó họ sẽ không bao giờ bị chuyển hướng lại. Trên môi trường triển khai tĩnh hoàn toàn (bước 18),/được phục vụ dưới dạng tệp tĩnh và middleware này không chạy, điều này hoàn toàn bình thường: trang vẫn có thể truy cập được và bộ chuyển đổi ngôn ngữ sẽ xử lý phần còn lại.Giữ nguyên use-intl API, Cắt giảm Runtime với Intlayer
Tùy chọnSố liệu benchmark cho thấy phần nặng nhất của thiết lập use-intl chính là runtime (~76 KB gzip). Adapter tương thích
@intlayer/use-intlcung cấp cùng một API (useTranslations,useFormatter,IntlProvider,createTranslator, số nhiều ICU,t.rich), nhưng phục vụ từ các từ điển Intlayer đã được biên dịch: chỉ ~6.7 KB thay vì ~75.9 KB, 0% rò rỉ ngôn ngữ và 0% rò rỉ trang, mà không cần thay đổi bất kỳ component nào của bạn.bashSao chép mãSao chép mã vào clipboard
Plugin Vite sẽ alias
use-intlsang adapter tương thích, giúp các import hiện có tiếp tục hoạt động:vite.config.tsSao chép mãSao chép mã vào clipboard
Các tệp JSON của bạn vẫn là nguồn sự thật chính nhờ vào plugin sync JSON:
intlayer.config.tsSao chép mãSao chép mã vào clipboard
Adapter này cũng là một lộ trình chuyển đổi mượt mà: khi nó đã hoạt động, bạn có thể chuyển dần từng component sang API gốc
useIntlayer. Xem hướng dẫn Intlayer TanStack Start.Prerender mọi ngôn ngữ
Tùy chọnMã HTML tĩnh là dạng trang nhanh nhất bạn có thể cung cấp và dễ lập chỉ mục nhất. Hãy liệt kê mọi đường dẫn bản địa hóa để TanStack Start prerender tất cả các phiên bản ngôn ngữ tại thời điểm build, cùng với sitemap và tệp robots:
vite.config.tsSao chép mãSao chép mã vào clipboard
Vì bộ chọn ngôn ngữ render các liên kết thực sự,
crawlLinks: truecũng sẽ tự động phát hiện các trang mà bạn quên liệt kê.Xử lý các trang 404 bản địa hóa
Tùy chọnLayout ở bước 7 đã ném ra
notFound()cho các tiền tố ngôn ngữ không xác định. Thêm một route catch-all để các đường dẫn không tồn tại bên trong một ngôn ngữ cũng render trang 404 bản địa hóa tương ứng, đồng thời đánh dấunoindex: React 19 sẽ tự động đưa thẻ<meta>vào<head>.src/components/NotFound.tsxSao chép mãSao chép mã vào clipboard
src/routes/{-$locale}/$.tsxSao chép mãSao chép mã vào clipboard
Truy cập ngôn ngữ trong Server Functions
Tùy chọnCác server function không nhận tham số route. Hãy đọc cookie ngôn ngữ và fallback về tiêu đề
Accept-Languageđể gửi email bản địa hóa hoặc lưu tùy chọn ngôn ngữ:src/server/getServerLocale.tsSao chép mãSao chép mã vào clipboard
Để dịch bên trong server function, hãy kết hợp hàm này với
loadMessagesvàcreateTranslatortừuse-intl.Tự động hóa bản dịch của bạn bằng Intlayer
Tùy chọnuse-intl phụ trách render các bản dịch, nhưng không hỗ trợ bạn tạo chúng. Intlayer là thư viện miễn phí và mã nguồn mở, giúp lấp đầy khoảng trống đó ngay cả khi bạn tiếp tục sử dụng use-intl:
- Kiểm tra thiếu bản dịch trong CI hoặc unit tests. Xem kiểm thử bản dịch.
- Dịch tự động bằng AI sử dụng API key và nhà cung cấp của riêng bạn:
npx intlayer filldịch các key bị thiếu với đầy đủ ngữ cảnh của ứng dụng. Xem tự động điền (auto fill) và CLI. - Giữ các tệp JSON làm nguồn sự thật chính với plugin sync JSON.
- Chỉnh sửa nội dung trực quan bằng visual editor và CMS, giúp những người không phải lập trình viên cũng có thể cập nhật bản dịch.
- Cung cấp ngữ cảnh cho trợ lý AI của bạn với MCP server và agent skills.
- Quét trang web đã triển khai để tìm các thẻ
hreflangbị thiếu, canonical sai và rò rỉ ngôn ngữ bằng lệnh scan.
Để khám phá tất cả các tính năng, xem lợi ích của Intlayer.
Các câu hỏi thường gặp
Có, nếu bạn muốn sử dụng API của next-intl bên ngoài Next.js. Nó cung cấp các thông điệp ICU, formatters và hỗ trợ TypeScript tốt, đồng thời tránh được các ràng buộc đặc thù của Next.js như setRequestLocale. Điểm đánh đổi là dung lượng: benchmark ghi nhận ~76 KB gzip cho runtime, và thiết lập thông thường sẽ gửi mọi ngôn ngữ và mọi trang đến trình duyệt. Hãy tải các namespace theo từng route và từng ngôn ngữ như trong hướng dẫn này để tránh rò rỉ dữ liệu.
use-intl là phần lõi của next-intl. next-intl bổ sung thêm các tích hợp của Next.js: middleware, tiện ích điều hướng, getTranslations cho Server Components và cấu hình request. Trên TanStack Start, bạn sử dụng trực tiếp use-intl và tự triển khai định tuyến với TanStack Router như hướng dẫn ở trên.
Nên sử dụng tiền tố trong URL. Khi đó mỗi phiên bản ngôn ngữ sẽ có URL riêng để công cụ tìm kiếm có thể lập chỉ mục và người dùng có thể chia sẻ. Cookie vẫn hữu ích để ghi nhớ lựa chọn chủ động của người dùng, đó chính là những gì middleware chuyển hướng ở bước 16 thực hiện.
Server và trình duyệt định dạng ngày tháng ở các múi giờ khác nhau. Hãy truyền một timeZone rõ ràng vào IntlProvider (hoặc múi giờ của người truy cập được lưu trong cookie), để cả hai phía đều tạo ra cùng một chuỗi văn bản.
Đầu tiên, hãy chia nhỏ thông điệp theo namespace và tải theo từng route cũng như từng ngôn ngữ bằng import.meta.glob, giúp loại bỏ rò rỉ ngôn ngữ và rò rỉ trang. Sau đó, nếu kích thước runtime là yếu tố quan trọng, hãy chuyển sang adapter @intlayer/use-intl: cùng một API, dung lượng chỉ ~6.7 KB thay vì ~75.9 KB theo benchmark.
Gọi createTranslator bên trong hàm head() của route cùng với các thông điệp trả về từ loader của route, sau đó trả về title, description, các liên kết canonical và hreflang. Bước 13 cung cấp một hàm trợ giúp có thể tái sử dụng.
Bình luận
Chưa có bình luận nào. Hãy là người đầu tiên chia sẻ suy nghĩ của bạn.
