Taro使用mobx做国际化小程序
效果

目前项目使用的是Taro做小程序开发框架,Taro可以集成mbox,当然一些正常的框架也可以集成mbox,只不过需要自己集成,或者用redux也可以用相同的思想实现。
思路
利用mbox action会重新render页面的能力来实现通过切换action来改变对应的语言,同样的国际化会写成一个字典数据结构的数据,通过设定统一的出口去统一读取字典中的值,并且可以实现参数代入。
核心代码
import { observable } from 'mobx'
// Language是一个函数根据参数key来返回中英文
import Language from 'src/locales/index'
// 正则匹配有参数的形式
const RegEx = /#{(\w+)}/g
const counterStore = observable({
// 当前使用的国际化map
T: {},
// 用来切换语言的函数
setLocales(lang = 'zh') {
this.T = Language(lang)
},
// 对外暴露get函数,通过对应的key来获取
get(key, params) {
let value = this.T[key]
if (!value) {
return ''
}
if (!params) {
return value
}
value = value.replace(RegEx, (a, match) => {
const v = params[match]
if (v) {
return v
}
return ''
})
return value
}
})
export default counterStore
国际化初始化
根据当前手机系统设置的语言来设置当前使用的国际化文字language
@inject((stores, props) => {
return {
localesStore: stores.localesStore || {}
}
})
@observer
class App extends Component {
config = {
pages: [
'pages/index'
],
window: {
}
}
componentWillMount() {
try {
const system = Taro.getSystemInfoSync()
this.props.localesStore.setLocales(system.language)
} catch (e) {
console.log(e)
}
}
// 在 App 类中的 render() 函数没有实际作用
// 请勿修改此函数
render () {
return (
<Provider store={store}>
<Index />
</Provider>
)
}
}
方法的使用
首先在对应的国际化文件中初始化想要设置的值
export default {
'login.phone': '手机号码',
'login.phone.placeholder': '请输入手机号码',
'login.code': '验证码',
'login.code.sendmsg': '发送验证码',
'login.btn': '登录',
'login.msg': '今日购物#{discount}的折扣'
}
在对应想要国际化的文件引入localesStore
@inject((stores, props) => {
return {
T: stores.localesStore
}
})
那么在使用的时候只需要T.get("输入想要的key","对应的params object")
<AtButton type='primary' onClick={this.login}>{ T.get('login.btn') }</AtButton>
<View>{ T.get('login.msg', { discount: '7' }) }</View>
看一下例子
这时候我们希望在三秒以后吧国际化文字从中文变成英文,下面是对应的代码:
componentWillMount() {
try {
const system = Taro.getSystemInfoSync()
this.props.localesStore.setLocales(system.language)
// 三秒以后从中文变成英文
setTimeout(() => {
this.props.localesStore.setLocales('en')
}, 3000)
} catch (e) {
console.log(e)
}
}
在对应的国际化英文文件中加入
export default {
'login.phone': '手机号码en',
'login.phone.placeholder': '请输入手机号码',
'login.code': '验证码',
'login.code.sendmsg': '发送验证码',
'login.btn': 'login',
'login.msg': "#{discount} off today's purchase discount"
}
如图,总共刷新了3次,每次3秒以后都会变成English

Taro使用mobx做国际化小程序的更多相关文章
- 想做微信小程序第三方代理,各位觉得一键生成平台能赚到钱吗?
这几年生意不景气,这是很多人的共识.从2009年开始,各种专家就判断"明年经济是最差的一年."然后,这个明年,一直"明"到了2018年,到最后,我们发现,经济就 ...
- 微信小程序开发入门教程(四)---自己动手做个小程序
前面已将基础知识准备的差不多了,下面实际做一个小程序. 一.目标 用于上传照片和文字. 2个主要页面:我me,设置set 二.开始制作 1.打开微信开发者工具(我用的1.02.1907160 Wind ...
- 使用AirtestProject+pytest做支付宝小程序UI自动化测试
一,前言 1,背景 因公司业务需要做支付宝小程序的UI自动化测试,于是在网上查找小程序的自动化资料,发现微信小程序是有自己的测试框架的,但几乎找不到支付宝小程序UI自动化测试相关的资料.白piao失败 ...
- Taro 开发踩坑指南 (小程序,H5, RN)
Taro 开发踩坑指南 (小程序,H5, RN) css taro 如何展示多行文本省略号 https://www.cnblogs.com/xgqfrms/p/12569057.html UI 设计稿 ...
- 你的产品适不适合做微信小程序?你需要这篇产品逻辑分析
自2017年1月9日张小龙宣布万众瞩目的“微信小程序”正式上线了.以名字看,感觉像是突出了“将你的程序接入微信”的意思. 我们此前分析过微信的功能迭代节奏:一般微信重要的功能规划周期,大约会在在9 ...
- 从零开始学做微信小程序,看这些就够了!
随着正式开放公测,微信小程序再次万众瞩目,越来越多的企业和个人涌入到小程序开发的大军中.小程序究竟是什么?适合做小程序的产品有哪些?做小程序需要提前准备什么?如何零基础学做小程序?此文,将列出OSC上 ...
- pyqt5 做的小程序,可以用来UI做个小demo
#!/usr/bin/python3# -*- coding: utf-8 -*- """ZetCode PyQt5 tutorial This program crea ...
- 用Taro做个微信小程序Todo, 小白工作记录
微信小程序框架: Taro 做微信小程序的框架, 几个比较主流的: 官方的WePY: https://tencent.github.io/wepy/document.html#/ 美团的mpvue: ...
- 小程序多端框架全面测评:chameleon、Taro、uni-app、mpvue、WePY
摘要: 微信小程序开发技巧. 作者:coldsnap 原文:小程序多端框架全面测评 Fundebug经授权转载,版权归原作者所有. 最近前端届多端框架频出,相信很多有代码多端运行需求的开发者都会产生一 ...
随机推荐
- BZOJ3456城市规划
题目描述 刚刚解决完电力网络的问题, 阿狸又被领导的任务给难住了.刚才说过, 阿狸的国家有n个城市, 现在国家需要在某些城市对之间建立一些贸易路线, 使得整个国家的任意两个城市都直接或间接的连通.为了 ...
- yii2 or查询
// 我们要查询id等于1或者id等于3的数据 $userInfo = User::find()->where(['or' , 'id = 1' , 'id = 3'])->all(); ...
- zsh fg: no job control in this shell.
图片的上面就是将一个应用按Ctrl+Z,把任务放到后台里面.没法fg将任务回到前台运行. 在.zshrc中添加set -m. 具体原因不明.我切换到root用户里,没有出现这个问题.将我的.zshrc ...
- TypeScript体系调研报告
作者简介:aoto 蚂蚁金服·数据体验技术团队 Q:为什么要写这边文章?这篇文章要表达什么? A:我们考虑在SPA应用中使用TS作为开发语言,我们需要一篇系统性介绍TS本身及周边的文章来论证在项目中使 ...
- FreeNAS插件打造ownCloud私有云网盘
ownCloud 是一个自由开源的个人云存储解决方案,可以自由获取无需付费,但用户需要自行架设服务器,好在FreeNAS可以通过插件轻松的构建ownCloud服务器. ownCloud 分为服务器端和 ...
- web.xml:<dispatcher>
web.xml 的 <dispatcher> 是 <filter-mapping> 下的子标签,指定 Filter 对应的请求方式,其可选值如下: REQUEST 客户端在地址 ...
- Java斗地主案例、异常和自定义异常整理
模拟斗地主洗牌发牌 1.1 案例介绍 按照斗地主的规则,完成洗牌发牌的动作. 具体规则: 1. 组装54张扑克牌 2. 将54张牌顺序打乱 3. 三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张 ...
- 分布式监控系统开发【day38】:报警自动升级代码解析及测试(八)
一.报警自动升级代码解析 发送邮件代码 def action_email(self,action_obj,action_operation_obj,host_id,trigger_data): ''' ...
- ZooKeeper 概述
ZooKeeper:分布式应用程序的分布式协调服务 ZooKeeper:是用于分布式应用程序的分布式开源协调服务 可以简单理解:ZooKeeper = 文件系统 + 通知机制 从设计模式角度理解:Zo ...
- 动态规划dp
一.概念:动态规划dp:是一种分阶段求解决策问题的数学思想. 总结起来就一句话:大事化小,小事化了 二.例子 1.走台阶问题 F(10):10级台阶的走法数量 所以:F(10)=F(9)+F(8) F ...