1page.title=Idioma e localidades 2page.tags=androidn 3page.image=images/cards/card-nyc_2x.jpg 4 5@jd:body 6 7<div id="qv-wrapper"> 8<div id="qv"> 9<h2>Neste documento:</h2> 10<ol> 11 <li><a href="#preN">Desafios ao resolver recursos de idioma</a></li> 12 <li><a href="#postN">Melhorias na estratégia de resolução de recursos</a></li> 13 <li><a href="#design">Projetar seu aplicativo para oferecer suporte a 14 localidades adicionais</a></li> 15 16</ol> 17 18</div> 19</div> 20 21<p>O Android N oferece suporte avançado para usuários multilíngues, 22permitindo que eles selecionem várias localidades nas configurações. O Android N 23fornece esse recurso ao expandir significativamente a quantidade de localidades com suporte 24e mudando a forma como o sistema resolve recursos. O novo método para resolver 25recursos é mais robusto e foi projetado para ser compatível com APKs existentes, mas 26tenha cuidado adicional para identificar comportamentos inesperados. Por exemplo, você 27deve testar para garantir que seu aplicativo assuma o idioma esperado por padrão. Além disso, 28se seu aplicativo oferecer suporte a vários idiomas, você deverá garantir que esse suporte funcione da maneira 29esperada. Por fim, garanta que seu aplicativo possa lidar corretamente 30com idiomas que ele não tenha sido explicitamente projetado para suportar.</p> 31 32<p>Este documento começa explicando a estratégia de resolução de recursos anterior ao 33Android N. Em seguida, ele descreve a estratégia 34de resolução de recursos aprimorada do Android N. Por fim, ele explica como aproveitar as vantagens 35do maior número de localidades para oferecer suporte a usuários multilíngues.</p> 36 37<h2 id="preN">Desafios ao resolver recursos de idioma</h2> 38 39<p>Antes do Android N, o Android nem sempre conseguia 40 fazer a correspondência correta entre aplicativos e localidades do sistema.</p> 41 42 <p>Considere, por exemplo, que temos a seguinte situação:</p> 43 <ul> 44 <li>o idioma padrão do seu aplicativo é {@code en_US} (inglês - EUA), mas ele também tem 45 strings em espanhol localizadas em arquivos de recursos {@code es_ES} 46.</li> 47 <li> Um dispositivo está definido para {@code es_MX}. </li> 48 49<p>Quando seu código Java usa strings como referência, o sistema carrega 50strings do arquivo de recursos padrão ({@code en_US}), mesmo que o aplicativo tenha recursos em 51espanhol localizados em {@code es_ES}. Isso acontece porque, quando 52 não consegue encontrar uma correspondência exata, o sistema continua procurando recursos após extrair o 53 código do país da localidade. Por fim, se não há correspondência, o sistema volta 54 ao padrão, que é {@code en_US}. </p> 55 56 57<p>O sistema também usaria {@code en_US} como padrão se o usuário escolhesse um idioma 58 não suportado pelo aplicativo, como o francês. Por exemplo:</p> 59 60<p class="table-caption" id="t-resource-res"> 61<strong>Tabela 1.</strong> Resolução de recurso sem uma correspondência exata de localidade. 62</p> 63<table> 64<tbody> 65<tr> 66<th>Configurações do usuário</th> 67<th>Recursos do aplicativo</th> 68<th>Resolução do recurso</th> 69</tr> 70<tr> 71<td>fr_CH</td> 72<td> 73padrão (en)<br> 74de_DE<br> 75es_ES<br> 76fr_FR<br> 77it_IT<br> 78</td> 79 <td> 80Tentativa de fr_CH => Falha<br> 81Tentativa de fr => Falha<br> 82Usar o padrão (en) 83</td> 84 </tr> 85 </tbody> 86</table> 87 88 89<p>Neste exemplo, o sistema exibe strings em inglês sem saber 90se o usuário entende inglês. Esse comportamento é bastante comum 91hoje em dia. O Android N deverá reduzir de forma significativa a frequência de 92resultados como esse.</p> 93 94<h2 id="postN">Melhorias na estratégia de resolução de recursos</h2> 95<p>O Android N proporciona uma resolução de recurso mais robusta e 96encontra soluções alternativas melhores. No entanto, para agilizar a resolução e melhorar 97 a capacidade de manutenção, você deve armazenar os recursos no dialeto pai mais comum. 98 Por exemplo, se você estava armazenando recursos em espanhol no diretório {@code es-US} 99 antes, mova-os para o diretório {@code es-419}, que contém o espanhol latino-americano. 100 Da mesma maneira, se você tiver strings de recurso em uma pasta {@code en-GB}, renomeie 101 essa pasta para {@code en-001} (inglês internacional), pois o pai mais comum 102 para strings <code>en-GB</code> é {@code en-001}. 103 O exemplo a seguir explica por que essas práticas melhoram o desempenho e 104a confiabilidade da resolução de recursos.</p> 105 106<h3>Exemplos de resolução de recursos</h3> 107 108<p>Com o Android N, o caso descrito na <strong>Tabela 1</strong> é resolvido 109de forma diferente:</p> 110 111<p class="table-caption" id="t-improved-res"> 112<strong>Tabela 2.</strong> Uma estratégia de resolução melhorada para quando não há 113uma correspondência exata para a localidade.</p> 114<table> 115<tr> 116<th>Configurações do usuário</th> 117<th>Recursos do aplicativo</th> 118<th>Resolução do recurso</th> 119</tr> 120<tr> 121<td><ol> 122<li> fr_CH</li> 123</ol> 124</td> 125<td> 126padrão (en)<br> 127de_DE<br> 128es_ES<br> 129fr_FR<br> 130it_IT<br> 131</td> 132<td> 133Tentativa de fr_CH => Falha<br> 134Tentativa de fr => Falha<br> 135Tentativa de filhos de fr => fr_FR<br> 136Usar fr_FR 137</td> 138</tr> 139 140</table> 141 142 143<p>Agora o usuário obtém recursos em francês em vez de inglês. Esse exemplo também mostra 144 por que você deve armazenar strings em francês em {@code fr} em vez de em {@code fr_FR} 145 para o Android N. Nesse caso, a ação necessária é fazer a correspondência com o dialeto pai mais próximo, 146 tornando a resolução mais rápida e mais previsível.</p> 147 148<p>Além dessa lógica de resolução melhorada, agora o Android oferece mais 149 idiomas de usuário dentre os quais escolher. Vamos experimentar o exemplo acima novamente com o italiano 150 especificado como um idioma de usuário adicional, mas sem suporte para francês no aplicativo. </p> 151 152<p class="table-caption" id="t-2d-choice"> 153<strong>Tabela 3.</strong> Resolução de recurso quando o aplicativo faz a correspondência apenas da 154segunda configuração de localidade preferencial do usuário.</p> 155<table> 156<tr> 157<th>Configurações do usuário</th> 158<th>Recursos do aplicativo</th> 159<th>Resolução do recurso</th> 160 161</tr> 162<tr> 163<td><ol> 164<li> fr_CH</li> 165<li> it_CH</li> 166</ol> 167</td> 168<td> 169padrão (en)<br> 170de_DE<br> 171es_ES<br> 172it_IT<br> 173</td> 174<td> 175Tentativa de fr_CH => Falha<br> 176Tentativa de fr => Falha<br> 177Tentativa de filhos de fr => Falha<br> 178Tentativa de it_CH => Falha<br> 179Tentativa de it => Falha<br> 180Tentativa de filhos de it => it_IT<br> 181Usar it_IT 182</td> 183 184</tr> 185 186</table> 187<p>O usuário obtém um idioma que ele compreende, mesmo que o aplicativo não tenha suporte para 188o francês.</p> 189 190 191<h2 id="design">Projetar seu aplicativo para oferecer suporte a localidades adicionais</h2> 192<h3>LocaleList API</h3> 193 194<p>O Android N adiciona uma nova API {@code LocaleList.getDefault()} 195que permite que os aplicativos façam uma consulta direta na lista de idiomas especificados por um usuário. Essa API 196permite que você crie um comportamento mais sofisticado 197 para o aplicativo e uma exibição de conteúdo mais otimizada. Por exemplo, uma pesquisa 198 pode mostrar resultados em vários idiomas com base nas configurações do usuário. Aplicativos de navegador 199 podem evitar ofertas de tradução de páginas em um idioma que o usuário conhece 200 e os aplicativos de teclado também podem ativar todos os layouts apropriados automaticamente. </p> 201 202<h3>Formatadores</h3> 203 204<p>Até o Android 6.0 (nível da API 23), o Android oferecia suporte para apenas uma ou duas localidades 205 para muitos idiomas comuns 206(en, es, ar, fr, ru). Como só existiam poucas variantes de cada idioma, 207os aplicativos podiam armazenar alguns números e datas como strings no código 208nos arquivos de recurso. No entanto, com o conjunto mais amplo de localidades suportadas do Android, 209podem existir 210diferenças significativas nos formatos de data, hora, moeda e informações 211similares dentro da mesma localidade. Colocar formatos no código pode produzir uma 212experiência confusa para os usuários. Portanto, ao desenvolver para o Android N, 213não deixe de usar formatadores em vez de strings no código para números e datas.</p> 214 215<p>Um bom exemplo é o árabe, cujo suporte no Android N foi expandido de 216uma {@code ar_EG} para 27 localidades de árabe. Essas localidades podem compartilhar a maioria dos recursos, 217mas algumas preferem dígitos ASCII, enquanto outras preferem dígitos nativos. Por exemplo, 218quando você quer criar uma frase com uma variável em dígito, como 219“Choose a 4 digit pin”, use formatadores como mostrado abaixo:</p> 220 221<pre> format(locale, "Choose a %d-digit PIN", 4)</pre> 222