انتقل إلى المحتوى

Орчуулга

Долоон хэл, гурван давхарга, нэг үүсгэгч. frontend/lib/i18n ба frontend/scripts/i18n-translate.mjs-ийн кодоос уншиж бичигдсэн.

Баримтын төв


Долоон хэл

Монгол + НҮБ-ын албан ёсны зургаан хэл (араб, хятад, англи, франц, орос, испани). Монгол нь эх сурвалж, бусад нь орчуулга.

Жагсаалт нь дур зоргоор биш, олон улсын байгууллагуудын хэрэглэдэг жишигт тулгуурласан — тиймээс найм дахь хэл нэмэх нь файл нэмэх биш, бодлого өөрчлөх ажил.

Бүтээгдэхүүний танилцуулга долоон хэлээр бүрэн байдаг. Техникийн баримт бүр долоон хувилбартай байх албагүй.

Гурван давхарга

Давхарга Хаана Хэрхэн шалгагдах
Цөмийн толь lib/i18n/core.ts Компиляцын үед — TranslationKey
Аппын толь registerDictionary(appId, …) Ажиллах үед — энгийн мөр
Overlay lib/i18n/locales/<хэл>/ Дутуу түлхүүр англи руу унана

Цөмийн түлхүүрийн үсгийн алдаа нь build алдаа хэвээр. Аппын түлхүүр нь мөр — өөр репод амьдардаг апп энэ репогийн мэддэггүй үгсийг өгдөг тул өөр байх аргагүй. t() хоёуланг нь авна.

Өмнө нь толь нь index.tsx дотор 25 import, 25 spread-ээс баригддаг нэг объект байсан ба хажууд нь тус бүр ~1381 мөртэй таван overlay файл байв. Апп нэмэх нь тэднийг бүгдийг засахыг шаарддаг байсан — хүн бүр дундын толь хүссэндээ биш, аппын үгс очих өөр газар байгаагүйд.

Бүртгэлийн дараалал хамаагүй: t() нь хайлт бүрд бүртгэлээс уншдаг, нэгтгэсэн объектыг барьж авдаггүй.

Үүсгэгч

npm run i18n:translate -- --locale fr           # юу өөрчлөгдөхийг харуулна
npm run i18n:translate -- --locale fr --write   # locales/fr.ts бичнэ

Платформ Gemini-тэй аль хэдийн ярьдаг (copilot, орчуулгын панель); энэ нь тэр л загварыг интерфэйс дээрээ, хүсэлт бүрд биш build-ийн үед хэрэглэж байгаа хэрэг. Хүсэлт бүрд орчуулах нь дэлгэц бүр дээр латенси, мөнгө төлж, зочилсон болгонд арай өөр үг авна гэсэн үг.

Гурван дүрэм:

  1. Хэзээ ч дарж бичихгүй. Зөвхөн overlay-д дутуу түлхүүрүүд илгээгдэнэ — хүний засвар үүрд үлдэнэ, дахин ажиллуулах нь үргэлж аюулгүй.
  2. Placeholder зохиохгүй. {name} зэрэг нь гаралт дээр шалгагдаж, алдсан эсвэл нэрийг нь өөрчилсөн орчуулга хаягдана — таарахаа больсон placeholder нь хэрэглэгчид шууд хаалт болж харагдана.
  3. Техникийн нэрсэд хүрэхгүй — tenant, RBAC, OAuth2, eID, SKU, e-Barimt зэрэг нь бүтээгдэхүүний үгсийн сан, зохиол биш.

Гаралт нь ноорог. Интерфэйсийн машин орчуулга нь хянахад хангалттай сайн, уншаагүйгээр гаргахад тохиромжгүй байх хангалттай олон удаа буруу байдаг — overlay бүрийн толгойд ч тэгж бичигдсэн.

Хуудасны хэл

Monгол агуулгатай хуудсыг <html lang="en"> гэж зарлавал Chrome түүнийг автоматаар «орчуулж», брэндийн нэрийг ч өөрчилнө. Хэлээ зөв зарлана.

Аппын толь route-оор бүртгэгдэнэ

2026-09-12-оос аппын толь (lib/i18n/apps/<app>.ts) тэр үгсийг уншдаг route-ийн layout.tsx-ээс import хийгдэнэ — lib/i18n/index.tsx-ээс биш:

// app/documents/layout.tsx
import "@/lib/i18n/apps/documents";

Модуль дээд түвшиндээ registerDictionary(appId, …) дууддаг тул layout-ийн модуль үнэлэгдэхэд — route-ийн chunk ачаалагдаж, render-ээс өмнө — толь бүртгэгдэнэ. Ингэснээр нэвтрээгүй landing бүх аппын толийг чирэхгүй (JS 416 → 255 KB).

  • lib/i18n/registry.ts нь аппын эх (mn/en, route-оос) ба overlay (бусад хэл, хэл сонгоход татагдах bundle-аас) хоёрыг тусад нь барьж, аль нь түрүүлж ирсэн ч нийлүүлнэ; бүртгэл бүр version-ийг өсгөж provider дахин зурна.
  • Аль толь аль layout-оос бүртгэгддэгийн жагсаалт lib/i18n/apps/index.ts-ийн толгойд. Шинэ апп нэмэхэд тэнд мөр нэмж, route-ийнхээ layout-оос import хий.
  • tests/first-load-weight.test.ts нь storefront-оос бусад аппын толийг index.tsx эсвэл core.ts-ээс import хийвэл build-ийг унагана.
  • Distribution-ий апп яг ийм байдлаар өөрийн layout-оос бүртгэнэ — цөмийн файлд хүрэхгүй.

Native клиентийн мөр

Native бүрхүүлийн нэвтрэх дэлгэцийн мөр вэб толиос үүсгэгддэг, гараар бичигддэггүй:

cd frontend && BRAND_NAME="Gerege Nexus" npm run i18n:export-native
# эсвэл брэнд тус бүрд: BRAND_NAME="<брэнд>" native-apps/sync-i18n.sh

Экспортлогч (scripts/export-native-auth-i18n.mjs) lib/i18n/addons/auth.ts (mn, en) ба locales/<хэл>/core.ts-ээс уншиж native-apps/generated-i18n/<хэл>.json, Android res/values*/auth.xml, iOS Login.xcstrings-ийг бичнэ. {brand} нь экспортын мөчид задрах тул BRAND_NAME заавал.

Дүрэм: auth.ts эсвэл overlay-ийн auth.* түлхүүрийг өөрчилсөн PR экспортын гаралтыг хамт commit хийнэ. native-apps/generated-i18n нь экспортлогчийн гаралттай таарч буйг CI-д шалгах алхам native клиентийн ажлаар нэмэгдэж байна; тэр хүртэл шалгагч нь review.