<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
/**
* Arquivo que contem a classe de traducao e outros para a traducao de aplicacoes
*
* As aplicacoes baseadas nesse arquivo/classe deverao adaptar-se ao modo como este
* monta os arquivos de idiomas e seus requisitos de codificacao de idioma.
*
* PHP versions 4 and 5
*
* LICENSE: This source file is subject to version 2 of the GNU/GPL license
* that is available through the world-wide-web at the following URI:
* http://www.gnu.org/copyleft/gpl.html. If you did not receive a copy of
* the GNU/GPL License and are unable to obtain it through the web, please
* send a note to hide@address.com so I can mail you a copy immediately.
*
* Um exemplo de como usar a classe:
* <code>
*
* define(TRANSLATOR_PATH, "../include/phpTranslator/");
* define(TRANSLATOR_PATH_URL, "../include/phpTranslator/");
*
* if(!@include_once( TRANSLATOR_PATH.'/Translator.php'))
* echo "<h1>There is a trouble with phpTranslator package.
* It isn't found.</h1>";
*
* $_objTranslator = new Translator( USER_LOCALE );
*
* $_objTranslator->setLangFilePath( "/myapplic_path_lang_files/" );
* $_objTranslator->setURLPath( TRANSLATOR_PATH_URL );
* $_objTranslator->buildLangArray();
* $_objTranslator->buildLangArray( 'target' );
* if(CODING)
* $_objTranslator->Translate( false );
* elseif(TRANSLATING)
* $_objTranslator->Translate();
* else
* echo $_objTranslator->getText( 'some text to translate and
* be showed after had been registred.' );
* </code>
*
* @category PHP-Tool
* @package phpTranslator
* @author Adriano dos Santos Vieira (harpiain) <hide@address.com>
* @copyright 2005-2006 Adriano dos Santos Vieira
* @license http://www.gnu.org/copyleft/gpl.html GNU/GPL License 3.0
* @version subVersion: $Id: phpTranslator, v 0.2.0-40 feb/23/2006 $
* @link http://obiblioopac4j.sourceforge.net
* @see Translator()
* @since File available since Release 0.0.1
* @todo The package TODO/Roadmap are: {@example ToDo.txt}
*/
/**
* Constrante que define o "ENTER" e o "SALTO DE LINHA" nos arquivos de idiomas
* @access private
*/
define ( T_CRLF, chr(13).chr(10) );
/**
* Constrante que define a cor do texto ainda nao traduzido
* @access private
*/
define ( T_BG_COLOR_TRADUZ, "#e7d4d4" );
/**
* Classe para realizar a traducao de um texto com base em arquivos pre-definidos
*
* As aplicacoes baseadas nessa classe deverao adaptar-se ao modo como esta classe <br>
* monta os arquivos de idiomas e seus requisitos de codificacao de idioma.
*
* Um exemplo de como usar a classe:
* <code>
*
* define(TRANSLATOR_PATH, "../include/phpTranslator/");
* define(TRANSLATOR_PATH_URL, "../include/phpTranslator/");
*
* if(!@include_once( TRANSLATOR_PATH.'/Translator.php'))
* echo "<h1>There is a trouble with phpTranslator package.
* It isn't found.</h1>";
*
* $_objTranslator = new Translator( USER_LOCALE );
*
* $_objTranslator->setLangFilePath( "/myapplic_path_lang_files/" );
* $_objTranslator->setURLPath( TRANSLATOR_PATH_URL );
* $_objTranslator->buildLangArray();
* $_objTranslator->buildLangArray( 'target' );
* if(CODING)
* $_objTranslator->Translate( false );
* elseif(TRANSLATING)
* $_objTranslator->Translate();
* else
* echo $_objTranslator->getText( 'some text to translate and
* be showed after had been registred.' );
* </code>
*
* @category PHP-Tool
* @package phpTranslator
* @author Adriano dos Santos Vieira (harpiain) <hide@address.com>
*/
Class Translator {
/**
* path para para a propria classe
* @access private
* @var string
*/
var $class_self_path = "./";
/**
* path relativo (URL) para a classe
* @access private
* @var string
*/
var $translator_url_path = "./";
/**
* path para o arquivo de mensagens
* @access private
* @var sting
*/
var $language_file_path = "./";
/**
* prefixo para o arquivo de mensagens
* @access private
* @var $language_file_prefix
*/
var $language_file_prefix = "language.";
/**
* sufixo para o arquivo de mensagens
* @access private
* @var string
*/
var $language_file_sufix = ".inc.php";
/**
* contera as mensagens a serem exibidas para a aplicacao de 2 idiomas (source and target)
*
* @access private
* @var array
*/
var $translated_text = "";
/**
* contera as mensagens padrao
*
* @access private
* @var array
*/
var $translated_text_std = array();
/**
* contera as mensagens traduzidas (ex: en-us)
*
* @access private
* @var array
*/
var $translated_text_tgt = array();
/**
* contera as mensagens da propria classe traduzidas ou padrao
*
* @access private
* @var array
* @since v 0.2.0-40
*/
var $translated_text_self = array();
/**
* padrao da aplicacao
*
* @access private
* @var string
*/
var $language_std = "pt-br";
/**
* preferencia do usuario
* @access private
* @var string
*/
var $language_user = "";
/**
* se traduz textos padrao conforme idioma:
* TRUE - tenta traduzir todos os textos;
* FALSE - nao traduz os textos
*
* @access private
* @var boolean
*/
var $translate_message = true;
/**
* se os arquivos de idioma estarao em sub-diretorios, conforme abrevitura ISO I18N
* ex: pt-br/language.pt-br.inc.php, en/language.en.inc.php ...
* TRUE - os arquivos estarao em subdiretorios;
* FALSE - os arquivos nao estarao em subdiretorios
*
* @access private
* @var boolean
* @since v 0.2.0-40
*/
var $language_file_subdir = false;
/**
* se os arquivos de idioma estarao seccionados, conforme contextualizacao
* ex: prefix.SECTION.sufix == language.admin.pt-br.inc.php ...
* TRUE - os arquivos estarao seccionados;
* FALSE - os arquivos nao estarao seccionados
*
* @access private
* @var boolean
* @since v 0.2.0-40
*/
var $languageFileInSections = false;
/**
* devera conter as secoes dos arquivos de idiomas, conforme contextualizacao
*
* <code>
* ...
* $_lang_sections = array('phpTranslator' => 'textos da classe de traducao',
* 'admin' => 'Textos da secao administrativa',
* 'home' => 'textos da secao principal',
* 'and son on' => 'e assim por diante...');
* ...
* </code>
* @access private
* @var array
* @since v 0.2.0-40
*/
var $language_sections = array();
/**
* devera conter a secao ativa a ser mostrada/traduzida, quando fizer uso de secoes
*
* @access private
* @var array
* @since v 0.2.0-40
*/
var $language_section_active = "";
/**
* possiveis mensagens retornadas pela classe
* @access private
* @var string
*/
var $mensagem = "";
/**
* se ocorreu erro em um metodo - true = ocorreu erro; false = nao ocorreu erro
* @access private
* @var boolean
*/
var $error = false;
/**
* Tamanho para o codigo do idioma
* @var numeric
* @access private
*/
var $language_code_len = 10;
/**
* Tamanho para o codigo da mensagem
* @var numeric
* @access private
*/
var $message_code_len = 100;
/**
* Tamanho para o tipo da mensagem
* @var numeric
* @access private
*/
var $message_type_len = 10;
/**
* Tamanho para a abreviacao
* @var numeric
* @access private
*/
var $message_abbr_len = 10;
/**
* Tamanho para o contextualizacao (ex: admin, config, preferences, front-end etc)
* @var numeric
* @access private
*/
var $message_context_len = 10;
/**
* contera as mensagens a serem exibidas para traducao
*
* @access private
* @var array
*/
var $arrLanguageLang = array();
/**
* contera as mensagens a serem listadas
*
* @access private
* @var array
*/
var $arrLanguageList = array();
/**
* idioma do browser
* @var string
* @access private
*/
var $_browser_language = '';
/**
* Se mostra todas as mensagens geradas pela aplicacao
* @var boolean
* @access private
*/
var $_debugTranslator = false;
/**
* Objeto template
* @var object
* @access private
*/
var $_objTmpl;
/**
* Metodo contrutor para realizar a traducao de um texto com base em arquivos pre-definidos
* @access public
* @name Translator
* @param string $_abbr_i18n_tgt - Deve ser informado o idioma destino para a aplicacao
* @param string $_abbr_i18n_src - Deve ser informado o idioma padrao da aplicacao
* (padrao "en" = English)
*/
function Translator( $_abbr_i18n_tgt='', $_abbr_i18n_src='en' ) {
$_browser_language = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
if(strpos($_browser_language, ",")) {
$_browser_language = substr($_browser_language,0,strpos($_browser_language, ","));
}
$this->_browser_language = $_browser_language;
$this->class_self_path = dirname(__FILE__);
if(!empty($_abbr_i18n_src))
$this->SetLanguage($_abbr_i18n_src);
if(!empty($_abbr_i18n_tgt))
$this->SetLanguage($_abbr_i18n_tgt,'target');
/*
* busca a propia traducao
*/
$this->setLangFilePath( $this->class_self_path."/languages/" );
$this->translated_text_self = $this->_getLangFile($_abbr_i18n_tgt);
if($this->error) {
$this->translated_text_self = $this->_getLangFile($_abbr_i18n_src);
if($this->error) {
$this->translated_text_self = $this->_getLangFile("en-us");
}
}
} // end func: Translator
/**
* Prove a interface de cadastramento de codigos de mensagems ou a de traducao
*
* @param boolean $_translate_only FALSE - Se apenas para traduzir
* TRUE - tambem para fazer manutencao (default)
*/
function Translate( $_translate_only=true ) {
// objeto para o template
$_objTmpl =& $this->_createTemplate();
$_objTmpl->setRoot( $this->class_self_path.'/templates' );
// Dados de inicializacao
//if($_translate_only)
// $_POST['mnt_lang_action']['tradutor'] = 'Traduzir';
if(!isset($_POST['mnt_lang_action'])) $_langAction = 'listar';
elseif(array_key_exists('tradutor', $_POST['mnt_lang_action'])) $_langAction = 'tradutor';
elseif(array_key_exists('inserir', $_POST['mnt_lang_action'])) $_langAction = 'inserir';
elseif(array_key_exists('alterar', $_POST['mnt_lang_action'])) $_langAction = 'alterar';
elseif(array_key_exists('excluir', $_POST['mnt_lang_action'])) $_langAction = 'excluir';
elseif(array_key_exists('listar', $_POST['mnt_lang_action'])) $_langAction = 'listar';
elseif(array_key_exists('salvar', $_POST['mnt_lang_action'])) $_langAction = 'salvar';
if(!empty($_POST['tag_active']))
$this->language_section_active = $_POST['tag_active'];
$this->buildLangArray();
$this->buildLangArray('target');
$_list_lang = false;
$_abbr_i18n_save = $this->language_std;
$_mnt_language = $_POST['mnt_language'];
$_lang_code_selected = $_POST['mnt_code_selected'];
$_lang_data_selected[$_lang_code_selected] = ($_POST['mnt_lang_data'][$_lang_code_selected]);
// Variaveis para o Template
// fim de variaveis para o template
// inicio de Montagem pagina HTML
$_objTmpl->readTemplatesFromInput( 'translate_mnt_tmpl.html' );
$_objTmpl->addVar( 'ini_page_form', 'class_self_path', $this->class_self_path );
$_objTmpl->addVar( 'ini_page_form', 'translator_url_path', $this->translator_url_path );
// Se acionado o botao para traduzir, retira-o e mostra o SALVAR/RESTAURAR
if($_translate_only) {
$_objTmpl->addVar( 'ini_page_form_btn', 'mnt_btn_show',"translate");
}
if(isset($_POST['lang_save'])) {
$this->_langSave($_POST['lang_target'],$this->language_user);
}
if(defined( '_VALID_MOS' ))
$_objTmpl->addVar( 'ini_page_form_mos', 'mos_page',"inside");
if($_langAction == 'excluir' ) {
$this->_langCodeDelete($_lang_data_selected);
$_list_lang = true;
$this->_langSave($this->translated_text_std,$_abbr_i18n_save);
}
if($_langAction == 'salvar') {
$_list_lang = true;
$this->translated_text_std[$_mnt_language['code']] = $_mnt_language;
$this->_langSave($this->translated_text_std,$_abbr_i18n_save);
}
// (re)constroi os arrays para o template
if(!empty($_POST['tag_active']))
$this->language_section_active = $_POST['tag_active'];
$this->buildLangArray();
$this->buildLangArray('target');
$this->buildArrayVars();
$titulo = $this->getText('#phpTranslator_page_title#');
$_objTmpl->addVar( 'ini_page_form', 'titulo', $titulo );
$_objTmpl->displayParsedTemplate('ini_page_form');
$this->showTagHeader(&$_objTmpl);
$_objTmpl->addVar( 'ini_page_form', 'PHPTRANSLATOR_EXCLUIR_CODIGO',
$this->getText('#phpTranslator_excluir codigo#') );
$_objTmpl->addVar( 'ini_page_form_btn', 'BTN_INSERIR',
$this->getText('#phptranslator_inserir#') );
$_objTmpl->addVar( 'ini_page_form_btn', 'BTN_ALTERAR',
$this->getText('#phptranslator_alterar#') );
$_objTmpl->addVar( 'ini_page_form_btn', 'BTN_EXCLUIR',
$this->getText('#phptranslator_excluir#') );
$_objTmpl->addVar( 'ini_page_form_btn', 'BTN_LISTAR',
$this->getText('#phptranslator_listar#') );
$_objTmpl->addVar( 'ini_page_form_btn', 'BTN_TRADUZIR',
$this->getText('#phptranslator_traduzir#') );
$_objTmpl->addVar( 'ini_page_form_btn', 'BTN_SALVAR',
$this->getText('#phptranslator_salvar#') );
$_objTmpl->addVar( 'ini_page_form_btn', 'BTN_RESTAURAR',
$this->getText('#phptranslator_restaurar#') );
$_objTmpl->addVar( 'ini_page_form_btn', 'MSG_SELECT_ONE_CHANGE',
$this->getText('#phptranslator_falta selecionar mensagem a ser alterada#') );
$_objTmpl->addVar( 'ini_page_form_btn', 'MSG_SELECT_ONE_DELETE',
$this->getText('#phptranslator_falta selecionar mensagem a ser excluida#') );
$_objTmpl->addVar( 'translate_mnt', 'BTN_SALVAR',
$this->getText('#phptranslator_salvar#') );
$_objTmpl->addVar( 'translate_mnt', 'BTN_RESTAURAR',
$this->getText('#phptranslator_restaurar#') );
$_objTmpl->addVar( 'translate_mnt', 'STANDARD_LANG_CODING',
$this->getText('#phptranslator_codificacao de idioma padrao#') );
$_objTmpl->addVar( 'translate_mnt', 'STANDARD_LANG_CODING_CONTEXT',
$this->getText('#phptranslator_contexto da mensagem#') );
$_objTmpl->addVar( 'translate_mnt', 'STANDARD_LANG_CODING_LANG',
$this->getText('#phptranslator_idioma#') );
$_objTmpl->addVar( 'translate_mnt', 'STANDARD_LANG_CODING_MSG_CODE',
$this->getText('#phptranslator_codigo da mensagem#') );
$_objTmpl->addVar( 'translate_mnt', 'STANDARD_LANG_CODING_MSG_TYPE',
$this->getText('#phptranslator_tipo da mensagem#') );
$_objTmpl->addVar( 'translate_mnt', 'STANDARD_LANG_CODING_MSG_ABBR',
$this->getText('#phptranslator_sigla para a mensagem#') );
$_objTmpl->addVar( 'translate_mnt', 'STANDARD_LANG_CODING_MSG',
$this->getText('#phptranslator_mensagem#') );
$_objTmpl->addVar( 'translate_mnt', 'STANDARD_LANG_CODING_ADVISE',
$this->getText('#phptranslator_mnt_code_advise#') );
$_objTmpl->addVar( 'translate_list_head', 'STANDARD_LANG_REPORTING',
$this->getText('#phptranslator_listagem de mensagens padrao codificadas#') );
$_objTmpl->displayParsedTemplate('form_buttons');
if($_langAction == 'inserir' or $_langAction == 'alterar') {
$_show_form = true;
$_objTmpl->addVar( 'translate_mnt',"LANG_COUNTRY_LEN", $this->language_code_len);
$_objTmpl->addVar( 'translate_mnt',"LANG_CODE_LEN", $this->message_code_len );
$_objTmpl->addVar( 'translate_mnt',"LANG_CONTEXT_LEN",$this->message_context_len);
$_objTmpl->addVar( 'translate_mnt',"LANG_TYPE_LEN", $this->message_type_len);
$_objTmpl->addVar( 'translate_mnt',"LANG_ABBR_LEN", $this->message_abbr_len);
if(array_key_exists('alterar', $_POST['mnt_lang_action']) ) {
if(empty($_lang_code_selected))
$_show_form = false;
$_objTmpl->addVar( 'translate_mnt',"LANG_COUNTRY", $_lang_data_selected[$_lang_code_selected]['lang'] );
$_objTmpl->addVar( 'translate_mnt',"LANG_CODE_DISABLED", 'disabled' );
$_objTmpl->addVar( 'translate_mnt',"LANG_CODE", $_lang_code_selected );
$_objTmpl->addVar( 'translate_mnt',"LANG_CONTEXT",
$_lang_data_selected[$_lang_code_selected]['context'] );
$_objTmpl->addVar( 'translate_mnt',"LANG_TYPE", $_lang_data_selected[$_lang_code_selected]['type'] );
$_objTmpl->addVar( 'translate_mnt',"LANG_ABBR", $_lang_data_selected[$_lang_code_selected]['abbr'] );
$_objTmpl->addVar( 'translate_mnt',"LANG_MESSAGE", $_lang_data_selected[$_lang_code_selected]['text'] );
}
else {
$_objTmpl->addVar( 'translate_mnt',"LANG_COUNTRY", $this->language_std );
}
if($_show_form)
$_objTmpl->displayParsedTemplate('translate_mnt');
$_list_lang = true;
}
if(!$_translate_only and ($_langAction == 'listar' or $_list_lang)) {
$_objTmpl->displayParsedTemplate('translate_list_head');
if($this->arrLanguageList)
foreach($this->arrLanguageList as $_keys => $_key) {
$_objTmpl->addVar( 'translate_list_body', 'TAB_CONTEXT', $_keys );
$_objTmpl->addVar( 'translate_list_body', 'STANDARD_LANG_CODING_LANG',
$this->getText('#phptranslator_idioma#') );
$_objTmpl->addVar( 'translate_list_body', 'STANDARD_LANG_CODING_MSG_CODE',
$this->getText('#phptranslator_codigo da mensagem#') );
$_objTmpl->addVar( 'translate_list_body', 'STANDARD_LANG_CODING_MSG_TYPE',
$this->getText('#phptranslator_tipo da mensagem#') );
$_objTmpl->addVar( 'translate_list_body', 'STANDARD_LANG_CODING_MSG_ABBR',
$this->getText('#phptranslator_sigla para a mensagem#') );
$_objTmpl->addVar( 'translate_list_body', 'STANDARD_LANG_CODING_MSG',
$this->getText('#phptranslator_mensagem#') );
$_objTmpl->addRows( 'translate_list_by_context', $this->arrLanguageList[$_keys] );
$_objTmpl->displayParsedTemplate('translate_list_body');
// limpa dados de template para acrecentar outros dados
$_objTmpl->clearTemplate('translate_list_body');
$_objTmpl->clearTemplate('translate_list_by_context');
} // end foreach
else
$_objTmpl->addVar('translate_list_foot', 'LIST_MESSAGE', $this->getText('#phptranslator_text#').$this->getText('#phptranslator_not found#'));
$_objTmpl->displayParsedTemplate('translate_list_foot');
}
if($_translate_only or $_langAction == 'tradutor') {
// inicio de Montagem pagina do tradutor
$_objTmpl->readTemplatesFromInput( 'translate_tmpl.html' );
$_objTmpl->addVar( 'translate_lang_head', 'STANDARD_LANG_TRANSLATION',
$this->getText('#phptranslator_traducao do idioma padrao#') );
$_objTmpl->displayParsedTemplate('translate_lang_head');
if(is_array($this->arrLanguageLang ))
foreach($this->arrLanguageLang as $_keys => $_key) {
$_objTmpl->addVar( 'translate_lang_body', 'STANDARD_TEXT',
$this->getText('#phptranslator_texto padrao#') );
$_objTmpl->addVar( 'translate_lang_body', 'TARGET_TEXT',
$this->getText('#phptranslator_traduzir para#') );
$_objTmpl->addVar( 'translate_lang_body', 'TRANSLATED_TEXT',
$this->getText('#phptranslator_texto traduzido#') );
$_objTmpl->addVar( 'translate_lang_body', 'ABBREVIATION',
$this->getText('#phptranslator_sigla#')."/".
$this->getText('#phptranslator_simbolo#') );
$_objTmpl->addVar( 'translate_lang_body', 'BTN_SALVAR',
$this->getText('#phptranslator_salvar#') );
$_objTmpl->addVar( 'translate_lang_body', 'BTN_RESTAURAR',
$this->getText('#phptranslator_restaurar#') );
$_objTmpl->addVar( 'translate_lang_body', 'TAB_CONTEXT', $_keys );
$_objTmpl->addVar( 'translate_lang_body','LANGUAGE_SOURCE',"(".$this->language_std.")");
$_objTmpl->addVar( 'translate_lang_body','LANGUAGE_TARGET',"(".$this->_getLanguage().")");
$_objTmpl->addRows( 'translate_lang_list_entry', $this->arrLanguageLang[$_keys] );
$_objTmpl->displayParsedTemplate('translate_lang_body');
// limpa dados de template para acrecentar outros dados
$_objTmpl->clearTemplate('translate_lang_body');
$_objTmpl->clearTemplate('translate_lang_list_entry');
} // end foreach
$_objTmpl->displayParsedTemplate('translate_lang_foot');
// fim de Montagem pagina do tradutor
}
$_objTmpl->displayParsedTemplate('end_page_form');
} //end func: Translate
/**
* Busca o texto a ser traduzido
*
* Busca a traducao do texto - caso o texto traduzido nao exista retorna o texto padrao e caso este
* tambem nao exista retorna o codigo de pesquisa
*
* @param string $_msg_code O codigo da mensagem a ser traduzida
* @param boolean $_sigla Se retorna a sigla em lugar da mensagem completa
* @param boolean $_text_case Se o texto retorna o texto como cadastrado, em maiusculas ou minusculas
* 1 - maiuscula
* 2 - minuscula
* outro - como estiver cadastrado
*
* @return string O texto traduzido, o texto padrao ou o codigo da mensagem
*
*/
function getText( $_msg_code, $_sigla=false, $_text_case=0 ) {
if(!empty($_msg_code) && ($this->translate_message)) {
$_msg_text = $this->_getStdText($_msg_code,$_sigla,$_text_case);
}
else {
$_msg_text = $_msg_code;
}
return $_msg_text;
} // end func: getText
/**
* Metodo para retornar a mensagens de erros ocorridas
*
* @access public
* @name getMessage
*/
function getMessage() {
return $this->mensagem;
} // end func: getMessage
/**
* Metodo para retornar se houve erro ou nao na classe
*
* @access public
* @return boolean TRUE - houve erro ao processar a classe
* FALSE - nao houve erro
*/
function isError() {
return $this->error;
} // end func: isError
/**
* Atribui o caminho fisico para os arquivos de idiomas
*
* devera conter as secoes dos arquivos de idiomas, conforme contextualizacao
* <code>
* ...
* $_lang_sections = array(
* 'phpTranslator' => 'textos da classe de traducao',
* 'admin' => 'Textos da secao administrativa',
* 'home' => 'textos da secao principal',
* 'and son on' => 'e assim por diante...');
*
* $objTranslator->setLangFileSections($_lang_sections);
* ...
* </code>
* @param string $_language_file_path O caminho para os arquivos de idiomas
* @var array
* @since v 0.2.0-40
*/
function setLangFileSections($_language_sections=array()) {
if(empty($_language_sections)) {
$this->message = "Impossivel processar traducao por secoes, secoes nao informadas.";
$this->error = true;
}
else {
$this->language_sections = $_language_sections;
$this->error = false;
}
return !$this->error;
}
/**
* Atribui o caminho fisico para os arquivos de idiomas
*
* @param string $_language_file_path O caminho para os arquivos de idiomas
*/
function setLangFilePath($_language_file_path="") {
if (!empty($_language_file_path))
$this->language_file_path = $_language_file_path;
} // end func: setLangFilePath
/**
* Mostra o formulario de selecao de contextos
* @access private
* @since v 0.2.0-40
*/
function showTagHeader(&$_objTmpl) {
if ($this->languageFileInSections)
if(!is_object($_objTmpl)) {
$this->mensagem = $this->getText('#phptranslator_objTemplate#').$this->getText('#phptranslator_not found#');
if($this->_debugTranslator) echo "phpTranslator: ".$this->getMessage();
$this->error = true;
}
else {
if(is_array($this->language_sections) and !empty($this->language_sections)) {
$_list = array();
foreach($this->language_sections as $_tag => $_tag_title) {
$_tag_current = '';
if($_tag == $this->language_section_active)
$_tag_current = 'TagCurrent';
$_arrAux = array(
array(
'TAG_NAME' => $_tag,
'TAG_HEADER_ACTIVE' => $_tag_current,
'TAG_HEADER' => $this->getText($_tag),
'TAG_HEADER_TITLE' => $this->getText($_tag_title)
)
);
$_list = array_merge($_list,$_arrAux);
}
/*
echo $this->language_section_active;
if('tradutor' == $this->language_section_active)
$_tag_current = 'TagCurrent';
$_list = array_merge($_list,
array(
array(
'TAG_NAME' => 'tradutor',
'TAG_HEADER_ACTIVE' => $_tag_current,
'TAG_HEADER' => $this->getText('tradutor'),
'TAG_HEADER_TITLE' => $this->getText('Classe Tradutora')
)
)
);
*/
$_objTmpl->addRows( 'tmplTagHeader_list', $_list);
$_objTmpl->addVar('tmplTagHeader','translator_url_path',$this->translator_url_path);
$_objTmpl->addVar('tmplTagHeader','TAG_ACTIVE',$_POST['tag_active']);
$_objTmpl->displayParsedTemplate('tmplTagHeader');
}
else {
$this->mensagem = $this->getText('#phptranslator_section array not defined#');
if($this->_debugTranslator) echo "phpTranslator: ".$this->getMessage();
$this->error = true;
}
}
} // end func: showTagHeader
/**
* Atribui o caminho (URL) para a classe
*
* @param string $_translator_url_path A URL para a classe
* @since v 0.2.0-40
*/
function setURLPath($_translator_url_path="") {
if (!empty($_translator_url_path))
$this->translator_url_path = $_translator_url_path;
} // end func: setURLPath
/**
* Atribui o sufixo para o arquivo de idiomas
*
* @param string $_file_sufix O sufixo a ser atribuido ao arquivo
*/
function setLangFileSufix($_file_sufix="") {
if (!empty($_file_sufix))
$this->language_file_sufix = $_file_sufix;
} // end func: setLangFileSufix
/**
* Atribui o prefixo para o arquivo de idiomas
*
* @param string $_file_prefix O prefixo a ser atribuido ao arquivo
*/
function setLangFilePrefix($_file_prefix="") {
if (!empty($_file_prefix))
$this->language_file_prefix = $_file_prefix;
} // end func: setLangFilePrefix
/**
* Atribui os idiomas a serem usado na aplicacao
*
* @access private
* @param string $_abbr_i18n ISO do Idioma em questao
* @param string $_lang_choice Qual o padrao a ser lido e armazenado
* standard - o padrao para a aplicacao
* target - o idioma destino
* user - o idioma para o usuario
*/
function setLanguage($_abbr_i18n, $_lang_choice='standard') {
switch ($_lang_choice) {
case 'standard': {
$this->setLangSrc($_abbr_i18n);
break;
}
case 'target': {
$this->setLangTgt($_abbr_i18n);
break;
}
case 'user': {
$this->setLangUser($_abbr_i18n);
break;
}
}
} // end func: setLanguage
/**
* Le os arquivos de idioma e os armazena em array especificos (padrao ou destino)
*
* @param string $_lang_choice Qual o padrao a ser lido e armazenado<br>
* . standard - o padrao para a aplicacao<br>
* . target - o idioma a ser mostrado para o usuario<br>
*/
function buildLangArray($_lang_choice='standard') {
switch ($_lang_choice) {
case 'standard': {
$this->translated_text_std = $this->_getLangFile();
$this->translated_text[$this->language_std] = $this->translated_text_std;
break;
}
case 'target': {
$this->translated_text_tgt = $this->_getLangFile($this->language_user);
$this->translated_text[$this->language_user] = $this->translated_text_tgt;
break;
}
}
} // end func: buildLangArray
/**
* Constroi o array de traducao de idiomas (DE -> PARA)
*
* @access private
*/
function getLangArray4Translate() {
$_language_src = $this->translated_text_std;
$_language_tgt = $this->translated_text_tgt;
if($_language_src) {
//Idioma a traduzir
// cria array para cada context
foreach($_language_src as $_keys => $_key) {
if($_key['type'] != 'notran')
$_list[$this->getText($_key['context'])] = array();
} // end foreach
foreach($_language_src as $_keys => $_key) {
if(!empty($_language_tgt[$_keys]['text']) or !empty($_language_tgt[$_keys]['abbr']))
$_cor = "";
else
$_cor = T_BG_COLOR_TRADUZ;
if($_key['type'] != 'notran')
$_arrAux = array(
array( 'cor' => $_cor,
'lang_src_key' => $_keys,
'lang_language' => $this->language_user,
'lang_context' => $_key['context'],
'lang_type' => $_key['type'],
'lang_src' => $_key['text'],
'lang_tgt' => $_language_tgt[$_keys]['text'],
'lang_tgt_acr' => $_language_tgt[$_keys]['abbr']
)
);
//$_list = array_merge($_list, $_arrAux);
$_list[$this->getText($_key['context'])] = array_merge($_list[$this->getText($_key['context'])],$_arrAux);
} // end foreach
}
if(empty($_list))
$_list = false;
return $_list;
} // end Function getLangArray4Translate
/**
* Constroi o array de listagem de idioma padrao
*
* @access private
*/
function getLangArray4List() {
$_language_src = $this->translated_text_std;
//Idioma a traduzir
if(!empty($_language_src)) {
// cria array para cada context
foreach($_language_src as $_keys => $_key) {
if($_key['type'] != 'notran')
$_list[$this->getText($_key['context'])] = array();
} // end foreach
foreach($_language_src as $_keys => $_key) {
if($_key['type'] != 'notran') {
$_arrAux = array(
array(
'list_lang' => $this->language_std,
'list_lang_code' => $_keys,
'list_lang_context' => $_key['context'],
'list_lang_type' => $_key['type'],
'list_lang_message' => $_key['text'],
'list_lang_abbr' => $_language_src[$_keys]['abbr']
)
);
$_list[$this->getText($_key['context'])] = array_merge($_list[$this->getText($_key['context'])],$_arrAux);
}
} // end foreach
}
if(empty($_list))
$_list = false;
return $_list;
} // end Function getLangArray4List
/**
* Constroi os arrays de traducao e listagem de idioma padrao
*
* @access private
*/
function buildArrayVars() {
$this->arrLanguageLang = $this->getLangArray4Translate();
$this->arrLanguageList = $this->getLangArray4List();
if(!empty($this->arrLanguageLang))
ksort($this->arrLanguageLang);
if(!empty($this->arrLanguageList))
ksort($this->arrLanguageList);
} // end Function buildArrayVars
/**
* Constroi string de conteudo do arquivo a ser salvo
*
* @access private
* @param array $_lang_tgt_text_file Idioma a ser salvo
*/
function buildStr4File($_lang_tgt_text_file) {
$_new_target_file = "";
if(is_array($_lang_tgt_text_file)) {
foreach($_lang_tgt_text_file as $_keys => $_values) {
$_text_test = trim($_values['text'] ). trim($_values['abbr']);
if(!empty($_text_test)) {
$_new_target_file .= $_values['lang'].
$this->_spaces($this->language_code_len-strlen($_values['lang']));
$_new_target_file .= $_keys.
$this->_spaces($this->message_code_len-strlen($_keys));
$_new_target_file .= $_values['context'].
$this->_spaces($this->message_context_len-strlen($_values['context']));
$_new_target_file .= $_values['type'].
$this->_spaces($this->message_type_len-strlen($_values['type']));
$_new_target_file .= $_values['abbr'].
$this->_spaces($this->message_abbr_len-strlen($_values['abbr']));
$_new_target_file .= $_values['text'];
$_new_target_file .= T_CRLF ;
}
}
}
else {
$this->Error = true;
$this->mensagem = $this->getText('#phptranslator_array parameter required#');
if($this->_debugTranslator) echo "phpTranslator: ".$this->getMessage();
$_new_target_file = false;
}
return $_new_target_file;
} // end Function buildStr4File
/**
* Salva o arquivo de idioma conforme definido nos padroes
*
* @access private
* @param string $_content_to_file Texto/conteudo do arquivo a ser salvo
* @param string $_abbr_i18n Idioma do arquivo a ser salvo- se nao informado busca o idioma padrao
* @param boolean $_file_increment Se o conteudo do arquivo sera incrementado - padrao eh sobrescrever
* @return boolean se o arquivo foi salvo ou nao
*/
function saveLangFile($_content_to_file, $_abbr_i18n = "", $_file_increment=false) {
if(empty($_abbr_i18n))
$_abbr_i18n = $this->language_std;
$_file_name = $this->_makeFileName($_abbr_i18n);
$this->error = true;
if(is_writable($this->language_file_path)) {
if (is_writable($_file_name) or !file_exists($_file_name)) {
if(($_file_increment) and file_exists($_file_name))
$_resource = @fopen($_file_name,'w+');
else
$_resource = @fopen($_file_name,'w');
if($_resource){
fwrite($_resource,$_content_to_file);
fclose($_resource);
}
else {
$this->mensagem = $this->getText('#phptranslator_file#')." ($_file_name) ".$this->getText('#phptranslator_without write permition#');
if($this->_debugTranslator) echo "phpTranslator: ".$this->getMessage();
$this->error = false;
}
}
else {
$this->mensagem = $this->getText('#phptranslator_file#')." ($_file_name) ".$this->getText('#phptranslator_without write permition#');
if($this->_debugTranslator) echo "phpTranslator: ".$this->getMessage();
$this->error = false;
}
}
else {
$this->mensagem = $this->getText('#phptranslator_directory#')." ($this->language_file_path) ".$this->getText('#phptranslator_without write permition#');
if($this->_debugTranslator) echo "phpTranslator: ".$this->getMessage();
$this->error = false;
}
return $this->error;
} // end func: SaveFile
/*
* Metodos PRIVATE
*/
/**
* Atribui o idioma padrao para a aplicacao
*
* @access private
* @param string $_abbr_i18n ISO do Idioma da aplicacao
*/
function setLangSrc($_abbr_i18n) {
$this->language_std = $_abbr_i18n;
} // end func: setLangSrc
/**
* Atribui o idioma do usuario
*
* @access private
* @param string $_abbr_i18n ISO do Idioma do usuario
*/
function setLangUser($_abbr_i18n) {
$this->language_user = $_abbr_i18n;
} // end func: setLangUser
/**
* Atribui o idioma do destino na traducao
*
* @access private
* @param string $_abbr_i18n ISO do Idioma target
*/
function setLangTgt($_abbr_i18n) {
$this->setLangUser($_abbr_i18n) ;
} // end func: setLangTgt
/**
* Monta o nome do arquivo de idiomas
* @access private
*
* @param string $_abbr_i18n Codigo ISO do idioma a ser usado
*
* @return string O nome do arquivo (incluindo o path)
*/
function _makeFileName($_abbr_i18n) {
if(empty($_abbr_i18n))
$_abbr_i18n = $this->language_user;
$_file_name = $this->language_file_path;
if($this->language_file_subdir)
$_file_name .= $_abbr_i18n."/";
$_file_name .= $this->language_file_prefix;
if ($this->languageFileInSections)
if(!empty($this->language_section_active))
$_file_name .= $this->language_section_active.".";
$_file_name .= $_abbr_i18n;
$_file_name .= $this->language_file_sufix;
$this->error = false;
if(!is_file($_file_name)) {
$this->mensagem = $this->getText('#phptranslator_file#')." ($_file_name) ".$this->getText('#phptranslator_not found#');
if($this->_debugTranslator) echo "phpTranslator: ".$this->getMessage();
$this->error = true;
}
return $_file_name;
} // end func: MakeFileName
/**
* Idioma a ser traduzido para a aplicacao.
* Se o preferido pelo usuario ou o do Browser em uso ou o padrao da aplicacao
* @access private
*/
function _getLanguage() {
// faz insercao dos textos padroes para a aplicacao (conforme o idioma
$_language = "";
if(!empty($this->language_user))
$_language = $this->language_user;
elseif(!empty($this->_browser_language))
$_language = $this->_browser_language;
else
$_language = $this->language_std;
return $_language;
} // end func: _getLanguage
/**
* Busca o texto a ser traduzido dentro do array de idiomas
*
* Busca a traducao do texto - caso o texto traduzido nao exista retorna o texto padrao e caso este
* tambem nao exista retorna o codigo de pesquisa
*
* @access private
* @param string $_msg_code O codigo da mensagem a ser traduzida
* @param boolean $_sigla Se retorna a sigla em lugar da mensagem completa
* @param boolean $_text_case Se o texto retorna o texto como cadastrado, em maiusculas ou minusculas
* 1 - maiuscula
* 2 - minuscula
* outro - como estiver cadastrado
*
* @return string O texto traduzido, o texto padrao ou o codigo da mensagem
*
*/
function _getStdText($_msg_code='',$_sigla=false,$_text_case=0) {
if(!empty($_msg_code))
/*
* - A chave de procura deve estar em minusculas bem como o conteudo do arquivo de idiomas
*/
$_key_lower_text = strtolower($_msg_code);
$_lang_array_aux = $this->translated_text[$this->_getLanguage()];
if(@array_key_exists($_key_lower_text, $_lang_array_aux)) {
if(@array_key_exists('text', $_lang_array_aux[$_key_lower_text])) {
$_msg_code_aux = $_lang_array_aux[$_key_lower_text]['text'];
if($_sigla)
if(@array_key_exists('abbr', $_lang_array_aux[$_key_lower_text]))
$_msg_code_aux = $_lang_array_aux[$_key_lower_text]['abbr'];
}
}
else {
$_lang_array_aux = $this->translated_text_std;
if(@array_key_exists($_key_lower_text, $_lang_array_aux)) {
if(@array_key_exists('text', $_lang_array_aux[$_key_lower_text])) {
$_msg_code_aux = $_lang_array_aux[$_key_lower_text]['text'];
if($_sigla)
if(@array_key_exists('abbr', $_lang_array_aux[$_key_lower_text]))
$_msg_code_aux = $_lang_array_aux[$_key_lower_text]['abbr'];
}
}
else {
$_lang_array_aux = $this->translated_text_self;
if(@array_key_exists($_key_lower_text, $_lang_array_aux)) {
if(@array_key_exists('text', $_lang_array_aux[$_key_lower_text])) {
$_msg_code_aux = $_lang_array_aux[$_key_lower_text]['text'];
if($_sigla)
if(@array_key_exists('abbr', $_lang_array_aux[$_key_lower_text]))
$_msg_code_aux = $_lang_array_aux[$_key_lower_text]['abbr'];
}
}
}
}
switch ($_text_case) {
case 1: // tudo em minusculas
$_msg_code_aux = strtolower($_msg_code_aux);
break;
case 2: // tudo em maiusculas
$_msg_code_aux = strtoupper($_msg_code_aux);
break;
}
if(empty($_msg_code_aux))
$_msg_code_aux = $_msg_code;
return $_msg_code_aux;
} // end func: _getStdText
/**
* Monta uma string contendo espacos em branco
* @access private
* @param int $_num Numero de espacos que a string contera
* @return string Espacos em branco
*/
function _spaces($_num=0) {
if($_num>0)
for($_inc=1;$_inc<=$_num;$_inc++) {
$_spaces .= " ";
}
return $_spaces;
} // end func: _spaces
/**
* cria template para a propria classe usar
* @access private
* @return patTemplate
*/
function &_createTemplate() {
global $option, $mosConfig_absolute_path;
if(defined( '_VALID_MOS' )) {
require_once($mosConfig_absolute_path.'/includes/patTemplate/patTemplate.php' );
$tmpl =& patFactory::createTemplate();
$tmpl->setRoot( dirname( __FILE__ ) . '/templates' );
}
else {
require_once( $this->class_self_path.'/classes/pat/patErrorManager.php' );
require_once( $this->class_self_path.'/classes/pat/patTemplate.php' );
$tmpl = new patTemplate();
$tmpl->setNamespace("mos");
}
$this->_objTmpl = $tmpl;
return $tmpl;
} // end func: _createTemplate
/**
* Salvar dados apos alteracoes ou exclusoes de mensagens codificadas
*
* @access private
*/
function _langSave($_lang_target,$_abbr_i18n_save) {
$_text4file = $this->buildStr4File($_lang_target);
if(!is_bool($_text4file)) {
$_saved = $this->saveLangFile($_text4file,$_abbr_i18n_save);
if(!$_saved)
echo $this->getMessage();
}
elseif(!($_text4file))
echo $this->getMessage();
} // end func: _langSave
/**
* Excluir mensagem do idioma padrao
*
* @access private
* @param array $_lang_data_selected Dado do idioma padrao a ser excluido
*
*/
function _langCodeDelete($_lang_data_selected) {
foreach($_lang_data_selected as $_keys => $_key) {
unset( $this->translated_text_std[$_keys]);
}
} // end func: _langCodeDelete
/**
* Busca o arquivo de idiomas
*
* @access private
* @param string $_abbr_i18n O codigo ISO do idioma a ser tratado
*
* @return array Contem os dados do idioma
*/
function _getLangFile($_abbr_i18n="") {
$this->error = false;
if(empty($_abbr_i18n))
$_abbr_i18n = $this->language_std;
$_src_file_name = $this->_makeFileName($_abbr_i18n);
if(!file_exists($_src_file_name)) {
$this->mensagem = $this->getText('#phptranslator_language file#')." ($_src_file_name) ".
$this->getText('#phptranslator_not found#');
if($this->_debugTranslator) echo "phpTranslator: ".$this->getMessage();
$this->error = true;
return false;
}
$_src_file = file($_src_file_name);
// monta idioma padrao
foreach($_src_file as $_keys => $_values) {
$_lang = trim(substr($_values,0,$this->language_code_len));
$_msg_code = strtolower(trim(substr($_values,$this->language_code_len,$this->message_code_len)));
$_str_start_aux = $this->language_code_len+$this->message_code_len;
$_msg_context = trim(substr($_values,$_str_start_aux,$this->message_context_len));
$_str_start_aux = $this->language_code_len+$this->message_code_len+$this->message_context_len;
$_msg_type = trim(substr($_values,$_str_start_aux,$this->message_type_len));
$_str_start_aux = $this->language_code_len+$this->message_code_len+
$this->message_context_len+$this->message_type_len;
$_msg_abbr = trim(substr($_values,$_str_start_aux,$this->message_abbr_len));
$_str_start_aux = $this->language_code_len+$this->message_code_len+
$this->message_context_len+$this->message_type_len+$this->message_abbr_len;
$_msg_text = trim(substr($_values,$_str_start_aux));
$_language_data[$_lang][$_msg_code]['text'] = $_msg_text;
$_language_data[$_lang][$_msg_code]['context'] = $_msg_context;
$_language_data[$_lang][$_msg_code]['type'] = $_msg_type;
$_language_data[$_lang][$_msg_code]['abbr'] = $_msg_abbr;
$_language_data[$_lang][$_msg_code]['lang'] = $_abbr_i18n;
}
asort($_language_data[$_abbr_i18n]);
return $_language_data[$_abbr_i18n];
} // end func: _getLangFile
/**
* Atribui o tamanho do campo de codigo (abbrI18N) do idioma
* @access public
* @param boolean $_length Tamnho a ser atribuido (default 10)
*/
function setLangCountryLength( $_length=10) {
$this->language_code_len = $_length;
} // end func: setLangCountryLength
/**
* Atribui o tamanho do campo de codigo da messagem
* @access public
* @param boolean $_length Tamnho a ser atribuido (default 100)
*/
function setLangMsgCodeLength( $_length=100) {
$this->message_code_len = $_length;
} // end func: setLangMsgCodeLength
/**
* Atribui o tamanho do campo de tipo da messagem
* @access public
* @param boolean $_length Tamnho a ser atribuido (default 10)
*/
function setLangMsgTypeLength( $_length=10) {
$this->message_type_len = $_length;
} // end func: setLangMsgTypeLength
/**
* Atribui o tamanho do campo de contexto da messagem
* @access public
* @param boolean $_length Tamnho a ser atribuido (default 10)
*/
function setLangMsgContextLength( $_length=10) {
$this->message_context_len = $_length;
} // end func: setLangMsgContextLength
/**
* Atribui o tamanho do campo da abreviatura da messagem
* @access public
* @param boolean $_length Tamnho a ser atribuido (default 10)
*/
function setLangMsgAbbrLength( $_length=10) {
$this->message_abbr_len = $_length;
} // end func: setLangMsgAbbrLength
/**
* Atribui que o caminho dos arquivos de idiomas ficarao em subdiretorios abbrI18N
* @access public
* @param boolean $_filesInSubDirs TRUE - em subdiretorio abbrI18N
* FALSE - sem subdiretorio abbrI18N (default)
*/
function setLangFilesInSubDirs($_filesInSubDirs=false) {
$this->language_file_subdir = $_filesInSubDirs;
} // end func: setLangFilesInSubDir
/**
* Atribui que os arquivos de idiomas serao seccionados conforme contextualizacao
* @access public
* @param boolean $_filesInSections TRUE - seccionados
* FALSE - nao seccionados (default)
*/
function setLangFilesInSections($_filesInSections=false) {
$this->languageFileInSections = $_filesInSections;
} // end func: setLangFilesInSections
/**
* Atribui a secao ativa a ser mostrada a TAG em "showTagHeader"
* @access public
* @param string $_activeSection O nome da seccao ativa (ex: admin ou setup)
* Obs: Deve ser o nome interno e nao a traducao
*/
function setActiveSection($_activeSection="") {
$this->language_section_active = $_activeSection;
} // end func: setActiveSection
/*
* Deprecated Methods
*/
/**
* @access private
* @deprecated since v 0.1.41
* @see setURLPath()
*/
function setTabPaneURLPath($_translator_url_path="") {
$this->setURLPath($_translator_url_path);
}
/**
* @access private
* @deprecated since v 0.1.41
* @see setLangFilePath()
*/
function setFilePath($_language_file_path="") {
$this->setLangFilePath($_language_file_path);
} // end func: setFilePath
/**
* @access private
* @deprecated since v 0.1.41
* @see setLangFileSections()
*/
function setLangSections($_language_sections=array()) {
$this->setLangFileSections($_language_sections);
}
/**
* @access private
* @deprecated since v 0.1.41
* @see setLangFilePrefix()
*/
function setFilePrefix($_file_prefix="") {
$this->setLangFilePrefix($_file_prefix);
} // end func: setFilePrefix
/* END OF DEPRECATED METHODS */
} // end Class: Translator
?>