| 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 => Отказ<br> |
| Попытка использования fr => Отказ<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 => Отказ<br> |
| Попытка использования fr => Отказ<br> |
| Попытка использования диалекта fr => 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 => Отказ<br> |
| Попытка использования fr => Отказ<br> |
| Попытка использования диалекта fr => Отказ<br> |
| Попытка использования it_CH => Отказ<br> |
| Попытка использования it => Отказ<br> |
| Попытка использования диалекта it => 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> |