{"record":{"id":"0a635c487c452a89","repo":"instructure/canvas-lms","slug":"validationerror","errorCode":null,"errorMessage":"ValidationError","messagePattern":"ValidationError","errorType":"exception","errorClass":"Translation::ValidationError","httpStatus":null,"severity":"error","filePath":"lib/translation.rb","lineNumber":143,"sourceCode":"    end\n\n    def collect_translation_stats(src_lang:, tgt_lang:, type:)\n      tags = %W[type:#{type} source_language:#{src_lang} dest_language:#{tgt_lang}]\n      InstStatsd::Statsd.distributed_increment(\"translation.invocations\", tags:)\n    end\n\n    def handle_cedar_errors\n      yield\n    rescue => e\n      case e.class.name\n      when /SameLanguageTranslationError/\n        raise SameLanguageTranslationError\n      when /ContentTooLongError/\n        raise TextTooLongError\n      when /UnsupportedLanguageError/\n        raise UnsupportedLanguageError\n      when /ValidationError/\n        raise ValidationError\n      else\n        raise TranslationError, e.message\n      end\n    end\n  end\nend\n","sourceCodeStart":125,"sourceCodeEnd":150,"githubUrl":"https://github.com/instructure/canvas-lms/blob/1c9f0bb8013ed69c4f2efe11fd483025469b7e6c/lib/translation.rb#L125-L150","documentation":"Raised by handle_cedar_errors in lib/translation.rb:143 when the Cedar translation service returns a ValidationError. The wrapper remaps it to Canvas's ValidationError, signaling the request payload (text, language params, etc.) failed upstream validation.","triggerScenarios":"translate_text or translate_html called with a payload Cedar rejects: empty/nil text, text exceeding field constraints, invalid options hash, or malformed arguments passed through to the service.","commonSituations":"Translating empty user-generated content without checking for blank input; passing nil source language; API contract change in Cedar adding new validation rules; oversized request fields.","solutions":["Validate input text is non-blank and within size limits before calling the translation service","Log e.message from the wrapped error to identify which field failed upstream validation","Rescue ValidationError and return a user-friendly message instead of surfacing the raw error","Check for recent Cedar/API contract changes if previously valid payloads now fail"],"exampleFix":"// before\nTranslation::Service.translate_html(body, from: nil, to: 'es')\n// after\nnext if body.blank?\nTranslation::Service.translate_html(body, from: source_locale, to: 'es')","handlingStrategy":"validation","validationCode":"raise ValidationError if text.blank? || text.length > MAX_TRANSLATABLE_LENGTH","typeGuard":null,"tryCatchPattern":"begin\n  translate_html(html, from:, to:)\nrescue ValidationError => e\n  logger.warn(\"translation payload rejected: #{e.message}\")\n  render json: {error: 'untranslatable content'}, status: :bad_request\nend","preventionTips":["Check for blank content before translating","Enforce size limits client-side","Keep payload options aligned with the current API contract"],"tags":["ruby","translation","validation"],"backgroundTag":"schema-validation-failed","analyzedSha":"1c9f0bb8013ed69c4f2efe11fd483025469b7e6c","analyzedAt":"2026-09-15T20:33:18.891Z","contentChangedAt":"2026-09-15T20:33:18.891Z","schemaVersion":2},"datasetVersion":"2026-09-23T02:17:17.105Z"}