feat(i18n): 中英文框架(命名空间字典+语言切换)+profile 接入参考+注册3个新页面
这个提交包含在:
@@ -0,0 +1,120 @@
|
||||
// Lightweight i18n for WeChat Mini Program (no official i18n API).
|
||||
//
|
||||
// Usage in a page:
|
||||
// var i18n = require('../../i18n/index')
|
||||
// onShow: function () { i18n.bind(this) } // injects `i18n` + `locale` into page data
|
||||
// WXML: {{i18n.common.loading}} / {{i18n.profile.title}}
|
||||
// JS strings: i18n.t('common.loading')
|
||||
//
|
||||
// Locale is persisted in storage; switching locale notifies listeners and the
|
||||
// convention is that every page re-runs i18n.bind(this) in onShow, so tab pages
|
||||
// pick up the new language the next time they are shown.
|
||||
|
||||
var locales = require('./locales/index')
|
||||
|
||||
var STORAGE_KEY = 'app_locale'
|
||||
var DEFAULT_LOCALE = 'zh'
|
||||
var SUPPORTED = ['zh', 'en']
|
||||
var LOCALE_NAMES = { zh: '中文', en: 'English' }
|
||||
|
||||
var _listeners = []
|
||||
var _current = null
|
||||
|
||||
function getSystemLocale() {
|
||||
try {
|
||||
var sys = wx.getSystemInfoSync()
|
||||
var lang = (sys.language || '').toLowerCase()
|
||||
return lang.indexOf('en') === 0 ? 'en' : 'zh'
|
||||
} catch (e) {
|
||||
return DEFAULT_LOCALE
|
||||
}
|
||||
}
|
||||
|
||||
function getLocale() {
|
||||
if (_current) return _current
|
||||
var saved = ''
|
||||
try { saved = wx.getStorageSync(STORAGE_KEY) } catch (e) {}
|
||||
_current = SUPPORTED.indexOf(saved) !== -1 ? saved : getSystemLocale()
|
||||
return _current
|
||||
}
|
||||
|
||||
function setLocale(locale) {
|
||||
if (SUPPORTED.indexOf(locale) === -1 || locale === _current) return
|
||||
_current = locale
|
||||
try { wx.setStorageSync(STORAGE_KEY, locale) } catch (e) {}
|
||||
applyTabBar()
|
||||
for (var i = 0; i < _listeners.length; i++) {
|
||||
try { _listeners[i](locale) } catch (e) {}
|
||||
}
|
||||
}
|
||||
|
||||
function onChange(fn) { if (typeof fn === 'function') _listeners.push(fn) }
|
||||
function offChange(fn) {
|
||||
_listeners = _listeners.filter(function (f) { return f !== fn })
|
||||
}
|
||||
|
||||
function getDict() {
|
||||
var loc = getLocale()
|
||||
return locales[loc] || locales[DEFAULT_LOCALE]
|
||||
}
|
||||
|
||||
function _lookup(dict, key) {
|
||||
if (!dict) return undefined
|
||||
var parts = key.split('.')
|
||||
var cur = dict
|
||||
for (var i = 0; i < parts.length; i++) {
|
||||
if (cur == null) return undefined
|
||||
cur = cur[parts[i]]
|
||||
}
|
||||
return cur
|
||||
}
|
||||
|
||||
// t('profile.title', {name: 'x'}) — falls back to zh, then to the raw key.
|
||||
function t(key, params) {
|
||||
var loc = getLocale()
|
||||
var val = _lookup(locales[loc], key)
|
||||
if (val === undefined) val = _lookup(locales[DEFAULT_LOCALE], key)
|
||||
if (typeof val !== 'string') return val === undefined ? key : val
|
||||
if (params) {
|
||||
val = val.replace(/\{(\w+)\}/g, function (m, k) {
|
||||
return params[k] !== undefined ? params[k] : m
|
||||
})
|
||||
}
|
||||
return val
|
||||
}
|
||||
|
||||
// Inject the full dictionary + current locale into a page/component's data.
|
||||
function bind(page) {
|
||||
if (page && typeof page.setData === 'function') {
|
||||
page.setData({ i18n: getDict(), locale: getLocale() })
|
||||
}
|
||||
}
|
||||
|
||||
// Refresh the bottom tabBar labels to the current locale.
|
||||
function applyTabBar() {
|
||||
var d = getDict()
|
||||
var tab = (d && d.common && d.common.tab) || {}
|
||||
var items = [
|
||||
{ index: 0, text: tab.home },
|
||||
{ index: 1, text: tab.records },
|
||||
{ index: 2, text: tab.mine }
|
||||
]
|
||||
items.forEach(function (it) {
|
||||
if (!it.text) return
|
||||
wx.setTabBarItem({ index: it.index, text: it.text, fail: function () {} })
|
||||
})
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
SUPPORTED: SUPPORTED,
|
||||
LOCALE_NAMES: LOCALE_NAMES,
|
||||
getLocale: getLocale,
|
||||
setLocale: setLocale,
|
||||
getSystemLocale: getSystemLocale,
|
||||
onChange: onChange,
|
||||
offChange: offChange,
|
||||
getDict: getDict,
|
||||
bind: bind,
|
||||
applyTabBar: applyTabBar,
|
||||
t: t
|
||||
}
|
||||
在新工单中引用
屏蔽一个用户