{"record":{"id":"a4a3831c48393beb","repo":"instructure/canvas-lms","slug":"samelanguagetranslationerror","errorCode":null,"errorMessage":"SameLanguageTranslationError","messagePattern":"SameLanguageTranslationError","errorType":"exception","errorClass":"Translation::SameLanguageTranslationError","httpStatus":null,"severity":"warning","filePath":"lib/translation.rb","lineNumber":137,"sourceCode":"\n    def check_same_language(source, target)\n      if source == target\n        InstStatsd::Statsd.distributed_increment(\"translation.errors\", tags: [\"error:same_language\"])\n        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":119,"sourceCodeEnd":150,"githubUrl":"https://github.com/instructure/canvas-lms/blob/1c9f0bb8013ed69c4f2efe11fd483025469b7e6c/lib/translation.rb#L119-L150","documentation":"Translation#handle_cedar_errors wraps CedarClient calls and translates exception class names into Canvas Translation hierarchy errors. When a Cedar client raises an exception whose class name matches /SameLanguageTranslationError/, it is re-raised as Translation::SameLanguageTranslationError. This is a re-mapping layer: either check_same_language inside the yielded block raised it (and it is re-raised identically), or the Cedar client itself raised a same-language error that gets normalized.","triggerScenarios":"translate_text/translate_html invoked where the content's detected language equals the target language and a SameLanguageTranslationError-class exception occurs inside the block (from check_same_language or from CedarClient), so handle_cedar_errors re-raises it as Translation::SameLanguageTranslationError.","commonSituations":"Auto-translate of inbox messages or discussion entries already written in the reader's language; UI allowing translation requests where source and target locales coincide; language detection returning the same code as the requested target.","solutions":["Skip the translation call when detected/source language equals the target language","Rescue Translation::SameLanguageTranslationError and fall back to the original content","Constrain target-language pickers to languages different from the detected content language","Normalize language codes before invoking translate_text/translate_html"],"exampleFix":"# before\nTranslation.translate_html(html_string: body, tgt_lang: locale, options: opts)\n# after\nbegin\n  Translation.translate_html(html_string: body, tgt_lang: locale, options: opts)\nrescue Translation::SameLanguageTranslationError\n  body\nend","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"begin\n  Translation.translate_html(html_string: html, tgt_lang: locale, options: opts)\nrescue Translation::SameLanguageTranslationError\n  html # already in target language\nend","preventionTips":["Compare detected vs target language before requesting","Gate translation UIs on language mismatch","Rescue the specific subclass, not generic TranslationError"],"tags":["translation","i18n","same-language","error-mapping"],"backgroundTag":"unsupported-operation","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"}