ñéöķàþî-î18ñ
ñéöķàþî-î18ñ ţŕàñšļàţéš à Ŕéàçţ àþþ ƒŕöḿ ţĥé ĴŠẊ ýöü àļŕéàđý ŵŕîţé. À ƃüîļđ þļüĝîñ ƒîñđš ţĥé üšéŕ-ṽîšîƃļé ţéẋţ, ĝîṽéš éàçĥ šţŕîñĝ à šţàƃļé ķéý, àñđ ŵŕîţéš à çàţàļöĝ ţĥàţ ķàþî öŕ ýöüŕ ţŕàñšļàţöŕš ƒîļļ, ŵîţĥ ñö ŵŕàþþéŕ çàļļš àñđ ñö ķéýš îñ ýöüŕ šöüŕçé.
Ţĥé þŕöƃļéḿ ŵîţĥ ţŕàđîţîöñàļ î18ñ
Ţŕàñšļàţîñĝ à Ŕéàçţ àþþ üšüàļļý ḿéàñš ŵŕàþþîñĝ éṽéŕý üšéŕ-ṽîšîƃļé šţŕîñĝ îñ à ţŕàñšļàţîöñ çàļļ:
// The traditional way: call-based (a translation function wraps every string)
<h1>{t("welcome.heading")}</h1>
<p>{t("welcome.description")}</p>
<button>{t("welcome.getStarted")}</button>
Ñéŵéŕ ļîƃŕàŕîéš đŕöþ ţĥé ķéý ƃüţ ķééþ ţĥé ŵŕàþþéŕ: ýöü ḿàŕķ éṽéŕý ţŕàñšļàţàƃļé ƒŕàĝḿéñţ ŵîţĥ àñ éẋþļîçîţ ĴŠẊ éļéḿéñţ îñšţéàđ.
// The traditional way: element-based (a marker component wraps every fragment)
<h1><T desc="welcome heading">Welcome</T></h1>
<p><T>Ship your product in every language your users speak.</T></p>
<button><T>Get started</T></button>
Éîţĥéŕ ŵàý, ýöü ŵŕîţé ţĥé ÜÎ àñđ ţĥéñ àññöţàţé îţ. Ţĥé àññöţàţîöñ çöšţš ýöü ŵöŕķ îñ ţĥŕéé þļàçéš:
- Ŵŕîţîñĝ ţĥé ŵŕàþþéŕ. Éṽéŕý šţŕîñĝ ĝéţš à ţŕàñšļàţîöñ çàļļ öŕ à ḿàŕķéŕ éļéḿéñţ. Éṽéŕý þŕöþ ţĥàţ ḿîĝĥţ ƃé ţŕàñšļàţéđ ƃéçöḿéš àñ éẋþŕéššîöñ öŕ à ḿàŕķéŕ çöḿþöñéñţ îñšţéàđ öƒ à þļàîñ ļîţéŕàļ. Ţĥé éļéḿéñţ-ƃàšéđ šţýļé ţŕàđéš ţĥé ķéý ƒöŕ éẋţŕà ĴŠẊ, àñđ ţĥé ŵŕàþþîñĝ šţàýš.
- Îñṽéñţîñĝ àñđ ḿàîñţàîñîñĝ ķéýš. Ýöü þîçķ
welcome.heading,welcome.descriptionàñđwelcome.getStarted, ŕéñàḿé ţĥéḿ ŵĥéñ ţĥé çöþý çĥàñĝéš, ĥüñţ ƒöŕ çöļļîšîöñš àñđ ŕéṽîéŵ ţĥéḿ îñ đš. Éļéḿéñţ-ƃàšéđ ļîƃŕàŕîéš ŕéþļàçé ţĥé ķéýš ŵîţĥdesc/contextþŕöþš ţĥàţ ýöü šţîļļ ŵŕîţé àñđ ķééþ àççüŕàţé. - Ķééþîñĝ ţĥéḿ îñ šýñç. Ţĥé ţŕàñšļàţîöñ ƒîļé, ţĥé çàļļ šîţéš àñđ ţĥé đöçš đŕîƒţ àþàŕţ. Ŵĥéñ ţĥéý đö, ţĥé àþþ šĥöŵš
welcome.headingţö ţĥé üšéŕ, öŕ ŕéñđéŕš ţĥé ŵŕöñĝ ţéẋţ.
Ýöü þàý ţĥàţ çöšţ öñ đàý öñé, àĝàîñ ŵĥéñ à ñéŵ éñĝîñééŕ ĵöîñš, àñđ éṽéŕý ţîḿé à đéšîĝñéŕ çĥàñĝéš à ŵöŕđ öƒ çöþý.
Ŵĥàţ ñéöķàþî-î18ñ đöéš đéŕéñţļý
ñéöķàþî-î18ñ éẋţŕàçţš ţŕàñšļàţàƃļé çöñţéñţ ƒŕöḿ þļàîñ ĴŠẊ:
// The neokapi-i18n way
<h1>Welcome</h1>
<p>Ship your product in every language your users speak.</p>
<button>Get started</button>
Àţ ƃüîļđ ţîḿé ţĥé þļüĝîñ ŵàļķš ýöüŕ ĴŠẊ, ķéýš éàçĥ šţŕîñĝ ƃý îţš ţéẋţ àñđ ţàĝ, àñđ ŵŕîţéš ţĥé çàţàļöĝ.
Àţ ƃüîļđ ţîḿé à Ṽîţé, ŵéƃþàçķ, Ŕöļļüþ öŕ éšƃüîļđ þļüĝîñ:
- Ŵàļķš ýöüŕ ĴŠẊ àñđ ƒîñđš éṽéŕýţĥîñĝ ţĥàţ šĥöüļđ ƃé ţŕàñšļàţéđ: ĥéàđîñĝš, ƃüţţöñš, àţţŕîƃüţé ṽàļüéš, àñđ šö öñ.
- Çöḿþüţéš à šţàƃļé ĥàšĥ ƒŕöḿ ţĥé šöüŕçé ţéẋţ àñđ ţĥé éļéḿéñţ'š öŵñ ţàĝ.
- Ŵŕîţéš à ĶƂƑ đîŕéçţöŕý àŕçĥîṽé, ţĥé éẋçĥàñĝé ƒöŕḿàţ ýöüŕ ţŕàñšļàţöŕš öŕ àñ ÀÎ ŕéàđ.
- Ŕéŵŕîţéš ţĥé ĴŠẊ ţö ļööķ üþ ţĥé ĥàšĥ àţ ŕéñđéŕ ţîḿé, öŕ, îñ îñļîñé ḿöđé, ŵŕîţéš ţĥé ţŕàñšļàţéđ ţéẋţ îñţö ţĥé ƃüîļđ šö ñöţĥîñĝ îš ļööķéđ üþ àţ ŕüñţîḿé.
Ţĥé šöüŕçé ţéẋţ îš ţĥé îđéñţîƒîéŕ. Ŵĥéñ ţĥé çöþý çĥàñĝéš, ýöü çĥàñĝé ţĥé ĴŠẊ, àñđ ţĥéŕé îš ñö ķéý ţö ŕéñàḿé öŕ ţàƃļé ţö üþđàţé. Éẋîšţîñĝ ţŕàñšļàţîöñš šţîļļ ŕéšöļṽé. À ñéŵ šţŕîñĝ ĝéţš à ƒŕéšĥ ĥàšĥ, àñđ ţĥé ñéẋţ éẋţŕàçţ þîçķš îţ üþ.
Ŵĥàţ ýöü šţöþ đöîñĝ
- Ŵŕàþþîñĝ ñöŕḿàļ ĴŠẊ îñ
t().<h1>Welcome</h1>îš ţŕàñšļàţàƃļé àš ŵŕîţţéñ, àñđ šö àŕé éļéḿéñţ çĥîļđŕéñ àñđ ţŕàñšļàţàƃļé þŕöþš öñ ýöüŕ öŵñ çöḿþöñéñţš. - Îñṽéñţîñĝ ķéýš. Ţĥé ĥàšĥ öƒ ţĥé šöüŕçé ţéẋţ àñđ ţĥé éļéḿéñţ'š öŵñ ţàĝ îš ţĥé ķéý. Ţĥé ŕüñţîḿé đîçţ ŕéàđš
{ "aB3": "Bienvenue", ... }, ŵĥéŕé à ķéý-ƃàšéđ ļîƃŕàŕý ĥàš{ "welcome.heading": "Bienvenue", ... }. - Ļöšîñĝ ţŕàñšļàţîöñš îñ à ŕéƒàçţöŕ. Àñçéšţöŕš àŕé ñöţ þàŕţ öƒ ţĥé ķéý. Ýöü çàñ ŵŕàþ à
<p>îñ à ñéŵ<div>, ḿöṽé îţ îñţö à<Card>öŕ ŕéšţŕüçţüŕé ţĥé þàĝé àŕöüñđ îţ, àñđ îţš ķéý àñđ ţŕàñšļàţîöñš šţàý. À ķéý çĥàñĝéš ŵĥéñ ţĥé ŵöŕđš çĥàñĝé, ŵĥîçĥ îš ŵĥéñ à ţŕàñšļàţöŕ šĥöüļđ ļööķ àĝàîñ. - Éđîţîñĝ ţŕàñšļàţîöñ ƒîļéš. Đéṽéļöþéŕš ŵŕîţé ĴŠẊ àñđ ţŕàñšļàţöŕš ŵŕîţé ţŕàñšļàţîöñš. Ţĥé
.kbf.jsonàŕçĥîṽé îš ţĥé çöñţŕàçţ ƃéţŵééñ ţĥéḿ. - Ḿàŕķîñĝ šţŕîñĝš, éẋçéþţ îñ ĴŠ đàţà.
t()îš ţĥé öñé éẋþļîçîţ ḿàŕķéŕ, ƒöŕ šţŕîñĝš ţĥàţ ƃéļöñĝ îñ ĴŠ đàţà: ƃüţţöñ-ļàƃéļ àŕŕàýš, éŕŕöŕ ḿéššàĝéš ŕéţüŕñéđ ƒŕöḿ ŕéđüçéŕš, ŕ郚.
Ŵĥàţ'š îñçļüđéđ
- Àüţöḿàţîç ĴŠẊ éẋţŕàçţîöñ ŵîţĥ Ŵ3Ç ĤŢḾĻ5 ţŕàñšļàţàƃîļîţý ŕüļéš: ĥéàđîñĝš, þàŕàĝŕàþĥš, ƃüţţöñš, ļàƃéļš, öþţîöñš,
<span>,<strong>,<em>, ļîñķš, ÀŔÎÀ-ƃàçķéđ àţţŕîƃüţéš. - Đéƒàüļţš ƒöŕ îđîöḿàţîç Ŕéàçţ:
<div>Label</div>,<section>...</section>, àñđ üñḿàþþéđ çöḿþöñéñţš ļîķé<TabsTrigger>General</TabsTrigger>éẋţŕàçţ ŵîţĥ à ŵàŕñîñĝ. - Ţŕàñšļàţàƃļé þŕöþš: ţĥé ĤŢḾĻ àñđ ÀŔÎÀ šéţ (
alt,title,placeholder,aria-label, …) öñ àñý éļéḿéñţ, þļüš Ŕéàçţ'š þŕöþ-ñàḿé çöñṽéñţîöñš (subtitle,description,label,helpText, …) öñ ýöüŕ öŵñ çöḿþöñéñţš.<PageHeader title="Content Memory" />éẋţŕàçţš àš ŵŕîţţéñ. <Plural>/<Select>àüţĥöŕîñĝ çöḿþöñéñţš ŵîţĥ ÇĻĐŔ þļüŕàļ ŕüļéš ţĥŕöüĝĥIntl.PluralRules, àñđ ÎÇÜ ñüḿƃéŕ, đàţé àñđ ţîḿé ƒöŕḿàţţîñĝ ţĥŕöüĝĥIntl. À ţŕàñšļàţöŕ çàñ ŵŕîţé{n, number}öŕ{d, date, long}îñţö à ţàŕĝéţ ŵîţĥ ñö çöđé çĥàñĝé.- Ţĥé
t()éšçàþé ĥàţçĥ ƒöŕ ţĥé ƒéŵ šţŕîñĝš ţĥàţ ƃéļöñĝ îñ đàţà. - Ţŵö ƃüîļđ ḿöđéš: îñļîñé (ñö ŕüñţîḿé, öñé ƃüîļđ þéŕ ļöçàļé) àñđ ŕüñţîḿé (öñé ƃüñđļé, đîçţ ļöàđéđ ÖŢÀ).
- Îñ-çöñţéẋţ ŕéṽîéŵ öñ ţĥé ŕüññîñĝ àþþ: ÀĻŢ+çļîçķ àñý šţŕîñĝ ţö šéé îţš šöüŕçé, éđîţ îţš ţŕàñšļàţîöñ àñđ ŵŕîţé îţ ƃàçķ ţö ţĥé
.kbf.json. Ţéŕḿš àñđ çĥéçķ ƒîñđîñĝš àþþéàŕ öñ ţĥé ļîṽé ţéẋţ. - Àñ éẋçĥàñĝé ƒöŕḿàţ, ĶƂƑ (šéé Ç-01), ţĥàţ çàŕŕîéš šţŕüçţüŕàļ çöñţéẋţ, þļàçéĥöļđéŕš, þļüŕàļ ƒöŕḿš àñđ àññöţàţîöñ öṽéŕļàýš. À ƒļàţ ķéý-ṽàļüé ĴŠÖÑ ĥöļđš ñöñé öƒ ţĥéšé.
- Îñţéĝŕàţîöñ ŵîţĥ
kapiƒöŕ þšéüđö-ţŕàñšļàţîöñ, ÀÎ ţŕàñšļàţîöñ, çĥéçķš, çöñţéñţ-ḿéḿöŕý ļéṽéŕàĝé àñđ ţéŕḿîñöļöĝý. ķàþî ĥàñđļéš ţĥé àŕçĥîṽé ŵîţĥ ţĥé šàḿé ţööļš îţ üšéš ƒöŕ ẊĻÎƑƑ, ĴŠÖÑ, Ḿàŕķđöŵñ, ĤŢḾĻ àñđ îţš öţĥéŕ ƒöŕḿàţš.
Ŵĥéñ ñéöķàþî-î18ñ îšñ'ţ ţĥé ŕîĝĥţ ƒîţ
- Šéŕṽéŕ-ŕéñđéŕéđ ĤŢḾĻ þîþéļîñéš ŵîţĥöüţ à Ŕéàçţ ƃüîļđ šţéþ. ΃ à ñöñ-Ŕéàçţ ƒŕàḿéŵöŕķ öüţþüţš ýöüŕ ĤŢḾĻ, üšé ķàþî'š ĤŢḾĻ öŕ ẊĻÎƑƑ ƒöŕḿàţš đîŕéçţļý.
- Ļàŕĝé çàţàļöĝš ƃüîļţ ḿöšţļý ƒŕöḿ þŕöĝŕàḿḿàţîç çöḿþöšîţîöñ. ΃ ḿöšţ öƒ ýöüŕ šţŕîñĝš çöḿé ƒŕöḿ ţéḿþļàţéš šüçĥ àš
t("error.code." + code), ţĥé šöüŕçé-ţéẋţ-àš-ķéý ḿöđéļ ŵöŕķš àĝàîñšţ ýöü. ñéöķàþî-î18ñ ƒîţš ƃéšţ ŵĥéñ ţĥé šţŕîñĝš àŕé ṽîšîƃļé îñ ţĥé šöüŕçé. - Ŕöüñđ-ţŕîþþîñĝ ţĥŕöüĝĥ šéṽéŕàļ ŢḾŠ ṽéñđöŕš ŵîţĥ éẋîšţîñĝ ţŕàñšļàţîöñ ķéýš. ΃ ýöüŕ ŵöŕķƒļöŵ đéþéñđš öñ ķéýš îñĥéŕîţéđ ƒŕöḿ àñöţĥéŕ šýšţéḿ, ḿöṽîñĝ ţö ñéöķàþî-î18ñ'š ĥàšĥéš îš à ḿîĝŕàţîöñ.
Ƒöŕ þŕöđüçţ ÜÎ, ḿàŕķéţîñĝ šîţéš, îñţéŕñàļ đàšĥƃöàŕđš, éẋţéñšîöñ þàĝéš àñđ éḿƃéđđéđ àþþš, ñéöķàþî-î18ñ ñééđš ñö þéŕ-šţŕîñĝ àññöţàţîöñ.
Ŕéļàţéđ
- Ǫüîçķ šţàŕţ: àđđ ñéöķàþî-î18ñ ţö à Ṽîţé + Ŕéàçţ þŕöĵéçţ îñ 5 ḿîñüţéš.
- Ŵŕîţîñĝ ţŕàñšļàţàƃļé çöḿþöñéñţš: ŵĥàţ éẋţŕàçţš àüţöḿàţîçàļļý, àñđ ŵĥéñ à ŵàŕñîñĝ ƒîŕéš.
t()éšçàþé ĥàţçĥ: ḿàŕķîñĝ šţŕîñĝš ţĥàţ ļîṽé öüţšîđé ĴŠẊ.- Éẋţŕàçţ → ţŕàñšļàţé → çöḿþîļé: ţĥé ƒüļļ éñđ-ţö-éñđ ƒļöŵ ŵîţĥ
kapi. - Àļţéŕñàţîṽéš: ĥöŵ ñéöķàþî-î18ñ çöḿþàŕéš ŵîţĥ öţĥéŕ Ŕéàçţ î18ñ ļîƃŕàŕîéš.