A maneira correta é examinar o cabeçalho HTTP Accept-Language enviado ao servidor. Ele contém a lista ordenada e ponderada de idiomas para os quais o usuário configurou seu navegador para preferir.
Infelizmente este cabeçalho não está disponível para leitura dentro do JavaScript; tudo o que você obtém é o navigator.languageque informa qual versão localizada do navegador da web foi instalada. Isso não é necessariamente o mesmo que o idioma preferido do usuário. No IE, você obtém systemLanguage(idioma instalado do SO), browserLanguage(o mesmo que language) e userLanguage(região do SO configurada pelo usuário), que são igualmente inúteis.
Se eu tivesse que escolher entre essas propriedades, cheiraria userLanguageprimeiro, voltando ae languagesomente depois disso (se elas não correspondessem a nenhum idioma disponível) olhando browserLanguagee finalmente systemLanguage.
Se você pode colocar um script do lado do servidor em outro lugar na rede que simplesmente lê o cabeçalho Accept-Language e o cospe novamente como um arquivo JavaScript com o valor do cabeçalho na string, por exemplo:
var acceptLanguage= 'en-gb,en;q=0.7,de;q=0.3';
você pode incluir um <script src> apontando para esse serviço externo no HTML e usar JavaScript para analisar o cabeçalho do idioma. Porém, não conheço nenhum código de biblioteca existente para fazer isso, pois a análise do Accept-Language é quase sempre feita no lado do servidor.
O que quer que você acabe fazendo, certamente precisará de uma substituição de usuário, porque sempre achará errado para algumas pessoas. Geralmente, é mais fácil colocar a configuração de idioma no URL (por exemplo, http: //www.example.com/en/site vs http: //www.example.com/de/site) e deixar o usuário clicar em links entre os dois. Às vezes, você deseja um único URL para as duas versões de idioma; nesse caso, você deve armazenar a configuração em cookies, mas isso pode confundir os agentes do usuário sem suporte para cookies e mecanismos de pesquisa.