Jūsu Lovable lietotne var būt pilnībā iztulkota un tomēr vācu lietotājam rādīt "5 элемент" vai cenu kā "1,234.50". Iemesls ir daudzskaitļa un formātu loģika, kas rakstīta angļu valodai un palikusi jūsu komponentos. globalize.now ir ar mākslīgo intelektu darbināta lokalizācijas infrastruktūra, kas glabā jūsu tekstus iekomitotos katalogos, un tālāk aprakstītais risinājums ievieto daudzskaitļa noteikumus šajos katalogos, nevis jūsu kodā.

Kāpēc daudzskaitļa formas sabojājas, kad Lovable tulko manu lietotni?

Tāpēc, ka daudzskaitļa noteikums atrodas komponentā, nevis tulkojumā. Bieži sastopams ģenerēts paraugs izskatās šādi:

<p>{count} {count === 1 ? "item" : "items"} in your cart</p>

Šī rindiņa burtiski ieraksta angļu valodas gramatiku. Tulkotājs var mainīt vārdus, bet ne === 1 pārbaudi, un arī vārdu secība ir fiksēta — skaitlis vienmēr ir pirmais. Angļu valodai ir divas formas. Krievu valodai — četras, tāpēc "1 элемент", "2 элемента", "5 элементов" un "1,5 элемента" prasa dažādas galotnes.

Ja vispirms esat iestatījis maršrutēšanu (skatiet kā padarīt Lovable lietotni daudzvalodu), daudzskaitļa formas ir nākamā kļūda, ko pamana lietotāji, jo nekas neavarē. Teikums vienkārši ir nepareizs.

1. solis: kā uzrakstīt daudzskaitļa formu, ko tulkotāji var mainīt?

Izmantojiet ICU plural ziņojumu, lai noteikums pārceltos uz tulkojumu. Ar Lingui to veido gan Plural komponents, gan plural makross.

import { Plural } from "@lingui/react/macro";

<p>
  <Plural value={count} one="# item in your cart" other="# items in your cart" />
</p>

Tekstiem ārpus JSX izmantojiet makrosu no core pakotnes:

import { plural } from "@lingui/core/macro";

const label = plural(count, { one: "# file", other: "# files" });

# tiek aizstāts ar skaitli. Saskaņā ar Lingui dokumentāciju jūs norādāt tikai tās formas, kas nepieciešamas jūsu avotvalodai, un other ir obligāts. Precīzas atbilstības, piemēram, _0="Your cart is empty", angļu valodā apstrādā nulles gadījumu bez atsevišķa atzara.

Lovable noklusējuma steki atšķiras pēc iestatīšanas, bet ne pēc šī API, tāpēc viens un tas pats komponents darbojas gan Vite SPA, gan TanStack Start projektos.

Kā izskatās katalogs pēc daudzskaitļa formu izvilkšanas?

Viens ziņojums katram tekstam, standarta ICU sintaksē, glabāts kā PO fails jūsu repozitorijā. Tulkotājs — cilvēks vai MI — nodrošina formas, kas nepieciešamas viņa valodai.

msgid "{count, plural, one {# item in your cart} other {# items in your cart}}"
msgstr "{count, plural, one {# товар в корзине} few {# товара в корзине} many {# товаров в корзине} other {# товара в корзине}}"

Krievu valodas other forma aptver daļskaitļus, piemēram, 1,5, tāpēc tā sakrīt ar ģenitīva vienskaitli. Tā kā katalogs ir iekomitots fails, daudzskaitļa izmaiņas pārskatāt pull request kā jebkuru citu kodu. Par pašu sintaksi skatiet kas ir ICU MessageFormat.

Kurām valodām nepieciešams vairāk par one un other?

Unicode CLDR definē sešas daudzskaitļa kategorijas: zero, one, two, few, many un other. Katra valoda izmanto kādu apakškopu, un other ir obligāta visur.

ValodaIzmantotās kategorijas
Japāņu, ķīniešuother
Angļuone, other
Krievuone, few, many, other
Arābuzero, one, two, few, many, other

CLDR specifikācija norāda, ka arī velsiešu valoda izmanto visas sešas. Jums to nav jāiekaļ no galvas. Jums vajadzīgs katalogu formāts, kas ļauj katrai valodai aizpildīt savas formas, un PO ar ICU ziņojumiem tieši tāds ir.

Kā panākt, lai Lovable atkal neraksta ternārās daudzskaitļa izteiksmes?

Ievietojiet noteikumu tur, kur Lovable lasa norādījumus. Lovable pārģenerē komponentus, kad pieprasāt jaunas funkcijas, un jauna funkcija, kas uzrakstīta bez noteikuma, atgriež ternāro izteiksmi.

Pievienojiet šo savam Knowledge vai AGENTS.md:

Never hand-build plurals or number formats. Use the Lingui Plural component
or plural() macro for every count. Use Intl with the active locale for every
date, number and price.

Skills lovable-i18n šādus noteikumus uzraksta jūsu vietā. Kā tas notiek, aprakstīts rakstā ko dara Lovable i18n skills. Pēc nākamās ģenerētās funkcijas izmaiņu pārskatā (diff) meklējiet === 1 un !== 1, lai pārliecinātos, ka noteikums ir ievērots.

2. solis: kā formatēt datumus un valūtu pēc lokalizācijas?

Izmantojiet Intl ar aktīvo lokalizāciju. Lingui objekts i18n piedāvā arī i18n.date() un i18n.number(), taču tieši izsaucot Intl ar i18n.locale, formatēšanas opcijas paliek redzamas jūsu pašu kodā.

import { useLingui } from "@lingui/react";

export function Price({ amount, currency }: { amount: number; currency: string }) {
  const { i18n } = useLingui();
  return (
    <span>
      {new Intl.NumberFormat(i18n.locale, { style: "currency", currency }).format(amount)}
    </span>
  );
}

export function OrderDate({ date }: { date: Date }) {
  const { i18n } = useLingui();
  return <time>{new Intl.DateTimeFormat(i18n.locale, { dateStyle: "long" }).format(date)}</time>;
}

Tie paši 1234,5 eiro katrā lokalizācijā tiek attēloti kā atšķirīga virkne ar saviem atdalītājiem un simbola novietojumu. Formatēšana nekad nepārrēķina naudu. Cena, kas glabāta eiro, katrā valodā paliek eiro, tāpēc glabājiet valūtas kodu blakus katrai cenai savā datubāzē.

3. solis: kā pirms izlaišanas pārbaudīt katru daudzskaitļa kategoriju?

Pajautājiet pārlūkam, kurā kategorijā iekrīt skaitlis, un pārbaudiet, vai katrai ir forma.

const ru = new Intl.PluralRules("ru");
[1, 2, 5, 21, 1.5].map((n) => ru.select(n));
// ["one", "few", "many", "one", "other"]

const ar = new Intl.PluralRules("ar");
[0, 1, 2, 3, 11, 100].map((n) => ar.select(n));
// ["zero", "one", "two", "few", "many", "other"]

Pievienojiet vienu testu katrai valodai, ko izlaižat: renderējiet komponentu ar skaitli no katras kategorijas un pārbaudiet, ka neviens neatgriežas pie trūkstošas formas. Tad vienreiz izlasiet krievu un arābu lapas pārlūkā. Trūkstošs few katalogā izpaužas kā nepareiza galotne, nevis kā kļūda.

Kas mainās, ja iepriekš izmantoju runtime logrīku?

Runtime logrīki tulko renderēto tekstu pēc ielādes, tāpēc tie neredz daudzskaitļa noteikumu jūsu kodā. Tas ir viens no iemesliem, kāpēc tulkojumu pārcelšana uz repozitoriju ir svarīga. Lovalingo darbību beidza 2026-08-31; migrācijas ceļvedis un salīdzinājuma lapa apraksta, kas mainās, kad katalogi atrodas jūsu repozitorijā.

Ar globalize.now jūs vienreiz pieslēdzat repozitoriju, un koda bāze tiek konvertēta pašā lietotnē. Pēc tam push uzdevumi iztulko jaunās kataloga vienības, un rezultāts tiek piegādāts kā izmaiņu pieprasījums (pull request). Lovable sinhronizējas no GitHub, tāpēc daudzskaitļa formas jūsu lietotnē nonāk tāpat kā jebkuras citas izmaiņas. Iestatīšana aprakstīta Lovable integrācijas lapā, bet darbplūsma bez informācijas paneļa — rakstā kā lokalizēt Lovable lietotni bez informācijas paneļa.

globalize.now pārvērš burtiski ierakstītus lietotnes tekstus tulkošanai gatavos lokalizācijas failos un pastāvīgi tos atjaunina līdz ar katru jauno versiju.

Izmēģiniet globalize.now bez maksas