From the documentation (section 4.10
When the installer starts up it goes through these stages to select the interface language:
1. Find a perfect match between the user default language (GetUserDefaultLangID())
2. If there is no perfect match, find a primary language match
3. If no match, take the first language defined in the script
4. If $LANGUAGE has changed during .onInit, go through steps 1 to 3 with the language inside $LANGUAGE instead of the default user language.
This means the value you set in .onInit will only be set after
.onInit returns. While in .onInit the installer language will be the language choosen by NSIS as the best match, next best, or the default.