if this is your template:
{#people i18n=i18n}
{i18n.firstname}: {name}
{/people}
here's how your context stack looks like as it iterates through your 'name' array
{ your original context}
i18n -> firstname: "First Name"
name -> "Moe"
what happens is, when you define a parameter, dust pushes into the context stack all the parameters you defined. then when it finds an array in your context, dust pushes into the stack, one at a time, all the items in the array.
so now when you define a path context within the section, even though you've passed i18n in as a parameter, the i18n context is still up in the context stack, and when you try to access i18n with a path, like {i18n.firstname}, dust wouldn't find it, coz it has to backtrack to find it, and getPath doesn't do backtracks. the get method, on the other hand does backtrack, so that's why, when you do this:
{#people firstname=i18n.firstname}
{firstname}: {name}
{/people}
it works, because it's accessing the firstname within the section with a get method. hope you understand what i'm trying to say.
what i'd do is define a helper method that takes in a section like so:
{#people}
{#i18n}{firstname}{/i18n}: {name}{~n}
{/people}
and define the method in your context (or push it to your global context [defined with makeBase] to make it a global helper) like so:
i18n: function(chunk, context, bodies, params){
var trans = context.get(translation); //or whatever name you give to your i18n list
chunk.render(bodies.block, context.push(trans));
return chunk;
}
tested this on the dust website and it works. the advantage to this approach is you can now format your i18n output within the confines of the section. also, it would be good to define both the helper and the i18n list in your global context, so do use makeBase for that. all the best.