Сегментируйте словарь перевода по модулям: есть модуль логина - цепляем словарь оттуда, есть модуль меню - конкатенируем и его из модуля меню. Нет модуля на странице - строк для этого модуля соответственно нет, т.к. они не нужны.
Тоже самое и с JS: если есть в модуле - грузим; модуля нет на странице - не грузим.
Алгоритм определения языка: Юзер/неЮзер->Cookie(LocalStorage)->AcceptLanguage->Default
IP-тут не нужен, обычно далее AcceptLanguage не нужно.
А Default - для роботов, которые не указывают язык при парсинге.