Budibase/budibase · error · ForbiddenError
License does not allow translations
Error message
License does not allow translations
What it means
processTranslationsConfig checks the translations entitlement before saving. If the license does not enable translations, a ForbiddenError is thrown and the config save is aborted before prepareTranslationsConfig runs.
Source
Thrown at packages/worker/src/api/controllers/global/configs.ts:346
)
locales[locale] = {
...localeConfig,
overrides,
}
}
return {
defaultLocale: config.defaultLocale,
locales,
}
}
async function processTranslationsConfig(
ctx: UserCtx,
config: TranslationsConfigInner
) {
const enabled = await pro.features.isTranslationsEnabled()
if (!enabled) {
throw new ForbiddenError("License does not allow translations")
}
ctx.request.body.config = prepareTranslationsConfig(ctx, config)
}
async function processSCIMConfig(
newConfig: SCIMInnerConfig,
existingConfig: SCIMInnerConfig | undefined
): Promise<SCIMDisableAction | undefined> {
const { disableAction } = newConfig
delete newConfig.disableAction
const isBeingDisabled = existingConfig?.enabled && !newConfig.enabled
if (isBeingDisabled && disableAction) {
return disableAction
}
}
export async function save(View on GitHub (pinned to a81a902e9a)
Solutions
- Upgrade to a plan that includes translations
- Re-apply or refresh the license key so the translations feature is entitled
- Drop the translations section from the config save payload
- After license changes, retry the save with the original payload
Defensive patterns
Strategy: validation
Validate before calling
const translationsAllowed = await pro.features.isTranslationsEnabled()
if (!translationsAllowed) {
// hide translations editor; exclude from config save payload
return
} Try / catch
try {
await configApi.save({ type: "translations", config })
} catch (err) {
if (err.status === 403 && err.message.includes("translations")) {
// show upgrade path; don't retry
} else { throw err }
} Prevention
- Check the translations entitlement before rendering the editor
- Exclude translations from saved payloads when unlicensed
- Treat 403 on premium features as an entitlement issue, not a code bug
- Re-check entitlements after license renewal or expiry
When it happens
Trigger: Saving a translations config (type translations) on a tenant whose license lacks the translations feature.
Common situations: Self-hosted/free tenants attempting to configure custom translations; expired license downgrading entitlements so previously-working saves now fail; license key missing from environment.
Related errors
- License does not allow use of recaptcha
- License does not allow OIDC PKCE method support
- Audit logs not available - license required.
- User does not have access to environment variables feature.
- FEATURE_DISABLED
AI-assisted analysis of Budibase/budibase@a81a902e9a (2026-08-29).
Data as JSON: /api/errors/3b6e3f092959d568.
Report an issue: GitHub.