Desenvolva para o Mundo - Internacionalização de Sistemas com Zend Framework
1. APLICAÇÕES
INTERNACIONALIZADAS
DESENVOLVA PARA O MUNDO
segunda-feira, 3 de dezembro de 12
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 2008
segunda-feira, 3 de dezembro de 12
3. POR QUE
INTERNACIONALIZAR
MEU APLICATIVO?
segunda-feira, 3 de dezembro de 12
4. Idiomas mais populares por país
The Impact of App Translations
By Tiuri van Agten, Analyst at Distimo
segunda-feira, 3 de dezembro de 12
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. Já que você tem que pensar de qualquer forma:
PENSE GRANDE!
- Donald Trump
segunda-feira, 3 de dezembro de 12
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.php
segunda-feira, 3 de dezembro de 12
8. #GOGOGO: AO ZEND
ZEND_DATE
ZEND_LOCALE ZEND_TRANSLATE
ZEND_CURRENCY
COMPONENTES USADOS NO ZEND 1
segunda-feira, 3 de dezembro de 12
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
TESTES
segunda-feira, 3 de dezembro de 12
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. #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
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. #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. #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. #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
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. #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. #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. #GOGOGO: AO ZEND 2
ZEND_LOCALE
ZEND_DATE
ZEND_TRANSLATE
i18n
ZEND_CURRENCY
COMPONENTES USADOS NO ZEND 2
segunda-feira, 3 de dezembro de 12
20. MUDANÇAS NA INTERNACIONALIZAÇÃO
COM ZEND 2
Remoção das classes:
•ZendLocaleLocale
•ZendLocaleFormat
•ZendDateDate
•ZendCurrencyCurrency
segunda-feira, 3 de dezembro de 12
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 desenvolvimento
segunda-feira, 3 de dezembro de 12
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. 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