i18n documentation - added note for caching in multi language modules
Style destructive actions destructively
Add backwards compatibility for has_extension
Update docblocks
FIX: Use Injector API for managing Member_Validator instance.

Updates the CMS profile page and SecurityAdmin to give developers a few ways to customise the required fields.

Added extension hook updateValidator for getValidator for things like modules to inject required fields to go along with Injector for replacing the entire class for project specific use.
API Better declaration of DataObject field change levels.
Use of const named identifiers to represent each change level rather than numbers.
Merge pull request #2524 from tractorcow/pulls/3.2-change-level-identifiers

API Better declaration of DataObject field change levels.
Making cacheToFile  key more resilient against mixed/nested types
API: LookupField::Field now returns an HTMLText instance.

Moved LookupField into a template, removed getSource() as the DropdownField getSource() has been simplified to just a getter
API: Change DropdownField::getSource() to not return the emptyString value.
Feature to allow that changing the SSTemplateParser through the Injector system

The motivation for this was to allow module developers to change what parser is used to parse SilverStripe templates.
This change enables people to compile their own version of the SilverStripe template parser and use it without modifying core files.
NEW Hook for `Member::registerFailedLogin`

Adding a hook for registerFailedLogin so that it is possible to add some custom logic when a user fails to login

Also rearranged the write as this function could hit the DB up to 3 times. Now it will me 0 or 1 times.
BUG FailedLoginCount reset

If you fail your maximum login attempts and are locked out, further failed login attempts add to your already existing FailedLoginCount as it is only reset if you log in successfully. This means that if you're locked out, then try again, one failure will automatically lock you out again, regardless of what you set your max limit to.

Example:

lock_out_after_incorrect_logins: 3
FailedLoginCount: 0

The user fails three login attempts.

lock_out_after_incorrect_logins: 3
FailedLoginCount: 3

The user is now locked out.

Lockout time passes.

The user fails their 4th login.

lock_out_after_incorrect_logins: 3
FailedLoginCount: 4

This will continue to happen until the user successfully logs in, without giving them the pre-defined amount of login attempts again due to this condition being met after every incorrect login:
```php
if($this->FailedLoginCount >= self::config()->lock_out_after_incorrect_logins) {
```

FailedLoginTestCount Test Added
Merge pull request #2561 from TomSpeak/patch-3

BUG FailedLoginCount reset
Merge pull request #2559 from willmorgan/cachetofile-arguments

Making cacheToFile  key more resilient against mixed/nested types
Merge remote-tracking branch 'origin/3.1'

Conflicts:
	.travis.yml
	forms/FormField.php
Clear DB caches in SecurityTest
"Description" field visibility in "insert link"
"Link type" selection in "insert link" panel
FIX #2496 `ConfirmedPasswordField` mismatch passwords saved

Fixes #2496

Also fixes another issue where 'Password' is hard coded as field name in `validate()`