blob: 94a71277ce7d53234bb91d62e24e21e96905fcb7 [file] [log] [blame]
page.title=Ngôn ng và Bn địa
page.tags=androidn
page.image=images/cards/card-nyc_2x.jpg
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Trong tài liu này:</h2>
<ol>
<li><a href="#preN">Th thách phân gii tài nguyên ngôn ngữ</a></li>
<li><a href="#postN">Các ci tiến đối vi Chiến lược phân gii tài nguyên</a></li>
<li><a href="#design">Thiết kế ng dng để h tr các bn địa
b sung</a></li>
</ol>
</div>
</div>
<p>Android N cung cp h tr ci tiến cho người dùng s dng nhiu ngôn ngữ,
cho phép h chn nhiu bn địa trong phn cài đặt. Android N
cung cp kh năng này bng cách m rng s lượng ln các bn địa được h tr
và thay đổi cách h thng phân gii tài nguyên. Phương thc phân gii tài nguyên
mi hot động mnh m hơn và được thiết kế để tương thích vi các tp APK có sn. Tuy nhiên
bn cn kim tra thêm để phát hin mi hành vi không mong mun. Ví dụ, bn
cn kim th để đảm bo rng ng dng ca mình s thiết lp mc định cho ngôn ng mong mun. Ngoài ra,
nếu ng dng ca bn h tr đa ngôn ng thì bn cn đảm bo rng vic h tr này hot động như
d kiến. Cui cùng, bn cn c gng đảm bo rng ng dng s x lý tinh tế
nhng ngôn ng mà bn không có ý định thiết kế ng dng để h trợ.</p>
<p>Tài liu này s bt đầu bng vic gii thích v chiến lược phân gii tài nguyên trong phiên bn trước
Android N. Tiếp theo, tài liu s mô t chiến lược phân gii tài nguyên
được ci tiến ca Android N. Cui cùng, tài liu s gii thích cách s dng
s lượng các bn địa được m rng để h tr thêm nhiu người dùng đa ngữ.</p>
<h2 id="preN">Th thách phân gii tài nguyên ngôn ngữ</h2>
<p>Trước Android N, không phi lúc nào Android cũng có th so khp
thành công ng dng vi các bn địa ca h thng. Ví dụ, gi s ngôn ng mc định ca ng dng ca bn
là Tiếng Anh (Mỹ) nhưng ng dng cũng có các xâu văn bn Tiếng Tây Ban Nha được bn địa hóa trong các tp tài nguyên {@code es_ES}
.</p>
<p>Khi mã ngun Java tham chiếu đến các xâu đó thì nó s phân gii các ngôn ng ca xâu như
sau:</p>
<ul>
<li>Nếu mt thiết b được đặt thành {@code es_MX} (Tiếng Tây Ban Nha-Mêxicô) thì Android s ti
xâu t các tp tài nguyên {@code es_ES}.</li>
<li>Nếu thiết b được đặt thành {@code en_AU} thì Android s tr v {@code
en_US}. H thng cũng s đặt mc định thành {@code en_US} nếu người dùng chn mt
ngôn ng mà ng dng không h tr chút nào, ví d như Tiếng Pháp.</li>
</ul>
<p>Các vn đề phân gii này phát sinh bi vì h thng s g mã quc gia
khi bn địa nếu nó không tìm thy s trùng khp tuyt đối. Ví dụ:</p>
<p class="table-caption" id="t-resource-res">
<strong>Bng 1.</strong> Phân gii tài nguyên không có trùng khp bn địa tuyt đối.
</p>
<table>
<tbody>
<tr>
<th>Cài đặt Người dùng</th>
<th>Tài nguyên ng dng</th>
<th>Phân gii tài nguyên</th>
</tr>
<tr>
<td>fr_CH</td>
<td>
mc định (en)<br>
de_DE<br>
es_ES<br>
fr_FR<br>
it_IT<br>
</td>
<td>
Th fr_CH =&gt; Không được<br>
Th fr =&gt; Không được<br>
S dng mc định (en)
</td>
</tr>
</tbody>
</table>
<p>Trong ví d này, h thng hin th các xâu Tiếng Anh mà không
xác định được liu người dùng có biết Tiếng Anh hay không. Đây là hành vi khá ph biến
ngày nay. Android N cn phi gim bt đáng k tn sut
ca nhng kết qu như vy.</p>
<h2 id="postN">Các ci tiến đối vi Chiến lược phân gii tài nguyên</h2>
<p>Android N mang đến cách thc phân gii tài nguyên mnh m hơn, và
tìm các gii pháp thay thế hiu qu hơn mt cách t động. Tuy nhiên, để tăng tc vic phân gii và nâng cao
kh năng bo trì, bn cn lưu tr các tài nguyên trong nhng nhánh ngôn ng m ph biến nht.
Ví dụ, nếu trước đây lưu tài nguyên Tiếng Tây Ban Nha trong thư mc {@code es-US}
thì hãy chuyn chúng vào trong thư mc {@code es-419}, nơi cha Tiếng Tây Ban Nha M La-tinh.
Tương tự, nếu bn có các xâu tài nguyên trong mt thư mc có tên {@code en-GB} thì hãy đổi tên
thư mc đó thành {@code en-001} (Tiếng Anh quc tế) bi vì nhánh m
ph biến nht cho chui <code>en-GB</code> là {@code en-001}.
Các ví d sau s gii thích ti sao các thc hành này s nâng cao hiu năng và
độ n định ca vic phân gii tài nguyên.</p>
<h3>Các ví d v phân gii tài nguyên</h3>
<p>Vi Android N, trường hp được mô t trong <strong>Bng 1</strong> được phân gii
theo cách khác:</p>
<p class="table-caption" id="t-improved-res">
<strong>Bng 2.</strong> Mt chiến lược phân gii ci tiến khi không có
trùng khp bn địa tuyt đối.</p>
<table>
<tr>
<th>Cài đặt Người dùng</th>
<th>Tài nguyên ng dng</th>
<th>Phân gii tài nguyên</th>
</tr>
<tr>
<td><ol>
<li> fr_CH</li>
</ol>
</td>
<td>
mc định (en)<br>
de_DE<br>
es_ES<br>
fr_FR<br>
it_IT<br>
</td>
<td>
Th fr_CH =&gt; Không được<br>
Th fr =&gt; Không được<br>
Th nhánh con ca fr =&gt; fr_FR<br>
S dng fr_FR
</td>
</tr>
</table>
<p>Bây gi thì người dùng s nhn được tài nguyên Tiếng Pháp thay vì Tiếng Anh. Ví d này cũng cho thy
lý do bn nên lưu tr các xâu Tiếng Pháp trong {@code fr} thay vì {@code fr_FR}
cho Android N. Phương pháp đây là ghép nhánh ngôn ng m gn nht,
giúp cho vic phân gii nhanh hơn và d d đoán hơn.</p>
<p>Ngoài lôgic phân gii được ci tiến này, Android gi đây cung cp thêm nhiu
ngôn ng cho người dùng la chn. Chúng ta hãy th li ví d trên vi Tiếng Ý
được xác định là mt ngôn ng người dùng b sung nhưng không được ng dng h tr cho Tiếng Pháp. </p>
<p class="table-caption" id="t-2d-choice">
<strong>Bng 3.</strong> Phân gii tài nguyên khi ng dng ch khp
vi cài đặt bn địa được ưu tiên th hai ca người dùng.</p>
<table>
<tr>
<th>Cài đặt Người dùng</th>
<th>Tài nguyên ng dng</th>
<th>Phân gii tài nguyên</th>
</tr>
<tr>
<td><ol>
<li> fr_CH</li>
<li> it_CH</li>
</ol>
</td>
<td>
mc định (en)<br>
de_DE<br>
es_ES<br>
it_IT<br>
</td>
<td>
Th fr_CH =&gt; Không được<br>
Th fr =&gt; Không được<br>
Th nhánh con ca fr =&gt; Không được<br>
Th it_CH =&gt; Không được<br>
Th it =&gt; Không được<br>
Th nhánh con ca it =&gt; it_IT<br>
S dng it_IT
</td>
</tr>
</table>
<p>Người dùng vn nhn được ngôn ng h biết mc dù ng dng không
h tr Tiếng Pháp.</p>
<h2 id="design">Thiết kế ng dng để h tr các bn địa b sung</h2>
<h3>API LocaleList</h3>
<p>Android N b sung thêm mt API {@code LocaleList.GetDefault()}
mi cho phép các ng dng truy vn trc tiếp danh sách các ngôn ng mà người dùng đã ch định. API này
cho phép bn to hành vi ng dng
phc tp hơn và hin th ni dung được ti ưu hóa tt hơn. Ví dụ, Tìm kiếm
có th hin th các kết qu bng nhiu ngôn ng da trên cài đặt ca người dùng. Các ng dng trình duyt
có th tránh đề ngh dch trang web sang mt ngôn ng mà người dùng đó đã biết,
và các ng dng bàn phím có th t động bt tt c các b trí phù hp. </p>
<h3>B định dng</h3>
<p>Tính ti Android 6.0 (API mc 23), Android 6.0 ch h tr mt hoc hai bn địa
cho nhiu ngôn ng ph biến
(en, es, ar, fr, ru). Bi vì ch có mt vài biến th ca tng ngôn ngữ,
các ng dng không gp vn đề gì vi vic lưu tr mt s ch s và ngày tháng dưới dng xâu được chèn trc tiếp khi viết mã
trong các tp tài nguyên. Tuy nhiên, vi tp hp m rng các bn địa được h tr bi Android,
có th có
nhiu khác bit ln v các định dng ngày tháng, thi gian, tin t và thông tin
tương t ngay c trong mt bn địa. Chèn trc tiếp các định dng có th khiến
người dùng cui bi ri. Do đó, khi phát trin cho Android N
hãy đảm bo s dng các b định dng thay vì các xâu ch s và ngày tháng được chèn trc tiếp khi viết mã.</p>
<p>Mt ví d đin hình là Tiếng Ả-rp vi được Android N h tr m rng t
mt {@code ar_EG} ti 27 bn địa Tiếng Ả-rp. Các bn địa này có th chia s hu hết các tài nguyên,
nhưng mt s bn địa ưu tiên ch s ASCII trong khi nhng bn địa khác li ưu tiên con s truyn thng. Ví dụ,
khi bn mun son mt câu có biến bng số, như
"Choose a 4 digit pin" thì bn hãy s dng b định dng như sau:</p>
<pre> format(locale, "Choose a %d-digit PIN", 4)</pre>