Hey Brian,
I'd quite like to go over why this decision was made. Firstly it was made due to being able to support a variety of languages. By separating them out you can pull out the languages you don't want so when you push it up to the server as a zip it's smaller in size.
From our experience of dealing with multi-lingual courses we found that all the content was translated, not bits of it. So by having the separation we're able to clearly see and define the different languages. Also we're able to set a default language which is configurable.
The current structure of the course folder looks like this:
course/
en/
course.json
contentObjects.json
articles.json
blocks.json
components.json
images/
fr/
course.json
contentObjects.json
articles.json
blocks.json
components.json
images/
config.json
The config.json file is a global config file that contains attributes like default language, global question weight. This needs to sit outside of the individual language folder. One thing I think is missing from this structure is the ability to have global assets and maybe the 'images' folder sits inside an 'assets' folder.
One advantage of having it this way is we can customise each course based upon language. So one course might have a different number of blocks compared to another language. This can be seen if you compare the sentence length of a German course and an English course - The German course due to the language having longer sentences when translated might mean you make a few extra blocks to accommodate the sentence length.
We found when dealing with courses that had translations we packaged them up separately so maybe this would be an approach when running $ grunt package. Maybe we can pass in a variable that selects the language and just packages that up.
I'm guessing here and could be completely wrong but does the get_string() method make a request to the server? If so, the way Adapt has been built to optimise it for mobile devices means we do our loading at the start - so all the course json files are loaded before the user can begin. This brings huge benefits:
1 - Plugins are able to view the whole course and iterate to create plugins that can map user journeys and assesments.
2 - Adapt has a nice user experience because it's not waiting for the server to respond. Pages load extremely quick and we're able to know what the data is before hand without making requests.
3 - By having Adapt as a one page web app we're able to manipulate the data in a way that we can create custom views. To be able to get the full affect of this (mainly because we have nested models/views) we need to load all the data at the beginning.
So as you can see there's huge benefits from doing it this way. I'm up for other suggestions or ways of dealing with this - but I'm also wary that this might not be required for MVP. But that's not to say that we should discuss them. I'd quite like to know more about the get_string() method Moodle uses if you could post up about that Brian?
On another note, was this issue brought up when dealing with a plugin trying to push tracking ids to the blocks.json? If so, maybe that might be the issue we need to look over.
Thanks,
Daryl