Hey Roger!
Yea this is a pretty logical behaviour. Just as you said, the more time it needs to load the data asynchronously, the often it happens that `$translate` service returns an unstranslated string.
The reason for that is, that the needed translation data simply is not available yet. So what happens is, the following: `$translate` service gets a translation id via `$translate('TRANSLATION_ID')`,
then it checks if there's a translation table for the requested language and also if the given translation id does exist in it. If it's not the case, it tries the same with the configured fallback language.
If even the translation id is not present in the translation table for the fallback language, a missingTranslationHander gets invoked (if configured). After that it just returns the translation id.
So how to get around this? Since things are flowing asynchronously you'll never know when translation data is available. Which means, simply relying on `$translate` service isn't enough.
You either have to wait for `$translateChangeSuccess` event and use `$translate` service then, or, if possible, you try to extract the translation logic to the view layer and use directives or
filters. They take care about that event listening.
If you decide to wait for `$translateChangeSuccess` event, you can do it like this:
```js
$rootScope.$on('$translateChangeSuccess', function () {
$scope.foo = $translate('TRANSLATION_ID');
});
```
Hope this helps!