Îñ-çöñţéẋţ ŕéṽîéŵ
À ţŕàñšļàţöŕ ŵöŕķîñĝ ƒŕöḿ à ƒîļé çàññöţ šéé ţĥàţ "Šàṽé" ļàñđéđ öñ à ƃüţţöñ 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 šàý, šĥàŕé öñé ţŕàñšļàţîöñ.
Šéé ţéŕḿîñöļöĝý àñđ çĥéçķ ƒîñđîñĝš öñ ţĥé þàĝé
Ŕüñ kapi'š çĥéçķš àĝàîñšţ ţĥé šàḿé 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ñ ŕüñţîḿé. Ŕéþàîñţ îš ţéẋţ-öñļý: à šţŕîñĝ ŵîţĥ îñļîñé ḿàŕķüþ (à ļîñķ, à ƃöļđ šþàñ) öŕ àñ ÎÇÜ þļüŕàļ šàṽéš ţö ţĥé šţöŕé ƃüţ îš ñöţ ŕéþàîñţéđ ļîṽé; à ŕéļöàđ þîçķš üþ ţĥé ŕéàļ ŕéñđéŕîñĝ. Ƒöŕ à ḿàñîƒéšţ ţĥàţ àļšö çàŕŕîéš éṽéŕý ļöçàļé'š ţàŕĝéţ àñđ ţĥé ţéŕḿîñöļöĝý àñđ çĥéçķ ƒîñđîñĝš, ĝéñéŕàţé îţ öṽéŕ ţĥé ŵĥöļé KBF ţŕéé îñšţéàđ:
neokapi-i18n compile i18n --out public/translations --review
Ŕéṽîéŵéŕš ŵîţĥöüţ à çĥéçķöüţ
Ŕéṽîéŵ ţàļķš ţö àñ éñđþöîñţ, àñđ ţĥé ļöçàļ öñé (ŕéàđîñĝ àñđ ŵŕîţîñĝ ţĥé .kbf.json ƒîļéš îñ ýöüŕ ŕéþöšîţöŕý) îš ţĥé éñđþöîñţ ţĥàţ ñééđš ñö îñƒŕàšţŕüçţüŕé. Þöîñţ îţ àţ à đéŕéñţ éñđþöîñţ öñ à šţàĝîñĝ đéþļöýḿéñţ àñđ à ŕéṽîéŵéŕ ŵîţĥ ñö ŕéþöšîţöŕý àñđ ñö ţööļçĥàîñ çàñ ŕéṽîéŵ ţĥé àþþ îñ þļàçé:
initKapiReview({ endpoint: "https://staging.example.com/review" });
Ñéẋţ
- Ţŕàñšļàţîñĝ ŵîţĥ kapi: ŵĥéŕé ţĥé ţéŕḿîñöļöĝý àñđ çĥéçķ ƒîñđîñĝš çöḿé ƒŕöḿ.
- Çöñƒîĝüŕàţîöñ: ţĥé
reviewàñđreviewKbfDiröþţîöñš. - Š-05: ĥöŵ îţ ŵöŕķš üñđéŕñéàţĥ, àñđ ŵĥý.