diff --git a/modules/comment.page_title.inc b/modules/comment.page_title.inc
index 91e83d9..03385a9 100644
--- a/modules/comment.page_title.inc
+++ b/modules/comment.page_title.inc
@@ -33,6 +33,13 @@ function comment_page_title_alter(&$title) {
 function comment_page_title_pattern_alter(&$pattern, &$types) {
   // Comment reply page
   if (arg(0) == 'comment' && arg(1) == 'reply' && is_numeric(arg(2))) {
+    
+    global $language;
+    
+    // Keys
+    $default_comment_child_reply_pattern_key = 'page_title_comment_child_reply';
+    $default_comment_reply_pattern_key = 'page_title_comment_reply';
+    
     // The node ID position is in arg 2...
     $types['node'] = menu_get_object('node', 2);
 
@@ -44,13 +51,28 @@ function comment_page_title_pattern_alter(&$pattern, &$types) {
 
     // Is this a root comment or a child comment (top level or nested)...
     if (($pid = arg(3)) && $comment = _comment_load($pid)) {
+      
       // Reply to comment...
       $types['comment'] = $comment;
-      $pattern = variable_get('page_title_comment_child_reply', '');
+      
+      $lang_pattern_key = !empty($language) ? $default_comment_child_reply_pattern_key. '_' .$language->language : $default_comment_child_reply_pattern_key;
+      $pattern = variable_get($lang_pattern_key, '');
+      
+      // Fallback for child reply
+      if (empty($pattern)) {
+        $pattern = variable_get($default_comment_child_reply_pattern_key, '[page-title] | [site-name]');
+      }
     }
     else {
       // Reply to node...
-      $pattern = variable_get('page_title_comment_reply', '');
+      
+      $lang_pattern_key = !empty($language) ? $default_comment_reply_pattern_key. '_' .$language->language : $default_comment_reply_pattern_key;
+      $pattern = variable_get($lang_pattern_key, '');
+      
+      // Fallback for child reply
+      if (empty($pattern)) {
+        $pattern = variable_get($default_comment_reply_pattern_key, '[page-title] | [site-name]');
+      }
     }
   }
 }
diff --git a/modules/forum.page_title.inc b/modules/forum.page_title.inc
index ca4658c..bd8d097 100644
--- a/modules/forum.page_title.inc
+++ b/modules/forum.page_title.inc
@@ -25,17 +25,37 @@ function forum_page_title_alter(&$title) {
  * Implementation of hook_page_title_pattern_alter().
  */
 function forum_page_title_pattern_alter(&$pattern, &$types) {
+  global $language;
+  
+  // Setting up keys
+  $default_forum_vocab_pattern_key = 'page_title_vocab';
+  $default_forum_root_pattern_key = 'page_title_forum_root_title';
+  
   // Forums Page title Patterns
   if (arg(0) == 'forum') {
     // If there is a numeric argument, then we're viewing a container or forum
     if (is_numeric(arg(1))) {
       $types['taxonomy'] = taxonomy_get_term(arg(1));
       $forum_vid = variable_get('forum_nav_vocabulary', '');
-      $pattern = variable_get('page_title_vocab_'. $forum_vid, '');
+      $lang_pattern_key = !empty($language) ? $default_forum_vocab_pattern_key. '_' .$forum_vid . '_' . $language->language : $default_forum_vocab_pattern_key;
+      
+      $pattern = variable_get($lang_pattern_key, '');
+      
+      // Fallback for forum vocab
+      if (empty($pattern)) {
+        $pattern = variable_get($default_forum_vocab_pattern_key, '[page-title] | [site-name]');
+      }
     }
     // Otherwise its the root - lets grab the root pattern.
     else {
-      $pattern = variable_get('page_title_forum_root_title', '');
+      $lang_pattern_key = !empty($language) ? $default_forum_root_pattern_key. '_' .$language->language : $default_forum_root_pattern_key;
+      
+      $pattern = variable_get($lang_pattern_key, '');
+      
+      // Fallback for forum vocab
+      if (empty($pattern)) {
+        $pattern = variable_get($default_forum_root_pattern_key, '[page-title] | [site-name]');
+      }
     }
   }
 }
diff --git a/modules/node.page_title.inc b/modules/node.page_title.inc
index e67a572..90d7b53 100644
--- a/modules/node.page_title.inc
+++ b/modules/node.page_title.inc
@@ -15,7 +15,8 @@ function node_page_title_alter(&$title) {
     // Get the node
     $node = menu_get_object('node');
 
-    // If the node has a custom page title and the node type is configured to have a custom page title (ie, it's not a leftover from a previous setting), then use it.
+    // If the node has a custom page title and the node type is configured to have a custom page title 
+    // (ie, it's not a leftover from a previous setting), then use it.
     if (!empty($node->page_title) && variable_get('page_title_type_'. $node->type .'_showfield', 0)) {
       $title = $node->page_title;
     }
@@ -29,13 +30,33 @@ function node_page_title_alter(&$title) {
 function node_page_title_pattern_alter(&$pattern, &$types) {
   if ((arg(0) == 'node' && is_numeric(arg(1)))) {
     $types['node'] = menu_get_object();
+    
+    // if a page title has been set for the viewed node and showfield is enabled, then get it
+    // else get the right pattern
+    if( !empty($types['node']->page_title) && variable_get('page_title_type_'. $types['node']->type .'_showfield', 0)) {
+      $pattern = $types['node']->page_title;
+    } 
+    else {
+      global $language;
+      // If a language exists for this node, we try to use page title pattern related to that language
+      // If the title pattern for that language is empty, we use the default one
+      // Setting up keys
+      $default_pattern_key = 'page_title_type_'. $types['node']->type;
+      $lang_pattern_key = !empty($language) ? $default_pattern_key . '_' . $language->language : $default_pattern_key;
+
+      // Get the right pattern in function of the determined key above
+      $pattern = variable_get($lang_pattern_key, '');
+      
+      // Fallback for node
+      if (empty($pattern)) {
+        $pattern = variable_get($default_pattern_key, '[page-title] | [site-name]');
+      }
+    }
 
     // If the node has any taxonomy, grab the first time and pass it over to be passed as a token.
     // TODO: Handle multiple terms? Only pass specific terms per content type?
     if (!empty($types['node']->taxonomy)) {
       $types['taxonomy'] = current($types['node']->taxonomy);
     }
-
-    $pattern = variable_get('page_title_type_'. $types['node']->type, '');
   }
 }
diff --git a/modules/page_title.page_title.inc b/modules/page_title.page_title.inc
index cd03e37..800821a 100644
--- a/modules/page_title.page_title.inc
+++ b/modules/page_title.page_title.inc
@@ -29,7 +29,18 @@ function page_title_page_title_alter(&$title) {
 function page_title_page_title_pattern_alter(&$pattern, &$data = array()) {
   // If frontpage, then use the frontpage pattern and set the title.
   if (drupal_is_front_page()) {
-    // Get the frontpage pattern
-    $pattern = variable_get('page_title_front', '[site-name] | [site-slogan]');
+    global $language;
+    
+    // Setting up keys
+    $default_pattern_key = 'page_title_front';
+    $lang_pattern_key = 'page_title_front'. '_' . $language->language;
+    
+    // Get pattern
+    $pattern = variable_get($lang_pattern_key, '');
+    
+    // Fallback for frontpage
+    if (empty($pattern)) {
+      $pattern = variable_get($default_pattern_key, '[page-title] | [site-name]');
+    }
   }
 }
diff --git a/modules/taxonomy.page_title.inc b/modules/taxonomy.page_title.inc
index ae86426..3263db5 100644
--- a/modules/taxonomy.page_title.inc
+++ b/modules/taxonomy.page_title.inc
@@ -27,7 +27,17 @@ function taxonomy_page_title_alter(&$title) {
 function taxonomy_page_title_pattern_alter(&$pattern, &$types) {
   // Taxonomy Term Page
   if (arg(0) == 'taxonomy' && arg(1) == 'term' && is_numeric(arg(2)) && module_exists('taxonomy')) {
+    global $language;
+    // Setting up keys
     $types['taxonomy'] = taxonomy_get_term(arg(2));
-    $pattern = variable_get('page_title_vocab_'. $types['taxonomy']->vid, '');
+    $default_taxonomy_pattern_key = 'page_title_vocab' . '_' . $types['taxonomy']->vid;
+    
+    $lang_key = $default_taxonomy_pattern_key . '_' . $language->language;
+    $pattern = variable_get($lang_key, '');
+    
+    // Fallback for taxonomy
+    if (empty($pattern)) {
+      $pattern = variable_get($default_taxonomy_pattern_key, '[page-title] | [site-name]');
+    }
   }
 }
diff --git a/modules/user.page_title.inc b/modules/user.page_title.inc
index 1b96364..02d73a1 100644
--- a/modules/user.page_title.inc
+++ b/modules/user.page_title.inc
@@ -24,14 +24,33 @@ function user_page_title_alter(&$title) {
  * Implementation of hook_page_title_pattern_alter().
  */
 function user_page_title_pattern_alter(&$pattern, &$types) {
+  global $language;
+  
+  // Setting up keys
+  $default_user_pattern_key = 'page_title_user';
+  $default_blog_pattern_key = 'page_title_blog';
+  $lang_pattern_user_key = !empty($language) ? $default_user_pattern_key . '_' . $language->language : $default_user_pattern_key;
+  $lang_pattern_blog_key = !empty($language) ? $default_blog_pattern_key . '_' . $language->language : $default_blog_pattern_key;
+  
   // User
   if (arg(0) == 'user' && is_numeric(arg(1))) {
     $types['user'] = user_load(array('uid' => arg(1)));
-    $pattern = variable_get('page_title_user', '');
+    $pattern = variable_get($lang_pattern_user_key, '');
+    
+    // Fallback for user
+    if (empty($pattern)) {
+      $pattern = variable_get($default_user_pattern_key, '[page-title] | [site-name]');
+    }
   }
+  
   // Blog
   elseif (arg(0) == 'blog' && is_numeric(arg(1))) {
     $types['user'] = user_load(array('uid' => arg(1)));
-    $pattern = variable_get('page_title_blog', '');
+    $pattern = variable_get($lang_pattern_blog_key, '');
+    
+    // Fallback for blog
+    if (empty($pattern)) {
+      $pattern = variable_get($default_blog_pattern_key, '[page-title] | [site-name]');
+    }
   }
 }
diff --git a/modules/views.page_title.inc b/modules/views.page_title.inc
index 23b560d..07a4222 100644
--- a/modules/views.page_title.inc
+++ b/modules/views.page_title.inc
@@ -1,5 +1,5 @@
 <?php
-// $Id: views.page_title.inc,v 1.1.2.3 2010/10/31 12:23:51 njt1982 Exp $
+// $Id: views.page_title.inc,v 1.1.2.2 2010/08/25 12:54:05 njt1982 Exp $
 
 /**
  * @file
@@ -21,7 +21,7 @@ function views_page_title_pattern_alter(&$pattern, &$types) {
 
     // Get the active page view
     $view = views_get_page_view();
-
+    
     // Sometimes there wont be a view on a views page - eg if you dont have access
     if (!$view) return;
 
diff --git a/page_title-admin-settings-form.tpl.php b/page_title-admin-settings-form.tpl.php
index 850891c..1bb1fd2 100644
--- a/page_title-admin-settings-form.tpl.php
+++ b/page_title-admin-settings-form.tpl.php
@@ -3,7 +3,7 @@
 
 /**
  * @file
- * Tempalte file for the admin settings form. Displays configuration in a neat table
+ * Template file for the admin settings form. Displays configuration in a neat table
  */
 
 $rows = array();
@@ -15,9 +15,10 @@ foreach (element_children($form['pattern']) as $key) {
     '#required' => $form['pattern'][$key]['#required'],
   );
   unset($form['pattern'][$key]['#title']);
-
+  
   $row = array(
     array('data' => drupal_render($title), 'class' => 'page-type'),
+    array('data' => drupal_render($form['language'][$key]), 'class' => 'language'),
     array('data' => drupal_render($form['scope'][$key]), 'class' => 'scope'),
   );
   if (isset($form['showfield'][$key .'_showfield'])) {
@@ -28,17 +29,17 @@ foreach (element_children($form['pattern']) as $key) {
     $row[] = array('data' => drupal_render($form['pattern'][$key]), 'colspan' => 2, 'class' => 'pattern');
   }
 
-  $rows[] = $row;
+$rows[] = $row;
 }
 
 $headers = array(
   array('data' => t('Page Type'), 'class' => 'page-type'),
+  array('data' => t('Language'), 'class' => 'language'),
   array('data' => t('Token Scope'), 'class' => 'scope'),
   array('data' => t('Pattern'), 'class' => 'pattern'),
-  array('data' => t('Show Field'), 'class' => 'showfie;d'),
+  array('data' => t('Show Field'), 'class' => 'showfield'),
 );
 
-
 drupal_add_css(drupal_get_path('module', 'page_title') .'/page_title.admin.css', 'module', 'all', FALSE);
 print theme('table', $headers, $rows, array('id' => 'page-title-settings'));
 
diff --git a/page_title.admin.css b/page_title.admin.css
index fd73b35..73d727f 100644
--- a/page_title.admin.css
+++ b/page_title.admin.css
@@ -1,10 +1,15 @@
+table#page-title-settings thead th { text-align:center; }
+
 table#page-title-settings th.showfield { text-align:center; }
 table#page-title-settings th.scope { text-align:center; }
-table#page-title-settings th.page-type { text-align:right; }
+table#page-title-settings th.page-type { text-align:left; }
 
 table#page-title-settings td.showfield { width:10%; text-align:center; }
 table#page-title-settings td.scope { text-align:center; }
-table#page-title-settings td.page-type { text-align:right; }
+table#page-title-settings td.language { text-align:center; }
+table#page-title-settings td.page-type { text-align:left; }
+
+table#page-title-settings td input { width: 95%; }
 
 div.view-list-page-titles th.views-field-nid       { width:5%; }
 div.view-list-page-titles th.views-field-edit-node { width:20%; }
diff --git a/page_title.admin.inc b/page_title.admin.inc
index 5ef7c95..35e834b 100644
--- a/page_title.admin.inc
+++ b/page_title.admin.inc
@@ -13,10 +13,10 @@
  *   array A structured array for use with Forms API.
  */
 function page_title_admin_settings() {
+  
   // Define a default looking 'form element' for setting.
   $showfield_form_element = array('#type' => 'checkbox', );
 
-
   // Define a default looking 'form element' for setting.
   $pattern_form_element = array(
     '#type' => 'textfield',
@@ -24,147 +24,287 @@ function page_title_admin_settings() {
     '#maxlength' => 256,
   );
 
-
-  // Set the theme callback for the patterns section
-  $form['patterns'] = array(
+  // Set the theme callback for the general patterns
+  $form['patterns']['general'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('General Title Patterns'),
+    '#collapsible' => FALSE,
+    '#theme' => 'page_title_admin_settings'
+  );
+  
+  // Set the theme callback for the content type patterns section
+  $form['patterns']['content_type'] = array(
     '#type' => 'fieldset',
-    '#title' => t('Page Title Patterns'),
+    '#title' => t('Content Types Patterns'),
     '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
     '#theme' => 'page_title_admin_settings'
   );
-
-
-  // Define the basic scope column values
-  $form['patterns']['scope'] = array(
-    'page_title_default'             => array('#type' => 'markup', '#value' => t('Global'), ),
-    'page_title_front'               => array('#type' => 'markup', '#value' => t('Global'), ),
-    'page_title_comment_reply'       => array('#type' => 'markup', '#value' => t('Node'), ),
-    'page_title_comment_child_reply' => array('#type' => 'markup', '#value' => t('Node') .'<br />'. t('Comment'), ),
-    'page_title_pager_pattern'       => array('#type' => 'markup', '#value' => t('Global'), ),
-    'page_title_user'                => array('#type' => 'markup', '#value' => t('User'), ),
+  
+  // Set the theme callback for the taxonomy section
+  $form['patterns']['taxonomy'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('Taxonomy Title Patterns'),
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+    '#theme' => 'page_title_admin_settings'
   );
+  
+  // Set the theme callback for the specific section
+  $form['patterns']['specific'] = array(
+    '#type' => 'fieldset',
+    '#title' => t('More Title Patterns'),
+    '#collapsible' => TRUE,
+    '#collapsed' => TRUE,
+    '#theme' => 'page_title_admin_settings'
+  );
+  
+  // List of all enabled languages
+  if (module_exists('locale')) {
+    $langs = locale_language_list();
+  } else {
+    $langs = array();
+  }
 
-
-  // Define the 'default' token patterns
-  $form['patterns']['pattern'] = array(
-    //Define the default pattern - this is a "fallback" pattern.
-    'page_title_default' => array(
+  // FALLBACKS - NO LOCALIZATION
+  $form['patterns']['general']['pattern']['page_title_default'] = array(
       '#title' => t('Default'),
       '#default_value' => variable_get('page_title_default', '[page-title] | [site-name]'),
       '#required' => TRUE,
-      '#description' => t('This pattern will be used as a <em>fallback</em> (ie, when no other pattern is defined)'),
-    ) + $pattern_form_element,
-
+      '#description' => t('Pattern used as a <em>fallback</em> (ie, when no other pattern is defined)'),
+  ) + $pattern_form_element;
+  $form['patterns']['general']['scope']['page_title_default'] = array('#type' => 'markup', '#value' => t('Global'), );
+  $form['patterns']['general']['language']['page_title_default'] = array('#type' => 'markup', '#value' => t('Independant'), );
+  
+  $key = 'page_title_front';
+  $form['patterns']['general']['scope'][$key] = array('#type' => 'markup', '#value' => t('Global'), );
+  $form['patterns']['general']['language'][$key] = array('#type' => 'markup', '#value' => t('Independant'), );
+  $form['patterns']['general']['pattern'][$key] = array(
+    '#title' => t('Frontpage'),
+    '#default_value' => variable_get($key, ''),
+    '#description' => t('Pattern used as a <em>fallback</em> for the frontpage <br>(ie, when no other pattern is defined for the frontpage)'),
+  ) + $pattern_form_element;
+  
+  $key = 'page_title_user';
+  $form['patterns']['general']['scope'][$key] = array('#type' => 'markup', '#value' => t('User'), );
+  $form['patterns']['general']['language'][$key] = array('#type' => 'markup', '#value' => t('Independant'), );
+  $form['patterns']['general']['pattern'][$key] = array(
+    '#title' => t('User Profile'),
+    '#default_value' => variable_get($key, ''),
+    '#description' => t('Pattern used as a <em>fallback</em> for the user profile <br>(ie, when no other pattern is defined for the user profile page)'),
+  ) + $pattern_form_element;
+  $form['patterns']['general']['showfield'][$key .'_showfield'] = array(
+      '#default_value' => variable_get($key .'_showfield', 0),
+  ) + $showfield_form_element;
+  
+  $key = 'page_title_blog';
+  $form['patterns']['general']['scope'][$key] = array('#type' => 'markup', '#value' => t('User'), );
+  $form['patterns']['general']['language'][$key] = array('#type' => 'markup', '#value' => t('Independant'), );
+  $form['patterns']['general']['pattern'][$key] = array(
+    '#title' => t('Blog Homepage'),
+    '#default_value' => variable_get($key, ''),
+    '#description' => t('Pattern used as a <em>fallback</em> for the blog homepages <br>(ie, when no other pattern is defined for the blog homepage)'),
+  ) + $pattern_form_element;
+  
+  $key = 'page_title_forum_root_title';
+  $form['patterns']['general']['scope'][$key] = array('#type' => 'markup', '#value' => t('User'), );
+  $form['patterns']['general']['language'][$key] = array('#type' => 'markup', '#value' => t('Independant'), );
+  $form['patterns']['general']['pattern'][$key] = array(
+    '#title' => t('Forum Root'),
+    '#default_value' => variable_get($key, ''),
+    '#description' => t('Pattern used as a <em>fallback</em> for forum roots <br>(ie, when no other pattern is defined for forum roots)'),
+  ) + $pattern_form_element;
+  
+  $key = 'page_title_pager_pattern';
+  $form['patterns']['specific']['scope'][$key] = array('#type' => 'markup', '#value' => t('Global'), );
+  $form['patterns']['specific']['language'][$key] = array('#type' => 'markup', '#value' => t('Independant'), );
+  $form['patterns']['specific']['pattern'][$key] = array(
+    '#title' => t('Pager Suffix'),
+    '#default_value' => variable_get($key, ''),
+    '#description' => t('Pattern used as a <em>fallback</em> for pager suffixes <br>(ie, when no other pattern is defined for pager suffixes)'),
+  ) + $pattern_form_element;
+  
+  $key = 'page_title_comment_reply';
+  $form['patterns']['specific']['scope'][$key] = array('#type' => 'markup', '#value' => t('Node'), );
+  $form['patterns']['specific']['language'][$key] = array('#type' => 'markup', '#value' => t('Independant'), );
+  $form['patterns']['specific']['pattern'][$key] = array(
+    '#title' => t('Comment Reply'),
+    '#default_value' => variable_get($key, ''),
+    '#description' => t('Pattern used as a <em>fallback</em> for comment replies <br>(ie, when no other pattern is defined for comment replies)'),
+  ) + $pattern_form_element;
+  
+  $key = 'page_title_comment_child_reply';
+  $form['patterns']['specific']['scope'][$key] = array('#type' => 'markup', '#value' => t('Node Comment'), );
+  $form['patterns']['specific']['language'][$key] = array('#type' => 'markup', '#value' => t('Independant'), );
+  $form['patterns']['specific']['pattern'][$key] = array(
+    '#title' => t('Comment Child Reply'),
+    '#default_value' => variable_get($key, ''),
+    '#description' => t('Pattern used as a <em>fallback</em> for child comment replies <br>(ie, when no other pattern is defined for child comment replies)'),
+  ) + $pattern_form_element;
+  
+  // PATTERNS THAT NEED LOCALISATION
+  foreach ($langs as $langcode => $langname){
+    
+    ////////////////////////////////////////////////////////
+    // GENERAL PATTERNS
+    
     // Define the frontpage pattern. This is use on <front>
-    'page_title_front' => array(
-      '#title' => t('Frontpage'),
-      '#default_value' => variable_get('page_title_front', '[site-name] | [site-slogan]'),
-      '#description' => t('This pattern will be used for the site frontpage'),
-    ) + $pattern_form_element,
-
+    $lang_key = 'page_title_front' . '_' . $langcode;
+    $form['patterns']['general']['pattern'][$lang_key] = array(
+      '#default_value' => variable_get($lang_key, '[site-name] | [site-slogan]'),
+      '#description' => t('Pattern used for the site frontpage'),
+    ) + $pattern_form_element;
+    $form['patterns']['general']['scope'][$lang_key] = array('#type' => 'markup', '#value' => t('Global'), );
+    $form['patterns']['general']['language'][$lang_key] = array('#type' => 'markup', '#value' => t('%lang', array('%lang' => $langname)), );
+    
+    // Define the user profile page pattern. This is used on any 'user/[0-9]' pages
+    if (module_exists('profile')) {
+      $lang_key = 'page_title_user' . '_' . $langcode;
+      $form['patterns']['general']['pattern'][$lang_key] = array(
+        '#default_value' => variable_get($lang_key, ''),
+        '#description' => t('Pattern used for any user profile pages'),
+      ) + $pattern_form_element;
+      $form['patterns']['general']['scope'][$lang_key] = array('#type' => 'markup', '#value' => t('User'), );
+      $form['patterns']['general']['language'][$lang_key] = array('#type' => 'markup', '#value' => t('%lang', array('%lang' => $langname)), );
+    }
+    
+    // Add the blog homepage pattern field
+    if (module_exists('blog')) {
+      $lang_key = 'page_title_blog' . '_' . $langcode;
+      $form['patterns']['general']['pattern'][$lang_key] = array(
+        '#default_value' => variable_get($lang_key, ''),
+        '#description' => t('Pattern used for a users blog page (ie <code>/blog/1</code>)'),
+      ) + $pattern_form_element;
+      $form['patterns']['general']['scope'][$lang_key] = array('#type' => 'markup', '#value' => t('User'), );
+      $form['patterns']['general']['language'][$lang_key] = array('#type' => 'markup', '#value' => t('%lang', array('%lang' => $langname)), );
+    }
+    
+    // Add the forum root pattern field
+    if (module_exists('forum')) {
+      $lang_key = 'page_title_forum_root_title' . '_' . $langcode;
+      $form['patterns']['general']['pattern'][$lang_key] = array(
+        '#default_value' => variable_get($lang_key, ''),
+        '#description' => t('Pattern used on the forum root page (ie, <code>/forum</code>)'),
+      ) + $pattern_form_element;
+      $form['patterns']['general']['scope'][$lang_key] = array('#type' => 'markup', '#value' => t('Global'));
+      $form['patterns']['general']['language'][$lang_key] = array('#type' => 'markup', '#value' => t('%lang', array('%lang' => $langname)), );
+    }
+    
+    /////////////////////////////////////////////////////
+    // SPECIFIC PATTERNS
+    
     // Define the pager pattern. This is appended to any page requests containing 'page=[0-9]+' in the query string
-    'page_title_pager_pattern' => array(
-      '#title' => t('Pager Suffix'),
-      '#default_value' => variable_get('page_title_pager_pattern', ''),
-      '#description' => t('This pattern will be appended to a page title for any given page with a pager on it'),
-    ) + $pattern_form_element,
-
+    $lang_key = 'page_title_pager_pattern' . '_' . $langcode;
+    $form['patterns']['specific']['pattern'][$lang_key] = array(
+      '#default_value' => variable_get($lang_key, ''),
+      '#description' => t('Pattern appended to a page title for any given page with a pager on it'),
+    ) + $pattern_form_element;
+    $form['patterns']['specific']['scope'][$lang_key] = array('#type' => 'markup', '#value' => t('Global'), );
+    $form['patterns']['specific']['language'][$lang_key] = array('#type' => 'markup', '#value' => t('%lang', array('%lang' => $langname)), );
+    
     // Define the comment reply pattern. This is used for a root comment reply (ie comment/[0-9]+).
-    'page_title_comment_reply' => array(
-      '#title' => t('Comment Reply'),
-      '#default_value' => variable_get('page_title_comment_reply', ''),
-      '#description' => t('This pattern will be used for comment reply pages, where the reply is directly to a "node"'),
-    ) + $pattern_form_element,
-
+    $lang_key = 'page_title_comment_reply' . '_' . $langcode;
+    $form['patterns']['specific']['pattern'][$lang_key] = array(
+      '#default_value' => variable_get($lang_key, ''),
+      '#description' => t('Pattern used for comment reply pages, where the reply is directly to a "node"'),
+    ) + $pattern_form_element;
+    $form['patterns']['specific']['scope'][$lang_key] = array('#type' => 'markup', '#value' => t('Node'), );
+    $form['patterns']['specific']['language'][$lang_key] = array('#type' => 'markup', '#value' => t('%lang', array('%lang' => $langname)), );
+    
     // Define the comment reply to comment pattern. This is used for a reply to a comment (ie comment/[0-9]+/[0-9]+).
-    'page_title_comment_child_reply' => array(
-      '#title' => t('Comment Child Reply'),
-      '#default_value' => variable_get('page_title_comment_child_reply', ''),
-      '#description' => t('This pattern with be used for comment reply pages where the reply is to an existing "comment" (eg a comment thread)'),
-    ) + $pattern_form_element,
-
-    // Define the user profile page pattern. This is used on any 'user/[0-9]' pages
-    'page_title_user' => array(
-      '#title' => t('User Profile'),
-      '#default_value' => variable_get('page_title_user', ''),
-      '#description' => t('This pattern will be used for any user profile pages'),
-    ) + $pattern_form_element,
-  );
-
-
-  // Define the "showfield" checkbox for the user profile page
-  $form['patterns']['showfield']['page_title_user_showfield'] = array(
-    '#default_value' => variable_get('page_title_user_showfield', 0),
-  ) + $showfield_form_element;
-
-
-  // Definate the patterns per-node-type
-  $types = node_get_types();
-  foreach ($types as $type) {
-    // Define the node-type key
-    $key = 'page_title_type_'. $type->type;
-
-    // Pattern entry
-    $form['patterns']['pattern'][$key] = array(
-      '#title' => t('Content Type - %type', array('%type' => $type->name)),
-      '#default_value' => variable_get($key, ''),
-      '#description' => t('This pattern will be used for all %type node-type pages', array('%type' => $type->name)),
+    $lang_key = 'page_title_comment_child_reply' . '_' . $langcode;
+    $form['patterns']['specific']['pattern'][$lang_key] = array(
+      '#default_value' => variable_get($lang_key, ''),
+      '#description' => t('Pattern used for comment reply pages where the reply is to an existing "comment" <br>(eg a comment thread)'),
     ) + $pattern_form_element;
-
-    $form['patterns']['showfield'][$key .'_showfield'] = array(
-      '#default_value' => variable_get($key .'_showfield', 0),
-    ) + $showfield_form_element;
-
-    $form['patterns']['scope'][$key] = array('#type' => 'markup', '#value' => t('Node'), );
-  }
-
-
-  // Definate the patterns per-vocab-type - if Taxonomy Module is enabled
+    $form['patterns']['specific']['scope'][$lang_key] = array('#type' => 'markup', '#value' => t('Node Comment'), );
+    $form['patterns']['specific']['language'][$lang_key] = array('#type' => 'markup', '#value' => t('%lang', array('%lang' => $langname)), );
+    
+  }; // end foreach $langs
+  
+  
+  /////////////////////////////////////////////////////
+  // TAXONOMY PATTERNS
+  // Define the patterns per-vocab-type - if Taxonomy Module is enabled
   if (module_exists('taxonomy')) {
+    
     $vocabs = taxonomy_get_vocabularies();
     foreach ($vocabs as $vocab) {
+      
       // Define the vocab key
-      $key = 'page_title_vocab_'. $vocab->vid;
-
-      // Pattern entry
-      $form['patterns']['pattern'][$key] = array(
+      $key = 'page_title_vocab'. '_' . $vocab->vid;
+      
+      // Fallback
+      $form['patterns']['taxonomy']['scope'][$key] = array('#type' => 'markup', '#value' => t('Taxonomy'), );
+      $form['patterns']['taxonomy']['language'][$key] = array('#type' => 'markup', '#value' => t('Independant'), );
+      $form['patterns']['taxonomy']['pattern'][$key] = array(
         '#title' => t('Vocabulary - %vocab_name', array('%vocab_name' => $vocab->name)),
-        '#default_value' => variable_get($key, ''),
-        '#description' => t('This pattern will be used for all %title term pages', array('%title' => $vocab->name)),
-      ) + $pattern_form_element;
-
-      $form['patterns']['showfield'][$key .'_showfield'] = array(
-        '#default_value' => variable_get($key .'_showfield', 0),
+        '#default_value' => t('No pattern possible'),
+      ) + $pattern_form_element;;
+      $form['patterns']['taxonomy']['showfield'][$key .'_showfield'] = array(
+          '#default_value' => variable_get($key .'_showfield', 0),
       ) + $showfield_form_element;
-
-      $form['patterns']['scope'][$key] = array('#type' => 'markup', '#value' => t('Taxonomy'), );
+  
+      // We define patterns for all the languages available in Drupal
+      foreach ($langs as $langcode => $langname){
+        // Key language dependant variables : pattern
+        $lang_key = $key . '_' . $langcode;
+        
+        // Pattern entry
+        $form['patterns']['taxonomy']['pattern'][$lang_key] = array(
+          '#default_value' => variable_get($lang_key, ''),
+          '#description' => t('Pattern used for all %title term pages', array('%title' => $vocab->name)),
+        ) + $pattern_form_element;
+        $form['patterns']['taxonomy']['language'][$lang_key] = array('#type' => 'markup', '#value' => t('%lang', array('%lang' => $langname)), );
+        $form['patterns']['taxonomy']['scope'][$lang_key] = array('#type' => 'markup', '#value' => t('Taxonomy'), );
+        }
+      
     }
   }
+  
+  /////////////////////////////////////////////////////
+  // CONTENT TYPES PATTERNS
+  // Define the patterns per-node-type
+  $types = node_get_types();
+  foreach ($types as $type) {
+    
+    // Define the node-type key
+    $key = 'page_title_type_'. $type->type;
 
-
-  // Add the blog homepage pattern field
-  if (module_exists('blog')) {
-    $key = 'page_title_blog';
-    $form['patterns']['pattern'][$key] = array(
-      '#title' => t('Blog Homepage'),
+    // Pattern entry
+    $form['patterns']['content_type']['scope'][$key] = array('#type' => 'markup', '#value' => t('Node'), );
+    $form['patterns']['content_type']['language'][$key] = array('#type' => 'markup', '#value' => t('Independant'), );
+    $form['patterns']['content_type']['pattern'][$key] = array(
+      '#title' => t('%type', array('%type' => $type->name)),
       '#default_value' => variable_get($key, ''),
-      '#description' => t('This pattern will be used for a users blog page (ie <code>/blog/1</code>)'),
+      '#description' => t('Pattern used as a <em>fallback</em> for all %type pages <br>(ie, when no other pattern is defined for that content type)', array('%type' => $type->name)),
     ) + $pattern_form_element;
 
-    $form['patterns']['scope'][$key] = array('#type' => 'markup', '#value' => t('User'), );
-  }
-
-
-  // Add the forum root pattern field
-  if (module_exists('forum')) {
-    $form['patterns']['pattern']['page_title_forum_root_title'] = array(
-      '#title' => t('Forum Root'),
-      '#default_value' => variable_get('page_title_forum_root_title', ''),
-      '#description' => t('This pattern will be used on the forum root page (ie, <code>/forum</code>)'),
-    ) + $pattern_form_element;
-    $form['patterns']['scope']['page_title_forum_root_title'] = array('#type' => 'markup', '#value' => t('Global'));
-  }
-
+    $form['patterns']['content_type']['showfield'][$key .'_showfield'] = array(
+      '#default_value' => variable_get($key .'_showfield', 0),
+    ) + $showfield_form_element;
+    
+    // We define patterns for all the languages available in Drupal
+    foreach ($langs as $langcode => $langname){
+      // Key language dependant variables : pattern
+      $lang_key = $key . '_' . $langcode;
+        
+      // Content Type Entry for language : pattern
+      $form['patterns']['content_type']['pattern'][$lang_key] = array(
+        '#default_value' => variable_get($lang_key, ''),
+      ) + $pattern_form_element;
+      
+      $form['patterns']['content_type']['language'][$lang_key] = array(
+        '#type' => 'markup', 
+        '#value' => t('%lang', array('%lang' => $langname))
+      );
+    } // end foreach $langs
+  } // end foreach $types
+
+  // We want to sort the pattern of the arrays alphabetically
+  // @TODO We should use weight instead to sort out rows
+  ksort($form['patterns']['general']['pattern']);
+  ksort($form['patterns']['specific']['pattern']);
 
   // Add the token help to a collapsed fieldset at the end of the configuration page.
   $form['token_help'] = array(
diff --git a/page_title.info b/page_title.info
index ba2d419..dd70989 100644
--- a/page_title.info
+++ b/page_title.info
@@ -3,9 +3,9 @@ name = Page Title
 description = "Enhanced control over the page title (in the &lt;head> tag)."
 dependencies[] = token
 core = 6.x
-; Information added by drupal.org packaging script on 2010-11-01
+; Information added by drupal.org packaging script on 2010-08-26
 version = "6.x-2.x-dev"
 core = "6.x"
 project = "page_title"
-datestamp = "1288570516"
+datestamp = "1282781730"
 
diff --git a/page_title.module b/page_title.module
index dc2ef96..3ded073 100644
--- a/page_title.module
+++ b/page_title.module
@@ -1,5 +1,5 @@
 <?php
-// $Id: page_title.module,v 1.18.2.54 2010/10/31 15:46:37 njt1982 Exp $
+// $Id: page_title.module,v 1.18.2.51 2010/08/25 13:40:28 njt1982 Exp $
 
 /**
  * @file
@@ -111,32 +111,63 @@ function page_title_theme() {
  * Updates settings after a node type change.
  */
 function page_title_node_type($op, $info) {
+  
+  // List of all enabled languages
+  if (module_exists('locale')) {
+    $langs = locale_language_list();
+  } else {
+    $langs = array();
+  }
+  
+  // Keys prefix
+  $oldkey_prefix = 'page_title_type_'. $info->old_type;
+  $newkey_prefix = 'page_title_type_'. $info->type;
+
   // Handle a content type rename
   if ($op == 'update' && !empty($info->old_type) && $info->type != $info->old_type) {
-    // Load the old node type settings.
-    $temp = variable_get('page_title_type_'. $info->old_type, '');
-
-    // If the settings aren't empty, then save them into the new type
-    if (!empty($temp)) {
-      variable_set('page_title_type_'. $info->type, $temp);
-    }
-
-    // Delete the old setting
-    variable_del('page_title_type_'. $info->old_type);
-
-    // Essentially, do the same as above but with the _showfield suffix for the node type
-    $temp = variable_get('page_title_type_'. $info->old_type .'_showfield', 0);
+    
+    // 1. Save showfield setting from old node type
+    $temp = variable_get($oldkey_prefix .'_showfield', 0);
     if ($temp) {
-      variable_set('page_title_type_'. $info->type .'_showfield', $temp);
+      variable_set($newkey_prefix .'_showfield', $temp);
     }
-    variable_del('page_title_type_'. $info->old_type .'_showfield');
-
+    variable_del($oldkey_prefix .'_showfield');
+    
+    // 2. Save patterns of old node type for each languages available on the system
+    foreach ($langs as $langcode => $langname) {
+      
+      // Key for the old and new node type per language
+      $oldkey_lang = $oldkey_prefix . '_' . $langcode;
+      $newkey_lang = $newkey_prefix . '_' . $langcode;
+
+      // Load the old node type setting
+      $temp = variable_get($oldkey_lang, '');
+      
+      // If the setting is not empty, then save it with the new type
+      if (!empty($temp)) {
+        variable_set($newkey_lang, $temp);
+      }
+      
+      // Delete the old setting
+      variable_del($oldkey_lang);
+    
+    } // end foreach $alllangs
+    
   }
 
-  // If deleted, remove the variables
+  // Handle a content type deletion
   if ($op == 'delete') {
-    variable_del('page_title_type_'. $info->type);
-    variable_del('page_title_type_'. $info->type .'_showfield');
+    
+    // Removing default pattern and showfield
+    variable_del($newkey_prefix);
+    variable_del($newkey_prefix .'_showfield');
+    
+    // Removing patterns associated to a language
+    foreach ($langs as $langcode => $langname) {
+      $newkey_lang = $newkey_prefix . '_' . $langcode;
+      variable_del($newkey_lang);
+    }
+    
   }
 }
 
@@ -145,15 +176,23 @@ function page_title_node_type($op, $info) {
  * Implementation of hook_form_alter().
  */
 function page_title_form_alter(&$form, $form_state, $form_id) {
+  
   // If we dont have permission to set the title then we need to abort this alter now!
   if (!user_access('set page title')) return;
 
   // Check we're editing a node and also check that the node type's 'show field' is enabled
   if ($form['#id'] == 'node-form') {
-    $key = 'page_title_type_'. $form['type']['#value'] .'_showfield';
-    if (variable_get($key, 0)) {
-      $page_title = isset($form['#node']->page_title) ? $form['#node']->page_title : NULL;
-
+    
+   $showfield_key = 'page_title_type_'. $form['type']['#value'] .'_showfield';
+    
+   if (variable_get($showfield_key, 0)) {
+     
+     $default_pattern_key = 'page_title_type_'. $form['type']['#value'];
+     // If a language exists for this node, we use the language related page title pattern, else we use the default pattern
+     $pattern_key = empty($form['#node']->language) ? $default_pattern_key : $default_pattern_key . '_' . $form['#node']->language;
+     
+     $page_title = isset($form['#node']->page_title) ? $form['#node']->page_title : variable_get($pattern_key, NULL);
+     
       // If we have vertical tabs installed, we need to render the form element slightly differently
       $show_vertical_tabs = FALSE;
       if (module_exists('vertical_tabs')) {
@@ -207,7 +246,6 @@ function page_title_form_alter(&$form, $form_state, $form_id) {
   }
 }
 
-
 /**
  * Implementation of hook_form_FORM_ID_alter().
  */
@@ -249,6 +287,43 @@ function page_title_form_forum_form_forum_alter(&$form, &$form_state) {
   }
 }
 
+/**
+ * Implementation of hook_form_FORM_ID_alter().
+ * Case when we're deleting a vocabulary, we need to remove variables from variable table
+ */
+function page_title_form_taxonomy_vocabulary_confirm_delete_alter(&$form, &$form_state) {
+ $form['#submit'][] = 'page_title_taxonomy_vocabulary_confirm_delete_submit';
+}
+
+/**
+ * Submit handler for the taxonomy_vocabulary_confirm_delete_submit element added in the hook_form_alter() above.
+ */
+function page_title_taxonomy_vocabulary_confirm_delete_submit($form, $form_state) {
+  // Remove all variables from {variable} table associated with the vocabulary deleted
+  // ie: begins with 'page_title_vocab_' and ends with '$lang'
+  $regexp = "^page_title_vocab(.)*_{1}$";
+  $query = "DELETE FROM {variable} WHERE name REGEXP '%s'";
+  db_query($query, $regexp);
+}
+
+/**
+ * Implementation of hook_form_FORM_ID_alter().
+ * Case when we're deleting a language, we need to remove variables from variable table
+ */
+function page_title_form_locale_languages_delete_form_alter(&$form, &$form_state) {
+ $form['#submit'][] = 'page_title_locale_languages_delete_form_submit';
+}
+
+/**
+ * Submit handler for the locale_languages_delete_form element added in the hook_form_alter() above.
+ */
+function page_title_locale_languages_delete_form_submit($form, $form_state) {
+  // Remove all variables from variable table associated to the language deleted
+  // ie: begins with 'page_title_' and ends with '$lang'
+  $regexp = "^page_title_(.)*_" . $form['langcode']['#value'] . "{1}$";
+  $query = "DELETE FROM {variable} WHERE name REGEXP '%s'";
+  db_query($query, $regexp);
+}
 
 /**
  * Implementation of hook_form_FORM_ID_alter().
@@ -283,6 +358,10 @@ function page_title_form_user_profile_form_alter(&$form, &$form_state) {
  * Implementation of hook_form_FORM_ID_alter().
  */
 function page_title_form_node_type_form_alter(&$form, &$form_state) {
+  
+  // key by content type
+  $key = 'page_title_type_'. $form['#node_type']->type;
+  
   // Alter the node type form - allows easy access to the per-content type page title settings
   $form['page_title'] = array(
     '#type' => 'fieldset',
@@ -299,13 +378,13 @@ function page_title_form_node_type_form_alter(&$form, &$form_state) {
     '#options' => array(
       'show_field' => t('Show field'),
     ),
-    '#default_value' => variable_get('page_title_type_'. $form['#node_type']->type .'_showfield', 0) ? array('show_field') : array(),
+    '#default_value' => variable_get( $key .'_showfield', 0) ? array('show_field') : array(),
   );
 
   $form['page_title']['pattern'] = array(
     '#type' => 'textfield',
     '#title' => t('Page Title Pattern'),
-    '#default_value' => variable_get('page_title_type_'. $form['#node_type']->type, ''),
+    '#default_value' => variable_get( $key , ''),
     '#description' => t('Enter the <em>Page Title</em> pattern you want to use for this node type. For more information, please use the !link settings page', array('!link' => l('Page Title', 'admin/content/page_title'))),
   );
 
@@ -317,9 +396,13 @@ function page_title_form_node_type_form_alter(&$form, &$form_state) {
  * Submit handler for the node_type_form element added in the hook_form_alter() above.
  */
 function page_title_node_type_form_submit($form, &$form_state) {
+  
+  $key_type = 'page_title_type_'. $form_state['values']['type'];
+  
   $show_field = $form_state['values']['page_title']['show_field']['show_field'] ? 1 : 0;
-  variable_set('page_title_type_'. $form_state['values']['type'] .'_showfield', $show_field);
-  variable_set('page_title_type_'. $form_state['values']['type'], $form_state['values']['page_title']['pattern']);
+  
+  variable_set($key_type .'_showfield', $show_field);
+  variable_set($key_type, $form_state['values']['page_title']['pattern']);
 
   // For some reason the node module adds the fieldset as a separate entry in the variables table... we dont want this!
   variable_del('page_title_'. $form_state['values']['type']);
@@ -441,7 +524,7 @@ function page_title_load_title($id, $type) {
 
 /**
  * Wrapper for old function...
- * NOTE: This has been depricated in favor of page_title_load_title().
+ * @deprecated Use page_title_load_title() instead.
  */
 function page_title_node_get_title($nid) {
   return page_title_load_title($nid, 'node');
@@ -450,7 +533,7 @@ function page_title_node_get_title($nid) {
 
 /**
  * Legacy page title setting function...
- * NOTE: This has been deprecated in favour of hook_page_title_alter().
+ * @deprecated Use hook_page_title_alter() instead.
  */
 function page_title_set_title($title = NULL) {
   static $stored_title;
@@ -490,20 +573,28 @@ function page_title_page_get_title($raw = FALSE) {
       call_user_func_array($function, $data);
     }
 
-    // If pattern is emtpy (either if the type is not overridable or simply not set) fallback to the default pattern)
-    if (empty($page_title_pattern)) {
-      $page_title_pattern = variable_get('page_title_default', '[page-title] | [site-name]');
+    if (empty($page_title_pattern)){
+      // pattern is still not set -> fallback to default global pattern
+      $page_title_pattern = empty($page_title_pattern) ?  variable_get('page_title_default', '[page-title] | [site-name]') : '';
     }
 
     // Append the pattern for pages with a pager on them
-    $page_title_pattern .= isset($_REQUEST['page']) ? variable_get('page_title_pager_pattern', '') : '';
+    global $language;
+    $default_key = 'page_title_pager_pattern';
+    $lang_key = $default_key . '_' . $language->language;
+    $pager_pattern = variable_get($lang_key, '');
+    // Fallback for pager
+    if(empty($pager_pattern)){
+      $pager_pattern = variable_get($default_key, '[page-title] | [site-name]');
+    }
+    $page_title_pattern .= isset($_REQUEST['page']) ? $pager_pattern : '';
 
     // Apply token patterns by resetting the token cache first and then using token_replace_multiple to insert token values
     token_get_values('global', NULL, TRUE);
     $title = token_replace_multiple($page_title_pattern, $types);
   }
 
-  // Trim trailing whitespace from the title
+  // Trimi trailing whitespace from the title
   $title = trim($title);
 
   // Use filter_xss to remove any tags and to entity encode content.
@@ -589,7 +680,6 @@ function _page_title_build_views_keys($view_name, $display_id) {
   return 'page_title-'. implode('-', array_filter(array($view_name, $display_id)));
 }
 
-
 /**
  * Form Alter handler for the views ui config form (used for filters and args)
  */
diff --git a/tests/page_title.test b/tests/page_title.test
index 1c79ae8..26ce11b 100644
--- a/tests/page_title.test
+++ b/tests/page_title.test
@@ -1,5 +1,5 @@
 <?php
-// $Id: page_title.test,v 1.1.2.2 2010/10/31 13:03:36 njt1982 Exp $
+// $Id: page_title.test,v 1.1.2.1 2010/08/24 23:08:51 njt1982 Exp $
 
 /**
  * @file
@@ -70,7 +70,7 @@ class PageTitleTestCase extends DrupalWebTestCase {
     );
 
     // Save the settings
-    $this->drupalPost('admin/settings/page-title', $settings, t('Save configuration'));
+    $this->drupalPost('admin/content/page-title', $settings, t('Save configuration'));
     $this->assertText(t('The configuration options have been saved.'), t('The configuration saved message was found'), 'Page Title');
 
 
@@ -92,7 +92,7 @@ class PageTitleTestCase extends DrupalWebTestCase {
     /**
      * Lets check a "default" page, such a the page title admin form
      */
-    $this->drupalGet('admin/settings/page-title');
+    $this->drupalGet('admin/content/page-title');
     $title = '<title>'. $settings['page_title_default'] .'</title>';
     $this->pass(check_plain($title));
     $title = str_replace('[page-title]', 'Page title', $title);
diff --git a/tests/page_title_views_test.info b/tests/page_title_views_test.info
index 14fc2e7..186837b 100644
--- a/tests/page_title_views_test.info
+++ b/tests/page_title_views_test.info
@@ -5,9 +5,9 @@ package = Development
 dependencies[] = page_title
 dependencies[] = views
 
-; Information added by drupal.org packaging script on 2010-11-01
+; Information added by drupal.org packaging script on 2010-08-26
 version = "6.x-2.x-dev"
 core = "6.x"
 project = "page_title"
-datestamp = "1288570516"
+datestamp = "1282781730"
 
