Regional (i.e. sub) localization not correctly supported
Environment: Redmine version 2.4.1.stable Ruby version 2.0.0-p247 (2013-06-27) [x86_64-linux] Rails version 3.2.15 Environment development Database adapter PostgreSQL
I have encountered a reliably repeatable bug when using regional localization (like en-GB) within Redmine.
The manifestation is a significant number of "translation missing" messages on screen, including for core labels like "translation missing: en.label_project_plural" and "translation missing: en.label_logged".
To reproduce, create/utilise a plugin providing a sub-regional translation file (e.g. en-GB), in the knowledge that Redmine core does not ship with a corresponding locale file and will defer to the fallback locale (e.g. en).
The bug can be observed by switching Language from the user "MyAccount" section, or during a login (when the user has a different regional locale to the installation's default locale).
The cause appears to be that when Redmine initialises regional locales (e.g. "en-GB"), it also loads the fallback locale (:en) - but only using files where a corresponding en-GB.yml file does not exist.
This creates two keys in Redmine's i18n translations dictionary ("en" and "en-GB"), however only 1 of them (en-GB) is populated with data from all available en-GB files - the other key (en) is lacking all translation from files that were not required to satisfy renderings for en-GB.
When the locale is subsequently switched from "en-GB" to "en" (or vice-versa depending on whichever locale was requested first by a user) due to a logon or a user selection, the alternative locale is considered already loaded since it's key exists even though the hash table is incomplete. This causes failed translation lookups.
I would offer a fix if I knew ruby, i18n and Redmine well enough, but hopefully this information facilitates a patch.
Interim solution (for me) is to not use sub-regional localisation (and remove this support from plugins that do).