NEW Introduce table llx_overwrite_trans to be able to overwrite
translations by simple database edition.
This commit is contained in:
parent
8ff41a8ded
commit
b1168d223a
@ -29,17 +29,17 @@
|
|||||||
*/
|
*/
|
||||||
class Translate
|
class Translate
|
||||||
{
|
{
|
||||||
var $dir; // Directories that contains /langs subdirectory
|
var $dir; // Directories that contains /langs subdirectory
|
||||||
|
|
||||||
var $defaultlang; // Current language for current user
|
var $defaultlang; // Current language for current user
|
||||||
var $direction = 'ltr'; // Left to right or Right to left
|
var $direction = 'ltr'; // Left to right or Right to left
|
||||||
var $charset_output='UTF-8'; // Codage used by "trans" method outputs
|
var $charset_output='UTF-8'; // Codage used by "trans" method outputs
|
||||||
|
|
||||||
var $tab_translate=array(); // Array of all translations key=>value
|
var $tab_translate=array(); // Array of all translations key=>value
|
||||||
private $_tab_loaded=array(); // Array to store result after loading each language file
|
private $_tab_loaded=array(); // Array to store result after loading each language file
|
||||||
|
|
||||||
var $cache_labels=array(); // Cache for labels return by getLabelFromKey method
|
var $cache_labels=array(); // Cache for labels return by getLabelFromKey method
|
||||||
var $cache_currencies=array(); // Cache to store currency symbols
|
var $cache_currencies=array(); // Cache to store currency symbols
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -157,9 +157,11 @@ class Translate
|
|||||||
* @param int $forcelangdir To force a different lang directory
|
* @param int $forcelangdir To force a different lang directory
|
||||||
* @return int <0 if KO, 0 if already loaded or loading not required, >0 if OK
|
* @return int <0 if KO, 0 if already loaded or loading not required, >0 if OK
|
||||||
*/
|
*/
|
||||||
function Load($domain,$alt=0,$stopafterdirection=0,$forcelangdir='')
|
function load($domain,$alt=0,$stopafterdirection=0,$forcelangdir='')
|
||||||
{
|
{
|
||||||
global $conf;
|
global $conf,$db;
|
||||||
|
|
||||||
|
if (count($this->tab_translate) == 0) $this->loadFromDatabase($db); // Nothing was loaded yet, so we load database.
|
||||||
|
|
||||||
// Check parameters
|
// Check parameters
|
||||||
if (empty($domain))
|
if (empty($domain))
|
||||||
@ -239,7 +241,7 @@ class Translate
|
|||||||
$tmparray=dol_getcache($usecachekey);
|
$tmparray=dol_getcache($usecachekey);
|
||||||
if (is_array($tmparray) && count($tmparray))
|
if (is_array($tmparray) && count($tmparray))
|
||||||
{
|
{
|
||||||
$this->tab_translate=array_merge($tmparray,$this->tab_translate); // Already found values tab_translate overwrites duplicates
|
$this->tab_translate+=$tmparray; // Faster than array_merge($tmparray,$this->tab_translate). Note: If a valuer already exists into tab_translate, value into tmparaay is not added.
|
||||||
//print $newdomain."\n";
|
//print $newdomain."\n";
|
||||||
//var_dump($this->tab_translate);
|
//var_dump($this->tab_translate);
|
||||||
if ($alt == 2) $fileread=1;
|
if ($alt == 2) $fileread=1;
|
||||||
@ -329,11 +331,12 @@ class Translate
|
|||||||
if (empty($this->_tab_loaded[$newdomain])) $this->_tab_loaded[$newdomain]=2; // Marque ce fichier comme non trouve
|
if (empty($this->_tab_loaded[$newdomain])) $this->_tab_loaded[$newdomain]=2; // Marque ce fichier comme non trouve
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This part is deprecated and replaced with table llx_overwrite_trans
|
||||||
// Overwrite translation
|
// Kept for backward compatibility.
|
||||||
$overwritekey='MAIN_OVERWRITE_TRANS_'.$this->defaultlang;
|
$overwritekey='MAIN_OVERWRITE_TRANS_'.$this->defaultlang;
|
||||||
if (! empty($conf->global->$overwritekey)) // Overwrite translation with key1:newstring1,key2:newstring2
|
if (! empty($conf->global->$overwritekey)) // Overwrite translation with key1:newstring1,key2:newstring2
|
||||||
{
|
{
|
||||||
|
// Overwrite translation with param MAIN_OVERWRITE_TRANS_xx_XX
|
||||||
$tmparray=explode(',', $conf->global->$overwritekey);
|
$tmparray=explode(',', $conf->global->$overwritekey);
|
||||||
foreach($tmparray as $tmp)
|
foreach($tmparray as $tmp)
|
||||||
{
|
{
|
||||||
@ -342,13 +345,167 @@ class Translate
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check to be sure that SeparatorDecimal differs from SeparatorThousand
|
|
||||||
|
|
||||||
|
// Check to be sure that SeparatorDecimal differs from SeparatorThousand
|
||||||
if (! empty($this->tab_translate["SeparatorDecimal"]) && ! empty($this->tab_translate["SeparatorThousand"])
|
if (! empty($this->tab_translate["SeparatorDecimal"]) && ! empty($this->tab_translate["SeparatorThousand"])
|
||||||
&& $this->tab_translate["SeparatorDecimal"] == $this->tab_translate["SeparatorThousand"]) $this->tab_translate["SeparatorThousand"]='';
|
&& $this->tab_translate["SeparatorDecimal"] == $this->tab_translate["SeparatorThousand"]) $this->tab_translate["SeparatorThousand"]='';
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load translation key-value from database into a memory array.
|
||||||
|
* If data already loaded, do nothing.
|
||||||
|
* All data in translation array are stored in UTF-8 format.
|
||||||
|
* tab_loaded is completed with $domain key.
|
||||||
|
* rule "we keep first entry found with we keep last entry found" so it is probably not what you want to do.
|
||||||
|
*
|
||||||
|
* Value for hash are: 1:Loaded from disk, 2:Not found, 3:Loaded from cache
|
||||||
|
*
|
||||||
|
* @param Database $db Database handler
|
||||||
|
* @return int <0 if KO, 0 if already loaded or loading not required, >0 if OK
|
||||||
|
*/
|
||||||
|
function loadFromDatabase($db)
|
||||||
|
{
|
||||||
|
global $conf;
|
||||||
|
|
||||||
|
$domain='database';
|
||||||
|
|
||||||
|
if ($this->defaultlang == 'none_NONE') return 0; // Special language code to not translate keys
|
||||||
|
|
||||||
|
// Check parameters
|
||||||
|
if (empty($db)) return 0; // Database handler can't be used
|
||||||
|
|
||||||
|
//dol_syslog("Translate::Load Start domain=".$domain." alt=".$alt." forcelangdir=".$forcelangdir." this->defaultlang=".$this->defaultlang);
|
||||||
|
|
||||||
|
$newdomain = $domain;
|
||||||
|
$modulename = '';
|
||||||
|
|
||||||
|
// Check cache
|
||||||
|
if (! empty($this->_tab_loaded[$newdomain])) // File already loaded for this domain
|
||||||
|
{
|
||||||
|
//dol_syslog("Translate::Load already loaded for newdomain=".$newdomain);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->_tab_loaded[$newdomain] = 1; // We want to be sure this function is called once only.
|
||||||
|
|
||||||
|
$fileread=0;
|
||||||
|
$langofdir=(empty($forcelangdir)?$this->defaultlang:$forcelangdir);
|
||||||
|
|
||||||
|
// Redefine alt
|
||||||
|
$alt=2;
|
||||||
|
|
||||||
|
if (empty($langofdir)) // This may occurs when load is called without setting the language and without providing a value for forcelangdir
|
||||||
|
{
|
||||||
|
dol_syslog("Error: ".get_class($this)."::Load was called but language was not set yet with langs->setDefaultLang(). Nothing will be loaded.", LOG_WARNING);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO Move cache read out of loop on dirs or at least filelangexists
|
||||||
|
$found=false;
|
||||||
|
|
||||||
|
// Enable caching of lang file in memory (not by default)
|
||||||
|
$usecachekey='';
|
||||||
|
// Using a memcached server
|
||||||
|
if (! empty($conf->memcached->enabled) && ! empty($conf->global->MEMCACHED_SERVER))
|
||||||
|
{
|
||||||
|
$usecachekey=$newdomain.'_'.$langofdir.'_'.md5($file_lang); // Should not contains special chars
|
||||||
|
}
|
||||||
|
// Using cache with shmop. Speed gain: 40ms - Memory overusage: 200ko (Size of session cache file)
|
||||||
|
else if (isset($conf->global->MAIN_OPTIMIZE_SPEED) && ($conf->global->MAIN_OPTIMIZE_SPEED & 0x02))
|
||||||
|
{
|
||||||
|
$usecachekey=$newdomain;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($usecachekey)
|
||||||
|
{
|
||||||
|
//dol_syslog('Translate::Load we will cache result into usecachekey '.$usecachekey);
|
||||||
|
//global $aaa; $aaa+=1;
|
||||||
|
//print $aaa." ".$usecachekey."\n";
|
||||||
|
require_once DOL_DOCUMENT_ROOT .'/core/lib/memory.lib.php';
|
||||||
|
$tmparray=dol_getcache($usecachekey);
|
||||||
|
if (is_array($tmparray) && count($tmparray))
|
||||||
|
{
|
||||||
|
$this->tab_translate+=$tmparray; // Faster than array_merge($tmparray,$this->tab_translate). Note: If a valuer already exists into tab_translate, value into tmparaay is not added.
|
||||||
|
//print $newdomain."\n";
|
||||||
|
//var_dump($this->tab_translate);
|
||||||
|
if ($alt == 2) $fileread=1;
|
||||||
|
$found=true; // Found in dolibarr PHP cache
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! $found)
|
||||||
|
{
|
||||||
|
// Overwrite translation with database read
|
||||||
|
$sql="SELECT transkey, transvalue FROM ".MAIN_DB_PREFIX."overwrite_trans where lang='".$this->defaultlang."'";
|
||||||
|
$resql=$db->query($sql);
|
||||||
|
|
||||||
|
if ($resql)
|
||||||
|
{
|
||||||
|
$num = $db->num_rows($resql);
|
||||||
|
if ($num)
|
||||||
|
{
|
||||||
|
if ($usecachekey) $tabtranslatedomain=array(); // To save lang content in cache
|
||||||
|
|
||||||
|
$i = 0;
|
||||||
|
while ($i < $num) // Ex: Need 225ms for all fgets on all lang file for Third party page. Same speed than file_get_contents
|
||||||
|
{
|
||||||
|
$obj=$db->fetch_object($resql);
|
||||||
|
|
||||||
|
$key=$obj->transkey;
|
||||||
|
$value=$obj->transvalue;
|
||||||
|
|
||||||
|
//print "Domain=$domain, found a string for $tab[0] with value $tab[1]<br>";
|
||||||
|
if (empty($this->tab_translate[$key])) // If translation was already found, we must not continue, even if MAIN_FORCELANGDIR is set (MAIN_FORCELANGDIR is to replace lang dir, not to overwrite entries)
|
||||||
|
{
|
||||||
|
$value=trim(preg_replace('/\\n/',"\n",$value));
|
||||||
|
|
||||||
|
$this->tab_translate[$key]=$value;
|
||||||
|
if ($usecachekey) $tabtranslatedomain[$key]=$value; // To save lang content in cache
|
||||||
|
}
|
||||||
|
|
||||||
|
$i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
$fileread=1;
|
||||||
|
|
||||||
|
// TODO Move cache write out of loop on dirs
|
||||||
|
// To save lang content for usecachekey into cache
|
||||||
|
if ($usecachekey && count($tabtranslatedomain))
|
||||||
|
{
|
||||||
|
$ressetcache=dol_setcache($usecachekey,$tabtranslatedomain);
|
||||||
|
if ($ressetcache < 0)
|
||||||
|
{
|
||||||
|
$error='Failed to set cache for usecachekey='.$usecachekey.' result='.$ressetcache;
|
||||||
|
dol_syslog($error, LOG_ERR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dol_print_error($db);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($alt == 2)
|
||||||
|
{
|
||||||
|
if ($fileread) $this->_tab_loaded[$newdomain]=1; // Set domain file as loaded
|
||||||
|
|
||||||
|
if (empty($this->_tab_loaded[$newdomain])) $this->_tab_loaded[$newdomain]=2; // Marque ce cas comme non trouve (no lines found for language)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check to be sure that SeparatorDecimal differs from SeparatorThousand
|
||||||
|
if (! empty($this->tab_translate["SeparatorDecimal"]) && ! empty($this->tab_translate["SeparatorThousand"])
|
||||||
|
&& $this->tab_translate["SeparatorDecimal"] == $this->tab_translate["SeparatorThousand"]) $this->tab_translate["SeparatorThousand"]='';
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return translated value of key for special keys ("Currency...", "Civility...", ...).
|
* Return translated value of key for special keys ("Currency...", "Civility...", ...).
|
||||||
* Search in lang file, then into database. Key must be any complete entry into lang file: CurrencyEUR, ...
|
* Search in lang file, then into database. Key must be any complete entry into lang file: CurrencyEUR, ...
|
||||||
|
|||||||
@ -31,3 +31,13 @@ ALTER TABLE llx_accountingaccount RENAME TO llx_accounting_account;
|
|||||||
ALTER TABLE llx_societe ADD COLUMN model_pdf varchar(255);
|
ALTER TABLE llx_societe ADD COLUMN model_pdf varchar(255);
|
||||||
|
|
||||||
ALTER TABLE llx_societe_commerciaux ADD COLUMN import_key varchar(14) AFTER fk_user;
|
ALTER TABLE llx_societe_commerciaux ADD COLUMN import_key varchar(14) AFTER fk_user;
|
||||||
|
|
||||||
|
|
||||||
|
create table llx_overwrite_trans
|
||||||
|
(
|
||||||
|
rowid integer AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
lang varchar(5), -- en_US, fr_FR ...
|
||||||
|
transkey varchar(128),
|
||||||
|
transvalue text
|
||||||
|
)ENGINE=innodb;
|
||||||
|
|
||||||
|
|||||||
27
htdocs/install/mysql/tables/llx_overwrite_trans.sql
Normal file
27
htdocs/install/mysql/tables/llx_overwrite_trans.sql
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
-- ============================================================================
|
||||||
|
-- Copyright (C) 2013 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/>.
|
||||||
|
-- ============================================================================
|
||||||
|
|
||||||
|
|
||||||
|
create table llx_overwrite_trans
|
||||||
|
(
|
||||||
|
rowid integer AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
lang varchar(5), -- en_US, fr_FR ...
|
||||||
|
transkey varchar(128),
|
||||||
|
transvalue text
|
||||||
|
)ENGINE=innodb;
|
||||||
|
|
||||||
|
|
||||||
Loading…
Reference in New Issue
Block a user