Sinu Lovable'i rakendus võib olla täielikult tõlgitud ja ikkagi öelda „5 элемент“ või näidata saksa kasutajale hinda kujul „1,234.50“. Põhjus on mitmuse- ja vormindusloogika, mis on kirjutatud inglise keele jaoks ja jäetud sinu komponentidesse. globalize.now on tehisintellektil põhinev lokaliseerimise infrastruktuur, mis hoiab sinu stringid commit'itud kataloogides, ja allolev lahendus viib mitmuse reeglid koodist kataloogidesse.
Miks mitmusevormid lähevad katki, kui Lovable mu rakendust tõlgib?
Sest mitmuse reegel asub komponendis, mitte tõlkes. Tavaline genereeritud muster näeb välja selline:
<p>{count} {count === 1 ? "item" : "items"} in your cart</p>
See rida kodeerib inglise keele grammatika kõvasti koodi. Tõlkija saab sõnu muuta, aga mitte === 1 kontrolli, ja ka sõnajärg on fikseeritud, sest arv on alati esimene. Inglise keeles on kaks vormi. Vene keeles on neli, nii et „1 элемент“, „2 элемента“, „5 элементов“ ja „1,5 элемента“ vajavad kõik erinevaid lõppe.
Kui seadistasid esmalt marsruutimise (vaata kuidas teha Lovable'i rakendus mitmekeelseks), on mitmus järgmine viga, mille kasutajad märkavad, sest midagi ei jookse kokku. Lause lihtsalt on vale.
Samm 1: Kuidas kirjutada mitmus, mida tõlkijad saavad muuta?
Kasuta ICU mitmusesõnumit, et reegel liiguks tõlkesse. Linguiga loovad sellise sõnumi nii komponent Plural kui ka makro plural.
import { Plural } from "@lingui/react/macro";
<p>
<Plural value={count} one="# item in your cart" other="# items in your cart" />
</p>
Stringide jaoks väljaspool JSX-i kasuta makrot core-paketist:
import { plural } from "@lingui/core/macro";
const label = plural(count, { one: "# file", other: "# files" });
# asendatakse arvuga. Lingui dokumentatsiooni järgi kirjutad ainult need vormid, mida sinu lähtekeel vajab, ja other on kohustuslik. Täpsed vasted nagu _0="Your cart is empty" käsitlevad inglise keeles nulli juhtu ilma eraldi haruta.
Lovable'i vaikimisi stackid erinevad seadistuselt, aga mitte selle API poolest, seega töötab sama komponent nii Vite SPA kui ka TanStack Start projektides.
Milline kataloog pärast mitmusevormide eraldamist välja näeb?
Üks sõnum stringi kohta, standardses ICU süntaksis, salvestatud PO failina sinu hoidlas. Tõlkija, olgu inimene või tehisintellekt, lisab vormid, mida tema keel vajab.
msgid "{count, plural, one {# item in your cart} other {# items in your cart}}"
msgstr "{count, plural, one {# товар в корзине} few {# товара в корзине} many {# товаров в корзине} other {# товара в корзине}}"
Vene keele other vorm katab ka murdarvud nagu 1,5, mistõttu see ühtib ainsuse genitiiviga. Kuna kataloog on commit'itud fail, vaatad mitmuse muudatused üle pull requestis nagu mis tahes muu koodi. Süntaksi enda kohta vaata mis on ICU MessageFormat.
Millised keeled vajavad rohkemat kui one ja other?
Unicode CLDR defineerib kuus mitmusekategooriat: zero, one, two, few, many ja other. Iga keel kasutab alamhulka neist ning other on kohustuslik kõikjal.
| Keel | Kasutatavad kategooriad |
|---|---|
| jaapani, hiina | other |
| Inglise | one, other |
| Vene | one, few, many, other |
| Araabia | zero, one, two, few, many, other |
CLDR spetsifikatsioon loetleb ka kõmri keele kõiki kuut kategooriat kasutavana. Seda pole vaja pähe õppida. Vaja on kataloogivormingut, mis laseb igal keelel täita oma vormid, ja ICU sõnumitega PO just seda teebki.
Kuidas takistada Lovable'it ternary-mitmusi uuesti kirjutamast?
Pane reegel sinna, kust Lovable juhiseid loeb. Lovable genereerib komponendid uuesti, kui palud uusi funktsioone, ja ilma reeglita kirjutatud uus funktsioon toob ternary tagasi.
Lisa see oma Knowledge'i või faili 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.
Skill lovable-i18n kirjutab sellised reeglid sinu eest. Kuidas see seda teeb, on kirjeldatud lehel mida Lovable i18n skill teeb. Pärast järgmist genereeritud funktsiooni otsi diffist === 1 ja !== 1, et veenduda, et reegel pidas.
Samm 2: Kuidas vormindada kuupäevi ja valuutat lokaali järgi?
Kasuta Intl koos aktiivse lokaaliga. Linguia objekt i18n pakub samuti i18n.date() ja i18n.number(), aga Intl otse i18n.locale abil kutsumine hoiab vormindusvalikud sinu enda koodis nähtaval.
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>;
}
Samad 1234,5 eurot renderduvad igas lokaalis erineva stringina, oma eraldajate ja sümboli asukohaga. Vormindamine ei konverteeri kunagi raha. Eurodes salvestatud hind jääb igas keeles eurodeks, seega hoia valuutakood andmebaasis iga hinna kõrval.
Samm 3: Kuidas testida enne väljalaset kõiki mitmusekategooriaid?
Küsi brauserilt, millisesse kategooriasse arv kuulub, ja kontrolli seejärel, et igaühel on vorm.
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"]
Lisa üks test iga väljastatava keele kohta: renderda komponent arvuga igast kategooriast ja kontrolli, et ükski ei kukuks tagasi puuduvale vormile. Seejärel loe vene ja araabia lehti kord brauseris läbi. Kataloogist puuduv few ilmneb vale lõpuna, mitte veana.
Mis muutub, kui kasutasin varem runtime widgetit?
Runtime widgetid tõlgivad renderdatud teksti pärast laadimist, mistõttu nad ei näe sinu koodis olevat mitmuse reeglit. See on osa põhjusest, miks tõlgete viimine hoidlasse on oluline. Lovalingo sulgus 2026-08-31; migratsioonijuhend ja võrdluslehekülg katavad, mis muutub, kui kataloogid asuvad sinu hoidlas.
globalize.now'iga ühendad hoidla ühe korra ja koodibaas teisendatakse rakenduses. Pärast seda tõlgivad push-tööd uued kataloogiühikud ning tulemus saabub tõmbepäringuna (pull request). Lovable sünkroonib GitHubist, seega jõuavad mitmusevormid sinu rakendusse samamoodi nagu iga muu muudatus. Seadistus on Lovable'i integratsiooni lehel ja töövoog ilma juhtpaneelita on kirjeldatud juhendis Lovable'i rakenduse lokaliseerimine ilma juhtpaneelita.
globalize.now muudab rakenduse koodis olevad tekstid tõlkeks valmis lokaale failideks ja hoiab neid ajakohasena, kui sa uusi versioone välja lasid.
Proovi globalize.now tasuta