blob: 83e9968f73da4fe452ed988ff894f404b5568b2b [file] [log] [blame]
page.title=Язык и языковой стандарт
page.tags=androidn
page.image=images/cards/card-nyc_2x.jpg
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Содержание документа:</h2>
<ol>
<li><a href="#preN">Сложности с разрешением языковых ресурсов</a></li>
<li><a href="#postN">Улучшение стратегии разрешения ресурсов</a></li>
<li><a href="#design">Проектирование приложения для поддержки дополнительных
языковых стандартов</a></li>
</ol>
</div>
</div>
<p>Android N обеспечивает расширенную поддержку многоязычных пользователей,
позволяя им выбирать в настройках из нескольких языковых стандартов. Эта возможность реализована в Android N
за счет значительного увеличения числа поддерживаемых языковых стандартов
и изменения способа разрешения ресурсов в системе. Новый метод разрешения
ресурсов более надежен и разработан с учетом совместимости с существующими APK. Тем не менее,
при его использовании следует очень внимательно следить за признаками непредвиденного поведения приложения. Например, при его использовании
следует провести тесты и убедиться, что приложение по умолчанию использует ожидаемый язык. Если
ваше приложение поддерживает несколько языков, нужно убедиться, что поддержка работает
ожидаемым образом. Также следует попытаться обеспечить корректную работу приложения с
языками, поддержка которых не предусматривалась явным образом в его коде.</p>
<p>В начале этого документа рассказывается о стратегии разрешения ресурсов, которая использовалась до появления
Android N. Далее в нем описывается улучшенная стратегия
разрешения ресурсов в Android N. В последней части документа рассказывается о том, как использовать
дополнительные языковые стандарты для поддержки большего числа многоязычных пользователей.</p>
<h2 id="preN">Сложности с разрешением языковых ресурсов</h2>
<p>До выпуска Android N в Android не всегда удавалось успешно сопоставлять
языковые стандарты приложений и системы. Допустим, по умолчанию в вашем приложении используется английский язык
(США), но оно также содержит строки на испанском, локализованные в файлах ресурсов {@code es_ES}.
</p>
<p>В коде Java разрешение языков строк происходило следующим
образом:</p>
<ul>
<li>Если на устройстве был установлен язык {@code es_MX} (испанский, Мексика), Android загружал
строки из файлов ресурсов {@code es_ES}.</li>
<li>Если на устройстве был установлен язык {@code en_AU}, Android возвращался к языку {@code
en_US}. Также система использовала по умолчанию язык {@code en_US}, если пользователь выбирал язык,
который вообще не поддерживался приложением, например, французский.</li>
</ul>
<p>Проблемы с разрешением возникали из-за того, что система удаляла код страны
из строки языкового стандарта при отсутствии точного совпадения. Например:</p>
<p class="table-caption" id="t-resource-res">
<strong>Таблица 1.</strong> Разрешение ресурсов без точного совпадения языковых стандартов.
</p>
<table>
<tbody>
<tr>
<th>Пользовательские настройки</th>
<th>Ресурсы приложения</th>
<th>Разрешение ресурсов</th>
</tr>
<tr>
<td>fr_CH</td>
<td>
по умолчанию (en)<br>
de_DE<br>
es_ES<br>
fr_FR<br>
it_IT<br>
</td>
<td>
Попытка использования fr_CH =&gt; Отказ<br>
Попытка использования fr =&gt; Отказ<br>
Использование языка по умолчанию (en)
</td>
</tr>
</tbody>
</table>
<p>В этом примере система отображает строки на английском,
не зная, понимает ли пользователь английский язык. Такое поведение приложений сейчас довольно
распространено. С выпуском Android N подобные ситуации
будут возникать намного реже.</p>
<h2 id="postN">Улучшение стратегии разрешения ресурсов</h2>
<p>В Android N используется более надежная система разрешения ресурсов,
которая автоматически находит более подходящие альтернативные варианты. Однако для ускорения процесса разрешения и упрощения
обслуживания ресурсы следует хранить на наиболее распространенном языке верхнего уровня.
Например, если вы хранили ресурсы на испанском в каталоге{@code es-US}
, их следует переместить в каталог {@code es-419}, где содержатся ресурсы на латиноамериканском диалекте испанского языка.
Аналогичным образом, если вы хранили строки ресурсов в папке {@code en-GB}, вам следует изменить название папки
на {@code en-001} (международная версия английского языка), поскольку {@code en-001} наиболее распространенный
язык верхнего уровня для строк <code>en-GB</code>.
В следующих примерах объясняется, почему такая практика повышает производительность и
надежность процесса разрешения ресурсов.</p>
<h3>Примеры разрешения ресурсов</h3>
<p>В Android N ситуация, описанная в <strong>Таблице 1</strong>, разрешается
иначе:</p>
<p class="table-caption" id="t-improved-res">
<strong>Таблица 2.</strong> Улучшенная стратегия разрешения при отсутствии
точного совпадения языкового стандарта.</p>
<table>
<tr>
<th>Пользовательские настройки</th>
<th>Ресурсы приложения</th>
<th>Разрешение ресурсов</th>
</tr>
<tr>
<td><ol>
<li> fr_CH</li>
</ol>
</td>
<td>
по умолчанию (en)<br>
de_DE<br>
es_ES<br>
fr_FR<br>
it_IT<br>
</td>
<td>
Попытка использования fr_CH =&gt; Отказ<br>
Попытка использования fr =&gt; Отказ<br>
Попытка использования диалекта fr =&gt; fr_FR<br>
Использование fr_FR
</td>
</tr>
</table>
<p>В этом примере пользователь получает ресурсы на французском языке, а не на английском. В этом примере также показано, почему для Android N
следует хранить строки на французском языке в каталоге {@code fr}, а не в каталоге {@code fr_FR}.
Здесь целью разрешения является нахождение наиболее близкого диалекта верхнего уровня,
что ускоряет процесс разрешения и делает его более предсказуемым.</p>
<p>Помимо улучшенной логики разрешения в Android добавлены
дополнительные языки. Рассмотрим предыдущий пример в ситуации, когда итальянский
указан как дополнительный язык пользователя, а приложение не поддерживает французский язык. </p>
<p class="table-caption" id="t-2d-choice">
<strong>Таблица 3.</strong> Разрешение ресурсов в ситуации, когда приложение находит соответствие только для
второго предпочитаемого пользователем языкового стандарта.</p>
<table>
<tr>
<th>Пользовательские настройки</th>
<th>Ресурсы приложения</th>
<th>Разрешение ресурсов</th>
</tr>
<tr>
<td><ol>
<li> fr_CH</li>
<li> it_CH</li>
</ol>
</td>
<td>
по умолчанию (en)<br>
de_DE<br>
es_ES<br>
it_IT<br>
</td>
<td>
Попытка использования fr_CH =&gt; Отказ<br>
Попытка использования fr =&gt; Отказ<br>
Попытка использования диалекта fr =&gt; Отказ<br>
Попытка использования it_CH =&gt; Отказ<br>
Попытка использования it =&gt; Отказ<br>
Попытка использования диалекта it =&gt; it_IT<br>
Использование it_IT
</td>
</tr>
</table>
<p>Пользователь получает данные на понятном ему языке, хотя приложение и не
поддерживает французский язык.</p>
<h2 id="design">Проектирование приложения для поддержки дополнительных языковых стандартов</h2>
<h3>API LocaleList</h3>
<p>В Android N добавлен новый API {@code LocaleList.GetDefault()},
позволяющий приложениям напрямую запрашивать список языков, выбранных пользователем. Этот API
позволяет реализовать более сложное поведение
приложений и лучше оптимизировать отображение содержимого на экране. Например, результаты поиска
могут отображаться на разных языках в зависимости от пользовательских настроек. Приложения в браузере
могут не предлагать пользователю перевести приложения на знакомый ему язык,
а приложения, использующие клавиатуру, могут автоматически включать все подходящие раскладки. </p>
<h3>Средства форматирования</h3>
<p>Версии Android до 6.0 включительно (уровень API 23) поддерживали только один или два языковых стандарта
для большинства распространенных языков
(en, es, ar, fr, ru). Поскольку у каждого языка имелось лишь немного вариантов,
приложения могли хранить числа и даты в виде жестко закодированных строк
в файлах ресурсов. Однако с расширением числа поддерживаемых Android языковых стандартов
могут возникнуть
значительные различия форматов даты, времени, валюты и другой подобной
информации даже в рамках одного языкового стандарта. Жесткое кодирование форматов может запутать
конечных пользователей. Поэтому при разработке приложений для Android N
следует использовать средства форматирования, а не жесткое кодирование строк с числами и датами.</p>
<p>В качестве наглядного примера можно привести арабский язык, поддержка которого в Android N расширена
с одного {@code ar_EG} до 27 языковых стандартов. Большинство ресурсов этих языковых стандартов общие, но
в некоторых из них используются цифры формата ASCII, а в других собственные цифры. Например,
если вы хотите создать предложение с числовой переменной
"Выберите ПИН-код из 4 цифр", вам нужно использовать средства форматирования следующим образом:</p>
<pre> format(locale, "Choose a %d-digit PIN", 4)</pre>