Index: /extensions/plugin_lang_analysis/admin.php
===================================================================
--- /extensions/plugin_lang_analysis/admin.php	(revision 23471)
+++ /extensions/plugin_lang_analysis/admin.php	(revision 23472)
@@ -7,8 +7,8 @@
 
 include_once(PLA_PATH . 'include/functions.inc.php');
-include_once(PHPWG_ROOT_PATH . '/admin/include/plugins.class.php');
+include_once(PHPWG_ROOT_PATH . 'admin/include/plugins.class.php');
 $plugins = new plugins();
 
-/* PLUGINS LIST */
+/* SELECT */
 if (!isset($_GET['plugin_id']))
 {
@@ -20,5 +20,5 @@
 }
 
-/* FILES LIST */
+/* CONFIG */
 else if (!isset($_GET['analyze']))
 {
@@ -45,7 +45,7 @@
   foreach ($files as &$file)
   {
-    if (isset($saved_files[$file]))
-    {
-      $file = $saved_files[$file];
+    if (isset($saved_files[ $file ]))
+    {
+      $file = $saved_files[ $file ];
       $file['lang_files'] = array_intersect($file['lang_files'], array_keys($language_files));
     }
@@ -65,9 +65,11 @@
     'PLA_PLUGIN' => $plugins->fs_plugins[ $_GET['plugin_id'] ],
     'PLA_FILES' => $files,
-    'PLA_LANG_FILES' => $language_files,
+    'PLA_LANG_FILES' => array_keys($language_files),
     'F_ACTION' => PLA_ADMIN.'&amp;plugin_id='.$_GET['plugin_id'].'&amp;analyze',
     'U_BACK' => PLA_ADMIN,
     ));
 }
+
+/* ANALYSIS */
 else
 {
@@ -78,5 +80,5 @@
     foreach ($_POST['files'] as $file => $data)
     {
-      $files[$file] = array(
+      $files[ $file ] = array(
         'path' => $file,
         'is_admin' => $data['is_admin']=='true',
@@ -85,5 +87,5 @@
       if (!empty($data['lang_files']))
       {
-        $files[$file]['lang_files'] = array_keys(array_filter($data['lang_files'], create_function('$f', 'return $f=="true";')));
+        $files[ $file ]['lang_files'] = array_keys(array_filter($data['lang_files'], create_function('$f', 'return $f=="true";')));
       }
     }
@@ -125,8 +127,8 @@
   }
   
-  // analyze
+  // analyse
   foreach ($strings as $string => &$string_data)
   {
-    // find where teh string is defined
+    // find where the string is defined
     $string_data['in_common'] = array_key_exists($string, $lang_common);
     $string_data['in_admin'] = array_key_exists($string, $lang_admin);
@@ -137,8 +139,14 @@
     }
     
+    // very rare case
+    if (count($string_data['in_plugin'])>1)
+    {
+      $string_data['warnings'][] = l10n('This string is translated in multiple files');
+    }
+    
     $missing = $useless = $ok = false;
     $string_data['is_admin'] = true;
     
-    // analyze for each file where the string exists
+    // analyse for each file where the string exists
     foreach ($string_data['files'] as $file => &$file_data)
     {
@@ -147,13 +155,5 @@
       
       // find if the string is translated in one of the language files included in this file
-      $exists = false;
-      foreach ($file_data['lang_files'] as $lang_file)
-      {
-        if (in_array($lang_file, $string_data['in_plugin']))
-        {
-          $exists = true;
-          break;
-        }
-      }
+      $exists = count(array_intersect($file_data['lang_files'], $string_data['in_plugin'])) > 0;
       
       // useless if translated in the plugin AND in common or admin
@@ -193,4 +193,10 @@
     else
     {
+      // another very rare case
+      if ($useless)
+      {
+        $string_data['warnings'][] = l10n('This string is useless in some files');
+      }
+      
       $string_data['stat'] = 'ok';
       $counts['ok']++;
@@ -199,5 +205,5 @@
   unset($string_data);
   
-  uksort($strings, 'strnatcasecmp');
+  uksort($strings, 'strnatcasecmp'); // natural sort
   $counts['total'] = array_sum($counts);
   
@@ -206,5 +212,5 @@
     'PLA_PLUGIN' => $plugins->fs_plugins[ $_GET['plugin_id'] ],
     'PLA_STRINGS' => $strings,
-    'PLA_LANG_FILES' => $language_files,
+    'PLA_LANG_FILES' => array_keys($language_files),
     'PLA_COUNTS' => $counts,
     'U_BACK' => PLA_ADMIN.'&amp;plugin_id='.$_GET['plugin_id'],
@@ -215,5 +221,5 @@
 $template->assign(array(
   'PLA_PATH'=> PLA_PATH, 
-  'PLA_ABS_PATH'=> realpath(PLA_PATH), 
+  'PLA_ABS_PATH'=> realpath(PLA_PATH).'/', 
   'PLA_ADMIN' => PLA_ADMIN,
   ));
Index: /extensions/plugin_lang_analysis/template/analysis.tpl
===================================================================
--- /extensions/plugin_lang_analysis/template/analysis.tpl	(revision 23472)
+++ /extensions/plugin_lang_analysis/template/analysis.tpl	(revision 23472)
@@ -0,0 +1,130 @@
+{footer_script}{literal}
+$('.strings tr.string td.toggler').click(function() {
+  if ($(this).hasClass('iconpla-plus-circled')) {
+    $(this).removeClass('iconpla-plus-circled').addClass('iconpla-minus-circled');
+    $(this).parent().nextUntil('tr.string').show();
+  }
+  else {
+    $(this).removeClass('iconpla-minus-circled').addClass('iconpla-plus-circled');
+    $(this).parent().nextUntil('tr.string').hide();
+  }
+});
+
+$('.strings tr.string').hover(
+  function() {
+    $(this).addClass('hover').nextUntil('tr.string').addClass('hover');
+  },
+  function() {
+    $(this).removeClass('hover').nextUntil('tr.string').removeClass('hover');
+  }
+);
+$('.strings tr.file').hover(
+  function() {
+    $(this).prevAll('tr.string:first').addClass('hover').nextUntil('tr.string').addClass('hover');
+  },
+  function() {
+    $(this).prevAll('tr.string:first').removeClass('hover').nextUntil('tr.string').removeClass('hover');
+  }
+);
+
+$('.open-all').click(function() {
+  $('.strings tr.string td.toggler').removeClass('iconpla-plus-circled').addClass('iconpla-minus-circled');
+  $('.strings tr.file').show();
+});
+$('.open-missing').click(function() {
+  $('.strings tr.string.missing td.toggler').removeClass('iconpla-plus-circled').addClass('iconpla-minus-circled');
+  $('.strings tr.file.string-missing').show();
+});
+$('.close-all').click(function() {
+  $('.strings tr.string td.toggler').removeClass('iconpla-minus-circled').addClass('iconpla-plus-circled');
+  $('.strings tr.file').hide();
+});
+
+$('.tiptip').tipTip({
+  delay: 0,
+  fadeIn: 200,
+  fadeOut: 200,
+  defaultPosition: 'right'
+});
+{/literal}{/footer_script}
+
+{html_style}
+.strings tr td:nth-last-child(-n+{math equation="2+x" x=$PLA_LANG_FILES|@count}) {ldelim}
+  text-align:center;
+}
+{/html_style}
+
+<fieldset>
+  <legend>{'Analysis results'|@translate}</legend>
+  
+  <p style="text-align:left;">
+    <a class="open-all">{'Expand all'|@translate}</a>
+    / <a class="open-missing">{'Expand missing'|@translate}</a>
+    / <a class="close-all">{'Collapse all'|@translate}</a>
+  </p>
+  
+  <table class="strings">
+  <thead>
+    <tr>
+      <th></th>
+      <th class="legend">
+        <span class="missing">{'Missing'|@translate}</span>
+        <span class="useless">{'Useless'|@translate}</span>
+      </th>
+      <th>{'Dependency'|@translate}</th>
+    {foreach from=$PLA_LANG_FILES item=lang_file}
+      <th>{$lang_file}</th>
+    {/foreach}
+      <th>common.lang</th>
+      <th>admin.lang</th>
+    </tr>
+  </thead>
+    
+  <tbody>
+  {foreach from=$PLA_STRINGS item=data key=string}
+    <!-- begin string -->
+    <tr class="string {$data.stat}">
+      <td class="toggler iconpla-plus-circled"></td>
+      <td>
+        {$string|htmlspecialchars}
+        {if isset($data.warnings)}<span class="iconpla-attention-circled tiptip" title="{'<br>'|@implode:$data.warning}"></span>{/if}
+      </td>
+      {if $data.is_admin}<td class="text-admin">{'Admin'|@translate}</td>
+      {else}<td class="text-common">{'Common'|@translate}</td>{/if}
+    {foreach from=$PLA_LANG_FILES item=lang_file}
+      <td>{if $lang_file|in_array:$data.in_plugin}<b>{'Yes'|@translate}</b>{else}{'No'|@translate}{/if}</td>
+    {/foreach}
+      <td>{if $data.in_common}<b>{'Yes'|@translate}</b>{else}{'No'|@translate}{/if}</td>
+      <td>{if $data.in_admin}<b>{'Yes'|@translate}</b>{else}{'No'|@translate}{/if}</td>
+    </tr>
+    {foreach from=$data.files item=file_data key=file}
+      <!-- begin file -->
+      <tr class="file string-{$data.stat} {$file_data.stat}">
+        <td></td>
+        <td>{$file} <i>({', '|@implode:$file_data.lines})</i></td>
+        {if $file_data.is_admin}<td class="text-admin">{'Admin'|@translate}</td>
+        {else}<td class="text-common">{'Common'|@translate}</td>{/if}
+      {foreach from=$PLA_LANG_FILES item=lang_file}
+        <td>{if $lang_file|in_array:$file_data.lang_files}<b>{'Yes'|@translate}</b>{else}{'No'|@translate}{/if}</td>
+      {/foreach}
+        <td></td>
+        <td></td>
+      </tr>
+    {/foreach} {* <!-- end file --> *}
+  {/foreach} {* <!-- end string --> *}
+  </tbody>
+  
+  <tfoot>
+    <tr>
+      <th></th>
+      <th>{'%d strings : %d missing and %d useless.'|@translate|sprintf:$PLA_COUNTS.total:$PLA_COUNTS.missing:$PLA_COUNTS.useless}</th>
+      <th></th>
+    {foreach from=$PLA_LANG_FILES item=path key=lang_file}
+      <th></th>
+    {/foreach}
+      <th></th>
+      <th></th>
+    </tr>
+  </tfoot>
+  </table>
+</fieldset>
Index: /extensions/plugin_lang_analysis/template/config.tpl
===================================================================
--- /extensions/plugin_lang_analysis/template/config.tpl	(revision 23472)
+++ /extensions/plugin_lang_analysis/template/config.tpl	(revision 23472)
@@ -0,0 +1,65 @@
+{footer_script}{literal}
+$('.switch-button.type span').click(function() {
+  $(this).siblings('span').removeClass('active');
+  $(this).addClass('active');
+  
+  if ($(this).hasClass('common')) {
+    $(this).nextAll('input').val('false');
+  }
+  else {
+    $(this).nextAll('input').val('true');
+  }
+});
+
+$('.switch-button.other span').click(function() {
+  if ($(this).hasClass('active')) {
+    $(this).removeClass('active');
+    $(this).next('input').val('false');
+  }
+  else {
+    $(this).addClass('active');
+    $(this).next('input').val('true');
+  }
+});
+{/literal}{/footer_script}
+
+<form method="POST" action="{$F_ACTION}" class="properties">
+<fieldset>
+  <legend>{'Select dependencies'|@translate}</legend>
+  
+  <table class="files">
+  <thead>
+    <tr>
+      <th></th>
+      <th>{'Core dependency'|@translate}</th>
+      <th>{'Local dependencies'|@translate}</th>
+    </tr>
+  </thead>
+  
+  <tbody>
+  {foreach from=$PLA_FILES item=file}
+    <tr>
+      <td>{$file.path}</td>
+      <td>
+        <div class="switch-button type">
+          <span class="item common {if not $file.is_admin}active{/if}">{'Common'|@translate}</span>
+          <span class="item admin {if $file.is_admin}active{/if}">{'Admin'|@translate}</span>
+          <input type="hidden" name="files[{$file.path}][is_admin]" value="{if $file.is_admin}true{else}false{/if}">
+        </div>
+      </td>
+      <td>
+        <div class="switch-button other">
+        {foreach from=$PLA_LANG_FILES item=lang_file}
+          <span class="item other {if $lang_file|in_array:$file.lang_files}active{/if}">{$lang_file}</span>
+          <input type="hidden" name="files[{$file.path}][lang_files][{$lang_file}]" value="{if $lang_file|in_array:$file.lang_files}true{else}false{/if}">
+        {/foreach}
+        </div>
+      </td>
+    </tr>
+  {/foreach}
+  </tbody>
+  </table>
+  
+  <p class="formButtons"><input type="submit" value="{'Continue'|@translate}"></p>
+</fieldset>
+</form>
Index: /extensions/plugin_lang_analysis/template/main.tpl
===================================================================
--- /extensions/plugin_lang_analysis/template/main.tpl	(revision 23471)
+++ /extensions/plugin_lang_analysis/template/main.tpl	(revision 23472)
@@ -1,268 +1,15 @@
-{combine_css path=$PLA_PATH|@cat:"template/style.css"}
-{combine_css path=$PLA_PATH|@cat:"template/fontello/css/fontello_pla.css"}
-
+{combine_css path=$PLA_PATH|cat:'template/style.css'}
+{combine_css path=$PLA_PATH|cat:'template/fontello/css/fontello_pla.css'}
 
 <div class="titrePage">
-	<h2>Plugin Language Analysis</h2>
+	<h2>
+    Plugin Language Analysis
+    {if isset($PLA_PLUGIN)}[{$PLA_PLUGIN.name}]{/if}
+  </h2>
 </div>
+
+{include file=$PLA_ABS_PATH|cat:'template/'|cat:$PLA_STEP|cat:'.tpl'}
 
 {if isset($U_BACK)}
 <p style="text-align:left;margin-left:20px;"><a href="{$U_BACK}" class="buttonLike">{'Back'|@translate}</a></p>
 {/if}
-
-
-{* <!-- select --> *}
-{if $PLA_STEP=='select'}
-{footer_script}{literal}
-$('form#pla').submit(function() {
-  window.location.href = location.href + '&plugin_id=' + $(this).find('select').val();
-  return false;
-});
-{/literal}{/footer_script}
-
-<form method="GET" action="{$F_ACTION}" class="properties" id="pla">
-<fieldset>
-  <legend>{'How to use?'|@translate}</legend>
-
-  <p>
-    This tool analyzes each file of the selected plugin, searching for <b>l10n</b>, <b>l10n_dec</b> and <b>translate</b> functions.<br>
-    Then it compares the matched strings to the content of the plugin language file and the common and admin core language files.<br>
-    Each file of the plugin can be configured as <b>Common</b> (public) or <b>Admin</b>.<br>
-    <br>
-    When the analysis is complete, each string can have one of these three status :
-  </p>
-  
-  <dl style="margin-left:30px;">
-    <dt class="iconpla-attention">missing</dt>
-    <dd>
-      not in the plugin language file<br>
-      <b>AND</b> not in the common language file<br>
-      <b>AND</b> (<br>
-      &nbsp;&nbsp;&nbsp;&nbsp;belonging to at least one common file<br>
-      &nbsp;&nbsp;&nbsp;&nbsp;<b>OR</b> not in the admin language file<br>
-      )
-    </dd>
-  
-    <dt class="iconpla-attention-circled">useless</dt>
-    <dd>
-      in the plugin language file<br>
-      <b>AND</b> (<br>
-      &nbsp;&nbsp;&nbsp;&nbsp;in the common language file<br>
-      &nbsp;&nbsp;&nbsp;&nbsp;<b>OR</b> (<br>
-      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;not belonging to any common file<br>
-      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b>AND</b> in the admin language file<br>
-      &nbsp;&nbsp;&nbsp;&nbsp;)<br>
-      )
-    </dd>
-  
-    <dt class="iconpla-ok-squared">ok</dt>
-    <dd>
-      any other case
-    </dd>
-  </dl>
-  
-  <p>
-    You can click the <span class="iconpla-plus-circled"></span> icon on the left of each string to see where it is located.
-  </p>
-</fieldset>
-
-<fieldset>
-  <legend>{'Select a plugin'|@translate}</legend>
-  
-  <select name="plugin_id">
-  {foreach from=$PLA_PLUGINS item=plugin key=plugin_id}
-    <option value="{$plugin_id}">{$plugin.name} ({$plugin.version})</option>
-  {/foreach}
-  </select>
-
-  <p class="formButtons"><input type="submit" value="{'Continue'|@translate}"></p>
-</fieldset>
-</form>
-
-{* <!-- configure --> *}
-{elseif $PLA_STEP=='config'}
-{footer_script}{literal}
-$('.switch-button.type span').click(function() {
-  $(this).siblings('span').removeClass('active');
-  $(this).addClass('active');
-  
-  if ($(this).hasClass('common')) {
-    $(this).nextAll('input').val('false');
-  }
-  else {
-    $(this).nextAll('input').val('true');
-  }
-});
-$('.switch-button.other span').click(function() {
-  if ($(this).hasClass('active')) {
-    $(this).removeClass('active');
-    $(this).next('input').val('false');
-  }
-  else {
-    $(this).addClass('active');
-    $(this).next('input').val('true');
-  }
-});
-{/literal}{/footer_script}
-
-<form method="POST" action="{$F_ACTION}" class="properties">
-<fieldset>
-  <legend>{'Select dependencies'|@translate}</legend>
-  
-  <table class="files">
-  <thead>
-    <tr>
-      <th></th>
-      <th>{'Core dependency'|@translate}</th>
-      <th>{'Local dependencies'|@translate}</th>
-    </tr>
-  </thead>
-  
-  <tbody>
-  {foreach from=$PLA_FILES item=file}
-    <tr>
-      <td>{$file.path}</td>
-      <td>
-        <div class="switch-button type">
-          <span class="item common {if not $file.is_admin}active{/if}">{'Common'|@translate}</span>
-          <span class="item admin {if $file.is_admin}active{/if}">{'Admin'|@translate}</span>
-          <input type="hidden" name="files[{$file.path}][is_admin]" value="{if $file.is_admin}true{else}false{/if}">
-        </div>
-      </td>
-      <td>
-        <div class="switch-button other">
-        {foreach from=$PLA_LANG_FILES item=path key=lang_file}
-          <span class="item other {if $lang_file|in_array:$file.lang_files}active{/if}">{$lang_file}</span>
-          <input type="hidden" name="files[{$file.path}][lang_files][{$lang_file}]" value="{if $lang_file|in_array:$file.lang_files}true{else}false{/if}">
-        {/foreach}
-        </div>
-      </td>
-    </tr>
-  {/foreach}
-  </tbody>
-  </table>
-  
-  <p class="formButtons"><input type="submit" value="{'Continue'|@translate}"></p>
-</fieldset>
-</form>
-
-{* <!-- analysis --> *}
-{elseif $PLA_STEP=='analysis'}
-{footer_script}{literal}
-$('.strings tr.string td.toggler').click(function() {
-  if ($(this).hasClass('iconpla-plus-circled')) {
-    $(this).removeClass('iconpla-plus-circled').addClass('iconpla-minus-circled');
-    $(this).parent().nextUntil('tr.string').show();
-  }
-  else {
-    $(this).removeClass('iconpla-minus-circled').addClass('iconpla-plus-circled');
-    $(this).parent().nextUntil('tr.string').hide();
-  }
-});
-
-$('.strings tr.string').hover(
-  function() {
-    $(this).addClass('hover').nextUntil('tr.string').addClass('hover');
-  },
-  function() {
-    $(this).removeClass('hover').nextUntil('tr.string').removeClass('hover');
-  }
-);
-$('.strings tr.file').hover(
-  function() {
-    $(this).prevAll('tr.string:first').addClass('hover').nextUntil('tr.string').addClass('hover');
-  },
-  function() {
-    $(this).prevAll('tr.string:first').removeClass('hover').nextUntil('tr.string').removeClass('hover');
-  }
-);
-
-$('.open-all').click(function() {
-  $('.strings tr.file').show();
-});
-$('.open-missing').click(function() {
-  $('.strings tr.file.string-missing').show();
-});
-$('.close-all').click(function() {
-  $('.strings tr.file').hide();
-});
-{/literal}{/footer_script}
-
-{html_style}
-.strings tr td:nth-last-child(-n+{math equation="2+x" x=$PLA_LANG_FILES|@count}) {ldelim}
-  text-align:center;
-}
-{/html_style}
-
-<fieldset>
-  <legend>{$PLA_PLUGIN.name}</legend>
-  
-  <p style="text-align:left;">
-    <a class="open-all">{'Expand all'|@translate}</a>
-    / <a class="open-missing">{'Expand missing'|@translate}</a>
-    / <a class="close-all">{'Collapse all'|@translate}</a>
-  </p>
-  
-  <table class="strings">
-  <thead>
-    <tr>
-      <th></th>
-      <th class="legend">
-        <span class="missing">{'Missing'|@translate}</span>
-        <span class="useless">{'Useless'|@translate}</span>
-      </th>
-      <th>{'Dependency'|@translate}</th>
-    {foreach from=$PLA_LANG_FILES item=path key=lang_file}
-      <th>{$lang_file}</th>
-    {/foreach}
-      <th>common.lang</th>
-      <th>admin.lang</th>
-    </tr>
-  </thead>
-    
-  <tbody>
-  {foreach from=$PLA_STRINGS item=data key=string}
-    <!-- begin string -->
-    <tr class="string {$data.stat}">
-      <td class="toggler iconpla-plus-circled"></td>
-      <td>{$string|htmlspecialchars}</td>
-      {if $data.is_admin}<td class="text-admin">{'Admin'|@translate}</td>
-      {else}<td class="text-common">{'Common'|@translate}</td>{/if}
-    {foreach from=$PLA_LANG_FILES item=path key=lang_file}
-      <td>{if $lang_file|in_array:$data.in_plugin}<b>{'Yes'|@translate}</b>{else}{'No'|@translate}{/if}</td>
-    {/foreach}
-      <td>{if $data.in_common}<b>{'Yes'|@translate}</b>{else}{'No'|@translate}{/if}</td>
-      <td>{if $data.in_admin}<b>{'Yes'|@translate}</b>{else}{'No'|@translate}{/if}</td>
-    </tr>
-    {foreach from=$data.files item=file_data key=file}
-      <!-- begin file -->
-      <tr class="file string-{$data.stat} {$file_data.stat}">
-        <td></td>
-        <td>{$file} <i>({', '|@implode:$file_data.lines})</i></td>
-        {if $file_data.is_admin}<td class="text-admin">{'Admin'|@translate}</td>
-        {else}<td class="text-common">{'Common'|@translate}</td>{/if}
-      {foreach from=$PLA_LANG_FILES item=path key=lang_file}
-        <td>{if $lang_file|in_array:$file_data.lang_files}<b>{'Yes'|@translate}</b>{else}{'No'|@translate}{/if}</td>
-      {/foreach}
-        <td></td>
-        <td></td>
-      </tr>
-    {/foreach} {* <!-- end file --> *}
-  {/foreach} {* <!-- end string --> *}
-  </tbody>
-  
-  <tfoot>
-    <tr>
-      <th></th>
-      <th>{'%d strings : %d missing and %d useless.'|@translate|sprintf:$PLA_COUNTS.total:$PLA_COUNTS.missing:$PLA_COUNTS.useless}</th>
-      <th></th>
-      <th></th>
-      <th></th>
-      <th></th>
-      <th></th>
-    </tr>
-  </tfoot>
-  </table>
-</fieldset>
-
-{/if}
Index: /extensions/plugin_lang_analysis/template/select.tpl
===================================================================
--- /extensions/plugin_lang_analysis/template/select.tpl	(revision 23472)
+++ /extensions/plugin_lang_analysis/template/select.tpl	(revision 23472)
@@ -0,0 +1,73 @@
+{footer_script}{literal}
+$('form#pla').submit(function() {
+  window.location.href = location.href + '&plugin_id=' + $(this).find('select').val();
+  return false;
+});
+{/literal}{/footer_script}
+
+<form method="GET" action="{$F_ACTION}" class="properties" id="pla">
+<fieldset>
+  <legend>{'Select a plugin'|@translate}</legend>
+  
+  <select name="plugin_id">
+  {foreach from=$PLA_PLUGINS item=plugin key=plugin_id}
+    <option value="{$plugin_id}">{$plugin.name} ({$plugin.version})</option>
+  {/foreach}
+  </select>
+
+  <p class="formButtons"><input type="submit" value="{'Continue'|@translate}"></p>
+</fieldset>
+
+<fieldset>
+  <legend>{'How to use?'|@translate}</legend>
+
+  <p>
+    This tool analyses each file of the selected plugin, searching for <b>l10n</b>, <b>l10n_dec</b> and <b>translate</b> functions.<br>
+    Then it compares the matched strings to the content of the plugin's language files and the common and admin core language files.<br>
+    Each file of the plugin can be configured as <b>Common</b> (public) or <b>Admin</b> and can be attached to one or more plugin's language files.<br>
+    <br>
+    When the analysis is complete, each string can have one of these three status :
+  </p>
+  
+  <dl style="margin-left:30px;">
+    <dt class="iconpla-attention">missing :</dt>
+    <dd>
+      not in the plugin language file<br>
+      <b>AND</b> not in the common language file<br>
+      <b>AND</b> (<br>
+      &nbsp;&nbsp;&nbsp;&nbsp;belonging to at least one common file<br>
+      &nbsp;&nbsp;&nbsp;&nbsp;<b>OR</b> not in the admin language file<br>
+      )
+    </dd>
+  
+    <dt class="iconpla-attention-circled">useless :</dt>
+    <dd>
+      in the plugin language file<br>
+      <b>AND</b> (<br>
+      &nbsp;&nbsp;&nbsp;&nbsp;in the common language file<br>
+      &nbsp;&nbsp;&nbsp;&nbsp;<b>OR</b> (<br>
+      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;not belonging to any common file<br>
+      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b>AND</b> in the admin language file<br>
+      &nbsp;&nbsp;&nbsp;&nbsp;)<br>
+      )
+    </dd>
+  
+    <dt class="iconpla-ok-squared">ok :</dt>
+    <dd>
+      any other case
+    </dd>
+  </dl>
+  
+  <p>
+    You can click the <span class="iconpla-plus-circled"></span> icon on the left of each string to see in which files it is used. Additionally you can see if the string is missing in only one or all files (corresponding to a problem in the loaded language files.
+  </p>
+</fieldset>
+
+<fieldset>
+  <legend>{'Limitations'|@translate}</legend>
+  
+  <p>
+    For both core and plugin dependencies, we assume that the language files are loaded at the beginning of the file and available for the whole file. In practice this is not true because of functions, triggers, pre-filters, etc.
+  </p>
+</fieldset>
+</form>
Index: /extensions/plugin_lang_analysis/template/style.css
===================================================================
--- /extensions/plugin_lang_analysis/template/style.css	(revision 23471)
+++ /extensions/plugin_lang_analysis/template/style.css	(revision 23472)
@@ -13,7 +13,10 @@
     padding:5px 8px;
     background:#e6e6e6;
-    color:#555;
+    color:#888;
     cursor:pointer;
   }
+    .switch-button span:hover {
+      text-decoration:underline;
+    }
     .switch-button span.active {
       color:#212121;
@@ -126,3 +129,6 @@
       background:#BFE599;
     }
-  
+
+.tiptip {
+  cursor:help;
+}
