项目中需要对同个渠道不同国家实现展示不同的游戏推荐,需要实现国际本土化,因此对于如何精准获取用户国家信息是比较关键,本文侧重介绍几种获取方法
1、获取本地化语言或者国家:
- a、
navigator.language用户偏好语言(通常是浏览器界面语言)的字符串- 优点
- 简单快速使用、兼容性好
navigator.language获取的是用户的首选语言
- 缺点:
- 通过获取用户的语言首选项,无法获取到用户的语言偏好列表,不够灵活
- 对于精准国家判断会存在差异
- 优点
- b、
navigator.languages- 优点
- 简单快速使用、语言偏好列表
- 可以识别各种不同的语言和区域,具有较高的可靠性
- 缺点:
- 通过获取用户的语言首选项,浏览器中可能设置多个语言偏好,导致不准确或不全面
- 在旧版本浏览器中不被支持
- 对于精准国家判断会存在差异
- 优点
- c、请求头
accept-language- 优点:
- 请求头部是一种通用的获取用户语言偏好的方法,不仅可以在浏览器中使用,也可以在移动端应用中使用。
- 包含了用户的语言偏好列表和权重值,可以更加精确地获取到用户的语言偏好。
- 是由服务器端获取的,可以避免一些客户端浏览器 API 不支持的问题。
- 缺点:
- 请求头部的设置完全由浏览器决定,用户也可以手动修改该头部,因此存在一定的安全隐患。
- 请求头部的格式比较复杂,包含多个语言标记和权重值,需要进行解析处理才能获取到用户的语言偏好。
- 需要发起请求才可以使用,无法在客户端 JavaScript 中直接访问。
- 优点:
// 需要服务端默认返回accept-language
let response = await fetch('https://www.minigame.vip');
response.headers.get('accept-language')
- d、ip地址
- 优点:
- 基于用户的 IP 地址,可以推断用户的大致地理位置
- 可以根据地理位置提供相关的语言或国家设置
- 缺点:
- 需要发起请求才可以使用
- 无法准确判断用户的语言或国家,特别是在使用代理或 VPN 的情况下
- 受限于 IP 数据库的准确性和更新频率
- 优点:
async function fetchPlace() {
let response = await fetch('https://ip138.com/');
if (response.status >= 200 && response.status < 300) {
return await response.text();
} else {
throw new Error(response.statusText);
}
}
fetchPlace()
-
e、使用本地缓存
- 优点:
- 可以在用户首次访问时设置语言或国家的选择,并将其保存在 Cookie 或本地存储中
- 提供用户自定义语言或国家设置,持久化用户偏好
- 缺点:
- 需要用户首先进行语言或国家选择,可能需要额外的用户交互
- 用户可以清除 Cookie 或本地存储,导致语言或国家选择的丢失
- 优点:
-
f、
navigator.geolocation.getCurrentPosition获取经纬度- 优点:
- 可以访问到设备的经纬度信息,通过第三方地图api反向地理编码查找,可以更精确获取的国家信息
- 缺点:
- geolocation 属性只允许在 安全上下文(HTTPS)中可用。 下使用。
- geolocation 位置属性仅在用户允许后才可以使用。
- 优点:
getCountryFromGeolocation();
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(showPosition);
} else {
console.log("Geolocation is not supported by this browser.")
}
function showPosition(position) {
console.log(
"Latitude: " + position.coords.latitude + "<br>" +
"Longitude: " + position.coords.longitude)
}
2、常规本地化方式:
- 通过子域名(gTLDS)或国家顶级域名(如ccTLDs)区分多语言。如:en.wikipedia.org/
- 通过URL路径区分多语言。如:developer.mozilla.org/en-US/docs/…
- 通过URL查询参数区分多语言(对SEO不友好)。如:locize.com/?lng=de
- 通过浏览器本地存储区分多语言。如:www.instagram.com/
3、常用语言国际化插件
gettext成熟而广泛使用的国际化方案。支持众多编程语言,包括 JavaScript。i18next提供了简单易用的 API 和丰富的功能。支持多种前端框架和环境。Format.js由 JavaScript 国际化(ECMA-402)标准驱动,浏览器原生支持。Intl API是 JavaScript 的国际化标准 API,浏览器原生支持。提供了多语言字符串比较、日期/时间格式化等功能。不需要额外的依赖库。