2. Итак, вы решили локализовать
приложение на множество языков
2
• Определить что переводить.
• А как же языковые особенности? Тоже нужно
учесть.
• Не поедет ли верстка? Поправить и её.
Что нужно сделать :
3. Что переводить?
Все что находится в папке ресурсов
приложения (res/): strings.xml, arrays.xml, etc.
3
9. Решение
• Следует использовать вместо 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
10. Ещё одно решение
• Использовать DateFormatSymbols
public 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
12. Решение проблемы
(не очень хорошее)
• Не использовать 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
13. Копирование 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
Полу-решение
14. Универсальное решение
Жёстко привязать локализацию к конкретному языку (или
массиву языков)
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. 15
• Если же нам вдруг понадобится родной язык устройства, то его
можно будет получить через
Resources.getSystem().getConfiguration().locale;
17. Даты
• Старайтесь использовать вместо SimpleDateFormat
стандартные форматы дат из DateFormat
DateFormat.getDateInstance(DateFormat.MEDIUM,
Locale.getDefault());
• Если создаем свой формат через SimpleDateFormat, то лучше
указывать ещё и локаль
new SimpleDateFormat(DateConstants.EEEE_FORMAT, Locale.US);
17
21. Цикл проверки локализации Jetradar
CI 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
22. Тестирование приложения
Варианты:
• ручное тестирование ( Nloc*Ndev*Nactions)
• автоматизированное снятие скриншотов , а
затем ручная проверка
• автоматизированное снятие и проверка
скриншотов ( UI unit-тесты)
22
25. Плюсы:
• Легко кастомизируется ( и очень удобно)
• Из коробки поддерживает переключение языков
• Легко встраивается в CI, из коробки поддерживает
fastlane
• Хорошая документация
25
26. Минусы:
• Не умеет формировать красивые отчеты (зато выводит
все очень красиво в консоль
• Требует установки
• Не умеет снимать скриншоты системных элементов
(диалогов, тостов, surfaceview)
• Не умеет снимать скриншоты вьюшек
• Не универсальное средство, помогающее в тестировании
26
29. Spoon от Square
Плюсы:
• Легко кастомизируется
• Легко встраивается в CI
• Умеет формировать удобные и красивые отчеты
• Универсальное средство, помогающее в тестировании
29
30. Spoon от Square
Минусы:
• Не умеет снимать скриншоты системных
элементов (диалогов, тостов, surfaceview)
• Не умеет снимать скриншоты вьюшек
• Не поддерживает из коробки переключение
языков
30
35. Автоматизированное снятие
и проверка скриншотов
Своего рода UI unit- тесты и проверка регрессии
приложения
Одна из библиотек (если не единственная ) -
Screenshot-tests-for-android от Facebook
35
38. Screenshot-tests-for-android
Минусы :
• Требует постоянной поддержки всех тестов
• Не поможет при вычитке скриншотов
• Пока в очень сырой бете
• Довольно сложный в установке и настройке
38
39. Проверим все на практике
Пример реализации https://github.com/Kpeved/localizations-example
39
40. Ссылки
• 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