Recursively translate nested objects

If the object doesn't look like a translation object then instead of
just returning it as a plain object we recursively call the i18n
function on it to try and translate it.
Recursively translate nested custom arrays

This allows custom nested arrays to be translated correctly by calling
the i18n function recursively.

I've had to swap the order that the json transform filters get run to
avoid a 'Maximum call stack size exceeded' error.