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

  1. Upgrade to a plan that includes translations
  2. Re-apply or refresh the license key so the translations feature is entitled
  3. Drop the translations section from the config save payload
  4. 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

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


AI-assisted analysis of Budibase/budibase@a81a902e9a (2026-08-29). Data as JSON: /api/errors/3b6e3f092959d568. Report an issue: GitHub.