diff --git a/app/controllers/api/v1/statuses/translations_controller.rb b/app/controllers/api/v1/statuses/translations_controller.rb
index 8cf495f78ac95dbdb9c4c34cbb33c8a8c3d36f4a..bd5cd9bb07febc98902b5470d8f36dd5b36acb77 100644
--- a/app/controllers/api/v1/statuses/translations_controller.rb
+++ b/app/controllers/api/v1/statuses/translations_controller.rb
@@ -23,6 +23,6 @@ class Api::V1::Statuses::TranslationsController < Api::V1::Statuses::BaseControl
   private
 
   def set_translation
-    @translation = TranslateStatusService.new.call(@status, content_locale)
+    @translation = TranslateStatusService.new.call(@status, I18n.locale.to_s)
   end
 end
diff --git a/app/services/translate_status_service.rb b/app/services/translate_status_service.rb
index e2e076e21b9bbe7c1b4615cb75fe0a44fb7c5ee3..bcd4703beb000468dc676046b838358e596eef6f 100644
--- a/app/services/translate_status_service.rb
+++ b/app/services/translate_status_service.rb
@@ -9,6 +9,8 @@ class TranslateStatusService < BaseService
   def call(status, target_language)
     @status = status
     @source_texts = source_texts
+
+    target_language = target_language.split(/[_-]/).first unless target_languages.include?(target_language)
     @target_language = target_language
 
     raise Mastodon::NotPermittedError unless permitted?
@@ -32,11 +34,15 @@ class TranslateStatusService < BaseService
   def permitted?
     return false unless @status.distributable? && TranslationService.configured?
 
-    languages[@status.language]&.include?(@target_language)
+    target_languages.include?(@target_language)
   end
 
   def languages
-    Rails.cache.fetch('translation_service/languages', expires_in: 7.days, race_condition_ttl: 1.hour) { TranslationService.configured.languages }
+    Rails.cache.fetch('translation_service/languages', expires_in: 7.days, race_condition_ttl: 1.hour) { translation_backend.languages }
+  end
+
+  def target_languages
+    languages[@status.language] || []
   end
 
   def content_hash
diff --git a/spec/services/translate_status_service_spec.rb b/spec/services/translate_status_service_spec.rb
index cd92fb8d1025abca6217fbce0ed9bad50a16ec33..ac7a43ff2af4f4aefa0c568f13b6148fcfd5d0c5 100644
--- a/spec/services/translate_status_service_spec.rb
+++ b/spec/services/translate_status_service_spec.rb
@@ -18,7 +18,7 @@ RSpec.describe TranslateStatusService do
   describe '#call' do
     before do
       translation_service = TranslationService.new
-      allow(translation_service).to receive(:languages).and_return({ 'en' => ['es'] })
+      allow(translation_service).to receive(:languages).and_return({ 'en' => ['es', 'es-MX'] })
       allow(translation_service).to receive(:translate) do |texts|
         texts.map do |text|
           TranslationService::Translation.new(
@@ -37,6 +37,7 @@ RSpec.describe TranslateStatusService do
         .to have_attributes(
           content: '<p>Hola</p>',
           detected_source_language: 'en',
+          language: 'es',
           provider: 'Dummy',
           status: status
         )
@@ -101,6 +102,16 @@ RSpec.describe TranslateStatusService do
         expect(media_attachment.description).to eq 'Hola & :highfive:'
       end
     end
+
+    describe 'target language is regional' do
+      it 'uses regional variant' do
+        expect(service.call(status, 'es-MX').language).to eq 'es-MX'
+      end
+
+      it 'uses parent locale for unsupported regional variant' do
+        expect(service.call(status, 'es-XX').language).to eq 'es'
+      end
+    end
   end
 
   describe '#source_texts' do