diff --git a/file_entity.file_api.inc b/file_entity.file_api.inc
index cfb75f9..d67b3d8 100644
--- a/file_entity.file_api.inc
+++ b/file_entity.file_api.inc
@@ -231,6 +231,31 @@ function file_view_file($file, $displays = 'full', $langcode = NULL) {
   drupal_alter('file_displays', $displays, $file, $view_mode);
   _file_sort_array_by_weight($displays);
 
+  // Since $file->alt and $file->title were set in file_entity_file_load()
+  // (which is a language-agnostic hook) they will not be in the correct
+  // language if the file is being displayed in a language other than the
+  // default one. Set them again here, using the correct language. This must
+  // run after hook_file_displays_alter() since the Media module sets
+  // $file->alt and $file->title again during that hook.
+  if ($langcode != $GLOBALS['language_content']->language) {
+    $languages = language_list();
+    if (isset($languages[$langcode])) {
+      $alt = variable_get('file_entity_alt', '[file:field_file_image_alt_text]');
+      $title = variable_get('file_entity_title', '[file:field_file_image_title_text]');
+      $replace_options = array(
+        'clear' => TRUE,
+        'sanitize' => FALSE,
+        'language' => $languages[$langcode],
+      );
+      if (!empty($alt)) {
+        $file->alt = token_replace($alt, array('file' => $file), $replace_options);
+      }
+      if (!empty($title)) {
+        $file->title = token_replace($title, array('file' => $file), $replace_options);
+      }
+    }
+  }
+
   // Attempt to display the file with each of the possible displays. Stop after
   // the first successful one. See file_displays() for details.
   $element = NULL;
