• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1page.title=Ngôn ngữ và Bản địa
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>Trong tài liệu này:</h2>
10<ol>
11	  <li><a href="#preN">Thử thách phân giải tài nguyên ngôn ngữ</a></li>
12    <li><a href="#postN">Các cải tiến đối với Chiến lược phân giải tài nguyên</a></li>
13    <li><a href="#design">Thiết kế ứng dụng để hỗ trợ các bản địa
14      bổ sung</a></li>
15
16</ol>
17
18</div>
19</div>
20
21<p>Android N cung cấp hỗ trợ cải tiến cho người dùng sử dụng nhiều ngôn ngữ,
22cho phép họ chọn nhiều bản địa trong phần cài đặt. Android N
23cung cấp khả năng này bằng cách mở rộng số lượng lớn các bản địa được hỗ trợ
24và thay đổi cách hệ thống phân giải tài nguyên. Phương thức phân giải tài nguyên
25mới hoạt động mạnh mẽ hơn và được thiết kế để tương thích với các tệp APK có sẵn. Tuy nhiên
26bạn cần kiểm tra thêm để phát hiện mọi hành vi không mong muốn. Ví dụ, bạn
27cần kiểm thử để đảm bảo rằng ứng dụng của mình sẽ thiết lập mặc định cho ngôn ngữ mong muốn. Ngoài ra,
28nếu ứng dụng của bạn hỗ trợ đa ngôn ngữ thì bạn cần đảm bảo rằng việc hỗ trợ này hoạt động như
29dự kiến. Cuối cùng, bạn cần cố gắng đảm bảo rằng ứng dụng sẽ xử lý tinh tế
30những ngôn ngữ mà bạn không có ý định thiết kế ứng dụng để hỗ trợ.</p>
31
32<p>Tài liệu này sẽ bắt đầu bằng việc giải thích về chiến lược phân giải tài nguyên trong phiên bản trước
33Android N. Tiếp theo, tài liệu sẽ mô tả chiến lược phân giải tài nguyên
34được cải tiến của Android N. Cuối cùng, tài liệu sẽ giải thích cách sử dụng
35số lượng các bản địa được mở rộng để hỗ trợ thêm nhiều người dùng đa ngữ.</p>
36
37<h2 id="preN">Thử thách phân giải tài nguyên ngôn ngữ</h2>
38
39<p>Trước Android N, không phải lúc nào Android cũng có thể so khớp
40thành công ứng dụng với các bản địa của hệ thống. Ví dụ, giả sử ngôn ngữ mặc định của ứng dụng của bạn
41  là Tiếng Anh (Mỹ) nhưng ứng dụng cũng có các xâu văn bản Tiếng Tây Ban Nha được bản địa hóa trong các tệp tài nguyên {@code es_ES}
42.</p>
43<p>Khi mã nguồn Java tham chiếu đến các xâu đó thì nó sẽ phân giải các ngôn ngữ của xâu như
44sau:</p>
45<ul>
46<li>Nếu một thiết bị được đặt thành {@code es_MX} (Tiếng Tây Ban Nha-Mêxicô) thì Android sẽ tải
47xâu từ các tệp tài nguyên {@code es_ES}.</li>
48<li>Nếu thiết bị được đặt thành {@code en_AU} thì Android sẽ trả về {@code
49en_US}. Hệ thống cũng sẽ đặt mặc định thành {@code en_US} nếu người dùng chọn một
50ngôn ngữ mà ứng dụng không hỗ trợ chút nào, ví dụ như Tiếng Pháp.</li>
51</ul>
52
53
54<p>Các vấn đề phân giải này phát sinh bởi vì hệ thống sẽ gỡ mã quốc gia
55 khỏi bản địa nếu nó không tìm thấy sự trùng khớp tuyệt đối.  Ví dụ:</p>
56<p class="table-caption" id="t-resource-res">
57<strong>Bảng 1.</strong> Phân giải tài nguyên không có trùng khớp bản địa tuyệt đối.
58</p>
59<table>
60<tbody>
61<tr>
62<th>Cài đặt Người dùng</th>
63<th>Tài nguyên Ứng dụng</th>
64<th>Phân giải tài nguyên</th>
65</tr>
66<tr>
67<td>fr_CH</td>
68<td>
69mặc định (en)<br>
70de_DE<br>
71es_ES<br>
72fr_FR<br>
73it_IT<br>
74</td>
75 <td>
76Thử fr_CH =&gt; Không được<br>
77Thử fr =&gt; Không được<br>
78Sử dụng mặc định (en)
79</td>
80 </tr>
81 </tbody>
82</table>
83
84
85<p>Trong ví dụ này, hệ thống hiển thị các xâu Tiếng Anh mà không
86xác định được liệu người dùng có biết Tiếng Anh hay không. Đây là hành vi khá phổ biến
87ngày nay. Android N cần phải giảm bớt đáng kể tần suất
88của những kết quả như vậy.</p>
89
90<h2 id="postN">Các cải tiến đối với Chiến lược phân giải tài nguyên</h2>
91<p>Android N mang đến cách thức phân giải tài nguyên mạnh mẽ hơn, và
92tìm các giải pháp thay thế hiệu quả hơn một cách tự động. Tuy nhiên, để tăng tốc việc phân giải và nâng cao
93khả năng bảo trì, bạn cần lưu trữ các tài nguyên trong những nhánh ngôn ngữ mẹ phổ biến nhất.
94 Ví dụ, nếu trước đây lưu tài nguyên Tiếng Tây Ban Nha trong thư mục {@code es-US}
95 thì hãy chuyển chúng vào trong thư mục {@code es-419}, nơi chứa Tiếng Tây Ban Nha Mỹ La-tinh.
96 Tương tự, nếu bạn có các xâu tài nguyên trong một thư mục có tên {@code en-GB} thì hãy đổi tên
97 thư mục đó thành {@code en-001} (Tiếng Anh quốc tế) bởi vì nhánh mẹ
98phổ biến nhất cho chuỗi <code>en-GB</code> là {@code en-001}.
99 Các ví dụ sau sẽ giải thích tại sao các thực hành này sẽ nâng cao hiệu năng và
100độ ổn định của việc phân giải tài nguyên.</p>
101
102<h3>Các ví dụ về phân giải tài nguyên</h3>
103
104<p>Với Android N, trường hợp được mô tả trong <strong>Bảng 1</strong> được phân giải
105theo cách khác:</p>
106
107<p class="table-caption" id="t-improved-res">
108<strong>Bảng 2.</strong> Một chiến lược phân giải cải tiến khi không có
109trùng khớp bản địa tuyệt đối.</p>
110<table>
111<tr>
112<th>Cài đặt Người dùng</th>
113<th>Tài nguyên Ứng dụng</th>
114<th>Phân giải tài nguyên</th>
115</tr>
116<tr>
117<td><ol>
118<li> fr_CH</li>
119</ol>
120</td>
121<td>
122mặc định (en)<br>
123de_DE<br>
124es_ES<br>
125fr_FR<br>
126it_IT<br>
127</td>
128<td>
129Thử fr_CH =&gt; Không được<br>
130Thử fr =&gt; Không được<br>
131Thử nhánh con của fr =&gt; fr_FR<br>
132Sử dụng fr_FR
133</td>
134</tr>
135
136</table>
137
138
139<p>Bây giờ thì người dùng sẽ nhận được tài nguyên Tiếng Pháp thay vì Tiếng Anh. Ví dụ này cũng cho thấy
140 lý do bạn nên lưu trữ các xâu Tiếng Pháp trong {@code fr} thay vì {@code fr_FR}
141 cho Android N. Phương pháp ở đây là ghép nhánh ngôn ngữ mẹ gần nhất,
142 giúp cho việc phân giải nhanh hơn và dễ dự đoán hơn.</p>
143
144<p>Ngoài lôgic phân giải được cải tiến này, Android giờ đây cung cấp thêm nhiều
145ngôn ngữ cho người dùng lựa chọn. Chúng ta hãy thử lại ví dụ trên với Tiếng Ý
146  được xác định là một ngôn ngữ người dùng bổ sung nhưng không được ứng dụng hỗ trợ cho Tiếng Pháp.  </p>
147
148<p class="table-caption" id="t-2d-choice">
149<strong>Bảng 3.</strong> Phân giải tài nguyên khi ứng dụng chỉ khớp
150với cài đặt bản địa được ưu tiên thứ hai của người dùng.</p>
151<table>
152<tr>
153<th>Cài đặt Người dùng</th>
154<th>Tài nguyên Ứng dụng</th>
155<th>Phân giải tài nguyên</th>
156
157</tr>
158<tr>
159<td><ol>
160<li> fr_CH</li>
161<li> it_CH</li>
162</ol>
163</td>
164<td>
165mặc định (en)<br>
166de_DE<br>
167es_ES<br>
168it_IT<br>
169</td>
170<td>
171Thử fr_CH =&gt; Không được<br>
172Thử fr =&gt; Không được<br>
173Thử nhánh con của fr =&gt; Không được<br>
174Thử it_CH =&gt; Không được<br>
175Thử it =&gt; Không được<br>
176Thử nhánh con của it =&gt; it_IT<br>
177Sử dụng it_IT
178</td>
179
180</tr>
181
182</table>
183<p>Người dùng vẫn nhận được ngôn ngữ họ biết mặc dù ứng dụng không
184hỗ trợ Tiếng Pháp.</p>
185
186
187<h2 id="design">Thiết kế ứng dụng để hỗ trợ các bản địa bổ sung</h2>
188<h3>API LocaleList</h3>
189
190<p>Android N bổ sung thêm một API {@code LocaleList.GetDefault()}
191 mới cho phép các ứng dụng truy vấn trực tiếp danh sách các ngôn ngữ mà người dùng đã chỉ định. API này
192cho phép bạn tạo hành vi ứng dụng
193phức tạp hơn và hiển thị nội dung được tối ưu hóa tốt hơn. Ví dụ, Tìm kiếm
194  có thể hiển thị các kết quả bằng nhiều ngôn ngữ dựa trên cài đặt của người dùng.  Các ứng dụng trình duyệt
195  có thể tránh đề nghị dịch trang web sang một ngôn ngữ mà người dùng đó đã biết,
196 và các ứng dụng bàn phím có thể tự động bật tất cả các bố trí phù hợp. </p>
197
198<h3>Bộ định dạng</h3>
199
200<p>Tính tới Android 6.0 (API mức 23), Android 6.0 chỉ hỗ trợ một hoặc hai bản địa
201cho nhiều ngôn ngữ phổ biến
202(en, es, ar, fr, ru). Bởi vì chỉ có một vài biến thể của từng ngôn ngữ,
203các ứng dụng không gặp vấn đề gì với việc lưu trữ một số chữ số và ngày tháng dưới dạng xâu được chèn trực tiếp khi viết mã
204trong các tệp tài nguyên.  Tuy nhiên, với tập hợp mở rộng các bản địa được hỗ trợ bởi Android,
205có thể có
206nhiều khác biệt lớn về các định dạng ngày tháng, thời gian, tiền tệ và thông tin
207tương tự ngay cả trong một bản địa. Chèn trực tiếp các định dạng có thể khiến
208người dùng cuối bối rối.  Do đó, khi phát triển cho Android N
209hãy đảm bảo sử dụng các bộ định dạng thay vì các xâu chữ số và ngày tháng được chèn trực tiếp khi viết mã.</p>
210
211<p>Một ví dụ điển hình là Tiếng Ả-rập với được Android N hỗ trợ mở rộng từ
212một {@code ar_EG} tới 27 bản địa Tiếng Ả-rập. Các bản địa này có thể chia sẻ hầu hết các tài nguyên,
213nhưng một số bản địa ưu tiên chữ số ASCII trong khi những bản địa khác lại ưu tiên con số truyền thống. Ví dụ,
214khi bạn muốn soạn một câu có biến bằng số, như
215"Choose a 4 digit pin" thì bạn hãy sử dụng bộ định dạng như sau:</p>
216
217<pre> format(locale, "Choose a %d-digit PIN", 4)</pre>
218