41
Адаптация приложения для 15+ языков и его тестирование. 1 Михаил Кулага hotellook

IT talk SPb "Локализация приложения на 15+ языков и его тестирование"

  • Upload
    dataart

  • View
    128

  • Download
    2

Embed Size (px)

Citation preview

Адаптация приложения для 15+ языков и его тестирование.

1

Михаил Кулага

hotellook

Итак, вы решили локализовать приложение на множество языков

2

• Определить что переводить.

• А как же языковые особенности? Тоже нужно учесть.

• Не поедет ли верстка? Поправить и её.

Что нужно сделать :

Что переводить?

Все что находится в папке ресурсов приложения (res/): strings.xml, arrays.xml, etc.

3

Варианты перевода

Онлайн переводчики - Google translate, Prompt, etc.

4

Shazam (ещё совсем недавно)

Переводы профессиональными переводчиками

5

Не всегда получаем то, что хотим

Bodyspace (RU)

6

KAYAK(RU)

7

Не всегда получаем то, что хотим

Momondo(RU)

8

Не всегда получаем то, что хотим

Решение

• Следует использовать вместо MMMM LLLL формат

public static String getStandaloneMonthName(int monthNumber) { SimpleDateFormat dateFormat = new SimpleDateFormat("LLLL", Locale.getDefault()); Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.MONTH, monthNumber); return dateFormat.format(calendar.getTime());}

9

Ещё одно решение

• Использовать DateFormatSymbolspublic static DateFormatSymbols getFormatSymbolsMonthsInNominative(Context context) { DateFormatSymbols russSymbol = new DateFormatSymbols(Locale.getDefault()); russSymbol.setMonths(context.getResources().getStringArray(R.array.months)); return russSymbol;}

DateUtils.getFormatSymbolsMonthsInNominative(getContext()).getMonths();DateUtils.getFormatSymbolsMonthsInNominative(getContext()).getWeekdays();DateUtils.getFormatSymbolsMonthsInNominative(getContext()).getShortWeekdays();

10

Числительные склоняются согласно текущей локализации

Airbnb (UK)

Plurals

11

Решение проблемы (не очень хорошее)

• Не использовать plurals. Написать свой метод для подстановки нужных ресурсов

String result;if (booksCount == 0) { result = getContext().getString(R.string.zero);} else if (booksCount == 1) { result = getContext().getString(R.string.one);} else if (booksCount > 1) { result = getContext().getString(R.string.moreThanOne); }

12

Копирование strings.xml в другие папки других языковgradle.taskGraph.afterTask { Task task -> if (task.name.matches('merge(.*)Resources')) { ['values-kk/', 'values-uk/', 'values-be/'].each { dest -> ['release'].each { buildVariant -> copy { from 'src/main/res/values-ru/' into project.getBuildDir().toString() + '/intermediates/res/merged/master/' + buildVariant + '/' + dest include('strings.xml') } } } }}

13

Полу-решение

Универсальное решениеЖёстко привязать локализацию к конкретному языку (или массиву языков)

public static void changeLocale(String localeLanguage, Context context) { Locale locale = new Locale(localeLanguage); Locale.setDefault(locale); Configuration config = new Configuration(); config.locale = locale; if (context.getApplicationContext().getResources() != null && context.getResources().getDisplayMetrics() != null) { context.getApplicationContext().getResources() .updateConfiguration(config, context.getResources().getDisplayMetrics()); } }

14

15

• Если же нам вдруг понадобится родной язык устройства, то его можно будет получить через

Resources.getSystem().getConfiguration().locale;

16

Даты

• Старайтесь использовать вместо SimpleDateFormat стандартные форматы дат из DateFormat

DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.getDefault());

• Если создаем свой формат через SimpleDateFormat, то лучше указывать ещё и локаль

new SimpleDateFormat(DateConstants.EEEE_FORMAT, Locale.US);

17

Средства андроид студии, которые нам помогут

String Editor

18

Средства андроид студии, которые нам помогут

Lint checker

19

Возможно что SHMETTERLING!!! не влезет 20

Цикл проверки локализации JetradarCI Screenshots

Save on google disk Web form

All good?

.png .html

Bugs?

Check translations QA testing

Change strings.xml Bugfix

NO YES

RELEASE

NOYES&

21

Тестирование приложения

Варианты:

• ручное тестирование ( Nloc*Ndev*Nactions)

• автоматизированное снятие скриншотов , а затем ручная проверка

• автоматизированное снятие и проверка скриншотов ( UI unit-тесты)

22

Ручное тестирование

23

Автоматизированное снятие скриншотов

• Spoon от Square

• Fastlane screengrab от Fabric

24

Плюсы:

• Легко кастомизируется ( и очень удобно)

• Из коробки поддерживает переключение языков

• Легко встраивается в CI, из коробки поддерживает fastlane

• Хорошая документация

25

Минусы:

• Не умеет формировать красивые отчеты (зато выводит все очень красиво в консоль

• Требует установки

• Не умеет снимать скриншоты системных элементов (диалогов, тостов, surfaceview)

• Не умеет снимать скриншоты вьюшек

• Не универсальное средство, помогающее в тестировании

26

Скриншот диалога Скриншот тоста Скриншот scrollview

27

Spoon от Square

28

Spoon от Square

Плюсы:

• Легко кастомизируется

• Легко встраивается в CI

• Умеет формировать удобные и красивые отчеты

• Универсальное средство, помогающее в тестировании

29

Spoon от Square

Минусы:

• Не умеет снимать скриншоты системных элементов (диалогов, тостов, surfaceview)

• Не умеет снимать скриншоты вьюшек

• Не поддерживает из коробки переключение языков

30

Spoon от Square

Скриншот диалога Скриншот тоста Скриншот scrollview

31

Spoon от Aviasales & Hotellook

32

Spoon от Aviasales & Hotellook

Плюсы:

• Умеет снимать скриншоты системных элементов (диалогов, тостов)

• Умеет снимать скриншоты вьюшек

33

Spoon от Aviasales & Hotellook

Скриншот диалога Скриншот тоста Скриншот scrollview

34

Автоматизированное снятие и проверка скриншотов

Своего рода UI unit- тесты и проверка регрессии приложения

Одна из библиотек (если не единственная ) - Screenshot-tests-for-android от Facebook

35

Screenshot-tests-for-android

36

Screenshot-tests-for-android

Плюсы :

• Позволяет избавиться от кучи ui-проблем до этапа приемки

• Помогает протестировать вьюшку в любых условиях с любыми тестовыми данными

37

Screenshot-tests-for-android

Минусы :

• Требует постоянной поддержки всех тестов

• Не поможет при вычитке скриншотов

• Пока в очень сырой бете

• Довольно сложный в установке и настройке

38

Проверим все на практике

Пример реализации https://github.com/Kpeved/localizations-example

39

Ссылки

• Spoon от Square - http://square.github.io/spoon/

• Spoon от AS & HL - https://github.com/nikslushkin/spoon

• facebook-screenshots - http://facebook.github.io/screenshot-tests-for-android/

• Fastlane Screengrab - https://github.com/fastlane/fastlane/tree/master/screengrab

40

Спасибо за внимание!

41

[email protected]