23
APLICAÇÕES INTERNACIONALIZADAS DESENVOLVA PARA O MUNDO segunda-feira, 3 de dezembro de 12

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

Embed Size (px)

DESCRIPTION

Palestra ministrada na PHP Conference 2012. Material de apoio disponível em: http://vivaweb.net/palestras/zf_i18n.zip

Citation preview

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

APLICAÇÕES

INTERNACIONALIZADAS

DESENVOLVA PARA O MUNDO

segunda-feira, 3 de dezembro de 12

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

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

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

POR QUE

INTERNACIONALIZAR

MEU APLICATIVO?

segunda-feira, 3 de dezembro de 12

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

Idiomas mais populares por paísThe Impact of App Translations

By Tiuri van Agten, Analyst at Distimo

segunda-feira, 3 de dezembro de 12

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

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

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

Já que você tem que pensar de qualquer forma:

PENSE GRANDE!- Donald Trump

segunda-feira, 3 de dezembro de 12

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

#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

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

COMPONENTES USADOS NO ZEND 1

#GOGOGO: AO ZEND

ZEND_LOCALE

ZEND_DATE

ZEND_CURRENCY

ZEND_TRANSLATE

segunda-feira, 3 de dezembro de 12

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

#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

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

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

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

#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

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

#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

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

#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

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

#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

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

#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

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

#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

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

#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

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

#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

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

COMPONENTES USADOS NO ZEND 2

#GOGOGO: AO ZEND 2

ZEND_LOCALEZEND_DATE

ZEND_CURRENCY

ZEND_TRANSLATE

i18n

segunda-feira, 3 de dezembro de 12

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

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

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

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

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

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