如何获取用户本土化信息

498 阅读3分钟

项目中需要对同个渠道不同国家实现展示不同的游戏推荐,需要实现国际本土化,因此对于如何精准获取用户国家信息是比较关键,本文侧重介绍几种获取方法

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、常规本地化方式:

3、常用语言国际化插件

  • gettext成熟而广泛使用的国际化方案。支持众多编程语言,包括 JavaScript。
  • i18next提供了简单易用的 API 和丰富的功能。支持多种前端框架和环境。
  • Format.js由 JavaScript 国际化(ECMA-402)标准驱动,浏览器原生支持。
  • Intl API是 JavaScript 的国际化标准 API,浏览器原生支持。提供了多语言字符串比较、日期/时间格式化等功能。不需要额外的依赖库。

4 、参考: