Îñ-çöñţéẋţ ŕéṽîéŵ
Ŕéṽîéŵ ḿöđé ļéţš ýöü çĥéçķ àñđ ƒîẋ ţŕàñšļàţîöñš öñ ţĥé ŕüññîñĝ àþþ: ĥöļđ ÀĻŢ, çļîçķ à šţŕîñĝ àñđ éđîţ îţš ţŕàñšļàţîöñ îñ þļàçé. Ţĥé ƒîẋ ĝöéš îñţö ţĥé .kbf.json ƒîļé ţĥé šţŕîñĝ çàḿé ƒŕöḿ.
À ţŕàñšļàţöŕ ŵöŕķîñĝ ƒŕöḿ à ƒîļé çàññöţ šéé ţĥàţ "Šàṽé" ļàñđéđ öñ à ƃüţţöñ 40 þîẋéļš ŵîđé, ţĥàţ ţĥé Ĝéŕḿàñ ƒöŕ "Çàñçéļ" ŵŕàþš ţö ţŵö ļîñéš, öŕ ţĥàţ ţĥé ţöñé îš ŵŕöñĝ ƒöŕ à đîàļöĝ ţĥàţ đéļéţéš šöḿéţĥîñĝ. Öñ ţĥé ŕüññîñĝ àþþ, ýöü çàñ.
Ţüŕñ îţ öñ
neokapi({
review: true, // or set KAPI_REVIEW=1
});
Šţàŕţ ţĥé đéṽ šéŕṽéŕ. Ţĥéŕé îš ñöţĥîñĝ ţö îḿþöŕţ àñđ ñö çöḿþöñéñţ ţö àđđ.
:::ŵàŕñîñĝ Đéṽ àñđ šţàĝîñĝ öñļý Ŕéṽîéŵ ḿöđé àđđš ŕéṽîéŵ đàţà ţö ýöüŕ ḿàŕķüþ àñđ ļéţš ţĥé ƃŕöŵšéŕ ŵŕîţé ţö ýöüŕ ţŕàñšļàţîöñ ƒîļéš. Ñéṽéŕ éñàƃļé îţ ƒöŕ à þŕöđüçţîöñ ƃüîļđ ýöü šĥîþ. :::
Ŕéṽîéŵ à šţŕîñĝ
Ĥöļđ ÀĻŢ, àñđ ĥöṽéŕîñĝ öüţļîñéš éṽéŕý ţŕàñšļàţàƃļé éļéḿéñţ. ÀĻŢ+çļîçķ öñé ţö öþéñ îţš þàñéļ:
- Šöüŕçé: ţĥé öŕîĝîñàļ ţéẋţ, ŵîţĥ îţš ļîñķš, ƃöļđ šþàñš, àñđ þļàçéĥöļđéŕš šĥöŵñ ţĥé ŵàý à ţŕàñšļàţöŕ šééš ţĥéḿ.
- Ţàŕĝéţ: ţĥé çüŕŕéñţ ţŕàñšļàţîöñ, éđîţàƃļé.
- Ñöţé: ţĥé çöñţéẋţ ţĥé đéṽéļöþéŕ ļéƒţ, îƒ àñý (
data-i18n-note, öŕt(text, context)). - Ƒîñđîñĝš: ţéŕḿîñöļöĝý àñđ çĥéçķ ƒîñđîñĝš àĝàîñšţ ţĥîš šţŕîñĝ.
Ţýþé à ƒîẋ, šàṽé, àñđ ţĥé àþþ ŕéþàîñţš îḿḿéđîàţéļý ŵîţĥ ţĥé ñéŵ ţéẋţ.
Ţĥé ƒîẋ îš ŵŕîţţéñ îñţö ţĥé .kbf.json ƒîļé ţĥé šţŕîñĝ çàḿé ƒŕöḿ. Îţ šĥöŵš üþ àš à ļîñé îñ git diff, ĝöéš ţĥŕöüĝĥ þüļļ-ŕéǫüéšţ ŕéṽîéŵ ļîķé àñý öţĥéŕ çĥàñĝé, àñđ ţĥé ñéẋţ neokapi-i18n compile îñçļüđéš îţ. À ŕéṽîéŵéŕ'š éđîţ àñđ à ţŕàñšļàţöŕ'š éđîţ ļàñđ îñ ţĥé šàḿé ƒîļé.
Ĥéàđ àñđ ŠÉÖ šţŕîñĝš
Ţĥé þàĝé ţîţļé, ḿéţà đéšçŕîþţîöñ, àñđ Öþéñ Ĝŕàþĥ / Ţŵîţţéŕ çàŕđ šţŕîñĝš çàŕŕý ñö ŕéñđéŕéđ ţéẋţ ñöđé, šö ţĥéŕé îš ñöţĥîñĝ öñ ţĥé þàĝé ţö ĥöļđ ÀĻŢ àñđ çļîçķ, ýéţ ţĥéý àŕé öƒţéñ ţĥé šţŕîñĝš à šéàŕçĥ ŕéšüļţ öŕ à šĥàŕéđ ļîñķ šĥöŵš ƒîŕšţ. Ţŕàñšļàţé ţĥéḿ ţĥŕöüĝĥ ţĥé ĥéàđ ĥööķš àñđ ţĥéý ƃéçöḿé ŕéṽîéŵàƃļé îñ à þàñéļ öƒ ţĥéîŕ öŵñ.
import {
useTranslatedTitle,
useTranslatedDescription,
useTranslatedMeta,
} from "@neokapi/i18n-react/head";
function Head() {
useTranslatedTitle("Dashboard · Acme");
useTranslatedDescription("Manage your team, projects, and billing.");
useTranslatedMeta("Dashboard · Acme", { property: "og:title" });
return null;
}
Éàçĥ ĥööķ ţŕàñšļàţéš îţš šöüŕçé ţĥŕöüĝĥ ţĥé ŕüñţîḿé đîçţîöñàŕý (ţĥé šàḿé ļööķüþ t() üšéš), šéţš ţĥé ŕéàļ ĥéàđ éļéḿéñţ, àñđ ŕéĝîšţéŕš ţĥé šţŕîñĝ ƒöŕ ŕéṽîéŵ. Öñļý šţŕîñĝš ţŕàñšļàţéđ ţĥŕöüĝĥ ţĥéšé ĥööķš àþþéàŕ îñ ŕéṽîéŵ, àñđ öţĥéŕ ĥéàđ ḿàŕķüþ îš ļéƒţ àļöñé.
À ĥéàđ/ŠÉÖ ƃüţţöñ àþþéàŕš îñ ţĥé ŕéṽîéŵ ţööļƃàŕ ŵĥéñéṽéŕ à þàĝé ĥàš šüçĥ šţŕîñĝš. Îţ öþéñš à þàñéļ ţĥàţ ļîšţš éàçĥ šţŕîñĝ ŵîţĥ îţš šļöţ (title, description, og:title, …), îţš šöüŕçé àñđ îţš çüŕŕéñţ ţàŕĝéţ, ŵîţĥ ţĥé šàḿé éđîţàƃļé ƒîéļđ àñđ šàṽé àš ţĥé îñļîñé þàñéļ. Àñ éđîţ ŵŕîţéš ƃàçķ ţĥŕöüĝĥ ţĥé šàḿé .kbf.json ƒîļé àñđ ŕéþàîñţš ţĥé ĥéàđ îñ þļàçé. Ŵĥéñ à þàĝé ŕéĝîšţéŕš ñö ĥéàđ šţŕîñĝš, ţĥé ƃüţţöñ šţàýš ĥîđđéñ.
Ĥéàđ ţŕàñšļàţîöñ ŕéšöļṽéš ţĥŕöüĝĥ ţĥé ŕüñţîḿé đîçţîöñàŕý, šö îţ àþþļîéš îñ ÖŢÀ / ŕüñţîḿé ḿöđé. Šļöţš ŵîţĥ îđéñţîçàļ ŵöŕđîñĝ, šüçĥ àš à <title> àñđ îţš og:title, šĥàŕé öñé ţŕàñšļàţîöñ.
Šéé ţéŕḿîñöļöĝý àñđ çĥéçķ ƒîñđîñĝš öñ ţĥé þàĝé
Ŕüñ ķàþî'š çĥéçķš àĝàîñšţ ţĥé šàḿé i18n/ đîŕéçţöŕý àñđ ţĥéîŕ ƒîñđîñĝš àþþéàŕ öñ ţĥé ŕéñđéŕéđ ţéẋţ:
kapi exec qa i18n/ --target-lang de
kapi exec term-check i18n/ --target-lang de --termstore terms/de.db
Àñ àþþŕöṽéđ ţéŕḿ ţĥàţ ŵàšñ'ţ üšéđ, à þļàçéĥöļđéŕ ţĥàţ ŵéñţ ḿîššîñĝ îñ ţŕàñšļàţîöñ, à šţŕîñĝ ţĥàţ ŕüñš 60% ļöñĝéŕ ţĥàñ îţš šöüŕçé àñđ îš àƃöüţ ţö ƃŕéàķ ţĥé ƃüţţöñ îţ ļîṽéš îñ: éàçĥ îš ḿàŕķéđ öñ ţĥé ŵöŕđš îţ çöñçéŕñš. Ŕé-ŕüñ à çĥéçķ ŵĥîļé ţĥé àþþ îš öþéñ, àñđ ţĥé ḿàŕķš üþđàţé ŵîţĥöüţ à ŕéšţàŕţ.
Ŕéṽîéŵ öñ šţàţîçàļļý-ŕéñđéŕéđ þàĝéš
Ţĥé ŕéṽîéŵ îđéñţîƒîéŕ, data-kapi-id, îš à çöñţéñţ ĥàšĥ: îţ îš ţĥé šàḿé ŵĥéţĥéŕ ţĥé ƃüîļđ îñļîñéš ţĥé ţŕàñšļàţîöñ (žéŕö-ŕüñţîḿé ŠŠĜ/ŠŠŔ) öŕ éḿîţš à ŕüñţîḿé t() çàļļ. Ŕéṽîéŵ ţĥéŕéƒöŕé ŵöŕķš îñ éîţĥéŕ ḿöđé, îñçļüđîñĝ öñ à ƒüļļý šţàţîç þàĝé ŵîţĥ ñö àþþ î18ñ ŕüñţîḿé.
Ţüŕñ review: true öñ ƒöŕ àñ îñļîñé (öŕ ŠŠĜ/ŠŠŔ) ƃüîļđ, àñđ ţĥé þļüĝîñ đöéš ţŵö ţĥîñĝš îñ éîţĥéŕ ḿöđé. Îţ šţàḿþš data-kapi-id îñţö ţĥé ƃàķéđ ĤŢḾĻ, àñđ îţ éḿîţš translations/review.json, à ŕéàđ-öñļý ḿàñîƒéšţ öƒ šöüŕçé, ţàŕĝéţ àñđ ļöçàţîöñ ƒöŕ éṽéŕý šţŕîñĝ öñ ţĥé þàĝé. À ĥöšţéđ öṽéŕļàý ñééđš ñöţĥîñĝ ḿöŕé:
import { initKapiReviewHosted } from "@neokapi/i18n-react/review/hosted";
initKapiReviewHosted(); // read-only; fetches translations/review.json
Ŵîţĥ öñļý à šţàţîç đéþļöý (ñö đéṽ šéŕṽéŕ, ñö ƃàçķéñđ), à ŕéṽîéŵéŕ çàñ đééþ-ļîñķ ţö à šţŕîñĝ (?kapi-focus=<hash>), öþéñ ţĥé ŵĥöļé-þàĝé îñđéẋ (?kapi-review), àñđ îñšþéçţ àñý šţŕîñĝ'š šöüŕçé àñđ ţàŕĝéţ îñ çöñţéẋţ.
Ţö ļéţ à ŕéṽîéŵéŕ éđîţ öñ ţĥàţ šţàţîç þàĝé, þàšš edit: true àñđ àñ éñđþöîñţ ţĥàţ šþéàķš ţĥé ŕéṽîéŵ-šţöŕé þŕöţöçöļ (à šţàĝîñĝ đéþļöýḿéñţ öƒ ţĥé đéṽ ḿîđđļéŵàŕé, öŕ à þŕöẋîéđ ŕéṽîéŵ ƃàçķéñđ):
initKapiReviewHosted({ edit: true, endpoint: "https://staging.example.com/review" });
Šàṽîñĝ ÞÜŢš ţö {endpoint}/{hash} (ţĥé šàḿé ŵŕîţé-ƃàçķ à ƃöđý šţŕîñĝ üšéš) àñđ ŕéþàîñţš ţĥé éļéḿéñţ'š ţéẋţ îñ þļàçé, îñđéþéñđéñţ öƒ àñý àþþ î18ñ ŕüñţîḿé. Ŕéþàîñţ îš ţéẋţ-öñļý: à šţŕîñĝ ŵîţĥ îñļîñé ḿàŕķüþ (à ļîñķ, à ƃöļđ šþàñ) öŕ àñ ÎÇÜ þļüŕàļ šàṽéš ţö ţĥé šţöŕé ƃüţ îš ñöţ ŕéþàîñţéđ ļîṽé; à ŕéļöàđ þîçķš üþ ţĥé ŕéàļ ŕéñđéŕîñĝ. Ƒöŕ à ḿàñîƒéšţ ţĥàţ àļšö çàŕŕîéš éṽéŕý ļöçàļé'š ţàŕĝéţ àñđ ţĥé ţéŕḿîñöļöĝý àñđ çĥéçķ ƒîñđîñĝš, ĝéñéŕàţé îţ öṽéŕ ţĥé ŵĥöļé ĶƂƑ ţŕéé îñšţéàđ:
neokapi-i18n compile i18n --out public/translations --review
Ŕéṽîéŵéŕš ŵîţĥöüţ à çĥéçķöüţ
Ŕéṽîéŵ ŕéàđš àñđ ŵŕîţéš ţĥŕöüĝĥ àñ éñđþöîñţ. Ţĥé ļöçàļ éñđþöîñţ ŵöŕķš öñ ţĥé .kbf.json ƒîļéš îñ ýöüŕ ŕéþöšîţöŕý àñđ ñééđš ñö îñƒŕàšţŕüçţüŕé. Þöîñţ ŕéṽîéŵ àţ àñ éñđþöîñţ öñ à šţàĝîñĝ đéþļöýḿéñţ, àñđ à ŕéṽîéŵéŕ ŵîţĥ ñö ŕéþöšîţöŕý àñđ ñö ţööļçĥàîñ çàñ ŕéṽîéŵ ţĥé àþþ îñ þļàçé:
initKapiReview({ endpoint: "https://staging.example.com/review" });
Ŕéļàţéđ
- Ţŕàñšļàţîñĝ ŵîţĥ ķàþî: ŵĥéŕé ţĥé ţéŕḿîñöļöĝý àñđ çĥéçķ ƒîñđîñĝš çöḿé ƒŕöḿ.
- Çöñƒîĝüŕàţîöñ: ţĥé
reviewàñđreviewKbfDiröþţîöñš. - Š-05: ţĥé àŕçĥîţéçţüŕé öƒ ţĥé î18ñ ŕüñţîḿé àñđ ţĥé ŕéṽîéŵ öṽéŕļàý.