From 4a009d2ad273b7244db912d606c410c73c406ad1 Mon Sep 17 00:00:00 2001
From: Laurent Destailleur <eldy@destailleur.fr>
Date: Sat, 16 Jan 2016 00:48:14 +0100
Subject: [PATCH] NEW On translation admin page, admin can overwrite a
 translation value.

---
 htdocs/admin/translation.php                  | 178 +++++++++++++++++-
 htdocs/core/menus/standard/eldy.lib.php       |   5 +-
 .../install/mysql/migration/3.9.0-4.0.0.sql   |   3 +
 .../mysql/tables/llx_overwrite_trans.key.sql  |  21 +++
 htdocs/langs/en_US/admin.lang                 |   1 +
 5 files changed, 199 insertions(+), 9 deletions(-)
 create mode 100644 htdocs/install/mysql/tables/llx_overwrite_trans.key.sql

diff --git a/htdocs/admin/translation.php b/htdocs/admin/translation.php
index 0528d090c52..4ebd64a2f5b 100644
--- a/htdocs/admin/translation.php
+++ b/htdocs/admin/translation.php
@@ -1,5 +1,5 @@
 <?php
-/* Copyright (C) 2007-2011 Laurent Destailleur  <eldy@users.sourceforge.net>
+/* Copyright (C) 2007-2016 Laurent Destailleur  <eldy@users.sourceforge.net>
  * Copyright (C) 2009      Regis Houssin        <regis.houssin@capnetworks.com>
  *
  * This program is free software; you can redistribute it and/or modify
@@ -33,15 +33,73 @@ $langs->load("errors");
 
 if (!$user->admin) accessforbidden();
 
-
-$action=GETPOST('action');
+$id=GETPOST('rowid','int');
+$action=GETPOST('action','alpha');
+$langcode=GETPOST('langcode','alpha');
+$transkey=GETPOST('transkey','alpha');
+$transvalue=GETPOST('transvalue','alpha');
 
 
 /*
  * Actions
  */
 
-// None
+
+if ($action == 'add' || (GETPOST('add') && $action != 'update'))
+{
+	$error=0;
+
+	if (empty($langcode))
+	{
+		setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Language")), null, 'errors');
+		$error++;
+	}
+	if ($transkey == '')
+	{
+		setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Key")), null, 'errors');
+		$error++;
+	}
+	if ($transvalue == '')
+	{
+		setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Value")), null, 'errors');
+		$error++;
+	}
+	if (! $error)
+	{
+		$sql = "INSERT INTO ".MAIN_DB_PREFIX."overwrite_trans(lang, transkey, transvalue) VALUE ('".$db->escape($langcode)."','".$db->escape($transkey)."','".$db->escape($transvalue)."')";
+		$result = $db->query($sql);
+		if ($result > 0)
+		{
+			setEventMessages($langs->trans("RecordSaved"), null, 'mesgs');
+			$action="";
+			$transkey="";
+			$transvalue="";
+		}
+		else
+		{
+			dol_print_error($db);
+			$action='';
+		}
+	}
+}
+
+// Delete line from delete picto
+if ($action == 'delete')
+{
+	$sql = "DELETE FROM ".MAIN_DB_PREFIX."overwrite_trans WHERE rowid = ".$db->escape($id);
+	$result = $db->query($sql);
+	if ($result >= 0)
+	{
+		setEventMessages($langs->trans("RecordDeleted"), null, 'mesgs');
+	}
+	else
+	{
+		dol_print_error($db);
+	}
+}
+
+
+
 
 
 
@@ -58,11 +116,121 @@ print $langs->trans("TranslationDesc")."<br>\n";
 print "<br>\n";
 
 print $langs->trans("CurrentUserLanguage").': <strong>'.$langs->defaultlang.'</strong><br>';
-print img_warning().' '.$langs->trans("SomeTranslationAreUncomplete").'<br>';
+print '<br>';
 
+print img_warning().' '.$langs->trans("SomeTranslationAreUncomplete").'<br>';
 $urlwikitranslatordoc='http://wiki.dolibarr.org/index.php/Translator_documentation';
 print $langs->trans("SeeAlso").': <a href="'.$urlwikitranslatordoc.'" target="_blank">'.$urlwikitranslatordoc.'</a><br>';
 
+print '<br>';
+
+print $langs->trans("TranslationOverwriteDesc",$langs->transnoentitiesnoconv("Language"),$langs->transnoentitiesnoconv("Key"),$langs->transnoentitiesnoconv("Value"))."<br>\n";
+
+print '<br>';
+
+print '<form action="'.$_SERVER["PHP_SELF"].((empty($user->entity) && $debug)?'?debug=1':'').'" method="POST">';
+print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
+print '<input type="hidden" id="action" name="action" value="">';
+
+print '<table class="noborder" width="100%">';
+print '<tr class="liste_titre">';
+print '<td>'.$langs->trans("Language").'</td>';
+print '<td>'.$langs->trans("Key").'</td>';
+print '<td>'.$langs->trans("Value").'</td>';
+if (! empty($conf->multicompany->enabled) && !$user->entity) print '<td>'.$langs->trans("Entity").'</td>';
+print '<td align="center"></td>';
+print "</tr>\n";
+
+
+// Line to add new record
+$var=false;
+print "\n";
+
+print '<tr '.$bc[$var].'><td><input type="text" class="flat" size="24" name="langcode" value="'.GETPOST('langcode').'"></td>'."\n";
+print '<td>';
+print '<input type="text" class="flat" size="30" name="transkey" value="">';
+print '</td><td>';
+print '<input type="text" class="flat" size="40" name="transvalue" value="">';
+print '</td>';
+// Limit to superadmin
+if (! empty($conf->multicompany->enabled) && !$user->entity)
+{
+	print '<td>';
+	print '<input type="text" class="flat" size="1" name="entity" value="'.$conf->entity.'">';
+	print '</td>';
+	print '<td align="center">';
+}
+else
+{
+	print '<td align="center">';
+	print '<input type="hidden" name="entity" value="'.$conf->entity.'">';
+}
+print '<input type="submit" class="button" value="'.$langs->trans("Add").'" name="add">';
+print "</td>\n";
+print '</tr>';
+
+
+// Show constants
+$sql = "SELECT";
+$sql.= " rowid";
+$sql.= ", lang";
+$sql.= ", transkey";
+$sql.= ", transvalue";
+//$sql.= ", entity";
+$sql.= " FROM ".MAIN_DB_PREFIX."overwrite_trans";
+$sql.= " WHERE 1 = 1";
+//$sql.= " AND entity IN (".$user->entity.",".$conf->entity.")";
+//if ((empty($user->entity) || $user->admin) && $debug) {} 										// to force for superadmin to debug
+//else if (! GETPOST('visible') || GETPOST('visible') != 'all') $sql.= " AND visible = 1";		// We must always have this. Otherwise, array is too large and submitting data fails due to apache POST or GET limits
+//if (GETPOST('name')) $sql.=natural_search("name", GETPOST('name'));
+//$sql.= " ORDER BY entity, name ASC";
+$sql.= " ORDER BY lang ASC, transkey ASC";
+
+dol_syslog("translation::select from table", LOG_DEBUG);
+$result = $db->query($sql);
+if ($result)
+{
+	$num = $db->num_rows($result);
+	$i = 0;
+	$var=false;
+
+	while ($i < $num)
+	{
+		$obj = $db->fetch_object($result);
+		$var=!$var;
+
+		print "\n";
+
+		print '<tr '.$bc[$var].'>';
+		
+		print '<td>'.$obj->lang.'</td>'."\n";
+		print '<td>'.$obj->transkey.'</td>'."\n";
+
+		// Value
+		print '<td>';
+		/*print '<input type="hidden" name="const['.$i.'][rowid]" value="'.$obj->rowid.'">';
+		print '<input type="hidden" name="const['.$i.'][lang]" value="'.$obj->lang.'">';
+		print '<input type="hidden" name="const['.$i.'][name]" value="'.$obj->transkey.'">';
+		print '<input type="text" id="value_'.$i.'" class="flat inputforupdate" size="30" name="const['.$i.'][value]" value="'.dol_escape_htmltag($obj->transvalue).'">';
+		*/
+		print $obj->transvalue;
+		print '</td>';
+
+		print '<td align="center">';
+		print '<a href="'.$_SERVER['PHP_SELF'].'?rowid='.$obj->rowid.'&entity='.$obj->entity.'&action=delete'.((empty($user->entity) && $debug)?'&debug=1':'').'">'.img_delete().'</a>';
+		print '</td>';
+		
+		print "</tr>\n";
+		print "\n";
+		$i++;
+	}
+}
+
+
+print '</table>';
+
+print "</form>\n";
+
 
 llxFooter();
 
diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php
index 3850f6bde67..f6b626b3d28 100644
--- a/htdocs/core/menus/standard/eldy.lib.php
+++ b/htdocs/core/menus/standard/eldy.lib.php
@@ -518,10 +518,7 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu
 						$newmenu->add("/accountancy/admin/fiscalyear.php?mainmenu=home", $langs->trans("Fiscalyear"),1);
 					}
 
-					if (! in_array($langs->defaultlang,array('en_US')))
-					{
-						$newmenu->add("/admin/translation.php", $langs->trans("Translation"),1);
-					}
+					$newmenu->add("/admin/translation.php", $langs->trans("Translation"),1);
 					$newmenu->add("/admin/boxes.php?mainmenu=home", $langs->trans("Boxes"),1);
 					$newmenu->add("/admin/delais.php?mainmenu=home",$langs->trans("Alerts"),1);
 					$newmenu->add("/admin/security_other.php?mainmenu=home", $langs->trans("Security"),1);
diff --git a/htdocs/install/mysql/migration/3.9.0-4.0.0.sql b/htdocs/install/mysql/migration/3.9.0-4.0.0.sql
index d0e2151e849..73793f868c8 100644
--- a/htdocs/install/mysql/migration/3.9.0-4.0.0.sql
+++ b/htdocs/install/mysql/migration/3.9.0-4.0.0.sql
@@ -31,3 +31,6 @@ ALTER TABLE llx_fichinter ADD COLUMN dateo date  after duree;
 ALTER TABLE llx_projet ADD COLUMN opp_percent double(5,2) after fk_opp_status;
 UPDATE llx_projet as p set opp_percent = (SELECT percent from llx_c_lead_status as cls where cls.rowid = p.fk_opp_status) where opp_percent IS NULL;
 
+ALTER TABLE llx_overwrite_trans ADD UNIQUE INDEX uk_overwrite_trans(lang, transkey);
+
+
diff --git a/htdocs/install/mysql/tables/llx_overwrite_trans.key.sql b/htdocs/install/mysql/tables/llx_overwrite_trans.key.sql
new file mode 100644
index 00000000000..70e0174c6da
--- /dev/null
+++ b/htdocs/install/mysql/tables/llx_overwrite_trans.key.sql
@@ -0,0 +1,21 @@
+-- ============================================================================
+-- Copyright (C) 2016 Laurent Destailleur  <eldy@users.sourceforge.net>
+--
+-- This program is free software; you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation; either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program. If not, see <http://www.gnu.org/licenses/>.
+--
+-- ===========================================================================
+
+
+ALTER TABLE llx_overwrite_trans ADD UNIQUE INDEX uk_overwrite_trans(lang, transkey);
+
diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang
index cc5a97a1ca7..ccf11407bc3 100755
--- a/htdocs/langs/en_US/admin.lang
+++ b/htdocs/langs/en_US/admin.lang
@@ -1088,6 +1088,7 @@ PathDirectory=Directory
 SendmailOptionMayHurtBuggedMTA=Feature to send mails using method "PHP mail direct" will generate a mail message that might be not correctly parsed by some receiving mail servers. Result is that some mails can't be read by people hosted by those bugged platforms. It's case for some Internet providers (Ex: Orange in France). This is not a problem into Dolibarr nor into PHP but onto receiving mail server. You can however add option MAIN_FIX_FOR_BUGGED_MTA to 1 into setup - other to modify Dolibarr to avoid this. However, you may experience problem with other servers that respect strictly the SMTP standard. The other solution (recommended) is to use the method "SMTP socket library" that has no disadvantages.
 TranslationSetup=Configuration de la traduction
 TranslationDesc=Choice of language visible on screen can be modified:<br>* Globally from menu <strong>Home - Setup - Display</strong><br>* For user only from tab <strong>User display</strong> of user card (click on login on top of screen). 
+TranslationOverwriteDesc=You can also overwrite some value by completing/editing the following table. You must use for "%s" the language code, for "%s" the key found into file langs/xx_XX/somefile.lang and "%s" the new value you want to use as new translation. 
 TotalNumberOfActivatedModules=Total number of activated feature modules: <b>%s</b>
 YouMustEnableOneModule=You must at least enable 1 module
 ClassNotFoundIntoPathWarning=Class %s not found into PHP path
-- 
GitLab