I was not able to duplicate your issue. I used the Joomla core Beez3 template to test this, where the template by default has the language files in main (Joomla root) Language folder and at the same time it has the same language files in the template language folder too.
Now, when a Joomla page is loaded then usually the last call is when the HtmlView loads the particular template:
HtmlView->loadTemplate()
Within this function the language files are loaded also (considering all of the possible/defined language paths of your Joomla application) and this call loads the languages (it is already a very sophisticated system in Joomla, I mean the process that this call pulls in):
// Load the language file for the template
$lang = \JFactory::getLanguage();
$lang->load('tpl_' . $template, JPATH_BASE, null, false, true)
|| $lang->load('tpl_' . $template, JPATH_THEMES . "/$template", null, false, true);
In the above call you can see that the load()
method tries to load the language from the main Language folder of Joomla, then from the template's language folder. It also gets obvious from the above two lines that Languages belongs to the main language folder first of all, then the extensions folder. So it looks safe to keep languages in the main language folder. But it is not a must (Joomla has great language debug system too if something goes wrong).
So what was my test to checking your issue?
It is simple: I renamed the beez3 English language files in the main language folder and changed one English language string in the English language file of beez3 template in the template's language folder. And when I loaded the page again the text constant (language constant) value was changed reflected on the page too. It means simply that the English language file was read from the language sub-folder of the template. but when I renamed back the language file in the main language folder then the text was set back on the page automatically.
To test this a little more (as an extra mile), I dumped the application global language object
use \Joomla\CMS\Factory;
$app = Factory::getApplication();
$lang = $app->getLanguage();
and checked the file paths of possible language files. At the case when I renamed the main language file of Beez3, a new path appeared in the language object's paths
array; and yes you bet, it was the language path to the beez3 template language folder and English language file.
On the last part of your post about language fallback to English language strings, yes I can confirm that, but the same as above. If the Language object can find English language files for your template in the main language folder, then it will use that first, if not it will load the template language file and fall back to that.
About this function even the documents have some good info:
Another cool trick you can do is** to load arbitrary front-end and
back-end language files of any component and language. For example,
you may want to load the English language file and mix it with the
user's current language. This means that untranslated strings will
appear in English and not as untranslated keys. You can use something
like this for the back-end language files:
$language = JFactory::getLanguage();
$language->load('com_yourcomponentname', JPATH_ADMINISTRATOR, 'en-GB', true);
$language->load('com_yourcomponentname', JPATH_ADMINISTRATOR, null, true);
And to load the front-end language files, using the same trick:
$language = JFactory::getLanguage();
$language->load('com_yourcomponentname', JPATH_SITE, 'en-GB', true);
$language->load('com_yourcomponentname', JPATH_SITE, null, true);
source: https://docs.joomla.org/Specification_of_language_files
And last but not least, you can also use a helpful Language class function to check whether there is a problematic language file in your system:
$langError = $lang->getErrorFiles();
var_dump($langError);
If I want to answer your main issue, there is something you have to find with your language files if it is not working, as it is given above (I do not have a clue from here why your language file is not read but I am sure it is a very small mistake somewhere)). Even though the language of your site is set to Italian, it-IT
for example, the English language files are always loaded in Joomla.