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 =&gt; Falha<br>
81Tentativa de fr =&gt; 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 =&gt; Falha<br>
134Tentativa de fr =&gt; Falha<br>
135Tentativa de filhos de fr =&gt; 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 =&gt; Falha<br>
176Tentativa de fr =&gt; Falha<br>
177Tentativa de filhos de fr =&gt; Falha<br>
178Tentativa de it_CH =&gt; Falha<br>
179Tentativa de it =&gt; Falha<br>
180Tentativa de filhos de it =&gt; 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