Those MO files are apparently not updated in Xenial. At the same time gettext seems to pick those files at first hand, while using /usr/share/locale-langpack as fallback. (I thought that gettext should do it the other way around.) So the result is:
If this gettext behavior is wrong, I suppose this should be fixed in gettext. If not, there is a need to update the translations in the apt package for Xenial.
Thanks for pointing out that, Maxim. (I should have thought of doing so.) So this is not a problem with the language pack generation, after all.
At this time I think the explanation is a combination of a few things.
To begin with, the apt package installs MO files in /usr/share/locale.
$ dpkg -L apt | grep ru.*mo$ locale/ ru/LC_MESSAGES/ apt.mo
/usr/share/
Those MO files are apparently not updated in Xenial. At the same time gettext seems to pick those files at first hand, while using /usr/share/ locale- langpack as fallback. (I thought that gettext should do it the other way around.) So the result is:
$ echo $(LANGUAGE=ru gettext -d apt '[upgradable from: %s]') /usr/share/ locale- langpack \
[может быть обновлён до: %s]
$ echo $(LANGUAGE=ru TEXTDOMAINDIR=
> gettext -d apt '[upgradable from: %s]')
[возможно обновление с: %s]
If this gettext behavior is wrong, I suppose this should be fixed in gettext. If not, there is a need to update the translations in the apt package for Xenial.