index.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import Vue from 'vue'
  2. import znCH from './lang/zn-CH'
  3. let defaultMessages = {};
  4. let merged = false;
  5. const vueI18nHandler = function() {
  6. const vuei18n = Object.getPrototypeOf(this || Vue).$t;
  7. if (typeof vuei18n === 'function' && !!Vue.locale) {
  8. if (!merged) {
  9. merged = true;
  10. Vue.locale(
  11. Vue.config.lang,
  12. Object.assign(Vue.config.lang === 'zn-CH'? znCH: {}, Vue.locale(Vue.config.lang) || {}, defaultMessages)
  13. );
  14. }
  15. return vuei18n.apply(this, arguments);
  16. }
  17. };
  18. function i18n(keysStr, params) {
  19. let value = vueI18nHandler.apply(this, arguments);
  20. if (value !== null && value !== undefined) return value;
  21. let message = Object.assign({}, Vue.config.lang === 'zn-CH'? znCH: {}, defaultMessages);
  22. let keys = keysStr && keysStr.split('.') || [];
  23. let result = null;
  24. if(keys.length) {
  25. for(let i=0;i<keys.length;i++) {
  26. let key = keys[i];
  27. if(key && message[key]) {
  28. message = message[key];
  29. result = message;
  30. }else{
  31. result = null;
  32. break;
  33. }
  34. }
  35. }
  36. return simpleTemplate(result, params);
  37. }
  38. function locale(lang, messages) {
  39. if(typeof lang === 'object') {
  40. messages = lang;
  41. lang = Vue.config.lang;
  42. }
  43. Vue.config.lang = lang;
  44. Object.assign(defaultMessages, messages);
  45. }
  46. function getArgType(arg) {
  47. return Object.prototype.toString.call(arg).toLowerCase().match(/\s(\w+)/)[1];
  48. }
  49. function simpleTemplate(templ, conf) {
  50. let pars = templ && templ.match(/{.+?}/g);
  51. if (pars && conf) {
  52. pars = pars.map(p => p.replace(/\{\s*(\w+|\d+).*?\}/, '$1'));
  53. pars.forEach((c, i) => {
  54. let reg = new RegExp('{\\s*'+c+'\\s*(?:=\\s*(\\S*?))?\\s*?}', 'g');
  55. templ = templ.replace(reg, (a, b) => {
  56. return getArgType(conf[c]) == 'function'? conf[c](): (conf[c] !== undefined? conf[c]: (b? b: a));
  57. });
  58. });
  59. }
  60. return templ;
  61. }
  62. export {
  63. i18n,
  64. locale
  65. }