Детекция языка по IP работает не полноценно, ибо IP больше определяет местоположение посетителя (страну), чем его языковые предпочтения.
Например, в Израиле живёт 20% русскоговорящего населения, а по IP вы им покажете сайт на иврите.
Детекция по IP пригодна для показа регионо-ориентированной рекламы (тоже косячит на VPN-ах).
Предпочитаемый язык(и) пользователя браузер передаёт в HTTP-заголовке
Accept-Language, поскольку каждый выбирает в настройках локали браузера свой предпочитаемый язык. На Хабре на эту тему есть статья
Грамотное определение языка пользователя с примером кода на PHP.
Остальное можно нагуглить.