{"record":{"id":"bf443356686052b1","repo":"instructure/canvas-lms","slug":"unsupportedlanguageerror","errorCode":null,"errorMessage":"UnsupportedLanguageError","messagePattern":"UnsupportedLanguageError","errorType":"exception","errorClass":"Translation::UnsupportedLanguageError","httpStatus":null,"severity":"error","filePath":"lib/translation.rb","lineNumber":141,"sourceCode":"        raise Translation::SameLanguageTranslationError\n      end\n    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":123,"sourceCodeEnd":150,"githubUrl":"https://github.com/instructure/canvas-lms/blob/1c9f0bb8013ed69c4f2efe11fd483025469b7e6c/lib/translation.rb#L123-L150","documentation":"Raised by handle_cedar_errors in lib/translation.rb:141 when the Cedar translation service reports an UnsupportedLanguageError. The wrapper translates the upstream exception into Canvas's own UnsupportedLanguageError so callers get a consistent error type. It means one of the source or target languages passed to translate_text/translate_html is not supported by the translation backend.","triggerScenarios":"Calling translate_text or translate_html with a locale string the Cedar service does not recognize (malformed code, deprecated locale, or a language outside Cedar's supported set); Cedar returns UnsupportedLanguageError which the case/when block remaps.","commonSituations":"Hardcoded locale strings that drift from supported language lists; user-submitted target languages not validated against the supported set; locale codes with wrong casing or region suffixes; backend language list changed after an upgrade.","solutions":["Check the source/target language codes against the translation service's supported language list before calling translate_text/translate_html","Normalize/validate locale codes (format, casing, region) before submission","Rescue UnsupportedLanguageError and fall back to a default supported language or skip translation","Verify the translation backend configuration/version still supports the requested languages"],"exampleFix":"// before\nTranslation::Service.translate_text(text, from: 'zh_CN', to: 'jp')\n// after\nraise UnsupportedLanguageError unless SUPPORTED_LANGUAGES.include?(to)\nTranslation::Service.translate_text(text, from: 'zh-CN', to: 'ja')","handlingStrategy":"validation","validationCode":"raise UnsupportedLanguageError unless SUPPORTED_LANGUAGES.include?(target_locale) && SUPPORTED_LANGUAGES.include?(source_locale)","typeGuard":null,"tryCatchPattern":"begin\n  translate_text(text, from:, to:)\nrescue UnsupportedLanguageError\n  fallback_locale_translation(text)\nend","preventionTips":["Validate locale codes against the service's supported list before calling","Normalize locale format (BCP-47) consistently","Keep a monitored list of supported languages"],"tags":["ruby","translation","i18n","unsupported-language"],"backgroundTag":"invalid-enum-value","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"}