From 8c2f27c616673887561eb55def26c6b2eefc265f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 28 Sep 2009 21:59:09 +0000 Subject: [PATCH] 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 --- htdocs/langs/pt_BR/admin.lang | 20 ++--- htdocs/theme/eldy/eldy.css.php | 2 +- htdocs/translate.class.php | 147 ++++++++++++++++----------------- 3 files changed, 84 insertions(+), 85 deletions(-) diff --git a/htdocs/langs/pt_BR/admin.lang b/htdocs/langs/pt_BR/admin.lang index 79543e7a739..22d2a98458c 100644 --- a/htdocs/langs/pt_BR/admin.lang +++ b/htdocs/langs/pt_BR/admin.lang @@ -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� 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:
inglé. @@ -215,11 +215,11 @@ UnpackPackageInDolibarrRoot=Descompactar o pacote na pasta raiz do ERP %s 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:
{000000} 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.
{000000+000} Igual que o anterior, com uma compensação correspondente ao número da direita do sinal + aplica-se a partir do primeiro %s.
{000000@x} 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.
{dd} dias (01 a 31).
{mm} mês (01 a 12).
{yy}, {yyyy} ou {e} ano em 2, 4 ou 1 figura.
-GenericMaskCodes2={cccc} o código de cliente em nº de caracteres
{cccc000} 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.
+LastStableVersion=�ltima Versão estável +GenericMaskCodes=Pode introduzir qualquer máscara numérica. Nesta máscara, pode utilizar as seguintes etiquetas:
{000000} 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.
{000000+000} Igual que o anterior, com uma compensação correspondente ao número da direita do sinal + aplica-se a partir do primeiro %s.
{000000@x} 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.
{dd} dias (01 a 31).
{mm} mês (01 a 12).
{yy}, {yyyy} ou {e} ano em 2, 4 ou 1 figura.
+GenericMaskCodes2={cccc} o código de cliente em n� de caracteres
{cccc000} 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.
GenericMaskCodes3=qualquer outro caracter0 na máscara se fica sem alterações.
Não é permitido espaços
-GenericMaskCodes4a=Exemplo em 99 ª %s o Fornecedor a Empresa realizada em 31/03/2007:
+GenericMaskCodes4a=Exemplo em 99 � %s o Fornecedor a Empresa realizada em 31/03/2007:
GenericMaskCodes4b=Exemplo sobre um Fornecedor criado em 31/03/2007:
GenericMaskCodes5=ABC{yy}{mm}-{000000} dará ABC0703-000099
{0000+100}-XXX/{dd}/YYY dará 0199-XXX/31/YYY 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 %s 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�ê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).
Este deve ter o valor octal (por Exemplo, 0666 significa leitura / escrita para todos).
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� 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� 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 OpenLDAP 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� 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 diff --git a/htdocs/theme/eldy/eldy.css.php b/htdocs/theme/eldy/eldy.css.php index 13c6724ab35..838b2d2b1b3 100644 --- a/htdocs/theme/eldy/eldy.css.php +++ b/htdocs/theme/eldy/eldy.css.php @@ -339,7 +339,7 @@ ul.tmenu { list-style: none; } li.tmenu { - float: left; + float: ; padding-left:5px; padding-right:5px; padding-top: 2px; diff --git a/htdocs/translate.class.php b/htdocs/translate.class.php index 9e06d93a9b6..88dd5b8e28e 100644 --- a/htdocs/translate.class.php +++ b/htdocs/translate.class.php @@ -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.'
'; - // 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.'
'; + //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].'
'; + $this->charset_inputfile[$newdomain]=strtoupper($value); + //print 'File '.$file_lang.' is declared to have format '.$this->charset_inputfile[$newdomain].'
'; } 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; }