diff --git a/performance_hacks.module b/performance_hacks.module
index f3b5ab9..8dc8bae 100644
--- a/performance_hacks.module
+++ b/performance_hacks.module
@@ -230,7 +230,7 @@ function performance_hacks_node_show($node, $message = FALSE) {
  *
  * @see @node_view_multiple().
  */
-function performance_hacks_node_view_multiple($nodes, $view_mode = 'teaser', $weight = 0) {
+function performance_hacks_node_view_multiple($nodes, $view_mode = 'teaser', $weight = 0, $langcode = NULL) {
 
   // If all nodes are cached, running the prepare view hooks is pointless.
   // However if any nodes aren't cached and we're rendering a list of nodes,
@@ -244,7 +244,7 @@ function performance_hacks_node_view_multiple($nodes, $view_mode = 'teaser', $we
   }
   $build = array();
   foreach ($nodes as $node) {
-    $build['nodes'][$node->nid] = performance_hacks_replace_node_view($node, $view_mode);
+    $build['nodes'][$node->nid] = performance_hacks_replace_node_view($node, $view_mode, $langcode);
     $build['nodes'][$node->nid]['#weight'] = $weight;
     $weight++;
   }
@@ -257,7 +257,7 @@ function performance_hacks_node_view_multiple($nodes, $view_mode = 'teaser', $we
  *
  * Replacement for node_view() which does drupal_render() caching.
  */
-function performance_hacks_replace_node_view($node, $view_mode = 'full') {
+function performance_hacks_replace_node_view($node, $view_mode = 'full', $langcode = NULL) {
   $cid = _performance_hacks_node_render_cache_key($node, $view_mode);
 
   // Cache for a maximum of three days, updates to users, taxonomy terms,
@@ -274,6 +274,7 @@ function performance_hacks_replace_node_view($node, $view_mode = 'full') {
     '#theme' => 'node',
     '#node' => $node,
     '#view_mode' => $view_mode,
+    '#language' => $langcode,
     '#pre_render' => array('_performance_hacks_node_build_content'),
   );
   if (performance_hacks_node_render_is_cacheable(NULL, $node)) {
@@ -378,6 +379,10 @@ function _performance_hacks_why_do_i_maintain_comment_module_again($node) {
  * Replacement for node_build_content() for pre_render().
  */
 function _performance_hacks_node_build_content($element) {
+  $langcode = $element['#langcode'];
+  if (!isset($langcode)) {
+    $langcode = $GLOBALS['language_content']->language;
+  }
   // To avoid rewriting the whole function, assign $node and
   // $view_mode, the $node will be passed by reference so no need
   // to stuff it back at the end.
@@ -389,16 +394,16 @@ function _performance_hacks_node_build_content($element) {
   // The 'view' hook can be implemented to overwrite the default function
   // to display nodes.
   if (node_hook($node, 'view')) {
-    $node = node_invoke($node, 'view', $view_mode);
+    $node = node_invoke($node, 'view', $view_mode, $langcode);
   }
 
   // Build fields content.
   // In case of a multiple view, node_view_multiple() already ran the
   // 'prepare_view' step. An internal flag prevents the operation from running
   // twice.
-  field_attach_prepare_view('node', array($node->nid => $node), $view_mode);
-  entity_prepare_view('node', array($node->nid => $node));
-  $node->content += field_attach_view('node', $node, $view_mode);
+  field_attach_prepare_view('node', array($node->nid => $node), $view_mode, $langcode);
+  entity_prepare_view('node', array($node->nid => $node), $langcode);
+  $node->content += field_attach_view('node', $node, $view_mode, $langcode);
 
   // Always display a read more link on teasers because we have no way
   // to know when a teaser view is different than a full view.
@@ -424,7 +429,7 @@ function _performance_hacks_node_build_content($element) {
   );
 
   // Allow modules to make their own additions to the node.
-  module_invoke_all('node_view', $node, $view_mode);
+  module_invoke_all('node_view', $node, $view_mode, $langcode);
 
   // merge $node->content into $element
   foreach (element_children($node->content) as $child) {
