diff --git a/performance_hacks.module b/performance_hacks.module
index d71455a..11c89b4 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,8 +257,8 @@ 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') {
-  $cid = _performance_hacks_node_render_cache_key($node, $view_mode);
+function performance_hacks_replace_node_view($node, $view_mode = 'full', $langcode = NULL) {
+  $cid = _performance_hacks_node_render_cache_key($node, $view_mode, $langcode);
 
   // Cache for a maximum of three days, updates to users, taxonomy terms,
   // theming, or other things which affect the rendered node output without
@@ -276,6 +276,7 @@ function performance_hacks_replace_node_view($node, $view_mode = 'full') {
     '#theme' => 'node',
     '#node' => $node,
     '#view_mode' => $view_mode,
+    '#langcode' => $langcode,
     '#pre_render' => array('_performance_hacks_node_build_content'),
   );
   if (performance_hacks_node_render_is_cacheable(NULL, $node)) {
@@ -303,16 +304,19 @@ function performance_hacks_replace_node_view($node, $view_mode = 'full') {
  *   The node object.
  * @param $view_mode
  *   The view mode as passed to node_view() or node_view_multiple().
+ * @param $langcode
+ *   The language code if available. Defaults to NULL.
  *
  * @return
  *   A string to use as the cache key.
  */
-function _performance_hacks_node_render_cache_key($node, $view_mode) {
+function _performance_hacks_node_render_cache_key($node, $view_mode, $langcode = NULL) {
   $cid = array(
     'node',
     'render',
     $node->nid,
     $view_mode,
+    $langcode,
     (int) empty($GLOBALS['user']->uid),
   );
 
@@ -350,9 +354,14 @@ function performance_hacks_node_render_is_cacheable($allow_caching = NULL, $node
 }
 
 /**
- * Determine all possible cache keys for a node.
+ * Clear the cache for a given node.
+ *
+ * @param $nid
+ *   Integer node id.
+ * @param $langcode
+ *   String language code. Defaults to NULL
  */
-function performance_hacks_clear_node_render_cache($nid) {
+function performance_hacks_clear_node_render_cache($nid, $langcode = NULL) {
   $keys = array();
   $entity_info = entity_get_info();
   $view_modes = array_keys($entity_info['node']['view modes']);
@@ -361,7 +370,7 @@ function performance_hacks_clear_node_render_cache($nid) {
   // authenticated or not.
   foreach ($view_modes as $mode) {
     foreach (array(0, 1) as $auth) {
-      $keys[] = "node:render:$nid:$mode:$auth";
+      $keys[] = "node:render:$nid:$mode:$langcode:$auth";
     }
   }
 
@@ -390,6 +399,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.
@@ -401,16 +414,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.
@@ -436,7 +449,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) {
