前端不使用 i18n,如何优雅的实现多语言?_前端多语言方案

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Web前端全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024c (备注前端)
img

正文

static start() {
    return new Promise((resolve, reject) => {
        axiso.request({
            url: "/static/appconfig.json",
            method: "get",
        }).then(result => {
            VFrame.host = (result.host || window.location.host);
            VFrame.wsUrl = "ws://" + VFrame.host + ":" + result.wsPort + "/ws/notify/";
            VFrame.getAll(resolve);
        }).catch(error => {
            reject(error);
        });
    });
}

static getAll(resolve) {
    getAll().then(res => {
        VFrame.applicationResource = res
        resolve()
    });
}


static l(key, ...args) {
    if (localStorage.getItem("ux_debug_language")) {
        return `[${key}]`
    }

    if (!VFrame.applicationResource) {
        return key
    }
    if (VFrame.applicationResource.language_texts) {
        let res = VFrame.applicationResource.language_texts[key];
        if (res) {
            return format(res, args);
        } else {
            return `[${key}]`
        }
    }
    return key;
}

}



### 2. main.js 中 使用我们新建的 VFrame.js



> 
> **上面我们说到 VFrame 的执行时机,我们可以看下面代码!**
> 
> 
> 
> 



import Vue from “vue”;
import App from “./App”;
import store from “./store”;
import router from “./router”;
import VFrame from “./framework/VFrame”;

Vue.prototype.l = VFrame.l;

// 这个为了方便用 VFrame ,并没有其他用途
Vue.prototype.$ux = {
v: VFrame
}

// 重要的就是这一步,VFrame 的执行时机
VFrame.start().then(() => {
//set layout to store
store.commit(“dragLayout/initLayout”)
new Vue({
el: “#app”,
router,
store,
render: h => h(App)
});
});



### 3. html js 中使用我们配置好的多语言


**Html 中使用:** **【 l("Key") 】**



{{ l('ManyLanguage') }}
```

js 中使用: 【 this.l(“Key”) 】

export default{

  data(){
    return {
        language:this.l("ManyLanguage")
    }
  },

  created(){
  
    console.log(this.l("MyLanguage"))
  },
}

经过上面一番操作我们已经可以在管理系统中成功的调用当前多语言了;

那么我们 VFrame 中的 getAll() API 调用时 如何返回我们刚好我们想要的语言呢?

我们就要处理 【 request.js 】中的封装,在请求拦截中去携带我们自定义的请求头信息,后端大佬去对应的处理即可!

import Cookies from "js-cookie";
import axios from "axios";


axios.defaults.headers["Content-Type"] = "application/json;charset=utf-8";
// 创建axios实例
const service = axios.create({
  // axios中请求配置有baseURL选项,表示请求URL公共部分
  baseURL: process.env.VUE_APP_BASE_API,
  // 超时
  timeout: 120000
});


service.interceptors.request.use(
  config => {

    var cultureName = Cookies.get(CONSTANT.UX_LANGUAGE);
    if (cultureName) {
      config.headers[CONSTANT.UX_LANGUAGE] = cultureName; // 让每个请求携带自定义token 请根据实际情况自行修改
    }

})

三、微信小程序中使用

实现步骤就像上面写的步骤一样,那么注意点是什么呢( 本文用的是uniapp去开发的微信小程序,也是基于 vue 的语法 )?

在 uniapp 里面我们不能写的像我们上面那样,因为 uniapp 是不支持的,那么这个时候我们如何去确保页面加载完成时,多语言可以全部返回呢?

答:做一个预加载页,当我们多语言成功返回以后跳转至业务页面

1. 完成上方基础 VFrame 创建,main.js 中挂载,但是不要在用 new vue 勿动(不然会报错)!

因为小程序有 Tabbar 所以我们的  VFrame.js 需要多一个方法;

import {
	request
} from "util/request.js";
export default class VFrame {
	static applicationResource;

	/**
	 * 在vue实例化之前调用异步start方法
	 */
	static start() {
		return new Promise((resolve, reject) => {
			request({
				url: '/application/getAppAll', //activityType=0 查询全部
				method: 'GET',
				hideLoading: true,
				data: {
					orgId: uni.getStorageSync('companyOrgId')
				}
			}).then(res => {
				VFrame.applicationResource = res.data.result
				resolve(res)
			});
		});
	}

	static l(key, args) {
		if (VFrame.applicationResource && VFrame.applicationResource.language_texts) {
			let res = VFrame.applicationResource.language_texts[key];
			if (res) {
				return res;
			} else {
				return `[${key}]`
			}
		}
		return key;
	}

	static tabbarLanguage(tabbarList) {
		let language = uni.getStorageSync('language') || 'zh-CN'
		if (language) {
			switch (language) {
				case 'en-GB':
					tabbarList[0].text = "Coupons"
					tabbarList[1].text = "Stamp"
					tabbarList[2].text = "Account"
					tabbarList[3].text = "Discount"
					tabbarList[4].text = "Favourite"
					break
				case 'zh-CN':
					tabbarList[0].text = "电子优惠券"
					tabbarList[1].text = "电子印花"
					tabbarList[2].text = "我的账户"
					tabbarList[3].text = "优惠奖赏"
					tabbarList[4].text = "我的最爱"
					break
				case 'zh-HK':
					tabbarList[0].text = "電子優惠券"
					tabbarList[1].text = "電子印花"
					tabbarList[2].text = "我的賬戶"
					tabbarList[3].text = "優惠獎賞"
					tabbarList[4].text = "我的最愛"
					break
			}
		}
		return tabbarList
	}

}

2. 预加载页面的制作

新建 preload.vue

<template>
	<view class="preload">fashion-cue</view>
</template>

<script>
import { mapMutations } from 'vuex';
import VFrame from '@/util/VFrame';
export default {
	name: 'Preload', // 预加载动画页面
	data() {
		return {};
	},
	methods: {
		...mapMutations(['setAppAll'])
	},
	onLoad(e) {
		console.log('onLoad', e);
		VFrame.start().then(res => {
			if (res && res.data.result.brandList && res.data.result.categoryList) {
				this.setAppAll(res.data.result);
			}
			getApp().globalData.isLoaded = true;
			uni.switchTab({
				url: e.redirect ? '/' + e.redirect : '/platforms/mp-weixin/discount/discount'
			});
		});
	}
};
</script>

<style>
.preload {
	width: 100%;
	font-weight: bold;
	font-family: 'Arial', 'Microsoft YaHei', '黑体', '宋体', sans-serif;
	font-size: 2.5rem;
	text-align: center;
	background-image: -webkit-linear-gradient(left, black, transparent 25%, black 50%, transparent 75%, black);
	-webkit-text-fill-color: transparent;
	-webkit-background-clip: text;
	-webkit-background-size: 200% 100%;
	-webkit-animation: masked-animation 2s infinite linear;
	position: absolute;
	top: 50%;
	left: 50%;
	transform: translate(-50%, -140%);


#### Vue 编码基础

2.1.1. 组件规范  

2.1.2. 模板中使用简单的表达式  

2.1.3 指令都使用缩写形式  

2.1.4 标签顺序保持一致  

2.1.5 必须为 v-for 设置键值 key  

2.1.6 v-show 与 v-if 选择  

2.1.7 script 标签内部结构顺序  

2.1.8 Vue Router 规范



#### Vue 项目目录规范

2.2.1 基础  

2.2.2 使用 Vue-cli 脚手架  

2.2.3 目录说明  

2.2.4注释说明  

2.2.5 其他



![](https://img-blog.csdnimg.cn/img_convert/b4ee1921321dddc29bf532ba888c89e9.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)**
![img](https://img-blog.csdnimg.cn/img_convert/704b82290bd4b751e5628e4260364109.png)

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
  

2.2.3 目录说明  

2.2.4注释说明  

2.2.5 其他



![](https://img-blog.csdnimg.cn/img_convert/b4ee1921321dddc29bf532ba888c89e9.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip1024c (备注前端)**
[外链图片转存中...(img-UTE77lfM-1713473921819)]

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值