contentrain-translate — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited contentrain-translate (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Translate existing content entries to a target locale, following i18n quality rules.
The user wants to translate content, add a new language, or says something like "translate to Turkish", "add German locale", "create French translations", "fill in missing translations", "localize".
Call contentrain_status to understand:
config.json → locales.supported).config.json → locales.source).If the user specified a locale, use it. Otherwise:
locales.supported, inform the user it needs to be added to the configuration first.Identify which models need translation:
i18n: true.contentrain_content_list(model: "<modelId>", locale: "<sourceLocale>") to get the source content.contentrain_content_list(model: "<modelId>", locale: "<targetLocale>").Ask the user which models to translate, or offer to translate all models with missing entries.
Read .contentrain/vocabulary.json for canonical term translations. All vocabulary-defined terms must use the exact translation specified for the target locale — do not create alternative translations.
Apply the rules from i18n-quality.md during translation:
#### Translation Quality
#### Vocabulary Alignment
.contentrain/vocabulary.json for approved translations of terms in the target locale.#### Cultural Adaptation
#### String Length Awareness
max constraints in the model definition.max constraints.#### Pluralization
one, other. German: one, other. Russian: one, few, many, other. Arabic: all six categories.#### Preserve Non-Translatable Content
"auth.login" key stays the same, value changes).Show the user a side-by-side comparison:
Model: hero (singleton)
Field: title
en: "Build faster with AI"
tr: "AI ile daha hizli gelistirin"
Field: description
en: "Ship content-driven apps in minutes"
tr: "Icerik odakli uygulamalari dakikalar icinde yayinlayin"Wait for user approval. The user may request adjustments to tone, phrasing, or terminology.
When translating a model to a brand-new locale, use copy_locale to bootstrap the target locale with source content before translating:
contentrain_bulk({ operation: "copy_locale", model: "<model-id>", source_locale: "en", target_locale: "<target>" })This creates target locale files with the source content as a starting point. Then translate each entry's values in-place — keys and entry IDs remain identical.
After all translations are saved, re-generate the SDK client so the application picks up the new locale data:
npx contentrain generateNew locale data requires SDK client regeneration:
npx contentrain generateAfter approval, call contentrain_content_save for each model and target locale:
contentrain_content_save(model: "<model-id>", entries: [
{ id: "<same-id>", locale: "<target-locale>", data: { ...translatedFields } }
])Use the same id (for collections) or slug (for documents) as the source entry to maintain the cross-locale link. Batch all entries for a model in one call.
Call contentrain_validate to verify:
min, max, pattern).If validation fails, fix issues and re-save.
Call contentrain_submit to commit the translations:
cr/content/{model}/{targetLocale}/{timestamp}.Report to the user:
max constraints (flagged for review)./contentrain-review to verify overall i18n coverage.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.