Somehow the variable "$LANG_$nr" is evaluated to a null string"" followed by the "$nr" variable. But why is the "_" not printed then?

Did you ever wonder why shell variables like "$name" are sometimes written as "${name}"?

Well the above phenomenom is the reason.

The underscore, "_", character is one of the valid characters in a variable name. So the shell seems to interpret "$LANG_", as a variable, which not defined anywhere in the script.
We only define "$LANG" as local variable in the shell function, not "$LANG_".

The solution is to use the curly braces to explicitly tell the shell where the variable name starts and ends.

So we now can see, that in the first pass the "${LANG}" variable is expanded to "nl", "fr" and "de".
By using the curly braces "{}" , the shell does not have to guess anymore, which characters exactly make up the variable name end.

In most cases it will guess correctly, but in this case it really needs a little help from it's curly friends

__________________
You don't need to be a genius to debug a pf.conf firewall ruleset, you just need the guts to run tcpdump

I've found it a good habit, to reach for ${} whenever there will be characters intermixed with the variable names, in my scripts, this usually manifests itself as "${ham}/${spam}-${eggs}" and such.

I figure, it beats debugging silly errors if things ever get changed into a situation that needs expicit, or worrying about the possibility of some unexpected variable slipping into the execution environment later, and changing the implied behaviour. Sometimes code that is explicit is better documentation then a comment.