i18n.js 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import Vue from 'vue'
  2. import VueI18n from 'vue-i18n'
  3. import store from '@/store'
  4. export const getLocale = function() {
  5. let locale = uni.getStorageSync('locale')
  6. if (!locale) {
  7. locale = uni.getLocale()
  8. if (locale.indexOf('zh') === 0) {
  9. return 'zh-cn'
  10. } else {
  11. return 'en-us'
  12. }
  13. }
  14. return locale || 'zh-cn'
  15. }
  16. export function setLocale(locale) {
  17. if (VueI18n.instance && VueI18n.instance.locale === locale) {
  18. return
  19. }
  20. if (VueI18n.instance) {
  21. VueI18n.instance.locale = locale
  22. }
  23. // if (locale !== 'zh-cn') {
  24. // const r = getAppLocale({ 'app_id': 'starify-ui', 'locale': locale.replace('-', '_') })
  25. // if (r.ret === 0) {
  26. // let messages = VueI18n.instance.getLocaleMessage(locale)
  27. // messages = Object.assign(messages, r.data)
  28. // VueI18n.instance.setLocaleMessage(locale, messages)
  29. // }
  30. // }
  31. const messages = VueI18n.instance.getLocaleMessage(locale)
  32. VueI18n.instance.setLocaleMessage(locale, messages)
  33. store.commit('SET_LOCALE', locale)
  34. uni.setLocale(locale)
  35. uni.setStorageSync('locale', locale)
  36. }
  37. function loadLocaleMessages() {
  38. const locales = require.context('./lang', true, /[A-Za-z0-9-_,\s]+\.js$/i)
  39. const messages = { 'zh-cn': {}}
  40. locales.keys().forEach((key) => {
  41. const matched = key.match(/\/module\/([A-Za-z0-9-_]+)\/([^.]*)\./i)
  42. if (matched && matched.length > 1) {
  43. const locale = matched[1]
  44. const module = matched[2]
  45. if (!messages[locale]) {
  46. messages[locale] = {}
  47. }
  48. messages[locale][module] = locales(key)['default']
  49. }
  50. })
  51. return messages
  52. }
  53. export function initLocale() {
  54. if (!VueI18n.locateInit) {
  55. VueI18n.locateInit = true
  56. const locale = getLocale()
  57. setLocale(locale)
  58. }
  59. }
  60. if (!VueI18n.instance) {
  61. Vue.use(VueI18n)
  62. const i18n = new VueI18n({
  63. locale: 'zh-cn',
  64. fallbackLocale: 'zh-cn',
  65. messages: loadLocaleMessages(),
  66. silentFallbackWarn: true
  67. })
  68. VueI18n.instance = i18n
  69. i18n.$t = Vue.prototype.$t = (key, text, values) => {
  70. let t = i18n.t(key, values)
  71. if (t) {
  72. t = t.toString()
  73. }
  74. return t || text
  75. }
  76. i18n.$tc = Vue.prototype.$tc = (key, text, values) => {
  77. let t = i18n.t(key, values)
  78. if (t) {
  79. t = t.toString()
  80. }
  81. return t || text
  82. }
  83. }
  84. export default VueI18n.instance