desenvolva para o mundo - internacionalização de sistemas com zend framework
DESCRIPTION
Palestra ministrada na PHP Conference 2012. Material de apoio disponível em: http://vivaweb.net/palestras/zf_i18n.zipTRANSCRIPT
APLICAÇÕES
INTERNACIONALIZADAS
DESENVOLVA PARA O MUNDO
segunda-feira, 3 de dezembro de 12
EDUARDO BONAGRADUAÇÃO: SISTEMAS PARA INTERNET - 2008
PÓS-GRADUAÇÃO: BANCO DE DADOS ORACLE/
DB2 - 2009
CO-FUNDADOR - VIVAWEB INTERNET
PROFESSOR UNIVERSITÁRIO - CESUMAR
PROGRAMADOR PHP DESDE 2004
PROGRAMADOR ZEND DESDE 2008
segunda-feira, 3 de dezembro de 12
POR QUE
INTERNACIONALIZAR
MEU APLICATIVO?
segunda-feira, 3 de dezembro de 12
Idiomas mais populares por paísThe Impact of App Translations
By Tiuri van Agten, Analyst at Distimo
segunda-feira, 3 de dezembro de 12
Para ter chances de ser visto em um mercado mundial seu aplicativo deverá ser bom e estar em inglês, não necessariamente nesta ordem.
O Brasil é o único país onde o idioma nativo não é nem o primeiro nem o segundo mais baixado. Apenas
40% dos top 200 tem suporte ao português.
segunda-feira, 3 de dezembro de 12
Já que você tem que pensar de qualquer forma:
PENSE GRANDE!- Donald Trump
segunda-feira, 3 de dezembro de 12
#GOGOGO: AO ASSUNTO!
• Internacionalização (i18n - internationalization)é a criação e o desenvolvimento de um produto que permite a localização fácil dos públicos alvo que variam em termos de cultura, região ou idioma.
• Localização (l10n - localization) está relacionado à adaptação de um produto, aplicação ou conteúdo do documento para atender às exigências do idioma, culturais e outros requisitos de um mercado alvo específico (um "local").
Fonte: W3C http://www.w3.org/International/questions/qa-i18n.pt.php
segunda-feira, 3 de dezembro de 12
COMPONENTES USADOS NO ZEND 1
#GOGOGO: AO ZEND
ZEND_LOCALE
ZEND_DATE
ZEND_CURRENCY
ZEND_TRANSLATE
segunda-feira, 3 de dezembro de 12
#ESTUDO DE CASO 1:TRADUÇÃO COM POEDIT
ADIÇÃO DE HELPER TRANSLATE EM CÓDIGOS
CRIAÇÃO DE CATÁLOGO
CONFIGURAÇÃO DE CATÁLOGO
ATUALIZAR CATÁLOGO A PARTIR DE CÓDIGO FONTE
CONFIGURAR APPLICATION.INI PARA DETECÇÃO
TESTES
segunda-feira, 3 de dezembro de 12
1) em application/views/scripts/index/index.phtml (view) - adicionar helper $this->translate nos termos a serem traduzidos
<li><a href="#"><?php echo $this->translate("Galeria") ?></a></li><li><a href="#"><?php echo $this->translate("Especificações") ?></a></li>
2) em application/i18n/en_US.po (tradução) - traduzir os novos termos com POEDIT
3) em application/configs/application.ini adicionar os parâmetros para reconhecimento do idioma e do arquivo de tradução
resources.locale.default = "pt_BR"resources.translate.data = APPLICATION_PATH "/i18n/"resources.translate.default.disableNotices = 1resources.translate.adapter = "gettext"resources.translate.options.scan = "filename"
#ESTUDO DE CASO 1:
segunda-feira, 3 de dezembro de 12
#ESTUDO DE CASO 1I:ZEND DATE E CURRENCY
UTILIZAÇÃO DO HELPER CURRENCY
CRIAÇÃO DE DATAS ATRAVÉS DO COMPONENTE E COMPORTAMENTO SOB INTERNACIONALIZAÇÃO
CUIDADOS NA UTILIZAÇÃO DE DATAS
segunda-feira, 3 de dezembro de 12
#ESTUDO DE CASO 1I:
1) em application/scripts/views/index/index.phtml
<p>iPhone 5 a partir de <? echo $this->currency(1290.50) ?></p>
Resultado com navegador em inglês: $1.290,50Resultado com navegador em português: R$1,290.50
De acordo com a identificação da localização (locale) - neste caso é automático pelo idioma do navegador - este helper currency se responsabiliza pela moeda.
segunda-feira, 3 de dezembro de 12
#ESTUDO DE CASO 1I:
1) em application/controllers/IndexController.php - serão criadas 3 datas para apresentar a forma com que o Zend_Date trata as datas e as imprime através das views.
// Ao usar datas fixas, crie-as com uma constante correta$data_de = new Zend_Date("2012-12-01", Zend_Date::ISO_8601);$this->view->data_de = $data_de;
// Ou com o locale correto$data_ate = new Zend_Date("30/12/2012", "pt_BR");$this->view->data_ate = $data_ate;
// veja o problema que acontece quando você cria uma data no formato brasileiro mas não informa nada e reusa esta data em um idioma que não seja o mesmo$data_com_problema = new Zend_Date("10/11/2012");$this->view->data_com_problema = $data_com_problema;
segunda-feira, 3 de dezembro de 12
#ESTUDO DE CASO 1I:
2) em application/views/scripts/index/index.php - serão chamadas as variáveis passadas via controller para as views.
<p>Do dia <?php echo $this->data_de->get("dd/MM/yy") ?> até <?php echo $this->data_ate->get("dd/MM/yy") ?></p><p>Esta data se encontrará com problemas em inglês <?php echo $this->data_com_problema->get("dd/MM/yy") ?></p>
*** Note que ao usar um navegador em português, tudo estará correto, mas em um navegador em inglês, a terceira data se encontrará com problemas no dia e no mês, justamente porque ao criar a data você não informou o formato dela.
segunda-feira, 3 de dezembro de 12
#ESTUDO DE CASO 1II:TRADUÇÃO POR URL
REESCRITA DAS ROTAS DEFAULT
CRIAÇÃO DE PLUGIN PARA SETUP DA TRADUÇÃO
TESTES
segunda-feira, 3 de dezembro de 12
#ESTUDO DE CASO 1II:1) em application/plugins/Rotas.php - criar o plugin de rotas para identificar sempre como primeiro parâmetro o idioma
<?phpclass Application_Plugin_Rotas extends Zend_Controller_Plugin_Abstract { public function routeStartup(Zend_Controller_Request_Abstract $request){ $router = Zend_Controller_Front::getInstance ()->getRouter (); $router->removeDefaultRoutes (); $router->addRoute ( 'languageModuleControllerAction', new Zend_Controller_Router_Route( '/:lang/:module/:controller/:action', array ('lang' => 'pt') )); $router->addRoute ( 'languageControllerAction', new Zend_Controller_Router_Route ( '/:lang/:controller/:action', array ('lang' => 'pt') )); $router->addRoute ( 'language', new Zend_Controller_Router_Route ( '/:lang', array ('lang' => 'pt') )); $router->addRoute ( 'languageController', new Zend_Controller_Router_Route ( '/:lang/:controller', array ('lang' => 'pt') )); }}?>
segunda-feira, 3 de dezembro de 12
#ESTUDO DE CASO 1II:2) em application/plugins/Internacionalizacao.php - criar o plugin que receberá o parâmetro de idioma através da rota e fará a leitura do arquivo de tradução.
<?phpclass Application_Plugin_Internacionalizacao extends Zend_Controller_Plugin_Abstract { protected $_idiomaPadrao = "pt_BR"; protected $_idiomas = array ("en","pt"); protected $_idiomasRegiao = array ("en" => "US", "pt" => "BR"); public function preDispatch(Zend_Controller_Request_Abstract $request) { $lang = $request->getParam ( "lang", NULL); if (! in_array ( $lang, $this->_idiomas )) $var_locale = $this->_idiomaPadrao; else $var_locale = $lang . '_' . $this->_idiomasRegiao [$lang]; $locale = new Zend_Locale ( $var_locale ); Zend_Registry::set ( 'Zend_Locale', $locale ); $translate = new Zend_Translate ( 'gettext', APPLICATION_PATH . '/i18n/', $locale, array ("scan" => Zend_Translate::LOCALE_FILENAME ) ); Zend_Registry::set ( 'Zend_Translate', $translate ); }}?>
segunda-feira, 3 de dezembro de 12
#ESTUDO DE CASO 1II:
3) em application/Bootstrap.php adicionar o método init Auto Loader para que a pasta plugins criada para o exemplo tenha seu namespace na aplicação
protected function _initAutoLoader() { $loader = new Zend_Loader_Autoloader_Resource(array( 'basePath' => APPLICATION_PATH, 'namespace' => 'Application' )); $loader->addResourceType('plugin', 'plugins/', 'Plugin');}
4) em application/configs/application.ini - adicionar os 2 plugins à aplicação
resources.frontController.plugins.internacionalizacao = "Application_Plugin_Internacionalizacao"resources.frontController.plugins.rotas = "Application_Plugin_Rotas”
*** Após isso, basta testar o endereço /en ou /pt e notará que independentemente do idioma do navegador o sistema optará pelo que foi passado na URL. Se nada for informado, ele busca pelo padrão que o plugin determinou como sendo PT.
segunda-feira, 3 de dezembro de 12
COMPONENTES USADOS NO ZEND 2
#GOGOGO: AO ZEND 2
ZEND_LOCALEZEND_DATE
ZEND_CURRENCY
ZEND_TRANSLATE
i18n
segunda-feira, 3 de dezembro de 12
MUDANÇAS NA INTERNACIONALIZAÇÃO COM ZEND 2
Remoção das classes:
•Zend\Locale\Locale
•Zend\Locale\Format
•Zend\Date\Date
•Zend\Currency\Currency
segunda-feira, 3 de dezembro de 12
MUDANÇAS NA INTERNACIONALIZAÇÃO COM ZEND 2
•Criação da Zend\i18n substituindo a Zend_Translate
•Criação de view helpers para CurrencyFormat, DateFormat, NumberFormat e Translate
•Incentivo ao uso das bibliotecas nativas do PHP 5.3 para resolução das demandas removidas do ZF1
•Benefícios como aumento de performance entre 5 a 10 vezes em testes realizados durante o desenvolvimento
segunda-feira, 3 de dezembro de 12
DÚVIDAS?twitter : @eduardobona
[email protected]/eduardobona
Material de apoio disponível em:http://vivaweb.net/palestras/zf_i18n.zip
MUITO OBRIGADO!!!segunda-feira, 3 de dezembro de 12
REFERÊNCIAS
• http://framework.zend.com/wiki/display/ZFDEV2/RFC+-+i18n+layer
• http://framework.zend.com/manual/2.0/en/index.html
• http://www.w3.org/International/questions/qa-i18n.pt.php
• http://imasters.com.br/artigo/24759/zend/internacionalizacao-e-localizacao-com-zend-framework
• http://www.distimo.com/publications
segunda-feira, 3 de dezembro de 12