前端国际化小坑:登录后页面语言不是用户设置的语言

简介: 欢迎关注前端西瓜哥

大家好,我是前端西瓜哥。

我给网站加上按需加载语言功能有一段时间后,测试给我找到了这么一个的 bug。

可能还是因为支持的语言太少,国外用户也太少的原因,所以这个问题这么晚才被发现。

那我们来看看这个问题。

场景

用户设置网站语言为中文,但浏览器设置语言为英文

用户打开网站,跳转到登录界面。因用户未登录,前端读取到浏览器为英语语言,所以动态加载英语语言。

输入用户名和密码,跳转到首页。因为用的是单页面应用(SPA),没有刷新页面,所以文案仍然是英文文案

用户需要刷新一下页面,才能拿到他设置的中文语言的文案。

方案 1:重新加载页面

最简单的方案,是丢弃 SPA 的不刷新页面的 “假跳转”,换成真跳转。

也就是说,不要使用原来底层为 history.pushState() 的 React Router 或 Vue Router 库的 API,直接使用 window.location.href = homeUrl

登录请求成功后,前端拿到了用户 Token。接着跳到首页并做一个重新加载语言的操作,因为有用户凭证,我们就能正确加载用户设置的语言。

虽然 SPA 打包后的文件通常很大,但我们有缓存,重新加载一遍的速度还是挺快的。

这里有一个可选的优化点:如果用户设置的语言和浏览器语言相同,可以仍旧使用 “假跳转”。这点需要后端配合,让登录接口额外返回当前用户语言字段。

方案 2:加载用户语言,覆盖掉浏览器语言

请求登录接口,拿到用户 Token 后,需要额外拿到用户设置的语言。

根据这个语言标识,动态获取对应的语言包 JS 文件,语言包下载完毕并覆盖掉原来的语言包,然后再 “假跳转” 到主页。

同样,如果用户语言和浏览器语言相同,直接“假跳转”到主页即可。

看起来好像不是很复杂的样子,但其实里面有很多坑。

要使用这种方案,你必须保证你的代码对语言包对象是响应式的。也就是说语言包对象一改变,你的组件你的方法都得自动跟着变化。

这意味着在某些情况下你不能使用缓存,对一些涉及到国际化文案的逻辑,要写成函数的形式。组件不能使用外部的静态内容,需要依赖 Context 或 Redux 这些会触发组件重渲染的方案。

当然如果你这样做了,也有好处,就是你切换语言时,不需要重新加载页面,组件会重新渲染应用新的语言文案。

结尾

我更倾向于使用方案 1,因为它简单,适用于任何场景。此外从不登录到登录,里面会发生非常多的状态变化,不太好维护。

另外,退出登录同样也要做重新加载页面的操作,因为用户语言和浏览器语言可能并不同。

我是前端西瓜哥,一名喜欢思考的前端开发,欢迎关注我。

相关文章
|
1月前
|
前端开发
web前端开发-----CSS样式设置
web前端开发-----CSS样式设置
31 0
|
3月前
|
缓存 前端开发 JavaScript
如何优化前端页面性能
前端性能优化是网站开发中非常重要的一部分,它直接关系到用户体验和网站的流量以及排名。本文将介绍一些优化前端页面性能的方法,包括减少HTTP请求、压缩代码、使用CDN等。
|
4月前
|
Web App开发 前端开发 JavaScript
前端语言报错
前端语言报错
35 0
|
4月前
|
移动开发 前端开发 JavaScript
VSCode设置类似Webstorm那样可以用本地局域网IP地址访问自己开发的测试项目,vs code 前端如何以服务器模式打开?
VSCode设置类似Webstorm那样可以用本地局域网IP地址访问自己开发的测试项目,vs code 前端如何以服务器模式打开?
VSCode设置类似Webstorm那样可以用本地局域网IP地址访问自己开发的测试项目,vs code 前端如何以服务器模式打开?
|
5天前
|
NoSQL JavaScript 前端开发
报错场景:ant design vue前端登录时,输入的验证码是对的,但是一直提上验证码错误,登录不进去 报错信息(Error in execution; nested exception)
报错场景:ant design vue前端登录时,输入的验证码是对的,但是一直提上验证码错误,登录不进去 报错信息(Error in execution; nested exception)
18 0
|
2月前
|
存储 前端开发 JavaScript
【JavaEE初阶】 博客系统项目--前端页面设计实现
【JavaEE初阶】 博客系统项目--前端页面设计实现
|
2月前
|
存储 前端开发 安全
无限连接:前端跨页面通信的实现与应用
在前端开发中,有时我们需要在不同的页面之间进行数据传递和交互。这种场景下,前端跨页面通信就显得尤为重要。前端跨页面通信是指在不同的页面之间传递数据、发送消息以及实现页面间的交互操作。本文将详细介绍前端跨页面通信的属性、应用场景以及实现方法,并提供一些代码示例和引用资料,帮助读者深入了解并应用这一重要的技术。
|
3月前
|
移动开发 监控 前端开发
HTML5与CSS3教学:美化员工行为监控软件前端页面的代码技巧
在当今信息时代,企业对员工行为的监控成为了一项必不可少的工作。而员工行为监控软件作为一种高效的管理工具,其前端页面的设计和美化显得尤为重要。本文将介绍如何利用HTML5和CSS3技术,优雅地美化员工行为监控软件前端页面的代码技巧。
213 0
|
4月前
|
JSON 前端开发 Java
(简易详细)spring boot 使用拦截器 实现拦截前端请求并返回json到前端页面
(简易详细)spring boot 使用拦截器 实现拦截前端请求并返回json到前端页面
109 0
|
4月前
|
监控 前端开发 应用服务中间件
Zabbix【部署 01】Zabbix企业级分布式监控系统部署配置使用实例(在线安装及问题处理)程序安装+数据库初始+前端配置+服务启动+Web登录
Zabbix【部署 01】Zabbix企业级分布式监控系统部署配置使用实例(在线安装及问题处理)程序安装+数据库初始+前端配置+服务启动+Web登录
413 0