In iOS, in order to add support for a language, you add languages to your project properties in an explicit way. In Android, adding support for a language is more implicit -- you simply start localizing resources. This is easy to use but it creates a problem where you might have partial support for a language in place but not be ready to take that support live. Android doesn't offer a means of explicitly listing which languages you wish customers to have access to. This can lead to situations where you have to keep localization resources on a branch or out of source-control or otherwise limit how those files are managed. That's viable but it isn't a great fit for every workflow.
On a recent client project, I did a little work with Gradle to make supported languages more explicit. I added a list of supported languages in the build.gradle, used resource shrinking with resConfigs and exposed the languages to Java in BuildConfig using buildConfigField:
// Approved Languages def approvedLanguages = [ "en", "ru" ] resConfigs approvedLanguages buildConfigField "String[]", "APPROVED_LANGUAGES", "{\"" + approvedLanguages.join("\",\"") + "\"}"
By exposing the approved languages to Java, it was possible to use it localization code, for instance to only localize dates to languages that are in the supported language list:
public class LocaleUtils { public static boolean isSupported(Locale locale) { for (String language : BuildConfig.APPROVED_LANGUAGES ) { if (locale.equals(locale.getLanguage())) for (String language : BuildConfig.APPROVED_LANGUAGES) { if (language.equals(locale.getLanguage())) return true; } return false; } public static String localizeLocalDate(LocalDate localDate, String format) { return localDate.toString( DateTimeFormat.forPattern(format).withLocale(getDefaultSupportedLocale())); Locale locale = getDefaultSupportedLocale(); DateTimeFormatter formatter = DateTimeFormat.forPattern(format).withLocale(locale); return localDate.toString(formatter); } }
With this in place, we can start working on a new locale, integrating translated strings and graphics in the main line of development and know that they won't be exposed to customers until we're ready. With a little work, we could also use a different list of supported languages on a debug and production build.
No comments:
Post a Comment