Qual: Rewrite the Translate:Load function to be more simpler and faster.

Now for a language pt_BR, we first look for lang pt_BR then pt_PT and then en_US
This commit is contained in:
Laurent Destailleur 2009-09-28 21:59:09 +00:00
parent f0b807d738
commit 8c2f27c616
3 changed files with 84 additions and 85 deletions

View File

@ -89,7 +89,7 @@ CurrentSessionTimeOut=Time out Sessão atual
OSEnv=Entorno SO
Box=Caixa
Boxes=Caixas
MaxNbOfLinesForBoxes=Nº de linhas máximo para as caixas
MaxNbOfLinesForBoxes=N<EFBFBD> de linhas máximo para as caixas
PositionByDefault=Posição por default
Position=Ordem
MenusDesc=Os configuradores do menu definem o conteúdo das 2 barras de menus (a barra horizontal e a barra vertical). É possível atribuir configuradores diferentes segundo o usuário seja interno ou externo.
@ -174,7 +174,7 @@ OfficialWebSiteFr=site web oficial falado/escrito em francês
OfficialWikiFr=Wiki falado/escrito em francês
OfficialWiki=Wiki ERP
OfficialDemo=Demo em linha ERP
ForDocumentationSeeWiki=Para a documentação de usuário, programador ou Perguntas Freqüentess (FAQ), consulte o wiki do ERP: <br><b><a href
ForDocumentationSeeWiki=Para a documentação de usuário, programador ou Perguntas Freq<65>entess (FAQ), consulte o wiki do ERP: <br><b><a href
ForAnswersSeeForum=Para outras questões ou realizar as suas próprias consultas, pode utilizar o fórum do ERP: <br><b><a href
HelpCenterDesc1=Esta área permite ajudá-lo a obter um serviço de suporte do ERP.
HelpCenterDesc2=Alguns destes serviços só estão disponíveis em <b>inglé</b>.
@ -215,11 +215,11 @@ UnpackPackageInDolibarrRoot=Descompactar o pacote na pasta raiz do ERP <b>%s</b>
SetupIsReadyForUse=A Instalação está finalizada e o ERP está disponível com o novo componente.
CurrentVersion=Versão atual do ERP
CallUpdatePage=Chamar a página de atualização da estrutura e dados da base de dados %s.
LastStableVersion=Última Versão estável
GenericMaskCodes=Pode introduzir qualquer máscara numérica. Nesta máscara, pode utilizar as seguintes etiquetas:<br><b>{000000} </b> corresponde a um número que se incrementa em cada um de %s. Introduza tantos zeros como longitude que deseje mostrar. O contador completarse-á a partir de zeros pela esquerda com o fim de ter tantos zeros como a máscara. <br> <b> {000000+000}</ b> Igual que o anterior, com uma compensação correspondente ao número da direita do sinal + aplica-se a partir do primeiro %s. <br> <b> {000000@x}</b> igual que o anterior, mas o contador restabelece-se a zero quando se chega a x meses (x entre 1 e 12). Se esta opção se utiliza e x é de 2 ou superior, então a seqüência {yy}{mm} ou {yyyy}{mm} também é necessário. <br> <b> {dd} </b> dias (01 a 31). <br><b> {mm}</b> mês (01 a 12). <br><b>{yy}</b>, <b>{yyyy}</b> ou <b>{e}</b> ano em 2, 4 ou 1 figura.<br>
GenericMaskCodes2=<b>{cccc}</b> o código de cliente em nº de caracteres<br><b>{cccc000}</b> o código de cliente em nº caracter é seguido por um contador próprio ao cliente sem offset, completado com zeros até completar a máscara, e voltando a zero ao mesmo tempo que o contador global.<br>
LastStableVersion=<EFBFBD>ltima Versão estável
GenericMaskCodes=Pode introduzir qualquer máscara numérica. Nesta máscara, pode utilizar as seguintes etiquetas:<br><b>{000000} </b> corresponde a um número que se incrementa em cada um de %s. Introduza tantos zeros como longitude que deseje mostrar. O contador completarse-á a partir de zeros pela esquerda com o fim de ter tantos zeros como a máscara. <br> <b> {000000+000}</ b> Igual que o anterior, com uma compensação correspondente ao número da direita do sinal + aplica-se a partir do primeiro %s. <br> <b> {000000@x}</b> igual que o anterior, mas o contador restabelece-se a zero quando se chega a x meses (x entre 1 e 12). Se esta opção se utiliza e x é de 2 ou superior, então a seq<65>ência {yy}{mm} ou {yyyy}{mm} também é necessário. <br> <b> {dd} </b> dias (01 a 31). <br><b> {mm}</b> mês (01 a 12). <br><b>{yy}</b>, <b>{yyyy}</b> ou <b>{e}</b> ano em 2, 4 ou 1 figura.<br>
GenericMaskCodes2=<b>{cccc}</b> o código de cliente em n<> de caracteres<br><b>{cccc000}</b> o código de cliente em n<> caracter é seguido por um contador próprio ao cliente sem offset, completado com zeros até completar a máscara, e voltando a zero ao mesmo tempo que o contador global.<br>
GenericMaskCodes3=qualquer outro caracter0 na máscara se fica sem alterações. <br>Não é permitido espaços <br>
GenericMaskCodes4a=<u>Exemplo em 99 ª %s o Fornecedor a Empresa realizada em 31/03/2007: </u><br>
GenericMaskCodes4a=<u>Exemplo em 99 <EFBFBD> %s o Fornecedor a Empresa realizada em 31/03/2007: </u><br>
GenericMaskCodes4b=<u>Exemplo sobre um Fornecedor criado em 31/03/2007:</u><br>
GenericMaskCodes5=<b>ABC{yy}{mm}-{000000}</b> dará <b>ABC0703-000099</b><br><b>{0000+100}-XXX/{dd}/YYY</b> dará <b>0199-XXX/31/YYY</b>
GenericNumRefModelDesc=Devolve um número criado na linha em uma máscara definida.
@ -228,7 +228,7 @@ ServerNotAvailableOnIPOrPort=Servidor não disponível não endereço <b>%s</b>
DoTestServerAvailability=Teste de conectividade com o servidor
DoTestSend=Teste envio
DoTestSendHTML=Teste envio HTML
ErrorCantUseRazInStartedYearIfNoYearMonthInMask=Erro, não se pode usar opção @ se a seqüência {yy}{mm} ou {yyyy}{mm} não se encontra a máscara.
ErrorCantUseRazInStartedYearIfNoYearMonthInMask=Erro, não se pode usar opção @ se a seq<65>ência {yy}{mm} ou {yyyy}{mm} não se encontra a máscara.
UMask=Parâmetro UMask de novos arquivos em Unix/Linux/BSD.
UMaskExplanation=Este parâmetro determina os direitos dos arquivos criados não servidor do ERP (durante o carregamento, por Exemplo).<br>Este deve ter o valor octal (por Exemplo, 0666 significa leitura / escrita para todos).<br>Este parâmetro não tem nenhum efeito sobre um servidor Windows.
SeeWikiForAllTeam=Veja o wiki para mais detalhes de todos os autores e da sua organização
@ -536,7 +536,7 @@ VATIsUsedExampleFR=em Francia, se trata das sociedades u organismos que eligen u
VATIsNotUsedExampleFR=em Francia, se trata de associações exentas de ICMS o sociedades, organismos o profesiones liberales que han eligedo o regime fiscal de módulos (ICMS em franquicia), pagando um ICMS em franquicia sem fazer declaração de ICMS. Esta elecção hace aparecer a anotação "IVA não aplicable - art-293B do CGI" em faturas.
LabelUsedByDefault=Etiqueta que se utilizará se não se encontra tradução para este código
LabelOnDocuments=Etiqueta sobre documentos
NbOfDays=Nº de Dias
NbOfDays=N<EFBFBD> de Dias
AtEndOfMonth=No Fim de Mês
Offset=Deslocado
AlwaysActive=Sempre Ativo
@ -565,7 +565,7 @@ DatabaseConfiguration=configuração da base de dados
Tables=Tabelas
TableName=Nome da tabela
TableLineFormat=Formato linhas
NbOfRecord=Nº Reg.
NbOfRecord=N<EFBFBD> Reg.
Constraints=Constrangimentos
ConstraintsType=Tipo de constrangimento
ConstraintsToShowOrNotEntry=Constrangimento para mostrar não menu de entrada
@ -905,7 +905,7 @@ LDAPDescValues=os valores de Exemplos se adaptan a <b>OpenLDAP</b> com os schema
ForANonAnonymousAccess=Para um acesso autentificado
##### Products #####=
ProductSetup=configuração do módulo produtos
NumberOfProductShowInSelect=Nº de produtos max em listas (0
NumberOfProductShowInSelect=N<EFBFBD> de produtos max em listas (0
ConfirmDeleteProductLineAbility=confirmação de eliminação de uma linha de produzido nos formulários
ModifyProductDescAbility=Personalização das descripciones dos produtos nos formulários
ViewProductDescInFormAbility=visualização das descripciones dos produtos nos formulários

View File

@ -339,7 +339,7 @@ ul.tmenu {
list-style: none;
}
li.tmenu {
float: left;
float: <?php print $left; ?>;
padding-left:5px;
padding-right:5px;
padding-top: 2px;

View File

@ -167,18 +167,12 @@ class Translate {
* If data for file already loaded, do nothing.
* All data in translation array are stored in UTF-8 format.
* \param domain File name to load (.lang file). Use @ before value if domain is in a module directory.
* \param alt Use alternate file even if file in target language is found
* \param soptafterdirection Stop when the DIRECTION tag is found
* \param alt 0,1,2
* \param soptafterdirection Stop when the DIRECTION tag is found (optimize)
* \param forcelangdir To force a lang directory
* \return int <0 if KO, >0 if OK
* \return int <0 if KO, 0 if already loaded, >0 if OK
* \remarks tab_loaded is completed with $domain key.
* Value for hash are: 1:Loaded from disk, 2:Not found, 3:Loaded from cache
* TODO Make a code simpler:
* First call is with alt=0. if xx=YY, then force alt to 1. If xx_YY == en_US, fr_FR or es_ES, then force alt=2
* $langofdir=$this->defaultlang or forcelangdir.
* Define lang file and try to load it if exists.
* Then if alt < 2, we call again with alt=alt+1 and a forcelangdir;
* We set the tab_loaded when alt == 2
*/
function Load($domain,$alt=0,$stopafterdirection=0,$forcelangdir='')
{
@ -191,45 +185,39 @@ class Translate {
exit;
}
//dol_syslog("Translate::Load domain=".$domain." alt=".$alt." forcelangdir=".$forcelangdir." this->defaultlang=".$this->defaultlang);
//dol_syslog("Translate::Load Start domain=".$domain." alt=".$alt." forcelangdir=".$forcelangdir." this->defaultlang=".$this->defaultlang);
$newdomain=eregi_replace('@','',$domain); // Remove the @ if present
// Check cache
if (empty($forcelangdir) && ! empty($this->tab_loaded[$domain])) { return; } // Le fichier de ce domaine est deja charge
if (! empty($this->tab_loaded[$newdomain])) // File already loaded for this domain
{
//dol_syslog("Translate::Load already loaded for ".$domain);
return 0;
}
$langofdir=(empty($forcelangdir)?$this->defaultlang:$forcelangdir);
$fileread=0;
//dol_syslog("Translate::Load langofdir=".$langofdir);
// Redefine alt
$langarray=split('_',$langofdir);
if ($alt < 1 && strtolower($langarray[0]) == strtolower($langarray[1])) $alt=1;
if ($alt < 2 && (strtolower($langofdir) == 'en_us' || strtolower($langofdir) == 'fr_fr' || strtolower($langofdir) == 'es_es')) $alt=2;
foreach($this->dir as $searchdir)
{
$newalt=$alt;
// If $domain is @xxx instead of xxx then we look for module lang file htdocs/xxx/langs/code_CODE/xxx.lang
// instead of global lang file htdocs/langs/code_CODE/xxx.lang
if (eregi('@',$domain)) // It's a language file of a module, we look in dir of this module.
{
$domain=eregi_replace('@','',$domain);
$searchdir=$searchdir ."/".$domain."/langs";
}
if (eregi('@',$domain)) $searchdir=$searchdir ."/".$newdomain."/langs";
else $searchdir=$searchdir."/langs";
// Directory of translation files
$scandir = $searchdir."/".(empty($forcelangdir)?$this->defaultlang:$forcelangdir);
$file_lang = $scandir . "/".$domain.".lang";
$scandir = $searchdir."/".$langofdir;
$file_lang = $scandir . "/".$newdomain.".lang";
$filelangexists=is_file($file_lang);
//print 'Load default_lang='.$this->defaultlang.' alt='.$alt.' newalt='.$newalt.' '.$file_lang."-".$filelangexists.'<br>';
// Check in "always available" alternate file if not found or if asked
if ($newalt || ! $filelangexists)
{
// Dir of ALWAYS available alternate file (en_US, fr_FR, es_ES)
if ($this->defaultlang == "en_US") $scandiralt = $searchdir."/fr_FR";
elseif (eregi('^fr',$this->defaultlang) && $this->defaultlang != 'fr_FR') $scandiralt = $searchdir."/fr_FR";
elseif (eregi('^en',$this->defaultlang) && $this->defaultlang != 'en_US') $scandiralt = $searchdir."/en_US";
elseif (eregi('^es',$this->defaultlang) && $this->defaultlang != 'es_ES') $scandiralt = $searchdir."/es_ES";
else $scandiralt = $searchdir."/en_US";
$file_lang = $scandiralt . "/".$domain.".lang";
$filelangexists=is_file($file_lang);
$newalt=1;
}
//print 'Load alt='.$alt.' newalt='.$newalt.' '.$file_lang."-".$filelangexists.'<br>';
//dol_syslog('Translate::Load Try to read for alt='.$alt.' langofdir='.$langofdir.' file_lang='.$file_lang." => ".$filelangexists);
if ($filelangexists)
{
@ -237,12 +225,12 @@ class Translate {
// Speed gain: 40ms - Memory overusage: 200ko (Size of session cache file)
$enablelangcacheinsession=false;
if ($enablelangcacheinsession && isset($_SESSION['lang_'.$domain]))
if ($enablelangcacheinsession && isset($_SESSION['lang_'.$newdomain]))
{
foreach($_SESSION['lang_'.$domain] as $key => $value)
foreach($_SESSION['lang_'.$newdomain] as $key => $value)
{
$this->tab_translate[$key]=$value;
$this->tab_loaded[$domain]=3; // Marque ce fichier comme charge depuis cache session
$this->tab_loaded[$newdomain]=3; // Set this file as loaded from cache in session
}
}
else
@ -264,13 +252,12 @@ class Translate {
if (eregi('^CHARSET$',$key)) // This is to declare in which charset files are encoded
{
$this->charset_inputfile[$domain]=strtoupper($value);
//print 'File '.$file_lang.' is declared to have format '.$this->charset_inputfile[$domain].'<br>';
$this->charset_inputfile[$newdomain]=strtoupper($value);
//print 'File '.$file_lang.' is declared to have format '.$this->charset_inputfile[$newdomain].'<br>';
}
elseif (eregi('^DIRECTION$',$key)) // This is to declare direction of language
{
// We do not load Separator values for alternate files
if (! $newalt)
if ($alt < 2) // We do not load direction for alternate files 2
{
$this->direction=$value;
if ($stopafterdirection) break;
@ -279,34 +266,22 @@ class Translate {
else
{
// On stocke toujours dans le tableau Tab en UTF-8
//if (empty($this->charset_inputfile[$domain]) || $this->charset_inputfile[$domain] == 'UTF-8') $value=utf8_decode($value);
if (empty($this->charset_inputfile[$domain]) || $this->charset_inputfile[$domain] == 'ISO-8859-1') $value=utf8_encode($value);
//if (empty($this->charset_inputfile[$newdomain]) || $this->charset_inputfile[$newdomain] == 'UTF-8') $value=utf8_decode($value);
if (empty($this->charset_inputfile[$newdomain]) || $this->charset_inputfile[$newdomain] == 'ISO-8859-1') $value=utf8_encode($value);
//print 'XX'.$key;
$this->tab_translate[$key]=$value;
// We do not load Separator values for alternate files
if (! $newalt || (! eregi('^Separator',$key)))
{
//print 'XX'.$key;
$this->tab_translate[$key]=$value;
}
if ($enablelangcacheinsession) $tabtranslatedomain[$key]=$value; // To save lang in session
}
}
}
}
$fileread=1;
fclose($fp);
// For language other than fr_FR and en_US, we also load alternate file
if (! $newalt && $this->defaultlang != "fr_FR" && $this->defaultlang != "en_US")
{
// This function MUST NOT contains call to syslog
//dol_syslog("Translate::Load loading alternate translation file (to complete ".$this->defaultlang."/".$domain.".lang file)", LOG_DEBUG);
$this->load($domain,1,$stopafterdirection);
}
$this->tab_loaded[$domain]=1; // Marque ce fichier comme charge
// To save lang in session
if ($enablelangcacheinsession && sizeof($tabtranslatedomain)) $_SESSION['lang_'.$domain]=$tabtranslatedomain;
if ($enablelangcacheinsession && sizeof($tabtranslatedomain)) $_SESSION['lang_'.$newdomain]=$tabtranslatedomain;
break; // Break loop on each root dir
}
@ -314,21 +289,45 @@ class Translate {
}
}
// Format for date
if ($domain == 'main')
// Now we load alternate file
if ($alt == 0)
{
$conf->format_date_short=empty($this->tab_translate['FormatDateShort'])?"%d/%m/%Y":$this->tab_translate['FormatDateShort']; # Format of day with PHP/C tags (strftime functions)
$conf->format_date_short_java=empty($this->tab_translate['FormatDateShortJava'])?"dd/MM/yyyy":$this->tab_translate['FormatDateShortJava']; # Format of day with Java tags
$conf->format_hour_short=empty($this->tab_translate['FormatHourShort'])?"%H:%M":$this->tab_translate['FormatHourShort'];
$conf->format_date_text_short=empty($this->tab_translate['FormatDateTextShort'])?"%d %b %Y":$this->tab_translate['FormatDateTextShort'];
$conf->format_date_text=empty($this->tab_translate['FormatDateText'])?"%d %B %Y":$this->tab_translate['FormatDateText'];
$conf->format_date_hour_short=empty($this->tab_translate['FormatDateHourShort'])?"%d/%m/%Y %H:%M":$this->tab_translate['FormatDateHourShort'];
$conf->format_date_hour_text_short=empty($this->tab_translate['FormatDateHourTextShort'])?"%d %b %Y %H:%M":$this->tab_translate['FormatDateHourTextShort'];
$conf->format_date_hour_text=empty($this->tab_translate['FormatDateHourText'])?"%d %B %Y %H:%M":$this->tab_translate['FormatDateHourText'];
//print $domain." => ".$this->defaultlang." ".$conf->format_date_hour_short." ".$this->tab_translate['FormatDateHourShort'];
// This function MUST NOT contains call to syslog
//dol_syslog("Translate::Load loading alternate translation file (to complete ".$this->defaultlang."/".$newdomain.".lang file)", LOG_DEBUG);
$langofdir=strtolower($langarray[0]).'_'.strtoupper($langarray[0]);
$this->load($domain,$alt+1,$stopafterdirection,$langofdir);
}
if (empty($this->tab_loaded[$domain])) $this->tab_loaded[$domain]=2; // Marque ce fichier comme non trouve
if ($alt == 1)
{
// This function MUST NOT contains call to syslog
//dol_syslog("Translate::Load loading alternate translation file (to complete ".$this->defaultlang."/".$newdomain.".lang file)", LOG_DEBUG);
$langofdir='en_US';
if (eregi('^fr',$langarray[0])) $langofdir='fr_FR';
if (eregi('^es',$langarray[0])) $langofdir='es_ES';
$this->load($domain,$alt+1,$stopafterdirection,$langofdir);
}
if ($alt == 2)
{
if ($fileread) $this->tab_loaded[$newdomain]=1; // Set domain file as loaded
// Format for date
if ($newdomain == 'main')
{
$conf->format_date_short=empty($this->tab_translate['FormatDateShort'])?"%d/%m/%Y":$this->tab_translate['FormatDateShort']; # Format of day with PHP/C tags (strftime functions)
$conf->format_date_short_java=empty($this->tab_translate['FormatDateShortJava'])?"dd/MM/yyyy":$this->tab_translate['FormatDateShortJava']; # Format of day with Java tags
$conf->format_hour_short=empty($this->tab_translate['FormatHourShort'])?"%H:%M":$this->tab_translate['FormatHourShort'];
$conf->format_date_text_short=empty($this->tab_translate['FormatDateTextShort'])?"%d %b %Y":$this->tab_translate['FormatDateTextShort'];
$conf->format_date_text=empty($this->tab_translate['FormatDateText'])?"%d %B %Y":$this->tab_translate['FormatDateText'];
$conf->format_date_hour_short=empty($this->tab_translate['FormatDateHourShort'])?"%d/%m/%Y %H:%M":$this->tab_translate['FormatDateHourShort'];
$conf->format_date_hour_text_short=empty($this->tab_translate['FormatDateHourTextShort'])?"%d %b %Y %H:%M":$this->tab_translate['FormatDateHourTextShort'];
$conf->format_date_hour_text=empty($this->tab_translate['FormatDateHourText'])?"%d %B %Y %H:%M":$this->tab_translate['FormatDateHourText'];
//print $domain." => ".$this->defaultlang." ".$conf->format_date_hour_short." ".$this->tab_translate['FormatDateHourShort'];
}
if (empty($this->tab_loaded[$newdomain])) $this->tab_loaded[$newdomain]=2; // Marque ce fichier comme non trouve
}
return 1;
}