pyssg đang trong giai đoạn phát triển (chưa 1.0) - API, cấu hình và theme có thể thay đổi.
Thêm quốc tế hóa (i18n)

1 phút đọc

Thêm quốc tế hóa (i18n)

Mục tiêu: phục vụ cùng một trang ở nhiều ngôn ngữ, kèm bộ chuyển ngôn ngữ và thẻ hreflang đúng, mà không bao giờ liên kết tới một bản dịch thiếu.

1. Thêm plugin

Plugin i18n được tích hợp sẵn. Thêm nó vào một preset qua extra_plugins:

from __future__ import annotations

from pyssg.presets import docs
from pyssg.plugins import i18n

config = docs(
    site={"title": "My Docs"},
    base_url="https://example.com",
    extra_plugins=[i18n(default_locale="en", locales=["en", "vi"])],
)

2. Sắp xếp nội dung mỗi locale một thư mục

Locale là thư mục cấp cao nhất dưới content/ - không có cách ghi đè bằng frontmatter:

content/
  en/index.md          ->  /            (locale mặc định, phục vụ ở gốc)
  en/guide/intro.md    ->  /guide/intro/
  vi/index.md          ->  /vi/
  vi/guide/intro.md    ->  /vi/guide/intro/

Các quy tắc được giữ đơn giản có chủ đích:

  • Locale mặc định được phục vụ ở gốc trang (tiền tố bị lược bỏ); mọi locale khác giữ tiền tố /<locale>/ của nó.
  • Nội dung nằm ngoài mọi thư mục locale sẽ không sinh trang.
  • Trang chỉ được sinh cho những locale thực sự có file - không có cơ chế dự phòng nội dung, nên bộ chuyển ngôn ngữ không bao giờ trỏ tới bản dịch thiếu.

3. Dùng các biến template

Plugin cấp cho mỗi trang ba biến template bổ sung:

  • lang - locale của trang hiện tại.
  • translations - chính trang đó ở các locale khác, mỗi mục {lang, url, title}.
  • languages - tất cả locale đã cấu hình.

Các theme tích hợp docsblog đã dùng chúng để render <html lang>, các bản thay thế hreflang và một bộ chuyển ở header, nên với bố cục trên bạn có ngay một trang song ngữ chạy được.

4. Build và kiểm tra

pyssg --site my-site build

Trang tiếng Anh xuất hiện ở gốc và trang tiếng Việt nằm dưới /vi/. Xem examples/docs/ trong kho mã để có một ví dụ song ngữ hoàn chỉnh.