it talk spb "Локализация приложения на 15+ языков и его...
TRANSCRIPT
Итак, вы решили локализовать приложение на множество языков
2
• Определить что переводить.
• А как же языковые особенности? Тоже нужно учесть.
• Не поедет ли верстка? Поправить и её.
Что нужно сделать :
Что переводить?
Все что находится в папке ресурсов приложения (res/): strings.xml, arrays.xml, etc.
3
Решение
• Следует использовать вместо 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
Решение проблемы (не очень хорошее)
• Не использовать 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;
Даты
• Старайтесь использовать вместо SimpleDateFormat стандартные форматы дат из DateFormat
DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.getDefault());
• Если создаем свой формат через SimpleDateFormat, то лучше указывать ещё и локаль
new SimpleDateFormat(DateConstants.EEEE_FORMAT, Locale.US);
17
Цикл проверки локализации 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
Плюсы:
• Легко кастомизируется ( и очень удобно)
• Из коробки поддерживает переключение языков
• Легко встраивается в CI, из коробки поддерживает fastlane
• Хорошая документация
25
Минусы:
• Не умеет формировать красивые отчеты (зато выводит все очень красиво в консоль
• Требует установки
• Не умеет снимать скриншоты системных элементов (диалогов, тостов, surfaceview)
• Не умеет снимать скриншоты вьюшек
• Не универсальное средство, помогающее в тестировании
26
Spoon от Square
Плюсы:
• Легко кастомизируется
• Легко встраивается в CI
• Умеет формировать удобные и красивые отчеты
• Универсальное средство, помогающее в тестировании
29
Spoon от Square
Минусы:
• Не умеет снимать скриншоты системных элементов (диалогов, тостов, surfaceview)
• Не умеет снимать скриншоты вьюшек
• Не поддерживает из коробки переключение языков
30
Spoon от Aviasales & Hotellook
Плюсы:
• Умеет снимать скриншоты системных элементов (диалогов, тостов)
• Умеет снимать скриншоты вьюшек
33
Автоматизированное снятие и проверка скриншотов
Своего рода UI unit- тесты и проверка регрессии приложения
Одна из библиотек (если не единственная ) - Screenshot-tests-for-android от Facebook
35
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