Well, I always think it's dangerous to make assumptions about geographic location vs language anyway : you could say for all of Australia use English as the default language (and many people with their head in the sand would like it to be so), but what about a French colleague I worked with in Australia ?
Geolocation is interesting anyway -
http://ip-api.com/json[
^] gives
{"status":"success","country":"Australia","countryCode":"AU","region":"NSW","regionName":"New South Wales","city":"Wallsend","zip":"2287","lat":-32.898,"lon":151.6707,"timezone":"Australia/Sydney","isp":"SingTel Optus Pty Ltd","org":"Optus Internet Pty Ltd","as":"AS4804 Microplex PTY LTD","query":"110.33.202.88"}
which is ok on the region (state), but fails miserable on the city (should be Sydney), and zip (postcode) is also incorrect.
I would use the browser accept-language header as my first choice, but allow the user to over-ride it/supply their own language identifier - else you're going to have to find yourself a really good database/service - they are out there, but not free