Desenvolva para o Mundo - Internacionalização de Sistemas com Zend Framework

1,677 views

Published on

Palestra ministrada na PHP Conference 2012.

Material de apoio disponível em:
http://vivaweb.net/palestras/zf_i18n.zip

0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,677
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
14
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Desenvolva para o Mundo - Internacionalização de Sistemas com Zend Framework

  1. 1. APLICAÇÕES INTERNACIONALIZADAS DESENVOLVA PARA O MUNDOsegunda-feira, 3 de dezembro de 12
  2. 2. EDUARDO BONA GRADUAÇÃ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 2008segunda-feira, 3 de dezembro de 12
  3. 3. POR QUE INTERNACIONALIZAR MEU APLICATIVO?segunda-feira, 3 de dezembro de 12
  4. 4. Idiomas mais populares por país The Impact of App Translations By Tiuri van Agten, Analyst at Distimosegunda-feira, 3 de dezembro de 12
  5. 5. 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
  6. 6. Já que você tem que pensar de qualquer forma: PENSE GRANDE! - Donald Trumpsegunda-feira, 3 de dezembro de 12
  7. 7. #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.phpsegunda-feira, 3 de dezembro de 12
  8. 8. #GOGOGO: AO ZEND ZEND_DATE ZEND_LOCALE ZEND_TRANSLATE ZEND_CURRENCY COMPONENTES USADOS NO ZEND 1segunda-feira, 3 de dezembro de 12
  9. 9. #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 TESTESsegunda-feira, 3 de dezembro de 12
  10. 10. #ESTUDO DE CASO 1: 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 = 1 resources.translate.adapter = "gettext" resources.translate.options.scan = "filename"segunda-feira, 3 de dezembro de 12
  11. 11. #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 DATASsegunda-feira, 3 de dezembro de 12
  12. 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,50 Resultado 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
  13. 13. #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
  14. 14. #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
  15. 15. #ESTUDO DE CASO 1II: TRADUÇÃO POR URL REESCRITA DAS ROTAS DEFAULT CRIAÇÃO DE PLUGIN PARA SETUP DA TRADUÇÃO TESTESsegunda-feira, 3 de dezembro de 12
  16. 16. #ESTUDO DE CASO 1II: 1) em application/plugins/Rotas.php - criar o plugin de rotas para identificar sempre como primeiro parâmetro o idioma <?php class 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
  17. 17. #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. <?php class 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
  18. 18. #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
  19. 19. #GOGOGO: AO ZEND 2 ZEND_LOCALE ZEND_DATE ZEND_TRANSLATE i18n ZEND_CURRENCY COMPONENTES USADOS NO ZEND 2segunda-feira, 3 de dezembro de 12
  20. 20. MUDANÇAS NA INTERNACIONALIZAÇÃO COM ZEND 2 Remoção das classes: •ZendLocaleLocale •ZendLocaleFormat •ZendDateDate •ZendCurrencyCurrencysegunda-feira, 3 de dezembro de 12
  21. 21. MUDANÇAS NA INTERNACIONALIZAÇÃO COM ZEND 2 •Criação da Zendi18n 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 desenvolvimentosegunda-feira, 3 de dezembro de 12
  22. 22. DÚVIDAS? twitter: @eduardobona eduardobona@vivaweb.net slideshare.net/eduardobona Material de apoio disponível em: http://vivaweb.net/palestras/zf_i18n.zip MUITO OBRIGADO!!!segunda-feira, 3 de dezembro de 12
  23. 23. 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/publicationssegunda-feira, 3 de dezembro de 12

×