That i18n solution modifies the Uri class. Every request will create it's own instance of Uri, to process the URI passed to it. Which means it will also go through the "detect language" bit for HMVC requests.
This solution isn't very good, and doesn't work (as you have noticed) for HMVC requests.
If you want this type of solution, it's probably better to overload Input::uri(). Call the parent to determine the URI, and upon return check the first segment, and set the locale and strip it if present.